随着代码库的增长,在不同的存储库之间组织它是有意义的,每个存储库都是一个单独的CMake管理项目。
由于模块化,这通常意味着您最终会遇到CMake管理的项目应用程序依赖于另一个CMake管理的项目 Library ,而两者都是内部的代码(即由您的结构拥有和维护的代码)。
然后,如果 Library 中的某些源被修改,则需要重新编译它以构建 Application 。问题是:
是否可以使用“build Application ”命令(IDE中的按钮,或在命令行上调用make
)来首先重建 Library < / em>如果 Library 文件发生变化?
答案 0 :(得分:1)
答案 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 取决于它的构建步骤。