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 c7dc5142b5
and df7ecfc4a7)
This commit is contained in:
Rémi Verschelde 2020-02-26 13:23:37 +01:00
parent c34b351b24
commit 75164169c4
3 changed files with 23 additions and 16 deletions

View File

@ -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)

View File

@ -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

View File

@ -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'])