根据版本有条件地选择编译器

时间:2020-12-31 09:24:29

标签: c++ cmake

目标

如果版本高于cmake,则让clang++选择10;否则,使用 g++。如果 clang++ 低于 10 且默认 g++ 低于 10.1,请使用 g++-10 (REQUIRED)。

这是为了实现编译器回退。

背景

正如本 answer 中亲切指出的,应该在 project 关键字之前设置默认编译器。

代替使用

-DCMAKE_CXX_COMPILER=clang++

set(CMAKE_CXX_COMPILER clang++)

我参考答案 here 使用了以下语句:

find_program(CMAKE_CXX_COMPILER
    NAMES $ENV{CXX} clang++ PATHS ENV PATH NO_DEFAULT_PATH)

if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10)
  find_program(CMAKE_CXX_COMPILER
      NAMES $ENV{CXX} g++ PATHS ENV PATH NO_DEFAULT_PATH)
  if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10.1)
    find_program(CMAKE_CXX_COMPILER
      NAMES $ENV{g++-10} g++-10 PATHS ENV PATH NO_DEFAULT_PATH REQUIRED)
  endif()
endif()

问题

g++ 的版本小于 clang++ 时,编译器未设置为 10,但我可以检查 cmake 是否通过了分支

if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10)

我不明白这种行为。有没有不使用命令行参数的替代方法?

更新

提出这个问题是为了承认不鼓励在 CMakeLists.txt 中设置编译器的事实。

@KamilCuk 提出了两种实现我所说的方法,如果他们愿意,可以采纳这些建议。

这就是我所做的。

TL;DR

不要在 CMakeLists.txt 中指定编译器。

我的建议

这与我之前在这个问题中所做的相反。

我从 CMakeLists.txt 中删除了所有配置逻辑,并决定创建一个 shell 文件来提取编译器版本并选择合适的编译器。这种配置方式非常有名,可以在许多流行的存储库中找到,例如 ImageMagicktensorflow

1 个答案:

答案 0 :(得分:0)

如果你想在 cmake 中编写逻辑,你可以写一些东西:

cmake_minimum_required(VERSION 3.11)

# Before project()!!!
execute_process(COMMAND clang++ --version OUTPUT_VARIABLE result)
string(REGEX REPLACE "[^0-9]* ([0-9]+).*" "\\1" clang_version "${result}") # extract the version with some regex
execute_process(COMMAND g++ --version OUTPUT_VARIABLE result)
string(REGEX REPLACE "[^0-9]* ([0-9]+).*" "\\1" gcc_version "${result}") # extract the version with some regex
# write your super condition here and set CMAKE_CXX_COMPILER depending on it
set(CMAKE_CXX_COMPILER g++)
if (gcc_version LESS 10)
    set(CMAKE_CXX_COMPILER clang++)
endif()


project(blabla) # uses CMAKE_CXX_COMPILER and configures cmake

您也可以使用 include(CMakeDetermineCXXCompiler) 来确定版本,或者使用来自 CMakeCXXCompilerId.cpp.in 的 cmake 模板文件来自 CMakeDetermineCXXCompiler 内部使用的 cmake 安装路径。

相关问题