以下两个之间有什么区别吗?
set(FOO true CACHE BOOL "description")
option(FOO "description" ON)
Run Code Online (Sandbox Code Playgroud)
背景:即使我已经使用CMake一段时间了,我option今天才注意到这个命令,因此我一直在使用set:我想知道用第二个替换第一个是否安全/值得.
我正在将一个makefile项目迁移到CMake.第一次编写makefile的人已经完成了一个用于在include文件中写入某些值的模块.
有一个主config.h文件,其中包含config_in.h.config.h文件包含以下内容:
#ifndef USE_FEATURE_A
#define USE_FEATURE_A 0
#endif
#ifndef USE_FEATURE_B
#define USE_FEATURE_B 0
#endif
Run Code Online (Sandbox Code Playgroud)
在makefile中有一个伪目标,就像with_feature_a在config_in.h中写的那样
#define USE_FEATURE_A 1
Run Code Online (Sandbox Code Playgroud)
通过这种方式,有人可以打字
make with_feature_a
make
Run Code Online (Sandbox Code Playgroud)
获得正确的构建.
我想使用这个代码库但使用CMake复制这样的东西.我在网上尝试了几种方法,但我没有让它发挥作用.
set_target_properties(with_feature_a PROPERTIES COMPILE_DEFINITIONS
"WITH_FEATURE_A=1"
)
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为如果我跑
make with_feature_a
Run Code Online (Sandbox Code Playgroud)
我没有with_feature_a在预处理器命令行中看到.
我做的第二次尝试是直接用内容集写一个文件到我想要的东西,但我不明白如何将file()命令连接到我的目标.
我把它放在我的CMakeLists.txt中
file(WRITE
local/config_in.h
"#define WITH_FEATURE_A 1"
)
Run Code Online (Sandbox Code Playgroud)
但这并不是每次都执行,我不知道如何将它设置为单个目标.
任何帮助表示赞赏.感谢您阅读所有这些内容.对不起长话:)
UPDATE
这里提供的解决方案是解决问题之路上的一大亮点.问题是不允许递归定义.我举了一个例子:
在CMakeLists.txt我放置:
if (WITH_FEATURE_A)
MESSAGE(STATUS "WITH_FEATURE_A")
add_definitions(-DUSE_FEATURE_A=1)
add_definitions(-DWITH_FEABURE_B=1)
endif()
if (WITH_FEABURE_B)
MESSAGE(STATUS "WITH_FEATURE_B")
add_definitions(-DUSE_FEATURE_D=1)
endif()
if (WITH_FEABURE_C)
MESSAGE(STATUS "WITH_FEATURE_C")
add_definitions(-DUSE_FEATURE_D=1)
endif()
if (WITH_FEABURE_D)
MESSAGE(STATUS "WITH_FEATURE_D")
endif()
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果我用-DWITH_FEATURE_A = 1执行cmake,我很乐意在输出中看到: …
我正在准备一个可以使用和不使用 GUI 的应用程序,所以我在我的 CMakeLists.txt 中使用命令
option (NEED_GUI "Include Qt support" OFF)
Run Code Online (Sandbox Code Playgroud)
和
if (NEED_GUI)
message("****GUI should be OFF****")
add_subdirectory(QtGUI) # The Qt-based graphics routines
endif (NEED_GUI)
Run Code Online (Sandbox Code Playgroud)
尽管我将选项设置为 OFF,但我还是收到了消息并构建了库。在哪里查找错误?