+++ /dev/null
-#include <msp/core/algorithm.h>
-#include <msp/fs/dir.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):
- Toolchain("msvc", get_priority(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", "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", "Visual Studio found in %s", vs_path);
-
- FS::Path vc_aux_build_dir = vs_path/"VC"/"Auxiliary"/"Build";
- builder.get_logger().log("files", "Traversing %s", vc_aux_build_dir);
- vector<string> vc_version_files = FS::list_filtered(vc_aux_build_dir, "^Microsoft\\.VCToolsVersion\\.");
- if(vc_version_files.empty())
- {
- builder.get_logger().log("problems", "MSVC tools version not found");
- return;
- }
-
- sort(vc_version_files);
- FS::Path vc_version_fn = vc_aux_build_dir/vc_version_files.back();
- builder.get_logger().log("files", "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", "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", "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", "Windows SDK version %s found in %s", win_sdk_version, win_sdk_dir);
-}
-
-int MicrosoftTools::get_priority(const Architecture &arch)
-{
- if(arch.get_toolchain()=="msvc")
- return 20;
- else if(arch.get_system()=="windows")
- return 10;
- else
- return 0;
-}