自动重新编译:如果CMake客户端项目依赖于单独的CMake库,如何让客户端项目重新构建其依赖项?

时间:2015-08-04 10:57:36

标签: cmake libraries

随着代码库的增长,在不同的存储库之间组织它是有意义的,每个存储库都是一个单独的CMake管理项目。

由于模块化,这通常意味着您最终会遇到CMake管理的项目应用程序依赖于另一个CMake管理的项目 Library ,而两者都是内部的代码(即由您的结构拥有和维护的代码)。

自动依赖重新编译问题

然后,如果 Library 中的某些源被修改,则需要重新编译它以构建 Application 。问题是:

是否可以使用“build Application ”命令(IDE中的按钮,或在命令行上调用make)来首先重建 Library < / em>如果 Library 文件发生变化?

2 个答案:

答案 0 :(得分:1)

我建议使用ExternalProject_Add命令。

不同版本的文档略有变化:

如果您在获取正确的依赖关系时遇到问题,this线程可能会对您有所帮助。

答案 1 :(得分:0)

通过查看OpenChemistry parent-project如何做到这一点,并通过 normanius 的回答确认,结果证明这可以通过相对较少的CMake脚本代码来实现。

事实证明,CMake CLI提供了针对目标构建系统的“构建”操作的抽象。见--build option
可以将ExternalProject_Add视为直接从CMake脚本使用此CLI界面的包装器。

想象一下,有一个CMake管理的存储库,构建 libuseful ,以及一个单独的CMake管理的存储库,构建 appawesome 并依赖于 libuseful

find_package(libuseful CONFIG) # The usual way to find a dependency

# appawesome is the executable we are building, it depends on libuseful
add_executable(appawesome main.cpp)
target_link_libraries(appawesome libuseful)

添加自动重建

然后可以系统地构建 appawesome ,首先尝试使用以下代码重建 libuseful

ExternalProject_Add(EP_libuseful)
    SOURCE_DIR <libuseful_sourcedir>  # containing libuseful's root CMakeLists.txt
    BINARY_DIR <libuseful_binarydir>  # containing libuseful's CMakeCache.txt
    BUILD_ALWAYS 1                    # Always rebuild libuseful
)

add_dependencies(libuseful EP_libuseful)

最后一行非常重要:find_package()在配置模式下应该使 libuseful 导入目标可用。对ExternalProject_Add的调用使构建目标EP_libuseful可用(这是一个自定义构建步骤,构建 libuseful )。最后一行只是确保 libuseful 取决于它的构建步骤。