From a7362cf29a76ef679c9a1ce74715a5d087851b91 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Fri, 11 Sep 2015 13:08:53 +0200 Subject: Add support for unnamed projects Sometimes (e.g., in bpkg configuration) we don't have a project name. In fact, it is not really a project; it can never be referenced in an import directive. So we now have a notion of an unnamed project. Such a project should still have the 'project' variable set first thing in bootstrap.build but its value should be empty. Note that we can still amalgamate such projects just liked named ones. --- build/file.cxx | 22 ++++++++++++++++++---- build/name.cxx | 2 +- 2 files changed, 19 insertions(+), 5 deletions(-) (limited to 'build') 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 (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; diff --git a/build/name.cxx b/build/name.cxx index 4061c78..1bb8d31 100644 --- a/build/name.cxx +++ b/build/name.cxx @@ -53,7 +53,7 @@ namespace build os << n; if (n.pair != '\0') - os << n.pair; + os << n.pair; else if (i != e) os << ' '; } -- cgit v1.1