aboutsummaryrefslogtreecommitdiff
path: root/toolsrc/src/SourceParagraph.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'toolsrc/src/SourceParagraph.cpp')
-rw-r--r--toolsrc/src/SourceParagraph.cpp62
1 files changed, 57 insertions, 5 deletions
diff --git a/toolsrc/src/SourceParagraph.cpp b/toolsrc/src/SourceParagraph.cpp
index 3b770a4b4..a938feb99 100644
--- a/toolsrc/src/SourceParagraph.cpp
+++ b/toolsrc/src/SourceParagraph.cpp
@@ -12,7 +12,7 @@
namespace vcpkg
{
- //
+ bool g_feature_packages = false;
namespace SourceParagraphRequiredField
{
static const std::string SOURCE = "Source";
@@ -25,6 +25,7 @@ namespace vcpkg
static const std::string MAINTAINER = "Maintainer";
static const std::string BUILD_DEPENDS = "Build-Depends";
static const std::string SUPPORTS = "Supports";
+ static const std::string DEFAULTFEATURES = "Default-Features";
}
static span<const std::string> get_list_of_valid_fields()
@@ -40,6 +41,17 @@ namespace vcpkg
return valid_fields;
}
+ namespace FeatureParagraphRequiredField
+ {
+ static const std::string FEATURE = "Feature";
+ }
+
+ namespace FeatureParagraphOptionalField
+ {
+ static const std::string DESCRIPTION = "Description";
+ static const std::string BUILD_DEPENDS = "Build-Depends";
+ }
+
void print_error_message(span<const ParseControlErrorInfo> error_info_list)
{
Checks::check_exit(VCPKG_LINE_INFO, error_info_list.size() > 0);
@@ -74,11 +86,22 @@ namespace vcpkg
System::println("Different source may be available for vcpkg. Use .\\bootstrap-vcpkg.bat to update.\n");
}
}
+ std::vector<SourceParagraph> getSourceParagraphs(const std::vector<SourceControlFile>& control_files)
+ {
+ return Util::fmap(control_files, [](const SourceControlFile& x) { return x.core_paragraph; });
+ }
- ExpectedT<SourceParagraph, ParseControlErrorInfo> SourceParagraph::parse_control_file(
- std::unordered_map<std::string, std::string> fields)
+ ExpectedT<SourceControlFile, ParseControlErrorInfo> SourceControlFile::parse_control_file(
+ std::vector<std::unordered_map<std::string, std::string>>&& control_paragraphs)
{
- SourceParagraph sparagraph;
+ if (control_paragraphs.size() == 0)
+ {
+ return ExpectedT<SourceControlFile, ParseControlErrorInfo>();
+ }
+ auto&& fields = control_paragraphs.front();
+
+ SourceControlFile control_file;
+ SourceParagraph& sparagraph = control_file.core_paragraph;
sparagraph.name = details::remove_required_field(&fields, SourceParagraphRequiredField::SOURCE);
sparagraph.version = details::remove_required_field(&fields, SourceParagraphRequiredField::VERSION);
sparagraph.description = details::remove_optional_field(&fields, SourceParagraphOptionalField::DESCRIPTION);
@@ -90,6 +113,9 @@ namespace vcpkg
std::string sups = details::remove_optional_field(&fields, SourceParagraphOptionalField::SUPPORTS);
sparagraph.supports = parse_comma_list(sups);
+ sparagraph.default_features =
+ details::remove_optional_field(&fields, SourceParagraphOptionalField::DEFAULTFEATURES);
+
if (!fields.empty())
{
const std::vector<std::string> remaining_fields = Maps::extract_keys(fields);
@@ -98,7 +124,33 @@ namespace vcpkg
return ParseControlErrorInfo{sparagraph.name, remaining_fields_as_string};
}
- return sparagraph;
+
+ control_paragraphs.erase(control_paragraphs.begin());
+
+ for (auto&& feature_pgh : control_paragraphs)
+ {
+ control_file.feature_paragraphs.emplace_back(std::make_unique<FeatureParagraph>());
+
+ FeatureParagraph& fparagraph = *control_file.feature_paragraphs.back();
+
+ fparagraph.name = details::remove_required_field(&feature_pgh, FeatureParagraphRequiredField::FEATURE);
+ fparagraph.description =
+ details::remove_required_field(&feature_pgh, FeatureParagraphOptionalField::DESCRIPTION);
+ std::string feature_deps =
+ details::remove_optional_field(&feature_pgh, FeatureParagraphOptionalField::BUILD_DEPENDS);
+ fparagraph.depends = expand_qualified_dependencies(parse_comma_list(feature_deps));
+
+ if (!feature_pgh.empty())
+ {
+ const std::vector<std::string> remaining_fields = Maps::extract_keys(feature_pgh);
+
+ const std::string remaining_fields_as_string = Strings::join("\n ", remaining_fields);
+
+ return ParseControlErrorInfo{sparagraph.name, remaining_fields_as_string};
+ }
+ }
+
+ return control_file;
}
std::vector<Dependency> vcpkg::expand_qualified_dependencies(const std::vector<std::string>& depends)