aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--build2/cc/compile.cxx4
-rw-r--r--build2/scope.cxx42
-rw-r--r--build2/scope.hxx5
3 files changed, 31 insertions, 20 deletions
diff --git a/build2/cc/compile.cxx b/build2/cc/compile.cxx
index 79d40c3..bfc79c9 100644
--- a/build2/cc/compile.cxx
+++ b/build2/cc/compile.cxx
@@ -2052,7 +2052,7 @@ namespace build2
if (!pfx_map->empty ())
{
dir_path d (f.directory ());
- auto i (pfx_map->find_sub (d));
+ auto i (pfx_map->find_sup (d));
if (i != pfx_map->end ())
{
@@ -2097,7 +2097,7 @@ namespace build2
{
// Find the most qualified prefix of which we are a sub-path.
//
- auto i (so_map.find_sub (f));
+ auto i (so_map.find_sup (f));
if (i != so_map.end ())
{
// Ok, there is an out tree for this headers. Remap to a path
diff --git a/build2/scope.cxx b/build2/scope.cxx
index 1cbb815..6b6b18a 100644
--- a/build2/scope.cxx
+++ b/build2/scope.cxx
@@ -788,29 +788,35 @@ namespace build2
return er.first;
}
- // Find the most qualified scope that encompasses this path.
- //
scope& scope_map::
find (const dir_path& k)
{
scope_map_base& m (*this);
- // Normally we would have a scope for the full path so try that before
- // making any copies.
+ // Better implementation that should work but doesn't.
//
- auto i (m.find (k)), e (m.end ());
-
- if (i != e)
- return i->second;
-
- for (dir_path d (k.directory ());; d = d.directory ())
- {
- auto i (m.find (d));
-
- if (i != e)
- return i->second;
-
- assert (!d.empty ()); // We should have the global scope.
- }
+#if 0
+ assert (k.normalized (false)); // Allow non-canonical dir separators.
+ auto i (m.find_sup (k));
+ return i != m.end () ? i->second : const_cast<scope&> (*global_scope);
+#else
+ // Normally we would have a scope for the full path so try that before
+ // making any copies.
+ //
+ auto i (m.find (k)), e (m.end ());
+
+ if (i != e)
+ return i->second;
+
+ for (dir_path d (k.directory ());; d = d.directory ())
+ {
+ auto i (m.find (d));
+
+ if (i != e)
+ return i->second;
+
+ assert (!d.empty ()); // We should have the global scope.
+ }
+#endif
}
}
diff --git a/build2/scope.hxx b/build2/scope.hxx
index 2be2b3a..028dbce 100644
--- a/build2/scope.hxx
+++ b/build2/scope.hxx
@@ -336,6 +336,11 @@ namespace build2
// directory (i.e., the calling code does not know what it is dealing
// with), so let's use the whole path.
//
+ // In fact, ideally, we should have used path_map instead of
+ // dir_path_map to be able to search for both paths without any casting
+ // (and copies). But currently we have too much stuff pointing to the
+ // key.
+ //
return find (path_cast<dir_path> (p));
}