2016-03-02 86 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

相關問題