我有一个有很多选项的大库,我最近从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
将不会检测子目录预设。
问题是如何从顶层调用指定预设,甚至在库内的CMakelists中提供默认的?
审判# 1
我发现默认预设的想法被拒绝了(https://gitlab.kitware.com/cmake/cmake/-/issues/21417)
审判# 2
我试着在顶部添加CMakePresets.json
,并在my_lib
中包含一个,它工作了。
在顶层运行cmake --list-presets
现在可以找到预设。
我想知道是否有其他解决方案?
正如您在问题帖子"试用#2"中所指出的,是的,您可以在CMakePresets之后include
其他json文件。CMakePresets. json模式。json文件。有关更多信息,请参阅有关include的文档。下面是文档中的一个示例:
{ ... "include": [ "otherThings.json", "moreThings.json" ], ... }
所以正如你所发现的,你可以保留你的主要CMakePresets。在项目的根目录中创建一个包含子目录1的文件,或者你可以用另一种方式来做:把你的主目录放在项目的根目录中,然后创建一个只包含子目录1的文件。
如果您想为根目录和子目录生成构建系统,这可能很有用。也就是说,你希望你的子目录的CMake配置能够被用作一个独立的项目。在这种情况下,你可以让它成为根项目的git子模块,或者为项目的各个部分的用户使用一个单线程结构。
如果你要用git子模块,那么你不能放一个主CMakePresets。并将其包含在子模块中,因为子模块repo应该是独立的,而不知道是什么将它用作子模块。在这种情况下,你可以把主CMakePresets。Json在repo中被用作子模块,或者只是做两个"副本"。相同的CMakePresets。Json文件-每个repo一个。
如果你想有一个实用程序CMakePreset。json文件中包含多个repos使用的常见内容,您可以使用该实用程序文件创建一个repo,并将该repo作为子模块包含到所有其他repos,然后使用CMakePresets。json的"include"
机制将这些实用程序预设配置拉到repo自己的CMakePresets中。json文件。