project

设置项目名称。

概要

project(<PROJECT-NAME> [<language-name>...])
project(<PROJECT-NAME>
        [VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
        [DESCRIPTION <project-description-string>]
        [HOMEPAGE_URL <url-string>]
        [LANGUAGES <language-name>...])

设置项目名称,并将其存储在变量 PROJECT_NAME 中。当从顶层 CMakeLists.txt 调用时,还会将项目名称存储在变量 CMAKE_PROJECT_NAME 中。

还设置了以下变量

PROJECT_SOURCE_DIR, <PROJECT-NAME>_SOURCE_DIR

项目源目录的绝对路径。

PROJECT_BINARY_DIR, <PROJECT-NAME>_BINARY_DIR

项目二进制目录的绝对路径。

PROJECT_IS_TOP_LEVEL, <PROJECT-NAME>_IS_TOP_LEVEL

版本 3.21 中新增。

布尔值,指示项目是否为顶层项目。

更多变量通过下面“选项”中描述的可选参数设置。如果未提供选项,则其对应的变量将设置为空字符串。

请注意,`<name>_SOURCE_DIR` 和 `<name>_BINARY_DIR` 形式的变量也可能在调用 `project()` 之前由其他命令设置(例如,请参阅 FetchContent_MakeAvailable() 命令)。项目不应依赖于在 `project()` 调用或其子作用域之外的特定值来保持 `<PROJECT-NAME>_SOURCE_DIR` 或 `<PROJECT-NAME>_BINARY_DIR`。

在版本 3.30 中更改: 当调用 `project(<PROJECT-NAME> ...)` 时,如果 `<PROJECT-NAME>_SOURCE_DIR`、`<PROJECT-NAME>_BINARY_DIR` 和 `<PROJECT-NAME>_IS_TOP_LEVEL` 已设置为普通变量,则会通过调用进行更新。具有相同名称的缓存条目始终像以前一样设置。有关详细信息,请参阅 3.30.3、3.30.4 和 3.30.5 的发行说明。

在版本 3.31 中更改: `<PROJECT-NAME>_SOURCE_DIR`、`<PROJECT-NAME>_BINARY_DIR` 和 `<PROJECT-NAME>_IS_TOP_LEVEL` 始终由 `project(<PROJECT-NAME> ...)` 设置为普通变量。请参阅策略 CMP0180。具有相同名称的缓存条目始终像以前一样设置。

选项

选项包括

VERSION <version>

可选;除非策略 CMP0048 设置为 `NEW`,否则可能不会使用。

接受由非负整数组件组成的 `<version>` 参数,即 `<major>[.<minor>[.<patch>[.<tweak>]]]`,并设置以下变量

版本 3.12 中新增: 当从顶层 CMakeLists.txt 调用 `project()` 命令时,版本也会存储在变量 CMAKE_PROJECT_VERSION 中。

DESCRIPTION <project-description-string>

版本 3.9 中新增。

可选。设置以下变量

为 `<project-description-string>`。建议此描述是一个相对较短的字符串,通常不超过几个词。

当从顶层 CMakeLists.txt 调用 `project()` 命令时,描述也会存储在变量 CMAKE_PROJECT_DESCRIPTION 中。

版本 3.12 中新增: 添加了 `<PROJECT-NAME>_DESCRIPTION` 变量。

HOMEPAGE_URL <url-string>

版本 3.12 中新增。

可选。设置以下变量

为 `<url-string>`,它应该是项目的规范主页 URL。

当从顶层 `CMakeLists.txt` 调用 `project()` 命令时,URL 也会存储在变量 CMAKE_PROJECT_HOMEPAGE_URL 中。

LANGUAGES <language-name>...

可选。也可以根据第一个简短签名指定,而无需 `LANGUAGES` 关键字。

选择构建项目所需的编程语言。

支持的语言包括 `C`、`CXX` (即 C++)、`CSharp` (即 C#)、`CUDA`、`OBJC` (即 Objective-C)、`OBJCXX` (即 Objective-C++)、`Fortran`、`HIP`、`ISPC`、`Swift`、`ASM`、`ASM_NASM`、`ASM_MARMASM`、`ASM_MASM` 和 `ASM-ATT`。

版本 3.8 中新增: 添加了 `CSharp` 和 `CUDA` 支持。

版本 3.15 中新增: 添加了 `Swift` 支持。

版本 3.16 中新增: 添加了 `OBJC` 和 `OBJCXX` 支持。

版本 3.18 中新增: 添加了 `ISPC` 支持。

版本 3.21 中新增: 添加了 `HIP` 支持。

版本 3.26 中新增: 添加了 `ASM_MARMASM` 支持。

如果启用 `ASM`,请将其放在最后,以便 CMake 可以检查其他语言(如 `C`)的编译器是否也适用于汇编。

默认情况下,如果未提供任何语言选项,则启用 `C` 和 `CXX`。指定语言 `NONE`,或使用 `LANGUAGES` 关键字且不列出任何语言,以跳过启用任何语言。

通过 `VERSION`、`DESCRIPTION` 和 `HOMEPAGE_URL` 选项设置的变量旨在用作包元数据和文档中的默认值。

代码注入

用户可以定义许多变量,以指定在执行 `project()` 命令期间在不同点包含的文件。以下概述了 `project()` 调用期间执行的步骤

  • 版本 3.15 中新增: 对于每个 `project()` 调用,无论项目名称如何,都包含由 CMAKE_PROJECT_INCLUDE_BEFORE 命名的文件和模块(如果已设置)。

  • 版本 3.17 中新增: 如果 `project()` 命令将 `<PROJECT-NAME>` 指定为其项目名称,则包含由 CMAKE_PROJECT_<PROJECT-NAME>_INCLUDE_BEFORE 命名的文件和模块(如果已设置)。

  • 设置上面“概要”和“选项”部分中详述的各种项目特定变量。

  • 仅对于第一个 `project()` 调用

    • 如果 CMAKE_TOOLCHAIN_FILE 已设置,则至少读取一次。它可能会被多次读取,也可能在稍后启用语言时再次读取(见下文)。

    • 设置描述主机和目标平台的变量。语言特定的变量可能在此刻设置,也可能不设置。在第一次运行时,唯一可能定义的语言特定变量是工具链文件可能已设置的变量。在后续运行时,可能会设置从先前运行缓存的语言特定变量。

    • 版本 3.24 中新增: 包含 CMAKE_PROJECT_TOP_LEVEL_INCLUDES 中列出的每个文件(如果已设置)。之后 CMake 将忽略该变量。

  • 启用调用中指定的任何语言,或者如果没有提供任何语言,则启用默认语言。首次启用语言时,可能会重新读取工具链文件。

  • 版本 3.15 中新增: 对于每个 `project()` 调用,无论项目名称如何,都包含由 CMAKE_PROJECT_INCLUDE 命名的文件和模块(如果已设置)。

  • 如果 `project()` 命令将 `<PROJECT-NAME>` 指定为其项目名称,则包含由 CMAKE_PROJECT_<PROJECT-NAME>_INCLUDE 命名的文件和模块(如果已设置)。

用法

项目的顶层 `CMakeLists.txt` 文件必须包含对 `project()` 命令的文字直接调用;通过 include() 命令加载一个是不够的。如果不存在此类调用,CMake 将发出警告,并假装顶部有一个 `project(Project)` 来启用默认语言(`C` 和 `CXX`)。

注意

在顶层 `CMakeLists.txt` 的顶部附近调用 `project()` 命令,但 *在* 调用 cmake_minimum_required() *之后*。在调用其他命令之前建立版本和策略设置非常重要,因为它们的行为可能会受到影响,因此,如果未保持此顺序,`project()` 命令将发出警告。另请参阅策略 CMP0000