From a4f2f99f23575a6cdcde5f18b8778ba2827ceb42 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Tue, 21 Mar 2023 06:53:03 +0200 Subject: Allow multiple values for --archive-lang* pkg-bindist option --- bpkg/system-package-manager-archive.cxx | 40 ++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 16 deletions(-) (limited to 'bpkg/system-package-manager-archive.cxx') diff --git a/bpkg/system-package-manager-archive.cxx b/bpkg/system-package-manager-archive.cxx index 384a0d5..79d4ca4 100644 --- a/bpkg/system-package-manager-archive.cxx +++ b/bpkg/system-package-manager-archive.cxx @@ -522,24 +522,23 @@ namespace bpkg // @@ Maybe we should just do "soft" version like in ? // // Note that we allow multiple values for the same language to support - // cases like --archive-lang cc=gcc12 --archive-lang cc=g++12. @@ This - // is TODO (need cli support for std::multimap). + // cases like --archive-lang cc=gcc12 --archive-lang cc=g++12. // vector>> langrt; - auto find = [] (const std::map& m, const string& n) + auto find = [] (const std::multimap& m, const string& n) { - auto i (m.find (n)); + auto p (m.equal_range (n)); - if (i == m.end ()) + if (p.first == p.second) { // If no mapping for c/c++, fallback to cc. // if (n == "c" || n == "c++") - i = m.find ("cc"); + p = m.equal_range ("cc"); } - return i != m.end () ? &*i : nullptr; + return p; }; auto add = [&langrt] (const pair& p) @@ -573,20 +572,23 @@ namespace bpkg if (l.impl) continue; - const pair* p (find (intfm, l.name)); + auto p (find (intfm, l.name)); - if (p == nullptr) + if (p.first == p.second) p = find (implm, l.name); - if (p == nullptr) + if (p.first == p.second) fail << "no runtime mapping for language " << l.name << info << "consider specifying with --archive-lang[-impl]" << info << "or alternatively specify --archive-build-meta"; - if (p->second.empty ()) - continue; // Unimportant. + for (auto i (p.first); i != p.second; ++i) + { + if (i->second.empty ()) + continue; // Unimportant. - add (*p); + add (*i); + } } } @@ -595,12 +597,18 @@ namespace bpkg if (lib && !l.impl) continue; - const pair* p (find (implm, l.name)); + auto p (find (implm, l.name)); - if (p == nullptr || p->second.empty ()) + if (p.first == p.second) continue; // Unimportant. - add (*p); + for (auto i (p.first); i != p.second; ++i) + { + if (i->second.empty ()) + continue; // Unimportant. + + add (*i); + } } for (const pair& p: langrt) -- cgit v1.1