我应该如何在可选支持 CUDA 的 CMake 项目中指定语言?

How should I specify the language in a CMake project that optionally supports CUDA?

我正在向 CMake 项目添加可选的 CUDA 功能。现在,该项目被组织为一个可执行文件和一些静态库。在顶级 CMakeLists.txt 文件中有一个 project 语句,如下所示:

project (my_project LANGUAGES CXX)

下面有一个 option 语句添加参数来规范是否使用 CUDA 功能进行构建

option(CUDA_FEATS "Set to On to use CUDA features" ON)

我不确定正确的做法是什么。我应该:

或者完全不同的东西?在这些情况下,最佳做法是什么?

使用 enable_language 命令,它非常不言自明:

cmake_minimum_required(VERSION 3.20)
project(my_project)

option(CUDA_FEATS "Set to On to use CUDA features" ON)
if (CUDA_FEATS)
    enable_language(CUDA)
endif ()

在那之后,如果 CUDA_FEATS 为真,那么您肯定已经启用了 CUDA 语言,找到了编译器等


解决您的部分解决方案:

Should I:

  • Edit the top project statement to add CUDA

不,因为您不需要 CUDA。如果您的项目没有 CUDA 编译器就无法构建,这是正确的做法,但是当它是可选的时,您不应该搜索您可能不会使用的 CUDA 编译器(特别是因为如果找不到它会出现致命错误! ).

  • Add, after the CUDA_FEATS option is set, a statement like project (my_project LANGUAGES CXX CUDA) (could this conflict with the initial one?)

我认为这在技术上可行,只是因为 project 恰好在内部调用 enable_language,但它很臭。

  • Only put the project statement after the parameter has been set

策略设置和 project/language 检测功能 非常重要,应始终在顶级 CMakeLists.txt 的开头配置它们。这意味着前两行应该是 cmake_minimum_requiredproject,中间或之前没有代码。我想不出任何违反此规则的情况在现代 CMake 中都是硬性要求。