mirror of
https://github.com/microsoft/vcpkg.git
synced 2024-12-28 03:10:57 +08:00
[vcpkg] Add --x-xunit internal command to print installation results in a VSTS friendly format.
This commit is contained in:
parent
6c5f52daf3
commit
d38d4a7540
3
.gitignore
vendored
3
.gitignore
vendored
@ -274,8 +274,9 @@ __pycache__/
|
|||||||
|
|
||||||
.vscode/
|
.vscode/
|
||||||
buildtrees/
|
buildtrees/
|
||||||
|
build*/
|
||||||
downloads/
|
downloads/
|
||||||
installed/
|
installed*/
|
||||||
packages/
|
packages/
|
||||||
scripts/buildsystems/tmp/
|
scripts/buildsystems/tmp/
|
||||||
*.exe
|
*.exe
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
$ErrorActionPreference = "Stop"
|
$ErrorActionPreference = "Stop"
|
||||||
|
|
||||||
|
rm TEST-internal-ci.xml -errorAction SilentlyContinue
|
||||||
|
|
||||||
New-Item -type directory downloads -errorAction SilentlyContinue | Out-Null
|
New-Item -type directory downloads -errorAction SilentlyContinue | Out-Null
|
||||||
./scripts/bootstrap.ps1
|
./scripts/bootstrap.ps1
|
||||||
if (-not $?) { throw $? }
|
if (-not $?) { throw $? }
|
||||||
@ -7,21 +9,14 @@ if (-not $?) { throw $? }
|
|||||||
# Clear out any intermediate files from the previous build
|
# Clear out any intermediate files from the previous build
|
||||||
if (Test-Path buildtrees)
|
if (Test-Path buildtrees)
|
||||||
{
|
{
|
||||||
Get-ChildItem buildtrees/*/* | ? { $_.Name -ne "src" -and $_.Extension -ne ".log"} | Remove-Item -Recurse -Force
|
Get-ChildItem buildtrees/*/* | ? { $_.Name -ne "src" } | Remove-Item -Recurse -Force
|
||||||
}
|
}
|
||||||
|
|
||||||
# Purge any outdated packages
|
# Purge any outdated packages
|
||||||
./vcpkg remove --outdated --recurse
|
./vcpkg remove --outdated --recurse
|
||||||
if (-not $?) { throw $? }
|
if (-not $?) { throw $? }
|
||||||
|
|
||||||
./vcpkg.exe install azure-storage-cpp cpprestsdk:x64-windows-static cpprestsdk:x86-uwp
|
./vcpkg.exe install azure-storage-cpp cpprestsdk:x64-windows-static cpprestsdk:x86-uwp `
|
||||||
|
bond cryptopp zlib expat sdl2 curl sqlite3 libuv protobuf:x64-windows sfml opencv:x64-windows uwebsockets uwebsockets:x64-windows-static `
|
||||||
|
opencv:x86-uwp boost:x86-uwp --keep-going "--x-xunit=TEST-internal-ci.xml"
|
||||||
if (-not $?) { throw $? }
|
if (-not $?) { throw $? }
|
||||||
|
|
||||||
./vcpkg.exe install bond cryptopp zlib expat sdl2 curl sqlite3 libuv protobuf:x64-windows sfml opencv:x64-windows uwebsockets uwebsockets:x64-windows-static
|
|
||||||
if (-not $?) { throw $? }
|
|
||||||
|
|
||||||
./vcpkg.exe install opencv:x86-uwp boost:x86-uwp
|
|
||||||
if (-not $?) { throw $? }
|
|
||||||
|
|
||||||
# ./vcpkg.exe install folly:x64-windows
|
|
||||||
# if (-not $?) { throw $? }
|
|
||||||
|
@ -7,18 +7,37 @@ namespace vcpkg::Chrono
|
|||||||
{
|
{
|
||||||
class ElapsedTime
|
class ElapsedTime
|
||||||
{
|
{
|
||||||
public:
|
using duration = std::chrono::high_resolution_clock::time_point::duration;
|
||||||
static ElapsedTime create_started();
|
|
||||||
|
|
||||||
constexpr ElapsedTime() : m_start_tick() {}
|
public:
|
||||||
|
constexpr ElapsedTime() : m_duration() {}
|
||||||
|
constexpr ElapsedTime(duration d) : m_duration(d) {}
|
||||||
|
|
||||||
template<class TimeUnit>
|
template<class TimeUnit>
|
||||||
TimeUnit elapsed() const
|
TimeUnit as() const
|
||||||
{
|
{
|
||||||
return std::chrono::duration_cast<TimeUnit>(std::chrono::high_resolution_clock::now() - this->m_start_tick);
|
return std::chrono::duration_cast<TimeUnit>(m_duration);
|
||||||
}
|
}
|
||||||
|
|
||||||
double microseconds() const { return elapsed<std::chrono::duration<double, std::micro>>().count(); }
|
std::string to_string() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::chrono::high_resolution_clock::time_point::duration m_duration;
|
||||||
|
};
|
||||||
|
|
||||||
|
class ElapsedTimer
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static ElapsedTimer create_started();
|
||||||
|
|
||||||
|
constexpr ElapsedTimer() : m_start_tick() {}
|
||||||
|
|
||||||
|
ElapsedTime elapsed() const
|
||||||
|
{
|
||||||
|
return ElapsedTime(std::chrono::high_resolution_clock::now() - this->m_start_tick);
|
||||||
|
}
|
||||||
|
|
||||||
|
double microseconds() const { return elapsed().as<std::chrono::duration<double, std::micro>>().count(); }
|
||||||
|
|
||||||
std::string to_string() const;
|
std::string to_string() const;
|
||||||
|
|
||||||
|
@ -9,11 +9,11 @@ namespace vcpkg
|
|||||||
{
|
{
|
||||||
struct GlobalState
|
struct GlobalState
|
||||||
{
|
{
|
||||||
static Util::LockGuarded<Chrono::ElapsedTime> timer;
|
static Util::LockGuarded<Chrono::ElapsedTimer> timer;
|
||||||
static std::atomic<bool> debugging;
|
static std::atomic<bool> debugging;
|
||||||
static std::atomic<bool> feature_packages;
|
static std::atomic<bool> feature_packages;
|
||||||
|
|
||||||
static std::atomic<int> g_init_console_cp;
|
static std::atomic<int> g_init_console_cp;
|
||||||
static std::atomic<int> g_init_console_output_cp;
|
static std::atomic<int> g_init_console_output_cp;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <vcpkg/base/chrono.h>
|
||||||
#include <vcpkg/build.h>
|
#include <vcpkg/build.h>
|
||||||
#include <vcpkg/dependencies.h>
|
#include <vcpkg/dependencies.h>
|
||||||
#include <vcpkg/vcpkgcmdarguments.h>
|
#include <vcpkg/vcpkgcmdarguments.h>
|
||||||
@ -25,7 +26,7 @@ namespace vcpkg::Install
|
|||||||
|
|
||||||
PackageSpec spec;
|
PackageSpec spec;
|
||||||
Build::ExtendedBuildResult build_result;
|
Build::ExtendedBuildResult build_result;
|
||||||
std::string timing;
|
vcpkg::Chrono::ElapsedTime timing;
|
||||||
|
|
||||||
const Dependencies::AnyAction* action;
|
const Dependencies::AnyAction* action;
|
||||||
};
|
};
|
||||||
@ -36,6 +37,7 @@ namespace vcpkg::Install
|
|||||||
std::string total_elapsed_time;
|
std::string total_elapsed_time;
|
||||||
|
|
||||||
void print() const;
|
void print() const;
|
||||||
|
std::string xunit_results() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct InstallDir
|
struct InstallDir
|
||||||
|
@ -255,7 +255,7 @@ int main(const int argc, const char* const* const argv)
|
|||||||
{
|
{
|
||||||
if (argc == 0) std::abort();
|
if (argc == 0) std::abort();
|
||||||
|
|
||||||
*GlobalState::timer.lock() = Chrono::ElapsedTime::create_started();
|
*GlobalState::timer.lock() = Chrono::ElapsedTimer::create_started();
|
||||||
|
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
GlobalState::g_init_console_cp = GetConsoleCP();
|
GlobalState::g_init_console_cp = GetConsoleCP();
|
||||||
|
@ -50,12 +50,14 @@ namespace vcpkg::Chrono
|
|||||||
return Strings::format("%.4g ns", nanos_as_double);
|
return Strings::format("%.4g ns", nanos_as_double);
|
||||||
}
|
}
|
||||||
|
|
||||||
ElapsedTime ElapsedTime::create_started()
|
ElapsedTimer ElapsedTimer::create_started()
|
||||||
{
|
{
|
||||||
ElapsedTime t;
|
ElapsedTimer t;
|
||||||
t.m_start_tick = std::chrono::high_resolution_clock::now();
|
t.m_start_tick = std::chrono::high_resolution_clock::now();
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string ElapsedTime::to_string() const { return format_time_userfriendly(elapsed<std::chrono::nanoseconds>()); }
|
std::string ElapsedTime::to_string() const { return format_time_userfriendly(as<std::chrono::nanoseconds>()); }
|
||||||
|
|
||||||
|
std::string ElapsedTimer::to_string() const { return elapsed().to_string(); }
|
||||||
}
|
}
|
||||||
|
@ -67,7 +67,7 @@ namespace vcpkg::Build::Command
|
|||||||
const Build::BuildPackageConfig build_config{
|
const Build::BuildPackageConfig build_config{
|
||||||
*scf, spec.triplet(), fs::path{port_dir}, build_package_options, features_as_set};
|
*scf, spec.triplet(), fs::path{port_dir}, build_package_options, features_as_set};
|
||||||
|
|
||||||
const auto build_timer = Chrono::ElapsedTime::create_started();
|
const auto build_timer = Chrono::ElapsedTimer::create_started();
|
||||||
const auto result = Build::build_package(paths, build_config, status_db);
|
const auto result = Build::build_package(paths, build_config, status_db);
|
||||||
System::println("Elapsed time for package %s: %s", spec.to_string(), build_timer.to_string());
|
System::println("Elapsed time for package %s: %s", spec.to_string(), build_timer.to_string());
|
||||||
|
|
||||||
@ -323,7 +323,7 @@ namespace vcpkg::Build
|
|||||||
const auto cmd_set_environment = make_build_env_cmd(pre_build_info, toolset);
|
const auto cmd_set_environment = make_build_env_cmd(pre_build_info, toolset);
|
||||||
const std::string command = Strings::format(R"(%s && %s)", cmd_set_environment, cmd_launch_cmake);
|
const std::string command = Strings::format(R"(%s && %s)", cmd_set_environment, cmd_launch_cmake);
|
||||||
|
|
||||||
const auto timer = Chrono::ElapsedTime::create_started();
|
const auto timer = Chrono::ElapsedTimer::create_started();
|
||||||
|
|
||||||
const int return_code = System::cmd_execute_clean(command);
|
const int return_code = System::cmd_execute_clean(command);
|
||||||
const auto buildtimeus = timer.microseconds();
|
const auto buildtimeus = timer.microseconds();
|
||||||
|
@ -63,9 +63,11 @@ namespace vcpkg::Commands::CI
|
|||||||
};
|
};
|
||||||
|
|
||||||
static const std::string OPTION_EXCLUDE = "--exclude";
|
static const std::string OPTION_EXCLUDE = "--exclude";
|
||||||
|
static const std::string OPTION_XUNIT = "--x-xunit";
|
||||||
|
|
||||||
static const std::array<CommandSetting, 1> CI_SETTINGS = {{
|
static const std::array<CommandSetting, 2> CI_SETTINGS = {{
|
||||||
{OPTION_EXCLUDE, "Comma separated list of ports to skip"},
|
{OPTION_EXCLUDE, "Comma separated list of ports to skip"},
|
||||||
|
{OPTION_XUNIT, "File to output results in XUnit format (internal)"},
|
||||||
}};
|
}};
|
||||||
|
|
||||||
const CommandStructure COMMAND_STRUCTURE = {
|
const CommandStructure COMMAND_STRUCTURE = {
|
||||||
@ -114,6 +116,18 @@ namespace vcpkg::Commands::CI
|
|||||||
result.summary.print();
|
result.summary.print();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto it_xunit = options.settings.find(OPTION_XUNIT);
|
||||||
|
if (it_xunit != options.settings.end())
|
||||||
|
{
|
||||||
|
std::string xunit_doc = "<assemblies><assembly><collection>\n";
|
||||||
|
|
||||||
|
for (auto&& result : results)
|
||||||
|
xunit_doc += result.summary.xunit_results();
|
||||||
|
|
||||||
|
xunit_doc += "</collection></assembly></assemblies>\n";
|
||||||
|
paths.get_filesystem().write_contents(fs::u8path(it_xunit->second), xunit_doc);
|
||||||
|
}
|
||||||
|
|
||||||
Checks::exit_success(VCPKG_LINE_INFO);
|
Checks::exit_success(VCPKG_LINE_INFO);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -257,7 +257,7 @@ CMake projects should use: "-DCMAKE_TOOLCHAIN_FILE=%s")",
|
|||||||
std::error_code ec;
|
std::error_code ec;
|
||||||
const bool was_deleted = fs.remove(path, ec);
|
const bool was_deleted = fs.remove(path, ec);
|
||||||
|
|
||||||
Checks::check_exit(VCPKG_LINE_INFO, !ec, "Error: Unable to remove user-wide integration: %d", ec.message());
|
Checks::check_exit(VCPKG_LINE_INFO, !ec, "Error: Unable to remove user-wide integration: %s", ec.message());
|
||||||
|
|
||||||
if (was_deleted)
|
if (was_deleted)
|
||||||
{
|
{
|
||||||
|
@ -151,14 +151,14 @@ namespace vcpkg::Commands::PortsDiff
|
|||||||
const std::vector<std::string>& added_ports = setp.only_left;
|
const std::vector<std::string>& added_ports = setp.only_left;
|
||||||
if (!added_ports.empty())
|
if (!added_ports.empty())
|
||||||
{
|
{
|
||||||
System::println("\nThe following %d ports were added:", added_ports.size());
|
System::println("\nThe following %zd ports were added:", added_ports.size());
|
||||||
do_print_name_and_version(added_ports, current_names_and_versions);
|
do_print_name_and_version(added_ports, current_names_and_versions);
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::vector<std::string>& removed_ports = setp.only_right;
|
const std::vector<std::string>& removed_ports = setp.only_right;
|
||||||
if (!removed_ports.empty())
|
if (!removed_ports.empty())
|
||||||
{
|
{
|
||||||
System::println("\nThe following %d ports were removed:", removed_ports.size());
|
System::println("\nThe following %zd ports were removed:", removed_ports.size());
|
||||||
do_print_name_and_version(removed_ports, previous_names_and_versions);
|
do_print_name_and_version(removed_ports, previous_names_and_versions);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -168,7 +168,7 @@ namespace vcpkg::Commands::PortsDiff
|
|||||||
|
|
||||||
if (!updated_ports.empty())
|
if (!updated_ports.empty())
|
||||||
{
|
{
|
||||||
System::println("\nThe following %d ports were updated:", updated_ports.size());
|
System::println("\nThe following %zd ports were updated:", updated_ports.size());
|
||||||
for (const UpdatedPort& p : updated_ports)
|
for (const UpdatedPort& p : updated_ports)
|
||||||
{
|
{
|
||||||
System::println(" - %-14s %-16s", p.port, p.version_diff.to_string());
|
System::println(" - %-14s %-16s", p.port, p.version_diff.to_string());
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
namespace vcpkg
|
namespace vcpkg
|
||||||
{
|
{
|
||||||
Util::LockGuarded<Chrono::ElapsedTime> GlobalState::timer;
|
Util::LockGuarded<Chrono::ElapsedTimer> GlobalState::timer;
|
||||||
std::atomic<bool> GlobalState::debugging(false);
|
std::atomic<bool> GlobalState::debugging(false);
|
||||||
std::atomic<bool> GlobalState::feature_packages(false);
|
std::atomic<bool> GlobalState::feature_packages(false);
|
||||||
|
|
||||||
|
@ -484,18 +484,18 @@ namespace vcpkg::Install
|
|||||||
{
|
{
|
||||||
std::vector<SpecSummary> results;
|
std::vector<SpecSummary> results;
|
||||||
|
|
||||||
const auto timer = Chrono::ElapsedTime::create_started();
|
const auto timer = Chrono::ElapsedTimer::create_started();
|
||||||
size_t counter = 0;
|
size_t counter = 0;
|
||||||
const size_t package_count = action_plan.size();
|
const size_t package_count = action_plan.size();
|
||||||
|
|
||||||
for (const auto& action : action_plan)
|
for (const auto& action : action_plan)
|
||||||
{
|
{
|
||||||
const auto build_timer = Chrono::ElapsedTime::create_started();
|
const auto build_timer = Chrono::ElapsedTimer::create_started();
|
||||||
counter++;
|
counter++;
|
||||||
|
|
||||||
const PackageSpec& spec = action.spec();
|
const PackageSpec& spec = action.spec();
|
||||||
const std::string display_name = spec.to_string();
|
const std::string display_name = spec.to_string();
|
||||||
System::println("Starting package %d/%d: %s", counter, package_count, display_name);
|
System::println("Starting package %zd/%zd: %s", counter, package_count, display_name);
|
||||||
|
|
||||||
results.emplace_back(spec, &action);
|
results.emplace_back(spec, &action);
|
||||||
|
|
||||||
@ -521,8 +521,8 @@ namespace vcpkg::Install
|
|||||||
Checks::unreachable(VCPKG_LINE_INFO);
|
Checks::unreachable(VCPKG_LINE_INFO);
|
||||||
}
|
}
|
||||||
|
|
||||||
results.back().timing = build_timer.to_string();
|
results.back().timing = build_timer.elapsed();
|
||||||
System::println("Elapsed time for package %s: %s", display_name, build_timer.to_string());
|
System::println("Elapsed time for package %s: %s", display_name, results.back().timing.to_string());
|
||||||
}
|
}
|
||||||
|
|
||||||
return InstallSummary{std::move(results), timer.to_string()};
|
return InstallSummary{std::move(results), timer.to_string()};
|
||||||
@ -533,6 +533,7 @@ namespace vcpkg::Install
|
|||||||
static const std::string OPTION_NO_DOWNLOADS = "--no-downloads";
|
static const std::string OPTION_NO_DOWNLOADS = "--no-downloads";
|
||||||
static const std::string OPTION_RECURSE = "--recurse";
|
static const std::string OPTION_RECURSE = "--recurse";
|
||||||
static const std::string OPTION_KEEP_GOING = "--keep-going";
|
static const std::string OPTION_KEEP_GOING = "--keep-going";
|
||||||
|
static const std::string OPTION_XUNIT = "--x-xunit";
|
||||||
|
|
||||||
static const std::array<CommandSwitch, 5> INSTALL_SWITCHES = {{
|
static const std::array<CommandSwitch, 5> INSTALL_SWITCHES = {{
|
||||||
{OPTION_DRY_RUN, "Do not actually build or install"},
|
{OPTION_DRY_RUN, "Do not actually build or install"},
|
||||||
@ -541,7 +542,9 @@ namespace vcpkg::Install
|
|||||||
{OPTION_RECURSE, "Allow removal of packages as part of installation"},
|
{OPTION_RECURSE, "Allow removal of packages as part of installation"},
|
||||||
{OPTION_KEEP_GOING, "Continue installing packages on failure"},
|
{OPTION_KEEP_GOING, "Continue installing packages on failure"},
|
||||||
}};
|
}};
|
||||||
static const std::array<std::string, 0> INSTALL_SETTINGS;
|
static const std::array<CommandSetting, 1> INSTALL_SETTINGS = {{
|
||||||
|
{OPTION_XUNIT, "File to output results in XUnit format (Internal use)"},
|
||||||
|
}};
|
||||||
|
|
||||||
std::vector<std::string> get_all_port_names(const VcpkgPaths& paths)
|
std::vector<std::string> get_all_port_names(const VcpkgPaths& paths)
|
||||||
{
|
{
|
||||||
@ -555,7 +558,7 @@ namespace vcpkg::Install
|
|||||||
Help::create_example_string("install zlib zlib:x64-windows curl boost"),
|
Help::create_example_string("install zlib zlib:x64-windows curl boost"),
|
||||||
1,
|
1,
|
||||||
SIZE_MAX,
|
SIZE_MAX,
|
||||||
{INSTALL_SWITCHES, {}},
|
{INSTALL_SWITCHES, INSTALL_SETTINGS},
|
||||||
&get_all_port_names,
|
&get_all_port_names,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -627,7 +630,7 @@ namespace vcpkg::Install
|
|||||||
library_target_pair.second.erase(library_target_pair.second.begin() + 4,
|
library_target_pair.second.erase(library_target_pair.second.begin() + 4,
|
||||||
library_target_pair.second.end());
|
library_target_pair.second.end());
|
||||||
System::println(" find_package(%s REQUIRED)\n"
|
System::println(" find_package(%s REQUIRED)\n"
|
||||||
" # Note: %d targets were omitted\n"
|
" # Note: %zd targets were omitted\n"
|
||||||
" target_link_libraries(main PRIVATE %s)\n",
|
" target_link_libraries(main PRIVATE %s)\n",
|
||||||
library_target_pair.first,
|
library_target_pair.first,
|
||||||
omitted,
|
omitted,
|
||||||
@ -735,6 +738,17 @@ namespace vcpkg::Install
|
|||||||
summary.print();
|
summary.print();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto it_xunit = options.settings.find(OPTION_XUNIT);
|
||||||
|
if (it_xunit != options.settings.end())
|
||||||
|
{
|
||||||
|
std::string xunit_doc = "<assemblies><assembly><collection>\n";
|
||||||
|
|
||||||
|
xunit_doc += summary.xunit_results();
|
||||||
|
|
||||||
|
xunit_doc += "</collection></assembly></assemblies>\n";
|
||||||
|
paths.get_filesystem().write_contents(fs::u8path(it_xunit->second), xunit_doc);
|
||||||
|
}
|
||||||
|
|
||||||
for (auto&& result : summary.results)
|
for (auto&& result : summary.results)
|
||||||
{
|
{
|
||||||
if (!result.action) continue;
|
if (!result.action) continue;
|
||||||
@ -751,7 +765,7 @@ namespace vcpkg::Install
|
|||||||
}
|
}
|
||||||
|
|
||||||
SpecSummary::SpecSummary(const PackageSpec& spec, const Dependencies::AnyAction* action)
|
SpecSummary::SpecSummary(const PackageSpec& spec, const Dependencies::AnyAction* action)
|
||||||
: spec(spec), build_result{BuildResult::NULLVALUE, nullptr}, timing("0"), action(action)
|
: spec(spec), build_result{BuildResult::NULLVALUE, nullptr}, action(action)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -770,4 +784,41 @@ namespace vcpkg::Install
|
|||||||
}
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string InstallSummary::xunit_results() const
|
||||||
|
{
|
||||||
|
std::string xunit_doc;
|
||||||
|
for (auto&& result : results)
|
||||||
|
{
|
||||||
|
std::string inner_block;
|
||||||
|
const char* result_string = "";
|
||||||
|
switch (result.build_result.code)
|
||||||
|
{
|
||||||
|
case BuildResult::POST_BUILD_CHECKS_FAILED:
|
||||||
|
case BuildResult::FILE_CONFLICTS:
|
||||||
|
case BuildResult::BUILD_FAILED:
|
||||||
|
result_string = "Fail";
|
||||||
|
inner_block = Strings::format("<failure><message><![CDATA[%s]]></message></failure>",
|
||||||
|
to_string(result.build_result.code));
|
||||||
|
break;
|
||||||
|
case BuildResult::EXCLUDED:
|
||||||
|
case BuildResult::CASCADED_DUE_TO_MISSING_DEPENDENCIES:
|
||||||
|
result_string = "Skip";
|
||||||
|
inner_block =
|
||||||
|
Strings::format("<reason><![CDATA[%s]]></reason>", to_string(result.build_result.code));
|
||||||
|
break;
|
||||||
|
case BuildResult::SUCCEEDED: result_string = "Pass"; break;
|
||||||
|
default: Checks::exit_fail(VCPKG_LINE_INFO);
|
||||||
|
}
|
||||||
|
|
||||||
|
xunit_doc += Strings::format(R"(<test name="%s" method="%s" time="%lld" result="%s">%s</test>)"
|
||||||
|
"\n",
|
||||||
|
result.spec,
|
||||||
|
result.spec,
|
||||||
|
result.timing.as<std::chrono::seconds>().count(),
|
||||||
|
result_string,
|
||||||
|
inner_block);
|
||||||
|
}
|
||||||
|
return xunit_doc;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -479,7 +479,7 @@ namespace vcpkg::PostBuildLint
|
|||||||
}
|
}
|
||||||
|
|
||||||
System::println(System::Color::warning,
|
System::println(System::Color::warning,
|
||||||
"Mismatching number of debug and release binaries. Found %d for debug but %d for release.",
|
"Mismatching number of debug and release binaries. Found %zd for debug but %zd for release.",
|
||||||
debug_count,
|
debug_count,
|
||||||
release_count);
|
release_count);
|
||||||
System::println("Debug binaries");
|
System::println("Debug binaries");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user