キーワードはINTERNAL
変数のプロパティです。次の例を見てください。
テスト/CMakeLists.txt:
cmake_minimum_required(VERSION 2.8)
Project(Test)
add_subdirectory(Component1)
add_subdirectory(Component2)
Test/Component1/CMakeLists.txt:
cmake_minimum_required(VERSION 2.8.11)
project(Component1)
set(SOURCES test1.c)
set(Component1_CONF "SomeValue" CACHE STRING "Component1_CONF description")
message(STATUS "Component1_CONF=${Component1_CONF}")
add_library(Component1 ${SOURCES})
target_include_directories(
Component1 INTERFACE
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>"
"$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>"
)
Test/Component2/CMakeLists.txt:
project(Component2)
set(SOURCES test1.c)
set(Component2_CONF "/etc/passwd" CACHE FILEPATH "Component2_CONF description")
add_executable(Component2 ${SOURCES})
target_link_libraries(Component2 Component1)
実際Component2
には、実行可能ファイルではなく静的ライブラリまたは共有ライブラリにすることができますが、それは問題ではありません。
cmake-gui
最上位ディレクトリで実行して実行すると、とのConfigure
両方が表示されます。ただし、トップレベルを変更して、強制的に設定する行を追加すると:Component1_CONF
Component2_CONF
CMakeLists.txt
Component1_CONF
cmake_minimum_required(VERSION 2.8)
Project(Test)
set(Component1_CONF "Other value" CACHE INTERNAL "Component1_CONF forced value" FORCE)
add_subdirectory(Component1)
add_subdirectory(Component2)
コマンドライン ( ) 構成Component1_CONF
から効果的に隠します。cmake-gui
-DComponent1_CONF=Boo
また、通常、変数は現在のスコープでのみ設定されることに注意してください (PARENT
キーワードが使用されていない場合)。したがって、あるディレクトリに設定された変数は、ピア サブディレクトリおよび親サブディレクトリに設定された変数には影響しません。ただし、変数がまったく同じスコープで設定されている場合 (たとえば、構成テストを親内から実行する場合CMakeLists.txt
)、はい、相互に干渉する可能性があります。これを防ぐために、CMake は変数を異なるパッケージから明示的に分離する命名規則を使用します。ほとんどの構成マクロは、マクロで設定される変数の名前プレフィックスを指定する「プレフィックス」パラメーターを受け取るため、マクロ ユーザー (アプリケーションの CMakeLists.txt) は、異なる依存パッケージからテスト変数を明示的に分離できます。