2016-03-02 124 views
0

基本上我有规则为测试源代码创建二进制文件,为应用程序源代码创建二进制文件的其他规则。然后我有两个单独的规则来为它们中的每一个生成可执行文件(每个链接到它们各自的库)。以下是生成测试可执行文件的规则示例。如图所示,我添加了一个编译定义。我的问题是,这个编译定义似乎不会递归地传递给应用程序二进制规则(当从下面的规则调用时)。所以我在应用程序中有一些由“TESTS”保护的代码,我希望只有在触发下面的这条规则时才能编译它。代码也被保护在头文件中。 有没有办法做到这一点?如何为cmake中的目标添加递归编译定义

编辑: 为了使它更清晰,我希望在调用此规则时,将此编译定义添加到两个目标OBJS和Tests_OBJS的编译定义中。

add_executable(tests 
    $<TARGET_OBJECTS:Tests_OBJS> 
    $<TARGET_OBJECTS:OBJS> 
    Tests/Main.cpp) 
target_link_libraries(tests ${LIBS}) 
target_compile_definitions(tests PRIVATE TESTS=1) 

回答

1

表达式$<TARGET_OBJECTS>不是指源,而是指对象。对于源代码更改编译定义已经晚了 - 它们是已在此阶段编译。如果您需要设置的来源,以用于不同目的进行编译不同,你需要为每个编译方式add_library()电话:

set(my_lib_sources ...) 

# Set of objects for application 
add_library(my_lib OBJECTS ${my_lib_sources}) 

# Set of objects for tests, they use special compile definitions 
add_library(my_lib_test OBJECTS ${my_lib_sources}) 
target_compile_definitions(my_lib_test PRIVATE TESTS=1) 

add_executable(tests 
    $<TARGET_OBJECTS:my_lib_test> # Already use special compile definitions 
    Tests/Main.cpp) 

# Uncomment, if additional definitions are needed for Tests/Main.cpp 
# target_compile_definitions(tests PRIVATE TESTS=1) 
+0

好,这似乎直觉有两个不同的调用。我认为在cmake中可以有更优雅的东西来传递来自调用规则的编译定义。但无论如何感谢:) – mkmostafa

相关问题