aboutsummaryrefslogtreecommitdiff
path: root/toolsrc/src/SourceParagraph.cpp
diff options
context:
space:
mode:
authorRobert Schumacher <roschuma@microsoft.com>2017-06-06 16:08:36 -0700
committerRobert Schumacher <roschuma@microsoft.com>2017-06-06 16:08:36 -0700
commit831f0631f7eea7aebad5fcce95c0bbf0e0cdff68 (patch)
tree00e8bfe0625c30329f04f73dec5b656bdfb90954 /toolsrc/src/SourceParagraph.cpp
parenta8edf0710cd8a52abd8b88ff0ebe159621c3b206 (diff)
downloadvcpkg-831f0631f7eea7aebad5fcce95c0bbf0e0cdff68.tar.gz
vcpkg-831f0631f7eea7aebad5fcce95c0bbf0e0cdff68.zip
[vcpkg] Added parser support for 'Supports' field
Diffstat (limited to 'toolsrc/src/SourceParagraph.cpp')
-rw-r--r--toolsrc/src/SourceParagraph.cpp80
1 files changed, 61 insertions, 19 deletions
diff --git a/toolsrc/src/SourceParagraph.cpp b/toolsrc/src/SourceParagraph.cpp
index c77659176..2508af1e8 100644
--- a/toolsrc/src/SourceParagraph.cpp
+++ b/toolsrc/src/SourceParagraph.cpp
@@ -5,6 +5,7 @@
#include "vcpkg_Checks.h"
#include "vcpkg_Maps.h"
#include "vcpkg_System.h"
+#include "vcpkg_Util.h"
#include "vcpkg_expected.h"
#include "vcpkglib_helpers.h"
@@ -23,6 +24,7 @@ namespace vcpkg
static const std::string DESCRIPTION = "Description";
static const std::string MAINTAINER = "Maintainer";
static const std::string BUILD_DEPENDS = "Build-Depends";
+ static const std::string SUPPORTS = "Supports";
}
static const std::vector<std::string>& get_list_of_valid_fields()
@@ -32,7 +34,8 @@ namespace vcpkg
SourceParagraphOptionalField::DESCRIPTION,
SourceParagraphOptionalField::MAINTAINER,
- SourceParagraphOptionalField::BUILD_DEPENDS};
+ SourceParagraphOptionalField::BUILD_DEPENDS,
+ SourceParagraphOptionalField::SUPPORTS};
return valid_fields;
}
@@ -72,7 +75,10 @@ namespace vcpkg
sparagraph.maintainer = details::remove_optional_field(&fields, SourceParagraphOptionalField::MAINTAINER);
std::string deps = details::remove_optional_field(&fields, SourceParagraphOptionalField::BUILD_DEPENDS);
- sparagraph.depends = expand_qualified_dependencies(parse_depends(deps));
+ sparagraph.depends = expand_qualified_dependencies(parse_comma_list(deps));
+
+ std::string sups = details::remove_optional_field(&fields, SourceParagraphOptionalField::SUPPORTS);
+ sparagraph.supports = parse_comma_list(sups);
if (!fields.empty())
{
@@ -89,7 +95,7 @@ namespace vcpkg
std::vector<Dependency> vcpkg::expand_qualified_dependencies(const std::vector<std::string>& depends)
{
- auto convert = [&](const std::string& depend_string) -> Dependency {
+ return Util::fmap(depends, [&](const std::string& depend_string) -> Dependency {
auto pos = depend_string.find(' ');
if (pos == std::string::npos) return {depend_string, ""};
// expect of the form "\w+ \[\w+\]"
@@ -102,21 +108,12 @@ namespace vcpkg
}
dep.qualifier = depend_string.substr(pos + 2, depend_string.size() - pos - 3);
return dep;
- };
-
- std::vector<vcpkg::Dependency> ret;
-
- for (auto&& depend_string : depends)
- {
- ret.push_back(convert(depend_string));
- }
-
- return ret;
+ });
}
- std::vector<std::string> parse_depends(const std::string& depends_string)
+ std::vector<std::string> parse_comma_list(const std::string& str)
{
- if (depends_string.empty())
+ if (str.empty())
{
return {};
}
@@ -126,17 +123,17 @@ namespace vcpkg
size_t cur = 0;
do
{
- auto pos = depends_string.find(',', cur);
+ auto pos = str.find(',', cur);
if (pos == std::string::npos)
{
- out.push_back(depends_string.substr(cur));
+ out.push_back(str.substr(cur));
break;
}
- out.push_back(depends_string.substr(cur, pos - cur));
+ out.push_back(str.substr(cur, pos - cur));
// skip comma and space
++pos;
- if (depends_string[pos] == ' ')
+ if (str[pos] == ' ')
{
++pos;
}
@@ -161,4 +158,49 @@ namespace vcpkg
}
const std::string& to_string(const Dependency& dep) { return dep.name; }
+
+ ExpectedT<Supports, std::vector<std::string>> Supports::parse(const std::vector<std::string>& strs)
+ {
+ Supports ret;
+ std::vector<std::string> unrecognized;
+
+ for (auto&& str : strs)
+ {
+ if (str == "x64")
+ ret.architectures.push_back(Architecture::X64);
+ else if (str == "x86")
+ ret.architectures.push_back(Architecture::X86);
+ else if (str == "arm")
+ ret.architectures.push_back(Architecture::ARM);
+ else if (str == "windows")
+ ret.platforms.push_back(Platform::WINDOWS);
+ else if (str == "uwp")
+ ret.platforms.push_back(Platform::UWP);
+ else if (str == "v140")
+ ret.toolsets.push_back(ToolsetVersion::V140);
+ else if (str == "v141")
+ ret.toolsets.push_back(ToolsetVersion::V141);
+ else if (str == "crt-static")
+ ret.crt_linkages.push_back(Linkage::STATIC);
+ else if (str == "crt-dynamic")
+ ret.crt_linkages.push_back(Linkage::DYNAMIC);
+ else
+ unrecognized.push_back(str);
+ }
+
+ if (unrecognized.empty())
+ return std::move(ret);
+ else
+ return std::move(unrecognized);
+ }
+
+ bool Supports::supports(Architecture arch, Platform plat, Linkage crt, ToolsetVersion tools)
+ {
+ auto is_in_or_empty = [](auto v, auto&& c) -> bool { return c.empty() || c.end() != Util::find(c, v); };
+ if (!is_in_or_empty(arch, architectures)) return false;
+ if (!is_in_or_empty(plat, platforms)) return false;
+ if (!is_in_or_empty(crt, crt_linkages)) return false;
+ if (!is_in_or_empty(tools, toolsets)) return false;
+ return true;
+ }
}