aboutsummaryrefslogtreecommitdiff
path: root/toolsrc/src/commands_build.cpp
diff options
context:
space:
mode:
authorRobert Schumacher <roschuma@microsoft.com>2017-04-23 01:30:43 -0700
committerRobert Schumacher <roschuma@microsoft.com>2017-04-23 01:30:43 -0700
commitee0201cfae196c175d58064b2e62a91c033ec038 (patch)
tree76690e3d383237ee50247c9b56c8908d7148f62f /toolsrc/src/commands_build.cpp
parente48fdb66a5be01321e68b371c6c171ed0fec3054 (diff)
downloadvcpkg-ee0201cfae196c175d58064b2e62a91c033ec038.tar.gz
vcpkg-ee0201cfae196c175d58064b2e62a91c033ec038.zip
[vcpkg-build] Fix regression in build command.
Missing dependencies were not being computed correctly after the internal call to build failed. Solution is to return the already-computed list from build.
Diffstat (limited to 'toolsrc/src/commands_build.cpp')
-rw-r--r--toolsrc/src/commands_build.cpp46
1 files changed, 26 insertions, 20 deletions
diff --git a/toolsrc/src/commands_build.cpp b/toolsrc/src/commands_build.cpp
index ab792f1bc..569283d22 100644
--- a/toolsrc/src/commands_build.cpp
+++ b/toolsrc/src/commands_build.cpp
@@ -37,16 +37,29 @@ namespace vcpkg::Commands::Build
return Strings::wformat(LR"("%s" %s %s 2>&1)", toolset.vcvarsall.native(), Strings::utf8_to_utf16(triplet.architecture()), tonull);
}
- BuildResult build_package(const SourceParagraph& source_paragraph, const PackageSpec& spec, const VcpkgPaths& paths, const fs::path& port_dir, const StatusParagraphs& status_db)
+ ExtendedBuildResult build_package(
+ const SourceParagraph& source_paragraph,
+ const PackageSpec& spec,
+ const VcpkgPaths& paths,
+ const fs::path& port_dir,
+ const StatusParagraphs& status_db)
{
Checks::check_exit(VCPKG_LINE_INFO, spec.name() == source_paragraph.name, "inconsistent arguments to build_package()");
const Triplet& triplet = spec.triplet();
- for (auto&& dep : filter_dependencies(source_paragraph.depends, triplet))
{
- if (status_db.find_installed(dep, triplet) == status_db.end())
+ std::vector<PackageSpec> missing_specs;
+ for (auto&& dep : filter_dependencies(source_paragraph.depends, triplet))
{
- return BuildResult::CASCADED_DUE_TO_MISSING_DEPENDENCIES;
+ if (status_db.find_installed(dep, triplet) == status_db.end())
+ {
+ missing_specs.push_back(PackageSpec::from_name_and_triplet(dep, triplet).value_or_exit(VCPKG_LINE_INFO));
+ }
+ }
+ // Fail the build if any dependencies were missing
+ if (!missing_specs.empty())
+ {
+ return { BuildResult::CASCADED_DUE_TO_MISSING_DEPENDENCIES, std::move(missing_specs) };
}
}
@@ -79,14 +92,14 @@ namespace vcpkg::Commands::Build
{
Metrics::track_property("error", "build failed");
Metrics::track_property("build_error", spec.to_string());
- return BuildResult::BUILD_FAILED;
+ return { BuildResult::BUILD_FAILED, {} };
}
const size_t error_count = PostBuildLint::perform_all_checks(spec, paths);
if (error_count != 0)
{
- return BuildResult::POST_BUILD_CHECKS_FAILED;
+ return { BuildResult::POST_BUILD_CHECKS_FAILED, {} };
}
create_binary_control_file(paths, source_paragraph, triplet);
@@ -94,7 +107,7 @@ namespace vcpkg::Commands::Build
// const fs::path port_buildtrees_dir = paths.buildtrees / spec.name;
// delete_directory(port_buildtrees_dir);
- return BuildResult::SUCCEEDED;
+ return { BuildResult::SUCCEEDED, {} };
}
const std::string& to_string(const BuildResult build_result)
@@ -146,30 +159,23 @@ namespace vcpkg::Commands::Build
const SourceParagraph& spgh = *maybe_spgh.get();
StatusParagraphs status_db = database_load_check(paths);
- const BuildResult result = build_package(spgh, spec, paths, paths.port_dir(spec), status_db);
- if (result == BuildResult::CASCADED_DUE_TO_MISSING_DEPENDENCIES)
+ const auto result = build_package(spgh, spec, paths, paths.port_dir(spec), status_db);
+ if (result.code == BuildResult::CASCADED_DUE_TO_MISSING_DEPENDENCIES)
{
- std::vector<InstallPlanAction> unmet_dependencies = Dependencies::create_install_plan(paths, { spec }, status_db);
- Util::erase_remove_if(unmet_dependencies, [&spec](const InstallPlanAction& p)
- {
- return (p.spec == spec) || (p.plan_type == InstallPlanType::ALREADY_INSTALLED);
- });
-
- Checks::check_exit(VCPKG_LINE_INFO, !unmet_dependencies.empty());
System::println(System::Color::error, "The build command requires all dependencies to be already installed.");
System::println("The following dependencies are missing:");
System::println("");
- for (const InstallPlanAction& p : unmet_dependencies)
+ for (const auto& p : result.unmet_dependencies)
{
- System::println(" %s", p.spec);
+ System::println(" %s", p);
}
System::println("");
Checks::exit_fail(VCPKG_LINE_INFO);
}
- if (result != BuildResult::SUCCEEDED)
+ if (result.code != BuildResult::SUCCEEDED)
{
- System::println(System::Color::error, Build::create_error_message(result, spec));
+ System::println(System::Color::error, Build::create_error_message(result.code, spec));
System::println(Build::create_user_troubleshooting_message(spec));
Checks::exit_fail(VCPKG_LINE_INFO);
}