CMake自定义命令始终执行

时间:2019-11-22 12:20:50

标签: cmake

在我的CMakeLists.txt中,定义了一个自定义目标和命令:

add_custom_command(
    OUTPUT
        ${CMAKE_CURRENT_SOURCE_DIR}/input.csv
        ${CMAKE_CURRENT_SOURCE_DIR}/output1.csv
        ${CMAKE_CURRENT_SOURCE_DIR}/output2.csv
    COMMAND python3 
        ${CMAKE_CURRENT_SOURCE_DIR}/tests/genVectors.py)

add_custom_target(TEST_VECTORS
    DEPENDS
        ${CMAKE_CURRENT_SOURCE_DIR}/input.csv
        ${CMAKE_CURRENT_SOURCE_DIR}/output1.csv
        ${CMAKE_CURRENT_SOURCE_DIR}/output2.csv)

add_executable(VectorTest tests/VectorTest.cpp)
add_dependencies(VectorTest TEST_VECTORS)

即使文件存在,它始终会生成新的CSV文件。如果它们不存在,我只需要生成向量(带有genVectors.py python文件)。我的配置有问题吗?

2 个答案:

答案 0 :(得分:1)

add_custom_command的{​​{3}}选项不能保证将生成的文件放在此处;它只是告诉CMake,预期将生成的文件放置在此处。您的python脚本很可能在相对路径下生成文件,因此它们只是被放置在CMake binary 目录(您的构建文件夹)中的某个位置。因此,虽然可以正确生成文件,但是自定义目标在CMAKE_CURRENT_SOURCE_DIR中看不到它们。因此,自定义目标将始终触发自定义命令以重新运行。

默认情况下,CMake从add_custom_command运行CMAKE_CURRENT_BINARY_DIR,但是您可以通过添加CMAKE_CURRENT_SOURCE_DIR选项将其更改为从WORKING_DIRECTORY运行。这样,生成的文件将放置在 expected 位置,并实现您想要的行为。尝试这样的事情:

add_custom_command(
    OUTPUT
        ${CMAKE_CURRENT_SOURCE_DIR}/input.csv
        ${CMAKE_CURRENT_SOURCE_DIR}/output1.csv
        ${CMAKE_CURRENT_SOURCE_DIR}/output2.csv
    COMMAND python3 
        ${CMAKE_CURRENT_SOURCE_DIR}/tests/genVectors.py
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})

add_custom_target(TEST_VECTORS
    DEPENDS
        ${CMAKE_CURRENT_SOURCE_DIR}/input.csv
        ${CMAKE_CURRENT_SOURCE_DIR}/output1.csv
        ${CMAKE_CURRENT_SOURCE_DIR}/output2.csv)

add_executable(VectorTest tests/VectorTest.cpp)
add_dependencies(VectorTest TEST_VECTORS)

答案 1 :(得分:0)

您可以尝试在配置时(即在调用cmake时)生成文件。这样,它将仅创建一次。

您可以删除add_custom_command并使用execute_process创建文件。