回避策の1つは、への${target}_ASSETS
呼び出しですべての依存関係が設定されるまで、カスタムターゲットの生成を延期することADD_RESOURCES
です。
依存関係をカスタムターゲットにすぐに追加する代わりに、マクロADD_RESOURCES
は依存関係をグローバル変数に記録する必要があります。グローバル変数の名前はターゲットによって異なります。
macro (ADD_RESOURCES _targetName)
set (_dependencies ${ARGN})
...
# record depencies in a target dependency variable
if (DEFINED ${_targetName}_Dependencies)
list (APPEND ${_targetName}_Dependencies ${_dependencies})
else()
set (${_targetName}_Dependencies ${_dependencies})
endif()
endmacro()
次に、リフレクションを通じて定義されたすべてのターゲット依存関係変数を決定し、各ターゲットにカスタムターゲットを設定する別のヘルパーマクロを追加します。
macro (SETUP_ASSETS_TARGETS)
get_cmake_property(_vars VARIABLES)
foreach (_var ${_vars})
if (_var MATCHES "(.+)_Dependencies")
set (_targetName ${CMAKE_MATCH_1})
set (_targetDependencies ${${_var}})
message("${_targetName} depends on ${_targetDependencies}")
add_custom_target(${_targetName}_ASSETS DEPENDS ${_targetDependencies})
endif()
endforeach()
endmacro()
を呼び出して必要なすべての依存関係をCMakeLists.txt
追加しADD_RESOURCES
、マクロを呼び出しSETUP_ASSETS_TARGETS
てすべてのカスタムターゲットを定義します。
ADD_RESOURCES( target1 some/path pattern1 pattern2 )
ADD_RESOURCES( target1 another/path pattern1 )
ADD_RESOURCES( target2 foo/bar pattern1 )
...
...
SETUP_ASSETS_TARGETS()