我的部分源代码是由一个工具生成的,该工具也在我们的主项目中使用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}
答案 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)
据我解释,如果目录更改,它将在构建期间重新分配文件。