CMake:如何使execute_process等待子目录完成?

时间:2019-07-03 05:19:10

标签: cmake

我的部分源代码是由一个工具生成的,该工具也在我们的主项目中使用add_subdirectory构建。我们使用execute_process命令执行此工具。显然,如果在到达execute_process语句之前未构建该工具,它将失败。

我使用GLOB(file(GLOB...))查找生成的源文件。之所以这样做,是因为无法事先知道生成了多少个文件,也不知道它们的名称。

如何强制cmake在执行过程之前等待子项目被编译?我需要DEPENDS这样的execute_process属性,但是此选项不可用。

# This subproject will source generator the tool
add_subdirectory(generator)


# I need something like: wait_for(generator)
execute_process(COMMAND generator ${CMAKE_SOURCE_DIR}/src)

file(GLOB GeneratedSources ${CMAKE_SOURCE_DIR}/src/*.cpp)
add_executable(mainprject.exe ${ProcessorSourceFiles}

2 个答案:

答案 0 :(得分:1)

命令execute_process配置阶段立即执行其COMMAND。因此,在使用add_executable命令创建可执行文件之后,无法对其进行安排:该可执行文件仅在 build 阶段构建。

您还需要在配置阶段构建子项目。例如。与

execute_process(COMMAND ${CMAKE_COMMAND}
    -S ${CMAKE_SOURCE_DIR}/generator
    -B ${CMAKE_BINARY_DIR}/generator
    -G ${CMAKE_GENERATOR}
    )

execute_process(COMMAND ${CMAKE_COMMAND}
    --build ${CMAKE_BINARY_DIR}/generator
    )

第一个命令调用cmake来配置位于${CMAKE_SOURCE_DIR}/generator目录下的'generator'项目。使用-G选项,我们为子项目使用与主项目相同的CMake生成器。

第二个命令将构建该项目,因此它将生成generator可执行文件。

创建generator可执行文件后,可以将其用于您的项目:

execute_process(COMMAND ${CMAKE_BINARY_DIR}/generator/<...>/generator ${CMAKE_SOURCE_DIR}/src)

这里您需要将绝对路径传递给generator可执行文件作为COMMAND的第一个参数:CMake不再具有generator可执行文件目标,因此它不会自动替换其路径。

答案 1 :(得分:0)

您将需要使用目标依赖关系对其进行建模。工具“发电机”应该是cmake目标。在这种情况下,请使用add_custom_target而不是像execute_process这样的东西:

add_custom_target(generate_sources ALL COMMAND generator ${CMAKE_SOURCE_DIR}/src))

然后使用add_dependencies将目标依赖项添加到“生成器”中:

add_dependencies(generate_sources generator)

这将确保运行该工具的目标“ generate_sources”仅在编译目标“生成器”之后的构建过程中运行。

以下内容为错误,请参阅评论以获取更多信息:

使用add_dependencies将依赖项从“ mainproject.exe”添加到“ generate_sources”。现在,我从未测试过此内容,因此请稍作尝试:对于CMake比3.12版本更新的情况,根据file上的条目,您应该能够将文件命令更改为:

file(GLOB GeneratedSources CONFIGURE_DEPENDS ${CMAKE_SOURCE_DIR}/src/*.cpp)

据我解释,如果目录更改,它将在构建期间重新分配文件。