aboutsummaryrefslogtreecommitdiff
path: root/build/file.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'build/file.cxx')
-rw-r--r--build/file.cxx22
1 files changed, 18 insertions, 4 deletions
diff --git a/build/file.cxx b/build/file.cxx
index f6fdd10..8f51660 100644
--- a/build/file.cxx
+++ b/build/file.cxx
@@ -338,7 +338,7 @@ namespace build
name = move (as<string> (v));
}
- level5 ([&]{trace << "extracted project name " << name << " for "
+ level5 ([&]{trace << "extracted project name '" << name << "' for "
<< *src_root;});
return name;
}
@@ -379,6 +379,15 @@ namespace build
//
string name (find_project_name (sd, dir_path (), &src));
+ // If the name is empty, then is is an unnamed project. While the
+ // 'project' variable stays empty, here we come up with a surrogate
+ // name for a key. The idea is that such a key should never conflict
+ // with a real project name. We ensure this by using the project's
+ // sub-directory and appending trailing '/' to it.
+ //
+ if (name.empty ())
+ name = dir.posix_string () + '/';
+
// @@ Can't use move() because we may need the values in diagnostics
// below. Looks like C++17 try_emplace() is what we need.
//
@@ -571,9 +580,14 @@ namespace build
// was specified by the user so it is most likely in our
// src.
//
- i = v.data_.emplace (
- i,
- find_project_name (out_root / d, src_root / d));
+ string n (find_project_name (out_root / d, src_root / d));
+
+ // See find_subprojects() for details on unnamed projects.
+ //
+ if (n.empty ())
+ n = d.posix_string () + '/';
+
+ i = v.data_.emplace (i, move (n));
i->pair = '=';
++i;