CMake 的文件组织是什么? CMakeLists.txt 应该包含其他文件吗?
Which file organization for CMake? Should CMakeLists.txt include other files?
我使用 CMake 配置、构建和安装 C++ 代码。
我已经定义了一些用户选项。
我添加了一个选项让 CMake 下载外部依赖项。
等等等等
目前,关于 CMake 的所有内容都写在一个文件中 CMakeLists.txt。还有一个配置文件 'config.cmake' 允许用户定义各种参数,例如详细级别、库路径、编译器标志等
什么是适合 CMake 的文件组织?
CMakeLists.txt 文件应该分成子文件吗?
非常感谢您的帮助!
一个好的文件组织取决于您的 CMake 逻辑有多大,或者您希望它变得有多大。一般来说:
可能会被大量重复使用的功能您可能希望组织成 "per topic" 包含宏的 .cmake 文件,并将它们包含在其他 CMakeLists.txt 文件中以加载该功能。你会在网上找到很多这样的东西(例如,用于定位特定系统库的自定义 Find*.cmake 文件非常常见。)一个常见的约定是在你的顶层源中有一个目录 "CMake"目录,尽管其他配置也是可能的。
如果你有很多不同的构建目标,它们都有自己独特的源文件(例如,单个项目中的多个库),最好将它们分成子目录并有一个 [=每个子目录 32=] 文件,顶层 CMakeLists.txt 文件使用 add_subdirectory 到 "hook them in" 到主构建。
项目的 "typical" 结构可能如下所示:
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
当然,这只是一个假设的例子——您需要根据您的具体项目来调整您的逻辑。由于您提到了 config.cmake 文件,因此可能值得一提的是,根据我的经验,大多数此类变量设置通常是在 cmake-gui 中或从 CMake 命令行的 -D 定义中完成的。 config.cmake 用作对选项进行分组的一种方式,但大多数用户在设置内容时可能会从 gui 开始。我还建议查看 CMake email archives 以了解具体问题 - 我发现它是非常有用的资源。
我使用 CMake 配置、构建和安装 C++ 代码。 我已经定义了一些用户选项。 我添加了一个选项让 CMake 下载外部依赖项。 等等等等
目前,关于 CMake 的所有内容都写在一个文件中 CMakeLists.txt。还有一个配置文件 'config.cmake' 允许用户定义各种参数,例如详细级别、库路径、编译器标志等
什么是适合 CMake 的文件组织? CMakeLists.txt 文件应该分成子文件吗?
非常感谢您的帮助!
一个好的文件组织取决于您的 CMake 逻辑有多大,或者您希望它变得有多大。一般来说:
可能会被大量重复使用的功能您可能希望组织成 "per topic" 包含宏的 .cmake 文件,并将它们包含在其他 CMakeLists.txt 文件中以加载该功能。你会在网上找到很多这样的东西(例如,用于定位特定系统库的自定义 Find*.cmake 文件非常常见。)一个常见的约定是在你的顶层源中有一个目录 "CMake"目录,尽管其他配置也是可能的。
如果你有很多不同的构建目标,它们都有自己独特的源文件(例如,单个项目中的多个库),最好将它们分成子目录并有一个 [=每个子目录 32=] 文件,顶层 CMakeLists.txt 文件使用 add_subdirectory 到 "hook them in" 到主构建。
项目的 "typical" 结构可能如下所示:
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
当然,这只是一个假设的例子——您需要根据您的具体项目来调整您的逻辑。由于您提到了 config.cmake 文件,因此可能值得一提的是,根据我的经验,大多数此类变量设置通常是在 cmake-gui 中或从 CMake 命令行的 -D 定义中完成的。 config.cmake 用作对选项进行分组的一种方式,但大多数用户在设置内容时可能会从 gui 开始。我还建议查看 CMake email archives 以了解具体问题 - 我发现它是非常有用的资源。