如何在CMake中设置编译器优先级

3

我正在制作一个模板CMake文件,用于以后的项目。 我本人非常喜欢使用clang,但我不想强迫每个使用我的项目的人也使用clang。 最好的情况是如果clang不存在,它可以简单地使用任何编译器。
我找到了以下代码行,但在我的测试中似乎没有起作用。

set(CMAKE_C_COMPILER_NAMES clang gcc icc cc)
set(CMAKE_CXX_COMPILER_NAMES clang++ g++ icpc c++ cxx)

以下是按照优先次序排序的最佳方式:

  1. clang
  2. gcc
  3. 安装了什么就使用什么

1
CMake通常可以适用于任何编译器,因此如果您想选择Clang,则应在cmake -D命令行选项中将Clang设置为编译器,如此处所建议的那样。我不会强加编译器偏好于项目中的其他人,只需让CMake为其环境选择最佳编译器即可。我不确定您在哪里看到这些变量,例如CMAKE_CXX_COMPILER_NAMES,但它们不是像CMAKE_CXX_COMPILER一样的特殊CMake变量。 - Kevin
这个问题很有价值。例如,我现在正在构建能够同时使用gcc和clang编译的代码,但是具有广泛支持clang属性的功能,以便检查线程锁定等。大多数人只使用cmake && make,所以如果代码在gcc之前选择clang将非常有益。 - fuzzyTew
2个回答

2
您应该让CMake使用用户已配置的编译器,或者他们配置为默认值的编译器,或者系统默认使用的编译器。在CMakeLists.txt中添加编译器选择代码是不划算的。
如果您知道程序不能与特定的编译器一起工作,您可以检查并显示警告消息。
作为用户,您可以指定CCCXX环境变量来选择编译器,或者CMAKE_<LANG>_COMPILER变量来覆盖前者。

1
我无法将clang配置为默认编译器,因为默认设置是为了取悦我的老板。对于我的个人项目,我想要覆盖这些默认设置,但又不会干扰其他人的工作,至少在我构建一些工具之前是这样的。 - Stefan Schmelz

0

我发现在初始的project()行之前必须设置变量:

cmake_minimum_required(VERSION 3.12)

set(CMAKE_C_COMPILER_NAMES clang gcc icc cc)
set(CMAKE_CXX_COMPILER_NAMES clang++ g++ icpc c++ cxx)

project(foo C CXX)

如果您访问执行此操作的文件的源代码, 您可以看到它加载特定于系统的配置文件来设置这些变量。通过包含这些文件并重用其结果,您可能能够使您的解决方案更兼容:

cmake_minimum_required(VERSION 3.12)

include(Platform/${CMAKE_SYSTEM_NAME}-Determine-C OPTIONAL)
include(Platform/${CMAKE_SYSTEM_NAME}-C OPTIONAL)
set(CMAKE_C_COMPILER_NAMES clang gcc icc cc ${CMAKE_C_COMPILER_NAMES})

include(Platform/${CMAKE_SYSTEM_NAME}-Determine-CXX OPTIONAL)
include(Platform/${CMAKE_SYSTEM_NAME}-CXX OPTIONAL)
set(CMAKE_CXX_COMPILER_NAMES clang++ g++ icpc c++ cxx ${CMAKE_CXX_COMPILER_NAMES})

project(foo C CXX)

但建议进一步审查CMake的内部结构,并与CMake开发人员沟通该问题,因为未来CMake实现的更改可能会改变其功能。如果您打开一个问题,并与他们讨论使用情况,他们可能会提供最佳解决方案。然后,他们将考虑该解决方案以进行进一步代码改进,从而使其具有更好的兼容性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接