根据正在构建的整个项目,CMake add_custom_target

Rus*_*lop 8 cmake

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

我会在make中写这个:

all: foo bar

foo: ...
bar: ...

test: all
    test.sh
Run Code Online (Sandbox Code Playgroud)

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

这就是我期望在cmake中指定它的方式.

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

add_custom_target(test test.sh
              DEPENDS all
)
Run Code Online (Sandbox Code Playgroud)

然而,由于没有所有目标,这不起作用.

有没有办法指定这个?或者是否有一个变量扩展到我想要构建的所有目标?

sak*_*kra 9

从版本2.8开始,CMake不提供包含所有目标列表的变量.你能做的最好是覆盖内置的命令add_library,并add_executable与调用内置的那些和跟踪所有定义的目标变量中自定义宏.

您甚至可以为自定义宏使用相同的名称.这样您就不必对所有现有add_library和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})
Run Code Online (Sandbox Code Playgroud)

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