2016-02-13 8 views
5

Quindi, sto facendo parte di un progetto una libreria con alcune intestazioni che sono l'interfaccia della libreria e le restanti sono private della libreria stessa. Così per la mia libreria la parte CMAKE assomiglia:CMake verifica una libreria, problema di localizzazione dell'intestazione

add_library(${PROJECT_NAME} ${PROJECT_SOURCES} "${PROJECT_BINARY_DIR}/libversion.h") 
add_library(my::lib ALIAS ${PROJECT_NAME}) 

target_include_directories(${PROJECT_NAME} 
    PRIVATE ${Boost_INCLUDE_DIRS} 
    PRIVATE ${PROJECT_BINARY_DIR} #to locate libversion.h 
    INTERFACE ${PUBLIC_INCLUDE_HEADERS} 
    ) 

E poi il mio obiettivo di prova:

add_executable(${TEST_NAME} ${TEST_SOURCES}) 
add_test(NAME LibTest COMMAND ${TEST_NAME}) 

target_link_libraries(${TEST_NAME} 
    PRIVATE ${Boost_LIBRARIES} 
    PRIVATE my::lib 
    ) 

Ma questo permette solo a me per testare la mia interfaccia pubblica. Se voglio testare la mia libreria, come potrei fare per dichiarare l'accesso alle restanti intestazioni nel progetto lib? Il mio modo di vedere sarebbe di aggiungere un intero nuovo target, my::lib::testing, che dichiara l'interfaccia come la directory di origine corrente (dove attualmente si trovano tutte le intestazioni, separare il pubblico dalle intestazioni private è un altro problema che devo ancora gestire). Quindi qualcosa di simile:

add_library(${PROJECT_NAME}_TESTING ${PROJECT_SOURCES} "${PROJECT_BINARY_DIR}/libversion.h") 
add_library(my::lib::testing ALIAS ${PROJECT_NAME}_TESTING) 

target_include_directories(${PROJECT_NAME}_TESTING 
    PRIVATE ${Boost_INCLUDE_DIRS} 
    PRIVATE ${PROJECT_BINARY_DIR} #to locate libversion.h 
    INTERFACE ${CMAKE_CURRENT_SOURCE_DIR} 
    ) 

Ma questo richiede due diversi obiettivi da costruire a seconda dell'utilizzo. Uno per la mia applicazione che collega all'alias my::lib e uno per il test dell'unità, che collega l'alias my::lib::testing.

Quindi la mia domanda è, come faccio modo pulito intestazioni separati, in modo che io possa avere solo i miei INTERFACE intestazioni mostrate da obiettivi, ma ancora accedere le intestazioni rimanenti dal mio target di test?

risposta

3

Entrambe le voci PRIVATE e PUBLIC popolano la proprietà INCLUDE_DIRECTORIES di una destinazione, quindi è possibile provare a utilizzarla in target_include_directories per il progetto di test.

add_executable(${TEST_NAME} ${TEST_SOURCES}) 
add_test(NAME LibTest COMMAND ${TEST_NAME}) 

target_link_libraries(${TEST_NAME} 
    PRIVATE ${Boost_LIBRARIES} 
    PRIVATE my::lib 
    ) 

target_include_directories(${TEST_NAME} PRIVATE $<TARGET_PROPERTY:my::lib,INCLUDE_DIRECTORIES>)