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這個環境變數就好。其他常見的對應如下:

而若是使用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

comments powered by Disqus