现代 CMake:有没有办法使用 CMakePresets.json 构建外部项目?
Modern CMake: is there a way to build external projects using a CMakePresets.json?
免责声明:我对 C++ 开发和处理更大的项目比较陌生,所以这可能是错误的方法或工具,所以我对不同的想法非常开放。
我希望能够提供一种软件包,它是针对不同平台的预构建库/二进制文件的集合,可与我们的其他软件一起使用。
我需要能够在不破坏任何东西的情况下独立地添加或删除目标。(例如,添加一个新库应该像创建一个新目录一样简单libname
并在里面配置一个CMakePresets.json)
理想情况下,我的想法是:
- 为每个依赖项创建一个包含构建说明的存储库
- 有一个 CI/CD 管道构建我们需要的所有不同版本(linux x64,linux ARM,windows)
- 提供平台下载特定版本
所以,我的想法是这样的:
├── 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 设置,您可以将结果上传到您的内部服务器,这样在大多数情况下,必要的包都是预先构建的。
上次尝试时,我遇到了传递依赖性等一些问题,您可能会发现自己为所有需要的包维护构建配方的内部分支,以便您可以控制那些传递依赖性.
免责声明:我对 C++ 开发和处理更大的项目比较陌生,所以这可能是错误的方法或工具,所以我对不同的想法非常开放。
我希望能够提供一种软件包,它是针对不同平台的预构建库/二进制文件的集合,可与我们的其他软件一起使用。
我需要能够在不破坏任何东西的情况下独立地添加或删除目标。(例如,添加一个新库应该像创建一个新目录一样简单libname
并在里面配置一个CMakePresets.json)
理想情况下,我的想法是:
- 为每个依赖项创建一个包含构建说明的存储库
- 有一个 CI/CD 管道构建我们需要的所有不同版本(linux x64,linux ARM,windows)
- 提供平台下载特定版本
所以,我的想法是这样的:
├── 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 设置,您可以将结果上传到您的内部服务器,这样在大多数情况下,必要的包都是预先构建的。
上次尝试时,我遇到了传递依赖性等一些问题,您可能会发现自己为所有需要的包维护构建配方的内部分支,以便您可以控制那些传递依赖性.