如何将命令追加到CMake中add_custom_target的指令中

6
假设我在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()

还有更好的方法吗?


"还有更好的方法吗?" -> 使用CTest(https://gitlab.kitware.com/cmake/community/wikis/doc/ctest/Testing-With-CTest) - R2RT
1个回答

7
你可以使用 add_custom_command 并将其作为目标的依赖项。通过自定义命令,您可以使用相同的 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了解人工源代码文件属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接