如何不使用cmd行参数编译CMakeLists.txt的某些部分?

时间:2019-04-30 15:08:09

标签: c++ cmake

我正在使用CMake 3.10.2,并将其放在我的目标CMakeLists.txt文件之一中。...

target_compile_definitions(mytarget PUBLIC USE_MY=${USE_MY})

然后我可以在命令行上使用-DUSE_MY = 0之类的参数,以便可以将这样的东西放入我的c ++文件中:

#ifdef USE_MY
   // code left out
#endif

但是,我还希望能够不编译CMakeLists.txt中的文件。

set(my_sources
    filea.cpp
    fileb.cpp
    filec.cpp (how would I leave out filec.cpp?)
)

在我的顶层CMakeLists.txt中,省略了整个库。

add_subdirectory(my_stuff/liba)
add_subdirectory(my_stuff/libb) (how to leave out this lib?)
add_subdirectory(my_stuff/libc

因此,我也想排除某些文件和目标,以免进行编译。感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

按照@drescherjm的建议,类似的方法可能对您有用:

set(my_sources
    filea.cpp
    fileb.cpp
)
if(USE_MY)
    # Append filec if USE_MY is defined.
    set(my_sources ${my_sources} filec.cpp)
endif()

类似地,

add_subdirectory(my_stuff/liba)
if(USE_MY)
    add_subdirectory(my_stuff/libb)
endif()
add_subdirectory(my_stuff/libc

# ... other code here ...

# Link the libraries.
target_link_libraries(targetA ${my_liba} ${my_libc})
if(USE_MY)
    target_link_libraries(targetA ${my_libb})
endif()

答案 1 :(得分:2)

在现代CMake中,您将执行以下操作:

add_subdirectory(my_stuff/liba)

if (USE_MY)
    add_subdirectory(my_stuff/libb)
endif()

add_subdirectory(my_stuff/libc

然后寻找来源:

add_library(libB source1.cpp source2.cpp source3.cpp)

if (USE_MY)
    target_sources(libB source4.cpp source5.cpp)
endif()