【问题标题】:Conditionally select compiler based on its version根据版本有条件地选择编译器
【发布时间】:2020-12-31 09:24:29
【问题描述】:

目标

如果clang++的版本高于10,则使cmake选择clang++;否则,使用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()

问题

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

if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10)

我不明白这种行为。在不使用命令行参数的情况下是否有任何替代方法?

更新

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

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

这就是我所做的。

TL;DR

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

我的建议

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

我从CMakeLists.txt 中删除了所有配置逻辑,并决定创建一个shell 文件来提取编译器版本并选择合适的编译器。这种配置方式相当有名,在ImageMagicktensorflow等很多流行的仓库中都能找到。

【问题讨论】:

  • 想象一下没有CMAKE_CXX_COMPILER_VERSION。你会怎么得到它?您必须自己编写代码,CMAKE_CXX_COMPILER_VERSION 设置之后编译器已被选择
  • @KamilCuk 我刚刚发现CMAKE_CXX_COMILER_VERSIONproject 之前什么都没有打印出来。你是绝对正确的。我必须提供命令行参数来指定编译器吗?
  • 你必须在某处写出你想写的逻辑

标签: c++ cmake


【解决方案1】:

如果你想在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 安装路径。

【讨论】:

  • 我可以验证CMakeDetermineCXXCompiler 是否与configure_file 有关吗?
  • 为什么不只是browse it's source。它是 cmake 提供和使用的众多模块之一。 configure_file 我认为在 CMAKE_DETERMINE_COMPILER_ID 内部调用 CMakeDetermineCompilerId.cmake
猜你喜欢
  • 2017-12-31
  • 1970-01-01
  • 1970-01-01
  • 2014-07-28
  • 1970-01-01
  • 2016-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多