summaryrefslogtreecommitdiffstats
path: root/source/core/windows
diff options
context:
space:
mode:
Diffstat (limited to 'source/core/windows')
-rw-r--r--source/core/windows/slang-win-visual-studio-util.cpp52
-rw-r--r--source/core/windows/slang-win-visual-studio-util.h15
2 files changed, 62 insertions, 5 deletions
diff --git a/source/core/windows/slang-win-visual-studio-util.cpp b/source/core/windows/slang-win-visual-studio-util.cpp
index b7de7607c..2fdf7e400 100644
--- a/source/core/windows/slang-win-visual-studio-util.cpp
+++ b/source/core/windows/slang-win-visual-studio-util.cpp
@@ -40,9 +40,33 @@ struct VersionInfo
const char* name; ///< The name of the registry key
};
+
+
+class WinVisualStudioCompiler : public CPPCompiler
+{
+public:
+ typedef CPPCompiler Super;
+
+ Result WinVisualStudioCompiler::compile(const CompileOptions& options, ExecuteResult& outRes) SLANG_OVERRIDE
+ {
+ CommandLine cmdLine;
+ WinVisualStudioUtil::calcArgs(options, cmdLine);
+ return WinVisualStudioUtil::executeCompiler(m_versionPath, cmdLine, outRes);
+ }
+ /// Ctor
+ WinVisualStudioCompiler(const Desc& desc, const WinVisualStudioUtil::VersionPath& versionPath) :
+ Super(desc),
+ m_versionPath(versionPath)
+ {
+ }
+
+ WinVisualStudioUtil::VersionPath m_versionPath;
+};
+
} // anonymous
+
static SlangResult _readRegistryKey(const char* path, const char* keyName, String& outString)
{
// https://docs.microsoft.com/en-us/windows/desktop/api/winreg/nf-winreg-regopenkeyexa
@@ -277,6 +301,26 @@ static SlangResult _find(int versionIndex, WinVisualStudioUtil::VersionPath& out
return SLANG_FAIL;
}
+/* static */SlangResult WinVisualStudioUtil::find(CPPCompilerSet* set)
+{
+ const int versionCount = SLANG_COUNT_OF(s_versionInfos);
+
+ for (int i = versionCount - 1; i >= 0; --i)
+ {
+ const auto& versionInfo = s_versionInfos[i];
+ auto desc = getDesc(versionInfo.version);
+
+ VersionPath versionPath;
+ if (!set->getCompiler(desc) && SLANG_SUCCEEDED(_find(i, versionPath)))
+ {
+ RefPtr<WinVisualStudioCompiler> compiler = new WinVisualStudioCompiler(desc, versionPath);
+ set->addCompiler(compiler);
+ }
+ }
+
+ return SLANG_OK;
+}
+
/* static */SlangResult WinVisualStudioUtil::executeCompiler(const VersionPath& versionPath, const CommandLine& commandLine, ExecuteResult& outResult)
{
// To invoke cl we need to run the suitable vcvars. In order to run this we have to have MS CommandLine.
@@ -336,11 +380,11 @@ static SlangResult _find(int versionIndex, WinVisualStudioUtil::VersionPath& out
}
}
-/* static */void WinVisualStudioUtil::calcArgs(const CPPCompileOptions& options, CommandLine& cmdLine)
+/* static */void WinVisualStudioUtil::calcArgs(const CPPCompiler::CompileOptions& options, CommandLine& cmdLine)
{
- typedef CPPCompileOptions::OptimizationLevel OptimizationLevel;
- typedef CPPCompileOptions::TargetType TargetType;
- typedef CPPCompileOptions::DebugInfoType DebugInfoType;
+ typedef CPPCompiler::OptimizationLevel OptimizationLevel;
+ typedef CPPCompiler::TargetType TargetType;
+ typedef CPPCompiler::DebugInfoType DebugInfoType;
// https://docs.microsoft.com/en-us/cpp/build/reference/compiler-options-listed-alphabetically?view=vs-2019
diff --git a/source/core/windows/slang-win-visual-studio-util.h b/source/core/windows/slang-win-visual-studio-util.h
index e8afbf418..b7e1c8a85 100644
--- a/source/core/windows/slang-win-visual-studio-util.h
+++ b/source/core/windows/slang-win-visual-studio-util.h
@@ -30,6 +30,9 @@ struct WinVisualStudioUtil
/// Given a version find it's path
static SlangResult find(Version version, VersionPath& outPath);
+ /// Find and add to the set (if not already there)
+ static SlangResult find(CPPCompilerSet* set);
+
/// Run visual studio on specified path with the parameters specified on the command line. Output placed in outResult.
static SlangResult executeCompiler(const VersionPath& versionPath, const CommandLine& commandLine, ExecuteResult& outResult);
@@ -46,7 +49,17 @@ struct WinVisualStudioUtil
static void append(Version version, StringBuilder& outBuilder);
/// Calculate the command line args
- static void calcArgs(const CPPCompileOptions& options, CommandLine& cmdLine);
+ static void calcArgs(const CPPCompiler::CompileOptions& options, CommandLine& cmdLine);
+
+ /// Get version as desc
+ static CPPCompiler::Desc getDesc(Version version)
+ {
+ CPPCompiler::Desc desc;
+ desc.type = CPPCompiler::Type::VisualStudio;
+ desc.majorVersion = Int(version) / 10;
+ desc.minorVersion = Int(version) % 10;
+ return desc;
+ }
};