现代 CMake:有没有办法使用 CMakePresets.json 构建外部项目?

Modern CMake: is there a way to build external projects using a CMakePresets.json?

免责声明:我对 C++ 开发和处理更大的项目比较陌生,所以这可能是错误的方法或工具,所以我对不同的想法非常开放。

我希望能够提供一种软件包,它是针对不同平台的预构建库/二进制文件的集合,可与我们的其他软件一起使用。

我需要能够在不破坏任何东西的情况下独立地添加或删除目标。(例如,添加一个新库应该像创建一个新目录一样简单libname并在里面配置一个CMakePresets.json)

理想情况下,我的想法是:

所以,我的想法是这样的:

├── A
│   └── CMakePresets.txt
├── B
│   └── CMakePresets.txt
├── C
│   └── CMakePresets.txt
└── CMakeLists.txt (or something like a python script)

A B 和 C 是我的依赖项以及我想要构建它们的方式,通过使用根目录中的脚本。

我花了一些时间试图找出一种干净利落地跨平台执行此操作的方法,但无济于事。 由于 FetchContent / ExternalProject_Add 命令,我考虑过使用 CMakeLists.txt,但还没有真正找到一种传递变量的方法,这种方法并不乏味。

这很令人沮丧,因为这看起来应该是比较常见的事情,但我觉得我错过了什么...

也许我应该使用类似 Python 脚本的东西来完成某些任务(例如克隆源、复制新目录中的预设并从那里构建),但我真的很喜欢这个想法用 CMake 做所有事情,考虑到它可以处理很多我想要的事情(克隆特定的 git 标签等)

谢谢

您刚刚描述了 Conan 的目标和方法。它与 CMake 接口良好,并使用您的“构建配方”方法。你和柯南认识到 C++ 包与 Python 或 Javascript 在本质上是不同的,因为它们因编译器版本、libc 版本、构建配置等而有无穷无尽的变化。解决方案是提供构建指令,并在多层缓存构建结果:本地机器、私有服务器、public 服务器。

结果是您指定了具有所需版本的包。如果与您指定的配置匹配,将只下载该包,否则将构建并缓存它。通过正确的 CI 设置,您可以将结果上传到您的内部服务器,这样在大多数情况下,必要的包都是预先构建的。

上次尝试时,我遇到了传递依赖性等一些问题,您可能会发现自己为所有需要的包维护构建配方的内部分支,以便您可以控制那些传递依赖性.