我有一个很大的库,里面有很多选项,我最近从 make 转换为 CMake,有很多选项。我使用配置预设来拥有多个配置文件。该库是由我的团队开发的,而在其上构建的应用程序是由其他团队开发的。该库提供通用功能,是应用程序必须使用的。我们试图通过预设提供合理的默认选项。
现在,我想在它的基础上构建一个玩具应用程序。
我有以下目录结构,其中 CMakePresets.json 文件位于子目录中(my_lib/
,实际上是一个 git 子模块)。
main.cpp
CMakeLists.txt // Top-Level CMakeLists
my_lib/
------> lib.c // simplified view of the functionalities here
------> lib.h
------> CMakeLists.txt
------> CMakePresets.json
# Top level CMakeLists.txt
project(toy_app)
add_subdirectory(my_complex_lib)
set(SOURCES main.cpp)
add_executable(toy_app ${SOURCES})
target_link_libraries(toy_app my_lib)
在顶层运行 cmake --list-presets
不会检测子目录预设。
问题是如何从顶级调用中指定预设,甚至在库内的 CMakelist 中提供默认预设?
试验#1
我发现默认预设的想法被拒绝了( https://gitlab.kitware.com/cmake/cmake/-/issues/21417 )
试验#2
我尝试在顶层添加 CMakePresets.json
并将其包含在 my_lib
中,并且成功了。
在顶层运行 cmake --list-presets
可以立即找到预设。
请问还有其他解决办法吗?
最佳答案
正如您在问题帖子“Trial #2”中指出的那样,是的,您可以将遵循 CMakePresets.json 架构的其他 json 文件包含到 CMakePresets.json 文件中。请参阅the docs on includes for more info 。这是文档中的示例:
{ ... "include": [ "otherThings.json", "moreThings.json" ], ... }
因此,正如您所发现的,您可以将主 CMakePresets.json 文件保留在子目录中,并在项目的根目录中创建另一个包含子目录的文件,或者您也可以以相反的方式执行此操作:将主文件放在在项目的根目录中创建一个仅将其包含在子目录中的目录。
如果您想为根目录和子目录生成构建系统,这可能很有用。 IE。您希望子目录的 CMake 配置能够用作独立项目。在这种情况下,您可能会将其设为根项目的 git 子模块,或者为项目各个部分的用户使用 monorepo 结构。
如果您要使用 git 子模块,那么您无法将主 CMakePresets.json 文件放在项目的根目录中并将其包含在子模块中,因为子模块存储库应该独立存在,而不知道它的用途一个子模块。在这种情况下,您可以将主 CMakePresets.json 放在用作子模块的存储库中,或者只制作同一 CMakePresets.json 文件的两个“副本” - 每个存储库一个。
如果您想要一个实用程序 CMakePreset.json 文件,其中包含多个存储库使用的常见内容,您可以仅使用该实用程序文件创建一个存储库,并将该存储库作为子模块包含到所有其他存储库中,然后使用 CMakePresets。 json 的 "include"
机制将这些实用程序预设配置拉入存储库自己的 CMakePresets.json 文件中。
关于cmake - 如何为子目录指定CMake Preset?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75165228/