CMake 的哪个文件组织?CMakeLists.txt 是否应该包含其他文件?

Ale*_*eph 1 cmake

我使用 CMake 来配置、构建和安装 C++ 代码。我已经定义了一些用户选项。我添加了一个选项,让 CMake 下载外部依赖项。等等等等。

目前,有关 CMake 的所有内容都写在单个文件 CMakeLists.txt 中。还有一个配置文件“config.cmake”,它允许用户定义各种参数,例如详细级别、库路径、编译器标志等。

什么是 CMake 的良好文件组织?CMakeLists.txt 文件是否应该分成子文件?

非常感谢您的帮助!

sta*_*ker 5

一个好的文件组织取决于你的 CMake 逻辑有多大,或者你期望它有多大。通常来说,一般来说:

  1. 可能会被大量重用的功能,您可能希望组织成“每个主题”的 .cmake 文件,其中包含宏,并将它们包含在其他 CMakeLists.txt 文件中以加载该功能。你会在网上找到很多这些(例如,用于定位特定系统库的自定义 Find*.cmake 文件很常见。)一个常见的约定是在你的顶级源目录中有一个目录“CMake”,尽管其他配置也是可能的。

  2. 如果您有许多不同的构建目标,它们都有自己独特的源文件(例如,单个项目中有多个库),最好将它们分成子目录,每个子目录有一个 CMakeLists.txt 文件,顶级 CMakeLists.txt 文件。 txt 文件使用 add_subdirectory 将它们“挂钩”到主构建。

项目的“典型”结构可能如下所示:

project/
        CMakeLists.txt
        README
        CMake/
           FindSpecialtyLib1.cmake
           FindSpecialtyLib2.cmake
           CustomCMakeMacroA.cmake
              etc...
        include/
           CMakeLists.txt (for installing headers, etc. if needed.)
        src/
           CMakeLists.txt (top level switching logic per user settings, etc.)
           lib1/
              CMakeLists.txt
              src1.cxx
              src2.cxx
           lib2/
              CMakeLists.txt
              src1.cxx
              src2.c
              private_header.h
Run Code Online (Sandbox Code Playgroud)

当然,这只是一个假设的例子 - 您需要根据您的特定项目来塑造您的逻辑。由于您提到了 config.cmake 文件,因此可能值得一提的是,根据我的经验,大多数此类变量设置通常是在 cmake-gui 或 CMake 命令行中的 -D 定义中完成的。config.cmake 可以作为对选项进行分组的一种方式,但大多数用户在设置内容时可能会从 gui 开始。我还建议查看CMake 电子邮件档案中的特定问题 - 我发现它是一个非常有用的资源。