CMake:是否保证自定义目标在库的依赖项前执行?
CMake构建顺序依赖问题解答
问题背景
项目结构如下:
my_project_dir libs/ third-party-lib/ configure.sh CMakeLists.txt CMakeLists.txt
my_project/libs/third-party-lib/CMakeLists.txt内容:
... add_library(lib_inner) add_library(lib) target_link_libraries(lib PRIVATE lib_inner) ...
my_project_dir/CMakeLists.txt内容:
add_executable(my_exe) add_custom_target(configure_third_party_lib ALL COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/libs/third-party-lib/config.sh ) add_dependencies(lib configure_third_party_lib) target_link_libraries(my_exe PRIVATE lib)
疑问
CMake是否保证以下构建顺序?
configure_third_party_liblib_innerlibmy_exe
还是可能出现以下顺序?
lib_innerconfigure_third_party_liblibmy_exe
已知add_dependencies可保证configure_third_party_lib在lib之前执行,但不清楚lib的依赖项lib_inner的相关规则。
解答
CMake无法保证第一种顺序,第二种顺序是完全可能出现的。
原因如下:
add_dependencies(lib configure_third_party_lib)仅建立了configure_third_party_lib与lib之间的前置依赖:CMake会确保configure_third_party_lib在lib开始构建前完成,但这个约束不会传递给lib的依赖项。- 通过
target_link_libraries(lib PRIVATE lib_inner),CMake仅保证lib_inner在lib之前构建,但没有任何规则约束lib_inner和configure_third_party_lib之间的执行顺序。两者属于并行的前置任务,CMake可能会根据系统资源、构建策略任意安排它们的执行顺序。
如果configure_third_party_lib生成的文件是lib_inner构建所必需的,那么当前的CMake配置存在缺陷,必须显式为lib_inner添加依赖:
add_dependencies(lib_inner configure_third_party_lib)
这样才能确保configure_third_party_lib在lib_inner和lib之前执行,进而保证第一种构建顺序。
内容的提问来源于stack exchange,提问作者Павел Романюк
相关产品推荐
相关产品推荐

