首页 > 解决方案 > 如何在 CMake 中将命令附加到 add_custom_target

问题描述

假设我在 CMake 中有一个用于单元测试的自定义目标,如下所示

 add_custom_target(
      test
      COMMAND ${CMAKE_CURRENT_BINARY_DIR}/ATest
      COMMAND ${CMAKE_CURRENT_BINARY_DIR}/BTest
      COMMAND ${CMAKE_CURRENT_BINARY_DIR}/CTest
      COMMAND ${CMAKE_CURRENT_BINARY_DIR}/DTest)

但我想根据是否找到外部依赖项向目标添加额外的测试。目前,我用

if(EXTERNAL_FOUND)
  add_custom_target(
      test
      COMMAND ${CMAKE_CURRENT_BINARY_DIR}/ATest
      COMMAND ${CMAKE_CURRENT_BINARY_DIR}/BTest
      COMMAND ${CMAKE_CURRENT_BINARY_DIR}/CTest
      COMMAND ${CMAKE_CURRENT_BINARY_DIR}/DTest
      COMMAND ${CMAKE_CURRENT_BINARY_DIR}/ETest)
else()
  add_custom_target(
      test
      COMMAND ${CMAKE_CURRENT_BINARY_DIR}/ATest
      COMMAND ${CMAKE_CURRENT_BINARY_DIR}/BTest
      COMMAND ${CMAKE_CURRENT_BINARY_DIR}/CTest
      COMMAND ${CMAKE_CURRENT_BINARY_DIR}/DTest)
endif()

这不是很优雅,当有多种条件时,它很快就会变得难以管理。是否有类似附加到自定义目标的东西,所以我们可以写下面的内容?

add_custom_target(
      test
      COMMAND ${CMAKE_CURRENT_BINARY_DIR}/ATest
      COMMAND ${CMAKE_CURRENT_BINARY_DIR}/BTest
      COMMAND ${CMAKE_CURRENT_BINARY_DIR}/CTest
      COMMAND ${CMAKE_CURRENT_BINARY_DIR}/DTest)

if(EXTERNAL_FOUND)
  # I can't seem to find something like this
  append_custom_target(test COMMAND ${CMAKE_CURRENT_BINARY_DIR}/ETest)
else()

还是有更好的方法来做到这一点?

标签: cmake

解决方案


您可以使用add_custom_command并将其用作目标的依赖项。使用自定义命令,您可以APPEND使用相同的命令OUTPUT

add_custom_target(
    test
    DEPENDS test-cmd
)
add_custom_command(
    OUTPUT test-cmd
    COMMAND ${CMAKE_COMMAND} -E echo "ATest"
    COMMAND ${CMAKE_COMMAND} -E echo "BTest"
    COMMAND ${CMAKE_COMMAND} -E echo "CTest"
    COMMAND ${CMAKE_COMMAND} -E echo "DTest"
)
if(EXTERNAL_FOUND)
    add_custom_command(
        OUTPUT test-cmd APPEND
        COMMAND ${CMAKE_COMMAND} -E echo "ETest"
    )
endif()

# test-cmd is not actually generated so set it to symbolic
set_source_files_properties(test-cmd PROPERTIES SYMBOLIC "true")

有关人工源文件属性,请参见SYMBOLIC


推荐阅读