有条件地包括源文件

Jam*_*mes 6 cmake

在我的根CMakeLists.txt中

add_definition(-DMY_MACRO)
Run Code Online (Sandbox Code Playgroud)

然后在一个子CMakeLists.txt我想做的事情

add_library(mylib, STATIC
    file1
#ifdef MY_MACRO
    file2
#endif
)
Run Code Online (Sandbox Code Playgroud)

我试过类似的东西

IF( DEFINED MY_MACRO )
SET(FILE2 "file2")
ELSE( DEFINED MY_MACRO )
SET(FILE2 "")
END_IF( DEFINED MY_MACRO )

add_library(mylib static
    file1
    ${FILE2}
)
Run Code Online (Sandbox Code Playgroud)

但没有快乐.

jul*_*ulp 5

add_definitions添加预处理器定义,它不定义cmake变量.

我还没有测试过,但是如果你真的想要寻找预处理器定义,可能会更像这样:

set(mylib_SOURCES )
list(APPEND mylib_SOURCES file1)
get_directory_property(CURRENT_DEFINITIONS COMPILE_DEFINITIONS)
list(FIND CURRENT_DEFINITIONS "MY_MACRO" IN_CURRENT_DEFINITIONS)
if(NOT IN_CURRENT_DEFINITIONS EQUAL -1)
    list(APPEND mylib_SOURCES file2)
endif(NOT IN_CURRENT_DEFINITIONS EQUAL -1)
add_library(mylib static ${mylib_SOURCES})
Run Code Online (Sandbox Code Playgroud)

(这里的定义是从父目录继承而来的)

在您的父母CMakeLists.txt中:

add_definitions(-DMY_MACRO) # should appear before going into subdirectories
add_subdirectory(foo)
Run Code Online (Sandbox Code Playgroud)

基于变量的不同方法是:

  • 父:

    option(WITH_FOO "with(out) foo option") # or set(WITH_FOO true/false)
    if(WITH_FOO)
        add_definitions(-DMY_MACRO)
    endif(WITH_FOO)
    add_subdirectory(foo)
    
    Run Code Online (Sandbox Code Playgroud)
  • 子目录:

    set(mylib_SOURCES )
    list(APPEND mylib_SOURCES file1)
    if(WITH_FOO)
        list(APPEND mylib_SOURCES file2)
    endif(WITH_FOO)
    add_library(mylib static ${mylib_SOURCES})
    
    Run Code Online (Sandbox Code Playgroud)

  • 谢谢,你让我走上正轨.我只是在定义宏的同一个地方设置一个cmake变量.节省了很多火箭. (2认同)