我应该如何在可选支持 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)
我不确定正确的做法是什么。我应该:
- 编辑顶部
project
语句以添加 CUDA
- 在设置
CUDA_FEATS
选项后,添加一条类似project (my_project LANGUAGES CXX CUDA)
的语句(会不会和前面的冲突?)
- 参数设置后只放
project
语句
或者完全不同的东西?在这些情况下,最佳做法是什么?
使用 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_required
和 project
,中间或之前没有代码。我想不出任何违反此规则的情况在现代 CMake 中都是硬性要求。
我正在向 CMake 项目添加可选的 CUDA 功能。现在,该项目被组织为一个可执行文件和一些静态库。在顶级 CMakeLists.txt
文件中有一个 project
语句,如下所示:
project (my_project LANGUAGES CXX)
下面有一个 option
语句添加参数来规范是否使用 CUDA 功能进行构建
option(CUDA_FEATS "Set to On to use CUDA features" ON)
我不确定正确的做法是什么。我应该:
- 编辑顶部
project
语句以添加 CUDA - 在设置
CUDA_FEATS
选项后,添加一条类似project (my_project LANGUAGES CXX CUDA)
的语句(会不会和前面的冲突?) - 参数设置后只放
project
语句
或者完全不同的东西?在这些情况下,最佳做法是什么?
使用 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_required
和 project
,中间或之前没有代码。我想不出任何违反此规则的情况在现代 CMake 中都是硬性要求。