]> git.tdb.fi Git - builder.git/commitdiff
Avoid some failures from MicrosoftTools when running on Linux
authorMikko Rasa <tdb@tdb.fi>
Wed, 28 Dec 2022 12:47:49 +0000 (14:47 +0200)
committerMikko Rasa <tdb@tdb.fi>
Wed, 28 Dec 2022 14:11:06 +0000 (16:11 +0200)
Don't try to run vswhere.exe if it isn't found.  If running on WSL, map
its result to the mount location to the Windows drive.

plugins/msvc/microsofttools.cpp

index af435bb2e85d73380343cd3f101bf61d119205e5..0370f455d34b5c6a0bae7c1720bd0fa5de922354 100644 (file)
@@ -4,6 +4,7 @@
 #include <msp/builder/sysutils.h>
 #include <msp/core/algorithm.h>
 #include <msp/fs/dir.h>
+#include <msp/fs/stat.h>
 #include <msp/strings/utils.h>
 #include "microsofttools.h"
 #include "msvcarchiver.h"
@@ -17,7 +18,8 @@ MicrosoftTools::MicrosoftTools(Builder &builder, const Architecture &arch):
        Toolchain("msvc", get_priority(arch))
 {
        find_vc_bin_dir(builder, arch);
-       find_windows_sdk_dir(builder);
+       if(!vc_base_dir.empty())
+               find_windows_sdk_dir(builder);
 
        add_tool(new MsvcCompiler(builder, arch, "CC", *this));
        add_tool(new MsvcCompiler(builder, arch, "CXX", *this));
@@ -29,8 +31,12 @@ void MicrosoftTools::find_vc_bin_dir(Builder &builder, const Architecture &arch)
 {
        FS::Path program_files_x86 = get_program_files_x86_dir();
 
+       FS::Path vswhere = program_files_x86/"Microsoft Visual Studio"/"Installer"/"vswhere.exe";
+       if(!FS::exists(vswhere))
+               return;
+
        ExternalTask::Arguments argv;
-       argv.push_back((program_files_x86/"Microsoft Visual Studio"/"Installer"/"vswhere.exe").str());
+       argv.push_back(vswhere.str());
        argv.push_back("-latest");
        argv.push_back("-property");
        argv.push_back("installationPath");
@@ -39,6 +45,12 @@ void MicrosoftTools::find_vc_bin_dir(Builder &builder, const Architecture &arch)
 
        string output = ExternalTask::run_and_capture_output(argv, FS::Path(), true);
        FS::Path vs_path = strip(output);
+       if(!vs_path.is_absolute())
+       {
+               string drive = vs_path[1];
+               if(drive.size()==2 && drive[0]>='A' && drive[0]<='Z' && drive[1]==':')
+                       vs_path = FS::Path("/mnt")/string(1, tolower(drive[0]))/vs_path.subpath(2);
+       }
 
        builder.get_logger().log("tools", "Visual Studio found in %s", vs_path);