<<Modern CMake>> 翻译 2.4 项目目录结构

本节内容有点跑题。但我认为这是一个很好的方法。 我将告诉你如何规划项目的目录。 这是基于惯例,但将帮助您:

  • 轻松阅读其他按照相同模式的项目,
  • 避免导致冲突的模式,
  • 避免混淆和使构建变得复杂。

首先,如果您的项目被叫做 project,包含一个链接库叫做 lib,一个可执行文件叫做 app, 那么您的文件目录应该类似以下结构:

- project
  - .gitignore
  - README.md
  - LICENCE.md
  - CMakeLists.txt
  - cmake
    - FindSomeLib.cmake
  - include
    - project
      - lib.hpp
  - src
    - CMakeLists.txt
    - lib.cpp
  - apps
    - CMakeLists.txt
    - app.cpp
  - tests
    - testlib.cpp
  - docs
    - Doxyfile.in
  - extern
    - googletest
  - scripts
    - helper.py

名字不是绝对的; 你经常会看到关于 test/ vs. tests/ 的争论, 应用程序文件夹可能被叫做其他名称(对于仅限库的项目不存在)。 您还有时会看到 python 目录用于 python 绑定, 或者一个 CMake 文件夹,来放置 CMake 助手文件,例如 Find<library>.cmake 文件。 但主要文件夹上面都列出来了。

注意一些已经很明显的事情; CMakeLists.txt 文件被分别放置在所有源目录中,但 include 目录中没有。 这是因为您应该能够拷贝 include 目录到 /usr/include 或者类似的地方(配置头文件除外,我将在另一章中介绍), 没有任何额外的文件或导致任何冲突。 这也是为什么在 include 目录中有一层 project 目录的原因。 使用 add_subdirectory 来添加包含 CMakeLists.txt 文件的子目录。

您经常需要一个 cmake 目录来放置所有构造助手模块。 这是你的 Find*.cmake 文件该存放的地方。 一组常见的助手文件可以在这里看到 github.com/CLIUtils/cmake

可以这样将此文件夹添加到 CMake 路径上:

set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})

您的 extern 文件夹应该只包含 git 子模块。 这样,您可以显式控制依赖项的版本,同时可以轻松升级。 有关添加子模块的示例,请参阅“测试”一章。

在你的 .gitignore 中,你应该有一些像这样的东西 /build*, 让用户可以在源代码目录创建编译目录,并在这些目录中构建项目。 一些软件包禁止这样做,但它比做一个真正的源外构建要好得多,因为那样每次构建你必须为你构建的软件包键入不同的命令行。

如果要避免在源文件夹中直接进行构建,你可以将其下面这些行添加到你的 CMakeLists.txt 文件的顶部附近:

### Require out-of-source builds
file(TO_CMAKE_PATH "${PROJECT_BINARY_DIR}/CMakeLists.txt" LOC_PATH)
if(EXISTS "${LOC_PATH}")
    message(FATAL_ERROR "You cannot build in a source directory (or any directory with a CMakeLists.txt file). Please make a build subdirectory. Feel free to remove CMakeCache.txt and CMakeFiles.")
endif()

版权声明:本文为hejiang原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/hejiang/p/11300135.html