mirror of https://github.com/microsoft/vcpkg.git
[triplet] Force using the factory that does sanity checks
This commit is contained in:
parent
e03e617f06
commit
330b411cd2
|
|
@ -6,17 +6,22 @@ namespace vcpkg
|
|||
{
|
||||
struct triplet
|
||||
{
|
||||
static triplet from_canonical_name(const std::string& triplet_as_string);
|
||||
|
||||
static const triplet X86_WINDOWS;
|
||||
static const triplet X64_WINDOWS;
|
||||
static const triplet X86_UWP;
|
||||
static const triplet X64_UWP;
|
||||
static const triplet ARM_UWP;
|
||||
|
||||
std::string value;
|
||||
const std::string& canonical_name() const;
|
||||
|
||||
std::string architecture() const;
|
||||
|
||||
std::string system() const;
|
||||
|
||||
private:
|
||||
std::string m_canonical_name;
|
||||
};
|
||||
|
||||
bool operator==(const triplet& left, const triplet& right);
|
||||
|
|
@ -39,7 +44,7 @@ namespace std
|
|||
{
|
||||
std::hash<std::string> hasher;
|
||||
size_t hash = 17;
|
||||
hash = hash * 31 + hasher(t.value);
|
||||
hash = hash * 31 + hasher(t.canonical_name());
|
||||
return hash;
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -12,9 +12,9 @@ namespace vcpkg
|
|||
name(required_field(fields, "Package")),
|
||||
version(required_field(fields, "Version")),
|
||||
description(optional_field(fields, "Description")),
|
||||
maintainer(optional_field(fields, "Maintainer"))
|
||||
maintainer(optional_field(fields, "Maintainer")),
|
||||
target_triplet(triplet::from_canonical_name(required_field(fields, "Architecture")))
|
||||
{
|
||||
target_triplet.value = required_field(fields, "Architecture");
|
||||
{
|
||||
std::string multi_arch = required_field(fields, "Multi-Arch");
|
||||
Checks::check_throw(multi_arch == "same", "Multi-Arch must be 'same' but was %s", multi_arch);
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ namespace vcpkg
|
|||
const std::wstring command = Strings::wformat(LR"("%%VS140COMNTOOLS%%..\..\VC\vcvarsall.bat" %s && cmake -DCMD=BUILD -DPORT=%s -DTARGET_TRIPLET=%s "-DCURRENT_PORT_DIR=%s/." -P "%s")",
|
||||
Strings::utf8_to_utf16(spec.target_triplet.architecture()),
|
||||
Strings::utf8_to_utf16(spec.name),
|
||||
Strings::utf8_to_utf16(spec.target_triplet.value),
|
||||
Strings::utf8_to_utf16(spec.target_triplet.canonical_name()),
|
||||
port_dir.generic_wstring(),
|
||||
ports_cmake_script_path.generic_wstring());
|
||||
|
||||
|
|
|
|||
|
|
@ -158,7 +158,7 @@ static void install_and_write_listfile(const vcpkg_paths& paths, const BinaryPar
|
|||
auto prefix_length = package_prefix_path.native().size();
|
||||
|
||||
std::error_code ec;
|
||||
fs::create_directory(paths.installed / bpgh.target_triplet.value, ec);
|
||||
fs::create_directory(paths.installed / bpgh.target_triplet.canonical_name(), ec);
|
||||
listfile << bpgh.target_triplet << "\n";
|
||||
|
||||
for (auto it = fs::recursive_directory_iterator(package_prefix_path); it != fs::recursive_directory_iterator(); ++it)
|
||||
|
|
@ -171,7 +171,7 @@ static void install_and_write_listfile(const vcpkg_paths& paths, const BinaryPar
|
|||
}
|
||||
|
||||
auto suffix = it->path().generic_u8string().substr(prefix_length + 1);
|
||||
auto target = paths.installed / bpgh.target_triplet.value / suffix;
|
||||
auto target = paths.installed / bpgh.target_triplet.canonical_name() / suffix;
|
||||
|
||||
auto status = it->status(ec);
|
||||
if (ec)
|
||||
|
|
|
|||
|
|
@ -73,14 +73,14 @@ static void inner(const vcpkg_cmd_arguments& args)
|
|||
triplet default_target_triplet;
|
||||
if (args.target_triplet != nullptr)
|
||||
{
|
||||
default_target_triplet = {*args.target_triplet};
|
||||
default_target_triplet = triplet::from_canonical_name(*args.target_triplet);
|
||||
}
|
||||
else
|
||||
{
|
||||
const auto vcpkg_default_triplet_env = System::wdupenv_str(L"VCPKG_DEFAULT_TRIPLET");
|
||||
if (!vcpkg_default_triplet_env.empty())
|
||||
{
|
||||
default_target_triplet = {Strings::utf16_to_utf8(vcpkg_default_triplet_env)};
|
||||
default_target_triplet = triplet::from_canonical_name(Strings::utf16_to_utf8(vcpkg_default_triplet_env));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ namespace vcpkg
|
|||
return std::error_code(package_spec_parse_result::too_many_colons);
|
||||
}
|
||||
|
||||
return package_spec{spec.substr(0, pos), spec.substr(pos + 1)};
|
||||
return package_spec{spec.substr(0, pos), triplet::from_canonical_name(spec.substr(pos + 1))};
|
||||
}
|
||||
|
||||
std::string package_spec::dir() const
|
||||
|
|
|
|||
|
|
@ -91,7 +91,7 @@ namespace UnitTest1
|
|||
Assert::AreEqual("1.2.8", pgh.version.c_str());
|
||||
Assert::AreEqual("", pgh.maintainer.c_str());
|
||||
Assert::AreEqual("", pgh.description.c_str());
|
||||
Assert::AreEqual("a", pgh.target_triplet.value.c_str());
|
||||
Assert::AreEqual("a", pgh.target_triplet.canonical_name().c_str());
|
||||
Assert::AreEqual(size_t(0), pgh.depends.size());
|
||||
}
|
||||
|
||||
|
|
@ -311,7 +311,7 @@ namespace UnitTest1
|
|||
vcpkg::expected<vcpkg::package_spec> spec = vcpkg::package_spec::from_string("zlib", vcpkg::triplet::X86_WINDOWS);
|
||||
Assert::AreEqual(vcpkg::package_spec_parse_result::success, vcpkg::to_package_spec_parse_result(spec.error_code()));
|
||||
Assert::AreEqual("zlib", spec.get()->name.c_str());
|
||||
Assert::AreEqual(vcpkg::triplet::X86_WINDOWS.value, spec.get()->target_triplet.value);
|
||||
Assert::AreEqual(vcpkg::triplet::X86_WINDOWS.canonical_name(), spec.get()->target_triplet.canonical_name());
|
||||
}
|
||||
|
||||
TEST_METHOD(package_spec_parse_with_arch)
|
||||
|
|
@ -319,7 +319,7 @@ namespace UnitTest1
|
|||
vcpkg::expected<vcpkg::package_spec> spec = vcpkg::package_spec::from_string("zlib:x64-uwp", vcpkg::triplet::X86_WINDOWS);
|
||||
Assert::AreEqual(vcpkg::package_spec_parse_result::success, vcpkg::to_package_spec_parse_result(spec.error_code()));
|
||||
Assert::AreEqual("zlib", spec.get()->name.c_str());
|
||||
Assert::AreEqual(vcpkg::triplet::X64_UWP.value, spec.get()->target_triplet.value);
|
||||
Assert::AreEqual(vcpkg::triplet::X64_UWP.canonical_name(), spec.get()->target_triplet.canonical_name());
|
||||
}
|
||||
|
||||
TEST_METHOD(package_spec_parse_with_multiple_colon)
|
||||
|
|
|
|||
|
|
@ -1,17 +1,18 @@
|
|||
#include "triplet.h"
|
||||
#include "vcpkg_Checks.h"
|
||||
#include <algorithm>
|
||||
|
||||
namespace vcpkg
|
||||
{
|
||||
const triplet triplet::X86_WINDOWS = {"x86-windows"};
|
||||
const triplet triplet::X64_WINDOWS = {"x64-windows"};
|
||||
const triplet triplet::X86_UWP = {"x86-uwp"};
|
||||
const triplet triplet::X64_UWP = {"x64-uwp"};
|
||||
const triplet triplet::ARM_UWP = {"arm-uwp"};
|
||||
const triplet triplet::X86_WINDOWS = from_canonical_name("x86-windows");
|
||||
const triplet triplet::X64_WINDOWS = from_canonical_name("x64-windows");
|
||||
const triplet triplet::X86_UWP = from_canonical_name("x86-uwp");
|
||||
const triplet triplet::X64_UWP = from_canonical_name("x64-uwp");
|
||||
const triplet triplet::ARM_UWP = from_canonical_name("arm-uwp");
|
||||
|
||||
std::string to_string(const triplet& t)
|
||||
{
|
||||
return t.value;
|
||||
return t.canonical_name();
|
||||
}
|
||||
|
||||
std::string to_printf_arg(const triplet& t)
|
||||
|
|
@ -21,7 +22,7 @@ namespace vcpkg
|
|||
|
||||
bool operator==(const triplet& left, const triplet& right)
|
||||
{
|
||||
return left.value == right.value;
|
||||
return left.canonical_name() == right.canonical_name();
|
||||
}
|
||||
|
||||
bool operator!=(const triplet& left, const triplet& right)
|
||||
|
|
@ -34,17 +35,33 @@ namespace vcpkg
|
|||
return os << to_string(t);
|
||||
}
|
||||
|
||||
triplet triplet::from_canonical_name(const std::string& triplet_as_string)
|
||||
{
|
||||
std::string s(triplet_as_string);
|
||||
std::transform(s.begin(), s.end(), s.begin(), ::tolower);
|
||||
|
||||
auto it = std::find(s.cbegin(), s.cend(), '-');
|
||||
Checks::check_exit(it != s.cend(), "Invalid triplet: %s", triplet_as_string);
|
||||
|
||||
triplet t;
|
||||
t.m_canonical_name = s;
|
||||
return t;
|
||||
}
|
||||
|
||||
const std::string& triplet::canonical_name() const
|
||||
{
|
||||
return this->m_canonical_name;
|
||||
}
|
||||
|
||||
std::string triplet::architecture() const
|
||||
{
|
||||
auto it = std::find(this->value.cbegin(), this->value.cend(), '-');
|
||||
Checks::check_exit(it != this->value.end(), "Invalid triplet: %s", this->value);
|
||||
return std::string(this->value.cbegin(), it);
|
||||
auto it = std::find(this->m_canonical_name.cbegin(), this->m_canonical_name.cend(), '-');
|
||||
return std::string(this->m_canonical_name.cbegin(), it);
|
||||
}
|
||||
|
||||
std::string triplet::system() const
|
||||
{
|
||||
auto it = std::find(this->value.cbegin(), this->value.cend(), '-');
|
||||
Checks::check_exit(it != this->value.end(), "Invalid triplet: %s", this->value);
|
||||
return std::string(it + 1, this->value.cend());
|
||||
auto it = std::find(this->m_canonical_name.cbegin(), this->m_canonical_name.cend(), '-');
|
||||
return std::string(it + 1, this->m_canonical_name.cend());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,8 +33,8 @@ namespace vcpkg {namespace Input
|
|||
{
|
||||
if (!paths.is_valid_triplet(t))
|
||||
{
|
||||
System::println(System::color::error, "Error: invalid triplet: %s", t.value);
|
||||
TrackProperty("error", "invalid triplet: " + t.value);
|
||||
System::println(System::color::error, "Error: invalid triplet: %s", t.canonical_name());
|
||||
TrackProperty("error", "invalid triplet: " + t.canonical_name());
|
||||
help_topic_valid_triplet(paths);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -61,7 +61,7 @@ namespace vcpkg
|
|||
for (; it != fs::directory_iterator(); ++it)
|
||||
{
|
||||
std::string triplet_file_name = it->path().stem().generic_u8string();
|
||||
if (t.value == triplet_file_name) // TODO: fuzzy compare
|
||||
if (t.canonical_name() == triplet_file_name) // TODO: fuzzy compare
|
||||
{
|
||||
//t.value = triplet_file_name; // NOTE: uncomment when implementing fuzzy compare
|
||||
return true;
|
||||
|
|
|
|||
Loading…
Reference in New Issue