2016-02-13 17 views
5

私はプロジェクトの一部に、ライブラリへのインタフェースであるいくつかのヘッダを持つライブラリを作成しています。残りはライブラリ自体にプライベートなものです。その後、CMakeはライブラリのヘッダ位置の問題をテストします

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} 
    ) 

そして、私のテスト対象:

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

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

しかし、これは私だけが私のパブリックインターフェイスをテストすることができますので、私のライブラリのCMAKEの一部は次のようになります。ライブラリを単体テストしたい場合は、プロジェクトの残りのヘッダへのアクセスを宣言するにはどうすればいいでしょうかlib?現在のソースディレクトリ(すべてのヘッダーが現在存在し、プライベートヘッダーからパブリックを分離することはまだ処理していない別の問題です)としてインターフェイスを宣言する新しいターゲットmy::lib::testingを追加することです。したがって、次のようなものがあります。

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} 
    ) 

しかし、これには用途に応じて2つの異なるターゲットが必要です。 1つは私のアプリケーションで別名my::libにリンクし、もう1つはユニットテストのためにエイリアスmy::lib::testingをリンクしています。

だから私の質問ですが、私はきれいに別々のヘッダはので、私はターゲットによって示される唯一の私INTERFACEヘッダを持っているが、それでも私のテスト対象で、残りのヘッダにアクセスすることができますはどうすればよいですか?

答えて

3

PRIVATEとPUBLICの両方の項目にターゲットのINCLUDE_DIRECTORIESプロパティが設定されているため、テストプロジェクトのtarget_include_directoriesでその項目を使用できます。

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>)