我有一个项目A,它导出一个静态库作为目标:
install(TARGETS alib DESTINATION lib EXPORT project_a-targets)
install(EXPORT project_a-targets DESTINATION lib/alib)
Run Code Online (Sandbox Code Playgroud)
现在我想将项目A用作项目B的外部项目并包含其构建目标:
ExternalProject_Add(project_a
URL ...project_a.tar.gz
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/project_a
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
)
include(${CMAKE_CURRENT_BINARY_DIR}/lib/project_a/project_a-targets.cmake)
Run Code Online (Sandbox Code Playgroud)
问题是当运行项目B的CMakeLists时,包含文件尚不存在.
有没有办法让include依赖于正在构建的外部项目?
假设我有一个由几个子项目A,B,C,D组成的项目 ...... 所有子项目都依赖于A,它经常变化.此外,可能有一些进一步的依赖关系:在这个例子中,d依赖于B.
现在:很多人正在研究这些项目.主CMakeLists.txt文件应包含所有目录,以便构建all构建所有目录.但人们也希望能够只在其中一个项目上工作,而不必每次都构建/安装所有项目.
如果我正在研究D,我可以通过调用轻松构建"仅"D
cmake --build . --target D -- -j7
Run Code Online (Sandbox Code Playgroud)
要么
ninja -j7 D
Run Code Online (Sandbox Code Playgroud)
如果他们的某些东西发生了变化,这也将构建A和B. 完善.
但是如何在不触发构建全部的情况下仅为D调用安装?如果我打电话,我想这样:
ninja -j7 D install
Run Code Online (Sandbox Code Playgroud)
它只构建D(和依赖项),然后只安装D 及其依赖项(A和B). 相反,它构建目标all并安装所有.
我想保持目标所有人都在继续建设.所以EXCLUDE_FROM_ALL不是一个选项.但是朝那个方向走,我找不到任何解决办法.
所以我在考虑以下策略:
它会起作用吗?有没有更好的解决方案?
我们希望避免每个人都必须编辑主CMakeLists.txt文件以排除他不感兴趣的项目.解决方案应该可以移植到不同的操作系统.
编辑:
我尝试了我提出的策略,但它不起作用:在我的情况下,为目标设置一个install语句(即使指定为OPTIONAL)也会使EXCLUDE_FROM_ALL无效.在文档中更好地阅读我发现:
Installing a target with EXCLUDE_FROM_ALL set to true has undefined behavior.
Run Code Online (Sandbox Code Playgroud)
我也收到这个警告:
Target <targetname> has EXCLUDE_FROM_ALL set and will not be built by default but an install rule has been provided for it. CMake does not define behavior for this …Run Code Online (Sandbox Code Playgroud)