【问题标题】:CMake call add_subdirectory within custom commandCMake 在自定义命令中调用 add_subdirectory
【发布时间】:2020-05-28 14:34:31
【问题描述】:

我正在使用生成 C++ 和 CMakeLists.txt 文件的代码生成器,遗憾的是我无法在我的主 CMakeLists.txt 文件中使用它来进行测试。

例如,您有以下 CMakeLists.txt 文件:

project(SomeProject CXX C)

add_custom_command(OUTPUT ${SRCS}
    COMMAND ${CODEGEN_CLI_PATH} -i "${INPUT}" -o "${OUT}"
    COMMENT "Generating sources"
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
    VERBATIM
)

add_custom_target(CODEGEN
    DEPENDS
    ${SRCS}
)

# Needs to be executed after the custom command
add_subdirectory(${GENERATED_CMAKE_LISTS_LOCATION})

只有在为特定目标(例如CODEGEN)执行自定义命令后,是否可以使用add_subdirectory 等函数?

我已经尝试通过在现有自定义命令中添加额外的行来执行它:

    COMMAND ${CMAKE_COMMAND} -D DIR=${GENERATED_CMAKE_LISTS_LOCATION} -P add_subdirectories.cmake

不幸的是,这不起作用,因为它不允许在脚本模式下执行像 add_subdirectory 这样的函数。

我无法从位于同一文件中的add_custom_command 调用自定义函数(正在执行add_subdirectory)。

【问题讨论】:

    标签: cmake dependencies


    【解决方案1】:

    不,这是不可能的。 add_subdirectory 命令在配置步骤期间运行,而CODEGEN 是在构建期间运行的目标。

    你似乎做错了什么,所以我能给你的唯一建议是使用execute_process 命令来运行你需要的命令。 execute_process命令是在配置阶段执行的,所以它可以在add_subdirectory之前生成你需要的文件。

    但是,请再次描述您的问题,您为什么希望 CMake 这样做。

    【讨论】:

    • 感谢您的回答 - 为了澄清您的问题,这是使用 Google Test 正确测试生成的代码并使其在 CI/CD 环境中工作的唯一方法。将其与测试可执行文件链接时,我需要有可用的依赖库。
    • 如果我没记错的话,execute_process 让我费了一番脑筋,因为这东西似乎是异步运行的。这意味着,它似乎是并行运行的。你确定execute_process 是表达依赖的好结构吗?
    • @typelogic 与什么并行?
    【解决方案2】:

    我有一个巨大的固定 unsigned char 数组,我编译成一个静态库。我解决它的方法是:

    if(NOT EXISTS ${PATH_TO_FOLDER}/smeagol.a)
        add_subdirectory(smeagol)
    endif()
    

    我仍在寻找一种更好的功夫方式来使用 cmake。我觉得它就在那里,一旦我找到它,我会更新这个答案。

    【讨论】:

    • cmake 内部发生了某种并行化
    猜你喜欢
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多