Fix duplicate suppression to handle same name with and without prefix
This commit is contained in:
parent
950c00d571
commit
3a41d19323
@ -498,3 +498,24 @@ cat config.h >>EOO
|
|||||||
#undef PREFIX_TEST_DUMMY3_H
|
#undef PREFIX_TEST_DUMMY3_H
|
||||||
#define PREFIX_TEST_DUMMY3_H zzz_TEST_DUMMY3_H
|
#define PREFIX_TEST_DUMMY3_H zzz_TEST_DUMMY3_H
|
||||||
EOO
|
EOO
|
||||||
|
|
||||||
|
: alias-map-prefix-same-name
|
||||||
|
:
|
||||||
|
mkdir build;
|
||||||
|
ln -s ../../bootstrap.build ../../root.build build/;
|
||||||
|
cat <<EOI >=config.h.cmake;
|
||||||
|
#cmakedefine PREFIX_zzz_TEST_DUMMY3_H
|
||||||
|
EOI
|
||||||
|
$* <<EOI &config.h &config.h.d;
|
||||||
|
./: h{config}: in{config.h.cmake}
|
||||||
|
{
|
||||||
|
autoconf.prefix = PREFIX_
|
||||||
|
autoconf.aliases = PREFIX_zzz_TEST_DUMMY3_H@zzz_TEST_DUMMY3_H
|
||||||
|
}
|
||||||
|
EOI
|
||||||
|
cat config.h >>EOO
|
||||||
|
#define zzz_TEST_DUMMY3_H 1
|
||||||
|
|
||||||
|
#undef PREFIX_zzz_TEST_DUMMY3_H
|
||||||
|
#define PREFIX_zzz_TEST_DUMMY3_H zzz_TEST_DUMMY3_H
|
||||||
|
EOO
|
||||||
|
@ -32,7 +32,7 @@ namespace build2
|
|||||||
autoconf::flavor flavor;
|
autoconf::flavor flavor;
|
||||||
string prefix;
|
string prefix;
|
||||||
const alias_map* aliases;
|
const alias_map* aliases;
|
||||||
map<string, string> checks; // Checks already seen.
|
set<string> checks; // Checks already seen.
|
||||||
|
|
||||||
const autoconf::rule& rule;
|
const autoconf::rule& rule;
|
||||||
|
|
||||||
@ -499,13 +499,6 @@ namespace build2
|
|||||||
// 1. Suppress if a duplicate (we do it regardless of whether it is
|
// 1. Suppress if a duplicate (we do it regardless of whether it is
|
||||||
// from the catalog or custom).
|
// from the catalog or custom).
|
||||||
//
|
//
|
||||||
// Which name should we store, prefixed or prefixless? If we store
|
|
||||||
// prefixed, then it won't be easy to match bases which are
|
|
||||||
// specified without a prefix: we will have to add the prefix
|
|
||||||
// unless the check is unprefixable, which we can only know by
|
|
||||||
// looking it up. So we store prefixless. Actually, it's convenient
|
|
||||||
// to store both.
|
|
||||||
//
|
|
||||||
// 2. Check for a custom value falling through if found.
|
// 2. Check for a custom value falling through if found.
|
||||||
//
|
//
|
||||||
// Here things get a bit tricky: while a stray HAVE_* buildfile
|
// Here things get a bit tricky: while a stray HAVE_* buildfile
|
||||||
@ -520,6 +513,16 @@ namespace build2
|
|||||||
// 3. Look in the catalog and fall through if not found.
|
// 3. Look in the catalog and fall through if not found.
|
||||||
//
|
//
|
||||||
// 4. Return the build-in value from the catalog.
|
// 4. Return the build-in value from the catalog.
|
||||||
|
|
||||||
|
// Note: this line must be recognizable by substitute_special().
|
||||||
|
//
|
||||||
|
if (md.checks.find (n) != md.checks.end ())
|
||||||
|
return "/* " + n + " already defined. */";
|
||||||
|
|
||||||
|
md.checks.insert (n);
|
||||||
|
|
||||||
|
// Note that if there is no prefix in the name, then we only look for
|
||||||
|
// an unprefixable built-in check.
|
||||||
//
|
//
|
||||||
auto deprefix = [&md] (const string& n) -> const char*
|
auto deprefix = [&md] (const string& n) -> const char*
|
||||||
{
|
{
|
||||||
@ -535,19 +538,9 @@ namespace build2
|
|||||||
return n.c_str ();
|
return n.c_str ();
|
||||||
};
|
};
|
||||||
|
|
||||||
// Note that if there is no prefix in the name, then we only look for
|
|
||||||
// an unprefixable built-in check.
|
|
||||||
//
|
|
||||||
const char* pn (deprefix (n)); // Prefixless name.
|
const char* pn (deprefix (n)); // Prefixless name.
|
||||||
const char* en (pn != nullptr ? pn : n.c_str ()); // Effective name.
|
const char* en (pn != nullptr ? pn : n.c_str ()); // Effective name.
|
||||||
|
|
||||||
// Note: this line must be recognizable by substitute_special().
|
|
||||||
//
|
|
||||||
if (md.checks.find (en) != md.checks.end ())
|
|
||||||
return "/* " + n + " already defined. */";
|
|
||||||
|
|
||||||
md.checks.emplace (en, n);
|
|
||||||
|
|
||||||
// If up is true, only look for an unprefixable check.
|
// If up is true, only look for an unprefixable check.
|
||||||
//
|
//
|
||||||
auto find = [] (const char* n, bool up = false) -> const check*
|
auto find = [] (const char* n, bool up = false) -> const check*
|
||||||
@ -664,23 +657,9 @@ namespace build2
|
|||||||
{
|
{
|
||||||
string pn (bs, b, e - b); // Prefixless name.
|
string pn (bs, b, e - b); // Prefixless name.
|
||||||
|
|
||||||
// First supress duplicates.
|
// We have to look it up before suppressing duplicates to know
|
||||||
|
// whether it should be prefixed.
|
||||||
//
|
//
|
||||||
{
|
|
||||||
auto i (md.checks.find (pn));
|
|
||||||
if (i != md.checks.end ())
|
|
||||||
{
|
|
||||||
append (("/* Base " +
|
|
||||||
i->second +
|
|
||||||
" already defined. */").c_str ());
|
|
||||||
|
|
||||||
if (pn != i->second)
|
|
||||||
ns.push_back (move (pn));
|
|
||||||
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const check* c (find (pn.c_str ()));
|
const check* c (find (pn.c_str ()));
|
||||||
|
|
||||||
// While it may be overridden by the user, we should also have
|
// While it may be overridden by the user, we should also have
|
||||||
@ -696,7 +675,19 @@ namespace build2
|
|||||||
|
|
||||||
string n ((up ? string () : md.prefix) + pn);
|
string n ((up ? string () : md.prefix) + pn);
|
||||||
|
|
||||||
md.checks.emplace (pn, n);
|
// Supress duplicates.
|
||||||
|
//
|
||||||
|
if (md.checks.find (n) != md.checks.end ())
|
||||||
|
{
|
||||||
|
append (("/* Base " + n + " already defined. */").c_str ());
|
||||||
|
|
||||||
|
if (!up)
|
||||||
|
ns.push_back (move (pn));
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
md.checks.insert (n);
|
||||||
|
|
||||||
if (custom (n))
|
if (custom (n))
|
||||||
append (this->in::rule::lookup (
|
append (this->in::rule::lookup (
|
||||||
|
Loading…
Reference in New Issue
Block a user