CMake自定义命令一直执行

3
在我的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个回答

2
add_custom_commandOUTPUT 选项并不保证生成的文件被放置在指定位置,它只是告诉 CMake 生成的文件应该被放置在那里。很可能你的 Python 脚本会生成相对路径下的文件,所以它们只会被放置在 CMake 的二进制目录(即构建文件夹)的某个地方。因此,尽管你的文件可能已经正确生成,但是你的自定义目标无法看到它们,因为它正在查找 CMAKE_CURRENT_SOURCE_DIR。因此,自定义目标将始终触发自定义命令重新运行。
默认情况下,CMake 从 CMAKE_CURRENT_BINARY_DIR 运行 add_custom_command,但你可以通过添加 WORKING_DIRECTORY 选项来更改它的运行位置为 CMAKE_CURRENT_SOURCE_DIR。这样,生成的文件将被放置在预期的位置,并实现你想要的行为。可以尝试像这样做:
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)

0

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

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


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