From 8f99168275981a2e6d51641e3fb08ee07225aabe Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Sat, 6 Feb 2021 18:34:43 -0500 Subject: [PATCH 1/4] [visualstudio] Fix v120 toolset detection when VS >= 2017 is not installed. --- src/vcpkg/visualstudio.cpp | 57 +++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 32 deletions(-) diff --git a/src/vcpkg/visualstudio.cpp b/src/vcpkg/visualstudio.cpp index b1b2891919..870836d9c4 100644 --- a/src/vcpkg/visualstudio.cpp +++ b/src/vcpkg/visualstudio.cpp @@ -126,45 +126,38 @@ namespace vcpkg::VisualStudio } } - // VS2019 instance from environment variable - auto maybe_vs160_comntools = System::get_environment_variable("vs160comntools"); - if (const auto path_as_string = maybe_vs160_comntools.get()) - { - // We want lexically_normal(), but it is not available - // Correct root path might be 2 or 3 levels up, depending on if the path has trailing backslash. - auto common7_tools = fs::u8path(*path_as_string); - if (common7_tools.filename().empty()) - instances.emplace_back(common7_tools.parent_path().parent_path().parent_path(), - "16.0", - VisualStudioInstance::ReleaseType::LEGACY); - else - instances.emplace_back( - common7_tools.parent_path().parent_path(), "16.0", VisualStudioInstance::ReleaseType::LEGACY); - } - - const auto append_if_has_cl_vs140 = [&](fs::path&& path_root) { + const auto append_if_has_cl = [&](fs::path&& path_root, CStringView version) { const auto cl_exe = path_root / "VC" / "bin" / "cl.exe"; const auto vcvarsall_bat = path_root / "VC" / "vcvarsall.bat"; if (fs.exists(cl_exe) && fs.exists(vcvarsall_bat)) - instances.emplace_back(std::move(path_root), "14.0", VisualStudioInstance::ReleaseType::LEGACY); + instances.emplace_back(std::move(path_root), version.c_str(), VisualStudioInstance::ReleaseType::LEGACY); }; - // VS2015 instance from environment variable - auto maybe_vs140_comntools = System::get_environment_variable("vs140comntools"); - if (const auto path_as_string = maybe_vs140_comntools.get()) - { - // We want lexically_normal(), but it is not available - // Correct root path might be 2 or 3 levels up, depending on if the path has trailing backslash. - auto common7_tools = fs::u8path(*path_as_string); - if (common7_tools.filename().empty()) - append_if_has_cl_vs140(common7_tools.parent_path().parent_path().parent_path()); - else - append_if_has_cl_vs140(common7_tools.parent_path().parent_path()); - } + const auto append_if_comntools_has_cl = [&](ZStringView env_var, CStringView version) { + auto maybe_comntools = System::get_environment_variable(env_var); + if (const auto path_as_string = maybe_comntools.get()) + { + // We want lexically_normal(), but it is not available + // Correct root path might be 2 or 3 levels up, depending on if the path has trailing backslash. + auto common7_tools = fs::u8path(*path_as_string); + if (common7_tools.filename().empty()) + append_if_has_cl(common7_tools.parent_path().parent_path().parent_path(), version); + else + append_if_has_cl(common7_tools.parent_path().parent_path(), version); + } + }; + + const auto maybe_append_legacy_vs = [&](ZStringView env_var, const fs::path& dir, CStringView version) { + // VS instance from environment variable + append_if_comntools_has_cl(env_var, version); + // VS instance from Program Files + append_if_has_cl(program_files_32_bit / dir, version); + }; - // VS2015 instance from Program Files - append_if_has_cl_vs140(program_files_32_bit / "Microsoft Visual Studio 14.0"); + append_if_comntools_has_cl("vs160comntools", "16.0"); + maybe_append_legacy_vs("vs140comntools", "Microsoft Visual Studio 14.0", "14.0"); + maybe_append_legacy_vs("vs120comntools", "Microsoft Visual Studio 12.0", "12.0"); return instances; } From 5c19a53d49318eef8ed39d26f4bcf73fa720d6ba Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Sat, 6 Feb 2021 18:57:19 -0500 Subject: [PATCH 2/4] apply formatting change --- src/vcpkg/visualstudio.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vcpkg/visualstudio.cpp b/src/vcpkg/visualstudio.cpp index 870836d9c4..281555babd 100644 --- a/src/vcpkg/visualstudio.cpp +++ b/src/vcpkg/visualstudio.cpp @@ -131,7 +131,8 @@ namespace vcpkg::VisualStudio const auto vcvarsall_bat = path_root / "VC" / "vcvarsall.bat"; if (fs.exists(cl_exe) && fs.exists(vcvarsall_bat)) - instances.emplace_back(std::move(path_root), version.c_str(), VisualStudioInstance::ReleaseType::LEGACY); + instances.emplace_back( + std::move(path_root), version.c_str(), VisualStudioInstance::ReleaseType::LEGACY); }; const auto append_if_comntools_has_cl = [&](ZStringView env_var, CStringView version) { From 38d64369a5b2eada64a3ff36af2ffe1ca0de2503 Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Tue, 9 Feb 2021 15:22:53 -0500 Subject: [PATCH 3/4] Always append VS2017 if vs160comntools is set. --- src/vcpkg/visualstudio.cpp | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/src/vcpkg/visualstudio.cpp b/src/vcpkg/visualstudio.cpp index 281555babd..19682f20a1 100644 --- a/src/vcpkg/visualstudio.cpp +++ b/src/vcpkg/visualstudio.cpp @@ -126,16 +126,22 @@ namespace vcpkg::VisualStudio } } - const auto append_if_has_cl = [&](fs::path&& path_root, CStringView version) { - const auto cl_exe = path_root / "VC" / "bin" / "cl.exe"; - const auto vcvarsall_bat = path_root / "VC" / "vcvarsall.bat"; - if (fs.exists(cl_exe) && fs.exists(vcvarsall_bat)) - instances.emplace_back( - std::move(path_root), version.c_str(), VisualStudioInstance::ReleaseType::LEGACY); + const auto maybe_append_path = [&](fs::path&& path_root, CStringView version, bool check_cl = true) { + if (check_cl) + { + const auto cl_exe = path_root / "VC" / "bin" / "cl.exe"; + const auto vcvarsall_bat = path_root / "VC" / "vcvarsall.bat"; + + if (!(fs.exists(cl_exe) && fs.exists(vcvarsall_bat))) + return; + } + + instances.emplace_back( + std::move(path_root), version.c_str(), VisualStudioInstance::ReleaseType::LEGACY); }; - const auto append_if_comntools_has_cl = [&](ZStringView env_var, CStringView version) { + const auto maybe_append_comntools = [&](ZStringView env_var, CStringView version, bool check_cl = true) { auto maybe_comntools = System::get_environment_variable(env_var); if (const auto path_as_string = maybe_comntools.get()) { @@ -143,20 +149,22 @@ namespace vcpkg::VisualStudio // Correct root path might be 2 or 3 levels up, depending on if the path has trailing backslash. auto common7_tools = fs::u8path(*path_as_string); if (common7_tools.filename().empty()) - append_if_has_cl(common7_tools.parent_path().parent_path().parent_path(), version); + maybe_append_path(common7_tools.parent_path().parent_path().parent_path(), version, check_cl); else - append_if_has_cl(common7_tools.parent_path().parent_path(), version); + maybe_append_path(common7_tools.parent_path().parent_path(), version, check_cl); } }; const auto maybe_append_legacy_vs = [&](ZStringView env_var, const fs::path& dir, CStringView version) { // VS instance from environment variable - append_if_comntools_has_cl(env_var, version); + maybe_append_comntools(env_var, version); // VS instance from Program Files - append_if_has_cl(program_files_32_bit / dir, version); + maybe_append_path(program_files_32_bit / dir, version); }; - append_if_comntools_has_cl("vs160comntools", "16.0"); + // VS 2017 changed the installer such that cl.exe cannot be found by path navigation and + // the env variable is only set when vcvars has been run. Therefore we close the safety valves. + maybe_append_comntools("vs160comntools", "16.0", false); maybe_append_legacy_vs("vs140comntools", "Microsoft Visual Studio 14.0", "14.0"); maybe_append_legacy_vs("vs120comntools", "Microsoft Visual Studio 12.0", "12.0"); From b76b5f4cfcc2c325d816bfeb983798b6803eddf4 Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Tue, 9 Feb 2021 15:28:59 -0500 Subject: [PATCH 4/4] Apply formatting changes. --- src/vcpkg/visualstudio.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/vcpkg/visualstudio.cpp b/src/vcpkg/visualstudio.cpp index 19682f20a1..fc8cf5c631 100644 --- a/src/vcpkg/visualstudio.cpp +++ b/src/vcpkg/visualstudio.cpp @@ -126,19 +126,16 @@ namespace vcpkg::VisualStudio } } - const auto maybe_append_path = [&](fs::path&& path_root, CStringView version, bool check_cl = true) { if (check_cl) { const auto cl_exe = path_root / "VC" / "bin" / "cl.exe"; const auto vcvarsall_bat = path_root / "VC" / "vcvarsall.bat"; - if (!(fs.exists(cl_exe) && fs.exists(vcvarsall_bat))) - return; + if (!(fs.exists(cl_exe) && fs.exists(vcvarsall_bat))) return; } - instances.emplace_back( - std::move(path_root), version.c_str(), VisualStudioInstance::ReleaseType::LEGACY); + instances.emplace_back(std::move(path_root), version.c_str(), VisualStudioInstance::ReleaseType::LEGACY); }; const auto maybe_append_comntools = [&](ZStringView env_var, CStringView version, bool check_cl = true) {