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