summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
Diffstat (limited to 'source')
-rw-r--r--source/compiler-core/slang-gcc-compiler-util.cpp86
1 files changed, 60 insertions, 26 deletions
diff --git a/source/compiler-core/slang-gcc-compiler-util.cpp b/source/compiler-core/slang-gcc-compiler-util.cpp
index 971416ddb..c897f5492 100644
--- a/source/compiler-core/slang-gcc-compiler-util.cpp
+++ b/source/compiler-core/slang-gcc-compiler-util.cpp
@@ -7,10 +7,37 @@
#include "../core/slang-io.h"
#include "../core/slang-shared-library.h"
+#include "../core/slang-char-util.h"
namespace Slang
{
+static Index _findVersionEnd(const UnownedStringSlice& in)
+{
+ Index numDots = 0;
+ const Index len = in.getLength();
+
+ for (Index i = 0; i < len; ++i)
+ {
+ const char c = in[i];
+ if (CharUtil::isDigit(c))
+ {
+ continue;
+ }
+ if (c == '.')
+ {
+ if (numDots >= 2)
+ {
+ return i;
+ }
+ numDots++;
+ continue;
+ }
+ return i;
+ }
+ return len;
+}
+
/* static */SlangResult GCCDownstreamCompilerUtil::parseVersion(const UnownedStringSlice& text, const UnownedStringSlice& prefix, DownstreamCompiler::Desc& outDesc)
{
List<UnownedStringSlice> lines;
@@ -18,38 +45,42 @@ namespace Slang
for (auto line : lines)
{
- if (line.startsWith(prefix))
+ Index prefixIndex = line.indexOf(prefix);
+ if (prefixIndex < 0)
{
- const UnownedStringSlice remainingSlice = UnownedStringSlice(line.begin() + prefix.getLength(), line.end()).trim();
- const Index versionEndIndex = remainingSlice.indexOf(' ');
- if (versionEndIndex < 0)
- {
- return SLANG_FAIL;
- }
+ continue;
+ }
- const UnownedStringSlice versionSlice(remainingSlice.begin(), remainingSlice.begin() + versionEndIndex);
+ const UnownedStringSlice remainingSlice = UnownedStringSlice(line.begin() + prefixIndex + prefix.getLength(), line.end()).trim();
- // Version is in format 0.0.0
- List<UnownedStringSlice> split;
- StringUtil::split(versionSlice, '.', split);
- List<Int> digits;
+ const Index versionEndIndex = _findVersionEnd(remainingSlice);
+ if (versionEndIndex < 0)
+ {
+ return SLANG_FAIL;
+ }
- for (auto v : split)
- {
- Int version;
- SLANG_RETURN_ON_FAIL(StringUtil::parseInt(v, version));
- digits.add(version);
- }
+ const UnownedStringSlice versionSlice(remainingSlice.begin(), remainingSlice.begin() + versionEndIndex);
- if (digits.getCount() < 2)
- {
- return SLANG_FAIL;
- }
+ // Version is in format 0.0.0
+ List<UnownedStringSlice> split;
+ StringUtil::split(versionSlice, '.', split);
+ List<Int> digits;
- outDesc.majorVersion = digits[0];
- outDesc.minorVersion = digits[1];
- return SLANG_OK;
+ for (auto v : split)
+ {
+ Int version;
+ SLANG_RETURN_ON_FAIL(StringUtil::parseInt(v, version));
+ digits.add(version);
+ }
+
+ if (digits.getCount() < 2)
+ {
+ return SLANG_FAIL;
}
+
+ outDesc.majorVersion = digits[0];
+ outDesc.minorVersion = digits[1];
+ return SLANG_OK;
}
return SLANG_FAIL;
@@ -64,6 +95,8 @@ SlangResult GCCDownstreamCompilerUtil::calcVersion(const String& exeName, Downst
ExecuteResult exeRes;
SLANG_RETURN_ON_FAIL(ProcessUtil::execute(cmdLine, exeRes));
+ // Note we now have builds that add other words in front of the version
+ // such as "Ubuntu clang version"
const UnownedStringSlice prefixes[] =
{
UnownedStringSlice::fromLiteral("clang version"),
@@ -89,6 +122,7 @@ SlangResult GCCDownstreamCompilerUtil::calcVersion(const String& exeName, Downst
return SLANG_OK;
}
}
+
return SLANG_FAIL;
}
@@ -594,7 +628,7 @@ static SlangResult _parseGCCFamilyLine(const UnownedStringSlice& line, LineParse
{
// Make STD libs available
cmdLine.addArg("-lstdc++");
- // Make maths lib available
+ // Make maths lib available
cmdLine.addArg("-lm");
}