cmake
子目录代码中如何关联 cmake 宏定义
CMakeLists.txt 增加如下内容:
OPTION(MOCK_DATA "Hello World" OFF)
if (MOCK_DATA)
add_definitions(-DMOCK_DATA_MICRO)
endif()
同理子目录道理一样,通过判断 cmake 变量,来决定是否定义源码中的宏定义。
此时在 cpp 源代码中可以通过如下形式使用宏定义:MOCK_DATA_MICRO
#ifdef MOCK_DATA_MICRO
hello_world();
#endif
如果想使能 MOCK_DATA_MICRO
宏定义则需要在 cmake 编译是指定参数:
cmake -DMOCK_DATA=ON ../; make -j8
cmake 中 if(NOT XXX) 和 if(NOT DEFINED XXX) 的区别
OPTION(MOCK_DATA "Hello World" OFF)
if (MOCK_DATA)
add_definitions(-DMOCK_DATA_MICRO)
endif()
if(NOT DEFINED MOCK_DATA)
message(STATUS "MOCK_DATA ---")
else
message(STATUS "MOCK_DATA +++")
endif
尽管我编译时 cmake 命令行没有指定 -DMOCK_DATA=ON 选项,仍然打印的是 MOCK_DATA +++
总结:虽然命令行没有指定对应选项,但是 CMakeLists.txt 文件中声明了 OPTION(MOCK_DATA "Hello World" OFF)
则 MOCK_DATA 就是 DEFINED 只不过值为 OFF。
因此需要修改代码为:
OPTION(MOCK_DATA "Hello World" OFF)
if (MOCK_DATA)
add_definitions(-DMOCK_DATA_MICRO)
endif()
if(NOT MOCK_DATA)
message(STATUS "MOCK_DATA ---")
else
message(STATUS "MOCK_DATA +++")
endif