相关疑难解决方法(0)

CMake:如何构建外部项目并包含其目标

我有一个项目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依赖于正在构建的外部项目?

cmake external-project

95
推荐指数
4
解决办法
8万
查看次数

使用cmake从复杂项目中仅安装一个目标(及其依赖项)(打开更好的解决方案)

假设我有一个由几个子项目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不是一个选项.但是朝那个方向走,我找不到任何解决办法.

所以我在考虑以下策略:

  • 除子项目A外,所有其他目标都设置为EXCLUDE_FROM_ALL,安装时可选.
  • 我添加了一个额外的子项目,它只是依赖于所有其他子项目(也许我通过使用PARENT_SCOPE中设置的一些变量使每个目标发布其名称),人们将不得不在他们想要构建和安装所有内容时调用它.

它会起作用吗?有没有更好的解决方案?

我们希望避免每个人都必须编辑主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)

cmake ninja

12
推荐指数
4
解决办法
1万
查看次数

标签 统计

cmake ×2

external-project ×1

ninja ×1