Friday, July 13, 2018

CMake Tricks: 一些小技巧

CMake Tricks: 一些小技巧

有常在編一些opensource的專案的應該都對CMake不陌生。這篇文章就整理些我在編使用CMake的專案時遇到的一些問題與解法。

追加Compiler flags

CMake裡面有一些變數是用來pass compiler flag給compiler,例如:CMAKE_CXX_FLAGS是用來給g++之類的C++ Compiler。這些變數當然是可以修改的。常見比較好的作法按依照該專案開發者定義的BUILD_TYPE來編,CMake裡面有一些常見的BUILD_TYPE,例如:Debug, Release, RelWithDebInfo ......等。可以透過在產生Makefile時下:
cmake -DCMAKE_BUILD_TYPE=value
來指定BUILD_TYPE,也可以在CMakeLists.txt中修改或是新增:
SET(CMAKE_CONFIGURATION_TYPES  "Release")
來給定。而BUILD_TYPE會使得該BUILD_TYPE中所定義的CMAKE_<LANG>_FLAGS_<BUILD_TYPE>被加入CMAKE_<LANG>_FLAGS中,例如:把build type設為Debug,會使得CMAKE_C_FLAGS_DEBUG被加入CMAKE_C_FLAGS中。這裡cmake官方文件寫得很清楚reference

若要自行追加flags也可以透過新增或是修改flags到CMAKE_<LANG>_FLAGS中。例如:
SET(GCC_COVERAGE_COMPILE_FLAGS "-g")
SET( CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}" )
我這裡的作法是新創一個變數GCC_COVERAGE_COMPILE_FLAGS,將其設為"-g",然後把她加入CMAKE_CXX_FLAGS中。

此外還有一個簡單有效的作法。由於CMAKE_C_FLAGS會依照環境變數CFLAGS初始化,所以只要修改CFLAGS這個環境變數就好。其他常見的對應如下:

  • CMAKE_C_FLAGS -> CFLAGS
  • CMAKE_CXX_FLAGS -> CXXFLAGS 
  • CMAKE_CUDA_FLAGS -> CUDAFLAGS
  • CMAKE_Fortran_FLAGS -> FFLAGS

而若是使用ccmake來產生Makefile,可以在視窗中輸入t開啟進階選項。直接在選單中修改即可。ex:

Option

下選項分為兩種,一是直接下在command line中,另一種則是用ccmake。
下在command line,只要用-D就好,ex:
cmake -DCMAKE_BUILD_TYPE=value
然而用這個很難知道,有什麼選項可以下,而且很麻煩,不過如果你build project是用script只能用這招。至於要知道有哪些選項可以透過:
cmake -L
得到所有選項以及當前選擇。
另外一種下option的方式是ccmake, 在Arch中安裝cmake套件,Ubuntu中安裝cmake-curses-gui即可,用法就是把所有cmake的指令改成ccmake。

當更新選項重新build時,會因為路徑下有CMakeCache.txt造成build成上一個版本的設定。可以把CMakeCache.txt刪除,或是透過make rebuild_cache重新建立CMakeCache.txt

CMake debug

如果要撰寫cmake最大問題是不知道cmake variable的值,經過運行後會變什麼。可以透過查看CMakeCache.txt或是下cmake -LAH來查看值。


其他連結:https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/Useful-Variables

No comments:

Post a Comment

精選文章

使用Ardunio Atmega2560 連接 nRF24L01+

使用Ardunio Atmega2560 連接 nRF24L01+ 關於library 目前主流有 https://github.com/maniacbug/RF24 與 https://github.com/TMRh20/RF24 這兩個。 其中TMRh20大大做...