Cmake 向自定义目标添加依赖项
我需要一种向自定义目标添加其他依赖项的方法。我有一个宏,用于将资源文件添加到特定项目中,如下所示:Cmake 向自定义目标添加依赖项,cmake,Cmake,我需要一种向自定义目标添加其他依赖项的方法。我有一个宏,用于将资源文件添加到特定项目中,如下所示: ADD_RESOURCES( ${TARGET} some/path pattern1 pattern2 ) ADD_RESOURCES( ${TARGET} another/path pattern1 ) 我创建了一个名为${target}\u ASSETS的目标,并希望将所有这些资源的生成附加到一个目标添加依赖项但是只接受其他目标。因此,如果我通过add_custom_命令生成文件,我不能将
ADD_RESOURCES( ${TARGET} some/path pattern1 pattern2 )
ADD_RESOURCES( ${TARGET} another/path pattern1 )
我创建了一个名为${target}\u ASSETS
的目标,并希望将所有这些资源的生成附加到一个目标<代码>添加依赖项但是只接受其他目标。因此,如果我通过add_custom_命令
生成文件,我不能将其用作依赖项
解决方法可能是为每次调用
ADD\u RESOURCES
创建一个新的自定义标记集,然后将其附加到资产目标。但是,每个目标都需要一个唯一的名称,而这并不是从ADD_RESOURCES的参数生成此唯一名称的方法。一个解决方法是推迟生成${target}\u资产
自定义目标,直到所有依赖项都已通过调用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()
然后添加另一个helper宏,该宏通过反射确定所有定义的目标依赖变量,并为每个目标设置自定义目标:
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()
我知道这是一个迟来的答案,但我为每个搜索此问题的人发布了我的解决方案:
function(target_resources THIS)
if (NOT TARGET ${THIS}_res)
# this is just a pseudo command which can be appended later
add_custom_command(OUTPUT ${THIS}_dep COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR})
# add a dependency with a target, as a command itself can not be a dependency
add_custom_target(${THIS}_res DEPENDS ${THIS}_dep)
add_dependencies(${THIS} ${THIS}_res)
endif ()
get_target_property(RUNTIME_OUTPUT_DIRECTORY ${THIS} RUNTIME_OUTPUT_DIRECTORY)
foreach (RES_FILE IN LISTS ARGN)
if (IS_ABSOLUTE ${RES_FILE})
file(RELATIVE_PATH PATH ${CMAKE_CURRENT_SOURCE_DIR} ${RES_FILE})
endif ()
# append the resource command with our resource
add_custom_command(OUTPUT ${THIS}_dep
COMMAND ${CMAKE_COMMAND} -E copy
${CMAKE_CURRENT_SOURCE_DIR}/${RES_FILE}
${RUNTIME_OUTPUT_DIRECTORY}/${RES_FILE}
APPEND)
endforeach ()
endfunction()
此解决方案的好处是不依赖全局变量,也不需要调用设置宏。我想到了这种方法。它可以工作,但我希望我不需要最后一步(有人最终会忘记它,想知道为什么它不工作)。公平地说,我可能需要最后一步(需要的远不止是设置这些资源)。
因此,如果我通过add_custom_命令生成一个文件,我不能将其用作依赖项。
没问题,只需依赖于此文件的add_custom_target()
。问题是目标需要一个名称,一个唯一的名称,我多次调用同一个宏。您可以这样定义ADD_RESOURCES
,它的调用方式如下:ADD_RESOURCES(${TARGET}“some/path pattern1 pattern2”“other/path pattern1”)
。或者你因为某种原因不能这样做?我可能可以,但是语法开始变得混乱,甚至更容易出错。真的吗?您更喜欢添加可执行文件(foo foo.c)
,添加可执行文件(foo bar.c)
,添加可执行文件(foo baz.c)
而不是添加可执行文件(foo foo.c bar.c baz.c)
?只需将每组参数放在新行上。