]> git.tdb.fi Git - builder.git/blobdiff - source/microsofttools.cpp
Add drivers for the MSVC toolchain
[builder.git] / source / microsofttools.cpp
diff --git a/source/microsofttools.cpp b/source/microsofttools.cpp
new file mode 100644 (file)
index 0000000..05edda5
--- /dev/null
@@ -0,0 +1,79 @@
+#include <msp/core/algorithm.h>
+#include <msp/fs/dir.h>
+#include <msp/strings/format.h>
+#include <msp/strings/utils.h>
+#include "builder.h"
+#include "externaltask.h"
+#include "logger.h"
+#include "microsofttools.h"
+#include "msvcarchiver.h"
+#include "msvccompiler.h"
+#include "msvclinker.h"
+#include "sysutils.h"
+
+using namespace std;
+using namespace Msp;
+
+MicrosoftTools::MicrosoftTools(Builder &builder, const Architecture &arch)
+{
+       find_vc_bin_dir(builder, arch);
+       find_windows_sdk_dir(builder);
+
+       add_tool(new MsvcCompiler(builder, arch, "CC", *this));
+       add_tool(new MsvcCompiler(builder, arch, "CXX", *this));
+       add_tool(new MsvcLinker(builder, arch, *this));
+       add_tool(new MsvcArchiver(builder, arch, *this));
+}
+
+void MicrosoftTools::find_vc_bin_dir(Builder &builder, const Architecture &arch)
+{
+       FS::Path program_files_x86 = get_program_files_x86_dir();
+
+       ExternalTask::Arguments argv;
+       argv.push_back((program_files_x86/"Microsoft Visual Studio"/"Installer"/"vswhere.exe").str());
+       argv.push_back("-latest");
+       argv.push_back("-property");
+       argv.push_back("installationPath");
+
+       builder.get_logger().log("auxcommands", format("Running %s", join(argv.begin(), argv.end())));
+
+       string output = ExternalTask::run_and_capture_output(argv, FS::Path(), true);
+       FS::Path vs_path = strip(output);
+
+       builder.get_logger().log("tools", format("Visual Studio found in %s", vs_path));
+
+       FS::Path vc_version_fn = vs_path/"VC"/"Auxiliary"/"Build"/"Microsoft.VCToolsVersion.v142.default.txt";
+       builder.get_logger().log("files", format("Reading %s", vc_version_fn));
+       char buffer[256];
+       unsigned len = IO::File(vc_version_fn.str()).read(buffer, sizeof(buffer));
+       string vc_version = strip(string(buffer, len));
+
+       builder.get_logger().log("tools", format("Detected MSVC version %s", vc_version));
+
+       const Architecture &native_arch = builder.get_native_arch();
+       string host = (native_arch.get_bits()==64 ? "Hostx64" : "Hostx86");
+       string target = (arch.get_bits()==64 ? "x64" : "x86");
+
+       vc_base_dir = vs_path/"VC"/"Tools"/"MSVC"/vc_version;
+       vc_bin_dir = vc_base_dir/"bin"/host/target;
+}
+
+void MicrosoftTools::find_windows_sdk_dir(Builder &builder)
+{
+       win_sdk_dir = get_registry_value<string>("HKLM\\SOFTWARE\\WOW6432Node\\Microsoft\\Microsoft SDKs\\Windows\\v10.0\\InstallationFolder");
+       if(win_sdk_dir.empty())
+               win_sdk_dir = get_program_files_x86_dir()/"Windows Kits"/"10";
+
+       builder.get_logger().log("files", format("Traversing %s", win_sdk_dir/"include"));
+       vector<string> sdk_versions = FS::list_filtered(win_sdk_dir/"include", "^10\\.");
+       if(sdk_versions.empty())
+       {
+               builder.get_logger().log("problems", "No Windows SDK versions found");
+               return;
+       }
+
+       sort(sdk_versions);
+       win_sdk_version = sdk_versions.back();
+
+       builder.get_logger().log("tools", format("Windows SDK version %s found in %s", win_sdk_version, win_sdk_dir));
+}