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
。