diff options
author | kraptor <david.anes@suse.com> | 2022-07-18 21:24:39 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-07-18 21:24:39 +0200 |
commit | efcb89fa702da5bd5d2cf000ace759df90152895 (patch) | |
tree | 04cea5eda625d510fac1ce67d87fbb957f58e3c8 /compiler | |
parent | d934ba93262f466673728ea570159c96dcdf831c (diff) | |
download | Nim-efcb89fa702da5bd5d2cf000ace759df90152895.tar.gz |
Correctly detect major version of GCC (#20059)
We were doing a very poor job detecting the major version of GCC by parsing the output of --version. This patches uses -dumpversion to make this parsing straightforward and it also fixes a bunch of compiling issues on different platforms with custom output for --version switches. For example, openSUSE first line of the output includes the revision number and the parsing that was being done did mix that number with the major version and breaks building the nim compiler (as it doesn't find the 3 dots for an X.Y.Z semver format, hence returning "false"). In this patch, we simply use -dumpversion (which has been at least from 1993, so we are safe :)
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/extccomp.nim | 26 |
1 files changed, 6 insertions, 20 deletions
diff --git a/compiler/extccomp.nim b/compiler/extccomp.nim index 23c43cb67..6d306d0e6 100644 --- a/compiler/extccomp.nim +++ b/compiler/extccomp.nim @@ -14,7 +14,7 @@ import ropes, platform, condsyms, options, msgs, lineinfos, pathutils, modulepaths -import std/[os, strutils, osproc, sha1, streams, sequtils, times, strtabs, json, jsonutils, sugar] +import std/[os, strutils, osproc, sha1, streams, sequtils, times, strtabs, json, jsonutils, sugar, parseutils] when defined(nimPreviewSlimSystem): import std/syncio @@ -525,26 +525,12 @@ proc ccHasSaneOverflow*(conf: ConfigRef): bool = result = false # assume an old or crappy GCC var exe = getConfigVar(conf, conf.cCompiler, ".exe") if exe.len == 0: exe = CC[conf.cCompiler].compilerExe - let (s, exitCode) = try: execCmdEx(exe & " --version") except: ("", 1) + # NOTE: should we need the full version, use -dumpfullversion + let (s, exitCode) = try: execCmdEx(exe & " -dumpversion") except: ("", 1) if exitCode == 0: - var i = 0 - var j = 0 - # the version is the last part of the first line: - while i < s.len and s[i] != '\n': - if s[i] in {' ', '\t'}: j = i+1 - inc i - if j > 0: - var major = 0 - while j < s.len and s[j] in {'0'..'9'}: - major = major * 10 + (ord(s[j]) - ord('0')) - inc j - if i < s.len and s[j] == '.': inc j - while j < s.len and s[j] in {'0'..'9'}: - inc j - if j+1 < s.len and s[j] == '.' and s[j+1] in {'0'..'9'}: - # we found a third version number, chances are high - # we really parsed the version: - result = major >= 5 + var major: int + discard parseInt(s, major) + result = major >= 5 else: result = conf.cCompiler == ccCLang |