【问题标题】:Controlling which targets are built with CMake add_subdirectory()控制使用 CMake add_subdirectory() 构建的目标
【发布时间】:2018-12-12 08:27:26
【问题描述】:

我在使用 add_subdirectory() 时遇到问题,即我无法控制实际使用它构建的目标 - 似乎只是相当于 make all。我可能误用了 add_subdirectory(),但据我了解,它可用于构建依赖项。我正在出售一些我的项目所依赖的库,并且在我的项目的 CMakeLists.txt 中,我为每个出售的项目添加了 add_subdirectory()(都有自己的 CMakeLists.txt)。

因为我是交叉编译,我不想构建这些库使用的任何二进制文件。在一种情况下,我还需要另一个不是由 ALL 目标在一个依赖项中构建的目标。据我所知, add_subdirectory() 无法做到这一点。有没有办法做到这一点,我错过了?有没有更好的 CMake 命令可以替代使用?

我之前通过仅使用我感兴趣的目标对每个依赖项调用 cmake/make 来使用 shell 脚本,但我正在尝试将其移至仅支持通过 CMake 调用的 Android Studio。

编辑:这很糟糕,但我正在考虑使用 add_custom_target 手动调用 cmakecmake --build 以便我可以像以前一样精确控制构建。

【问题讨论】:

  • 据我了解,CMake 为子目录中的每个目标创建单独的make 目标。你不必为此做任何额外的事情。当您运行make 时,尝试执行make <target_name>,其中<target_name> 是您在子目录中创建的目标之一。
  • I don't want to build any binaries used by these libraries. - 如果子项目支持通过参数禁用这些二进制文件,请在调用add_subdirectory 之前设置这些参数(使用set(... CACHE ...))。 I also need another target that's not built by the ALL target in one dependency. - 就在您在 ALL 期间构建的目标之一和非 ALL 目标之间的 add_dependency。您可以通过检查 CMAKE_CROSSCOMPILING CMake 变量来检测交叉编译。

标签: cmake


【解决方案1】:

add_subdirectory 命令支持EXCLUDE_FROM_ALL 选项,该选项可防止在子目录中创建的目标包含在父目录的ALL 目标中。要仅构建所需的供应商目标,请为您自己的项目目标添加目标级别的依赖项。

【讨论】:

  • 如何为通过 add_subdirectory 拉入的另一个外部项目构建所需的目标?
猜你喜欢
  • 1970-01-01
  • 2021-05-29
  • 1970-01-01
  • 2018-10-28
  • 2012-10-15
  • 2018-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多