aboutsummaryrefslogtreecommitdiff
path: root/toolsrc/src
diff options
context:
space:
mode:
authorRobert Schumacher <roschuma@microsoft.com>2020-03-09 09:19:05 -0700
committerRobert Schumacher <roschuma@microsoft.com>2020-03-09 09:19:05 -0700
commit6b55c62144b120f3c5fc0d3cd8163f309241a18a (patch)
tree125aa435dff79db545fc4b08ab0c3cb537bc725c /toolsrc/src
parente21400c7cae2c2df3a9dce6ef8e3c4bf7109aaac (diff)
parentd0b1f2a9e8ed1ea53d181d13c69e15cf775148db (diff)
downloadvcpkg-6b55c62144b120f3c5fc0d3cd8163f309241a18a.tar.gz
vcpkg-6b55c62144b120f3c5fc0d3cd8163f309241a18a.zip
Merge remote-tracking branch 'origin/master' into HEAD
Diffstat (limited to 'toolsrc/src')
-rw-r--r--toolsrc/src/vcpkg/build.cpp28
-rw-r--r--toolsrc/src/vcpkg/cmakevars.cpp62
-rw-r--r--toolsrc/src/vcpkg/commands.ci.cpp7
-rw-r--r--toolsrc/src/vcpkg/commands.dependinfo.cpp3
-rw-r--r--toolsrc/src/vcpkg/commands.env.cpp3
-rw-r--r--toolsrc/src/vcpkg/commands.upgrade.cpp5
-rw-r--r--toolsrc/src/vcpkg/install.cpp8
7 files changed, 100 insertions, 16 deletions
diff --git a/toolsrc/src/vcpkg/build.cpp b/toolsrc/src/vcpkg/build.cpp
index c6b358819..e6a81607d 100644
--- a/toolsrc/src/vcpkg/build.cpp
+++ b/toolsrc/src/vcpkg/build.cpp
@@ -41,7 +41,8 @@ namespace vcpkg::Build::Command
const PathsPortFileProvider& provider,
const VcpkgPaths& paths)
{
- CMakeVars::TripletCMakeVarProvider var_provider(paths);
+ auto var_provider_storage = CMakeVars::make_triplet_cmake_var_provider(paths);
+ auto& var_provider = *var_provider_storage;
var_provider.load_dep_info_vars(std::array<PackageSpec, 1>{full_spec.package_spec});
var_provider.load_tag_vars(std::array<FullPackageSpec, 1>{full_spec}, provider);
@@ -518,11 +519,30 @@ namespace vcpkg::Build
else
return System::cmd_execute_modify_env(build_env_cmd, clean_env);
});
-
- const int return_code = System::cmd_execute(command, env);
#else
- const int return_code = System::cmd_execute_clean(command);
+ const auto& env = System::get_clean_environment();
#endif
+ auto buildpath = paths.buildtrees / action.spec.name();
+ if (!fs.exists(buildpath))
+ {
+ std::error_code err;
+ fs.create_directory(buildpath, err);
+ Checks::check_exit(VCPKG_LINE_INFO, !err.value(), "Failed to create directory '%s', code: %d", buildpath.u8string(), err.value());
+ }
+ auto stdoutlog = buildpath / ("stdout-" + action.spec.triplet().canonical_name() + ".log");
+ std::ofstream out_file(stdoutlog.native().c_str(), std::ios::out | std::ios::binary | std::ios::trunc);
+ Checks::check_exit(VCPKG_LINE_INFO, out_file, "Failed to open '%s' for writing", stdoutlog.u8string());
+ const int return_code = System::cmd_execute_and_stream_data(
+ command,
+ [&](StringView sv) {
+ System::print2(sv);
+ out_file.write(sv.data(), sv.size());
+ Checks::check_exit(
+ VCPKG_LINE_INFO, out_file, "Error occurred while writing '%s'", stdoutlog.u8string());
+ },
+ env);
+ out_file.close();
+
// With the exception of empty packages, builds in "Download Mode" always result in failure.
if (action.build_options.only_downloads == Build::OnlyDownloads::YES)
{
diff --git a/toolsrc/src/vcpkg/cmakevars.cpp b/toolsrc/src/vcpkg/cmakevars.cpp
index 42bed5501..98b2546ed 100644
--- a/toolsrc/src/vcpkg/cmakevars.cpp
+++ b/toolsrc/src/vcpkg/cmakevars.cpp
@@ -1,17 +1,77 @@
#include "pch.h"
+#include <vcpkg/base/hash.h>
#include <vcpkg/base/optional.h>
#include <vcpkg/base/span.h>
+#include <vcpkg/base/system.process.h>
#include <vcpkg/base/util.h>
#include <vcpkg/cmakevars.h>
+#include <vcpkg/dependencies.h>
using namespace vcpkg;
using vcpkg::Optional;
-using vcpkg::CMakeVars::TripletCMakeVarProvider;
namespace vcpkg::CMakeVars
{
+ void CMakeVarProvider::load_tag_vars(const vcpkg::Dependencies::ActionPlan& action_plan,
+ const PortFileProvider::PortFileProvider& port_provider) const
+ {
+ std::vector<FullPackageSpec> install_package_specs;
+ for (auto&& action : action_plan.install_actions)
+ {
+ install_package_specs.emplace_back(FullPackageSpec{action.spec, action.feature_list});
+ }
+
+ load_tag_vars(install_package_specs, port_provider);
+ }
+
+ namespace
+ {
+ struct TripletCMakeVarProvider : Util::ResourceBase, CMakeVarProvider
+ {
+ explicit TripletCMakeVarProvider(const vcpkg::VcpkgPaths& paths) : paths(paths) {}
+
+ void load_generic_triplet_vars(Triplet triplet) const override;
+
+ void load_dep_info_vars(Span<const PackageSpec> specs) const override;
+
+ void load_tag_vars(Span<const FullPackageSpec> specs,
+ const PortFileProvider::PortFileProvider& port_provider) const override;
+
+ Optional<const std::unordered_map<std::string, std::string>&> get_generic_triplet_vars(
+ Triplet triplet) const override;
+
+ Optional<const std::unordered_map<std::string, std::string>&> get_dep_info_vars(
+ const PackageSpec& spec) const override;
+
+ Optional<const std::unordered_map<std::string, std::string>&> get_tag_vars(
+ const PackageSpec& spec) const override;
+
+ public:
+ fs::path create_tag_extraction_file(
+ const Span<const std::pair<const FullPackageSpec*, std::string>>& spec_abi_settings) const;
+
+ fs::path create_dep_info_extraction_file(const Span<const PackageSpec> specs) const;
+
+ void launch_and_split(const fs::path& script_path,
+ std::vector<std::vector<std::pair<std::string, std::string>>>& vars) const;
+
+ const VcpkgPaths& paths;
+ const fs::path& cmake_exe_path = paths.get_tool_exe(Tools::CMAKE);
+ const fs::path get_tags_path = paths.scripts / "vcpkg_get_tags.cmake";
+ const fs::path get_dep_info_path = paths.scripts / "vcpkg_get_dep_info.cmake";
+ mutable std::unordered_map<PackageSpec, std::unordered_map<std::string, std::string>> dep_resolution_vars;
+ mutable std::unordered_map<PackageSpec, std::unordered_map<std::string, std::string>> tag_vars;
+ mutable std::unordered_map<Triplet, std::unordered_map<std::string, std::string>> generic_triplet_vars;
+ };
+ }
+
+ std::unique_ptr<CMakeVarProvider> make_triplet_cmake_var_provider(const vcpkg::VcpkgPaths& paths)
+ {
+ return std::make_unique<TripletCMakeVarProvider>(paths);
+ }
+
fs::path TripletCMakeVarProvider::create_tag_extraction_file(
const Span<const std::pair<const FullPackageSpec*, std::string>>& spec_abi_settings) const
{
diff --git a/toolsrc/src/vcpkg/commands.ci.cpp b/toolsrc/src/vcpkg/commands.ci.cpp
index 842bb9b0a..9cf3026cb 100644
--- a/toolsrc/src/vcpkg/commands.ci.cpp
+++ b/toolsrc/src/vcpkg/commands.ci.cpp
@@ -223,7 +223,7 @@ namespace vcpkg::Commands::CI
std::unordered_map<std::string, SourceControlFileLocation> default_feature_provider;
};
- static bool supported_for_triplet(const CMakeVars::TripletCMakeVarProvider& var_provider,
+ static bool supported_for_triplet(const CMakeVars::CMakeVarProvider& var_provider,
const InstallPlanAction* install_plan)
{
auto&& scfl = install_plan->source_control_file_location.value_or_exit(VCPKG_LINE_INFO);
@@ -253,7 +253,7 @@ namespace vcpkg::Commands::CI
const VcpkgPaths& paths,
const std::set<std::string>& exclusions,
const PortFileProvider::PortFileProvider& provider,
- const CMakeVars::TripletCMakeVarProvider& var_provider,
+ const CMakeVars::CMakeVarProvider& var_provider,
const std::vector<FullPackageSpec>& specs,
const bool purge_tombstones)
{
@@ -414,7 +414,8 @@ namespace vcpkg::Commands::CI
StatusParagraphs status_db = database_load_check(paths);
PortFileProvider::PathsPortFileProvider provider(paths, args.overlay_ports.get());
- CMakeVars::TripletCMakeVarProvider var_provider(paths);
+ auto var_provider_storage = CMakeVars::make_triplet_cmake_var_provider(paths);
+ auto& var_provider = *var_provider_storage;
const Build::BuildPackageOptions install_plan_options = {
Build::UseHeadVersion::NO,
diff --git a/toolsrc/src/vcpkg/commands.dependinfo.cpp b/toolsrc/src/vcpkg/commands.dependinfo.cpp
index 7023547da..f153626fa 100644
--- a/toolsrc/src/vcpkg/commands.dependinfo.cpp
+++ b/toolsrc/src/vcpkg/commands.dependinfo.cpp
@@ -252,7 +252,8 @@ namespace vcpkg::Commands::DependInfo
}
PathsPortFileProvider provider(paths, args.overlay_ports.get());
- CMakeVars::TripletCMakeVarProvider var_provider(paths);
+ auto var_provider_storage = CMakeVars::make_triplet_cmake_var_provider(paths);
+ auto& var_provider = *var_provider_storage;
// By passing an empty status_db, we should get a plan containing all dependencies.
// All actions in the plan should be install actions, as there's no installed packages to remove.
diff --git a/toolsrc/src/vcpkg/commands.env.cpp b/toolsrc/src/vcpkg/commands.env.cpp
index 6d959d425..5b673b965 100644
--- a/toolsrc/src/vcpkg/commands.env.cpp
+++ b/toolsrc/src/vcpkg/commands.env.cpp
@@ -40,7 +40,8 @@ namespace vcpkg::Commands::Env
const ParsedArguments options = args.parse_arguments(COMMAND_STRUCTURE);
PortFileProvider::PathsPortFileProvider provider(paths, args.overlay_ports.get());
- CMakeVars::TripletCMakeVarProvider var_provider(paths);
+ auto var_provider_storage = CMakeVars::make_triplet_cmake_var_provider(paths);
+ auto& var_provider = *var_provider_storage;
var_provider.load_generic_triplet_vars(triplet);
diff --git a/toolsrc/src/vcpkg/commands.upgrade.cpp b/toolsrc/src/vcpkg/commands.upgrade.cpp
index 960e9bbb3..fbce1a421 100644
--- a/toolsrc/src/vcpkg/commands.upgrade.cpp
+++ b/toolsrc/src/vcpkg/commands.upgrade.cpp
@@ -45,7 +45,8 @@ namespace vcpkg::Commands::Upgrade
// Load ports from ports dirs
PortFileProvider::PathsPortFileProvider provider(paths, args.overlay_ports.get());
- CMakeVars::TripletCMakeVarProvider var_provider(paths);
+ auto var_provider_storage = CMakeVars::make_triplet_cmake_var_provider(paths);
+ auto& var_provider = *var_provider_storage;
// input sanitization
const std::vector<PackageSpec> specs = Util::fmap(args.command_arguments, [&](auto&& arg) {
@@ -180,6 +181,8 @@ namespace vcpkg::Commands::Upgrade
Checks::exit_fail(VCPKG_LINE_INFO);
}
+ var_provider.load_tag_vars(action_plan, provider);
+
const Install::InstallSummary summary =
Install::perform(action_plan, keep_going, paths, status_db, var_provider);
diff --git a/toolsrc/src/vcpkg/install.cpp b/toolsrc/src/vcpkg/install.cpp
index fc398bd45..af1252533 100644
--- a/toolsrc/src/vcpkg/install.cpp
+++ b/toolsrc/src/vcpkg/install.cpp
@@ -681,22 +681,20 @@ namespace vcpkg::Install
//// Load ports from ports dirs
PortFileProvider::PathsPortFileProvider provider(paths, args.overlay_ports.get());
- CMakeVars::TripletCMakeVarProvider var_provider(paths);
+ auto var_provider_storage = CMakeVars::make_triplet_cmake_var_provider(paths);
+ auto& var_provider = *var_provider_storage;
// Note: action_plan will hold raw pointers to SourceControlFileLocations from this map
auto action_plan = Dependencies::create_feature_install_plan(provider, var_provider, specs, status_db);
- std::vector<FullPackageSpec> install_package_specs;
for (auto&& action : action_plan.install_actions)
{
action.build_options = install_plan_options;
if (action.request_type != RequestType::USER_REQUESTED)
action.build_options.use_head_version = Build::UseHeadVersion::NO;
-
- install_package_specs.emplace_back(FullPackageSpec{action.spec, action.feature_list});
}
- var_provider.load_tag_vars(install_package_specs, provider);
+ var_provider.load_tag_vars(action_plan, provider);
// install plan will be empty if it is already installed - need to change this at status paragraph part
Checks::check_exit(VCPKG_LINE_INFO, !action_plan.empty(), "Install plan cannot be empty");