2

カスタム ターゲットに追加の依存関係を追加する方法が必要です。次のように使用して、特定のプロジェクトにリソース ファイルを追加するマクロがあります。

ADD_RESOURCES( ${TARGET} some/path pattern1 pattern2 )
ADD_RESOURCES( ${TARGET} another/path pattern1 )

というターゲットを作成し、${TARGET}_ASSETSこれらすべてのリソースの生成を 1 つのターゲットにアタッチしたいと考えています。add_dependenciesただし、他のターゲットのみを受け入れます。したがって、を介してファイルを生成した場合、add_custom_commandそれを依存関係として使用することはできません。

回避策は、呼び出しごとに新しいカスタム ターゲットを作成し、それを ASSETSADD_RESOURCESターゲットにアタッチすることです。ただし、各ターゲットには一意の名前が必要であり、ADD_RESOURCES のパラメーターからこの一意の名前を生成する方法はありません。

4

2 に答える 2

1

回避策の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()
于 2012-08-11T17:47:38.043 に答える