From 75164169c43f6dcef237ac9a7bf842598f5f20f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Verschelde?= Date: Wed, 26 Feb 2020 13:23:37 +0100 Subject: [PATCH] SCons: Fix get_compiler_version() to return ints Otherwise comparisons would fail for compiler versions above 10. Also simplified code somewhat to avoid using subprocess too much needlessly. (cherry picked from commits c7dc5142b56b3f52ba9c2746eb4855fae68ed26e and df7ecfc4a7f8403144be2aa49bb47f9ead25926b) --- SConstruct | 8 ++++---- methods.py | 24 ++++++++++++++++-------- platform/x11/detect.py | 7 +++---- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/SConstruct b/SConstruct index 3b7746527f8..39c34737dad 100644 --- a/SConstruct +++ b/SConstruct @@ -350,12 +350,13 @@ if selected_platform in platform_list: # Force to use Unicode encoding env.Append(MSVC_FLAGS=['/utf8']) else: # Rest of the world + version = methods.get_compiler_version(env) or [-1, -1] + shadow_local_warning = [] all_plus_warnings = ['-Wwrite-strings'] if methods.using_gcc(env): - version = methods.get_compiler_version(env) - if version != None and version[0] >= '7': + if version[0] >= 7: shadow_local_warning = ['-Wshadow-local'] if (env["warnings"] == 'extra'): @@ -369,8 +370,7 @@ if selected_platform in platform_list: '-Wduplicated-branches', '-Wduplicated-cond', '-Wstringop-overflow=4', '-Wlogical-op']) env.Append(CXXFLAGS=['-Wnoexcept', '-Wplacement-new=1']) - version = methods.get_compiler_version(env) - if version != None and version[0] >= '9': + if version[0] >= 9: env.Append(CCFLAGS=['-Wattribute-alias=2']) elif (env["warnings"] == 'all'): env.Append(CCFLAGS=['-Wall'] + shadow_local_warning) diff --git a/methods.py b/methods.py index 33b8f1cbe75..6b97acf822b 100644 --- a/methods.py +++ b/methods.py @@ -1,5 +1,4 @@ import os -import os.path import re import glob import subprocess @@ -626,14 +625,23 @@ def detect_darwin_sdk_path(platform, env): raise def get_compiler_version(env): - # Not using this method on clang because it returns 4.2.1 # https://reviews.llvm.org/D56803 - if using_gcc(env): - version = decode_utf8(subprocess.check_output([env['CXX'], '-dumpversion']).strip()) - else: - version = decode_utf8(subprocess.check_output([env['CXX'], '--version']).strip()) - match = re.search('[0-9][0-9.]*', version) + """ + Returns an array of version numbers as ints: [major, minor, patch]. + The return array should have at least two values (major, minor). + """ + if not env.msvc: + # Not using -dumpversion as some GCC distros only return major, and + # Clang used to return hardcoded 4.2.1: # https://reviews.llvm.org/D56803 + try: + version = decode_utf8(subprocess.check_output([env.subst(env['CXX']), '--version']).strip()) + except (subprocess.CalledProcessError, OSError): + print("Couldn't parse CXX environment variable to infer compiler version.") + return None + else: # TODO: Implement for MSVC + return None + match = re.search('[0-9]+\.[0-9.]+', version) if match is not None: - return match.group().split('.') + return list(map(int, match.group().split('.'))) else: return None diff --git a/platform/x11/detect.py b/platform/x11/detect.py index bd5e5e08124..b471ff53d18 100644 --- a/platform/x11/detect.py +++ b/platform/x11/detect.py @@ -180,15 +180,14 @@ def configure(env): env.Append(LINKFLAGS=['-pipe']) # Check for gcc version >= 6 before adding -no-pie + version = get_compiler_version(env) or [-1, -1] if using_gcc(env): - version = get_compiler_version(env) - if version != None and version[0] >= '6': + if version[0] >= 6: env.Append(CCFLAGS=['-fpie']) env.Append(LINKFLAGS=['-no-pie']) # Do the same for clang should be fine with Clang 4 and higher if using_clang(env): - version = get_compiler_version(env) - if version != None and version[0] >= '4': + if version[0] >= 4: env.Append(CCFLAGS=['-fpie']) env.Append(LINKFLAGS=['-no-pie'])