CMake add_custom_target 取决于正在构建的整个项目

2024-04-11

我想添加一个依赖于成功构建的整个项目的测试目标,而无需重新指定对所有库或可执行文件的依赖关系。

我会在 make 中将其写为:

all: foo bar

foo: ...
bar: ...

test: all
    test.sh

test.sh 隐式使用 foo 和 bar 并希望它们是最新的。

这就是我希望在 cmake 中指定它的方式。

add_library(foo ...)
add_executable(bar ...)

add_custom_target(test test.sh
              DEPENDS all
)

然而,这不起作用,因为没有所有目标。

有没有办法指定这一点?或者是否有一个变量可以扩展到我试图构建的所有目标?


从版本 2.8 开始,CMake 不提供保存所有目标列表的变量。您能做的最好的事情就是覆盖内置命令add_library and add_executable使用自定义宏调用内置宏并跟踪变量中所有定义的目标。

您甚至可以对自定义宏使用相同的名称。这样您就不必对所有现有的进行更改add_library and add_executable来电。如果您覆盖其中任何命令,原始内置命令将带有下划线前缀:

set (_allTargets "")

macro(add_library _target)
    _add_library (${_target} ${ARGN})
    list (APPEND _allTargets ${_target})
endmacro()

macro(add_executable _target)
    _add_executable (${_target} ${ARGN})
    list (APPEND _allTargets ${_target})
endmacro()

add_library(liba STATIC liba.cpp)
add_executable(main liba main.cpp)

add_custom_target(test "${CMAKE_CURRENT_SOURCE_DIR}/test.sh")

add_dependencies(test ${_allTargets})

另请注意,您无法使用以下命令将目标依赖项添加到自定义目标DEPENDS选项。DEPENDS只能引用现有文件或使用生成的文件add_custom_command(...)在同一目录中。要添加目标依赖项,请使用add_dependencies命令代替。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CMake add_custom_target 取决于正在构建的整个项目 的相关文章

随机推荐