aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--build/variable.cxx27
-rw-r--r--tests/variable/representation/build/bootstrap.build4
-rw-r--r--tests/variable/representation/buildfile18
-rw-r--r--tests/variable/representation/driver.cxx10
-rw-r--r--tests/variable/representation/test.out6
5 files changed, 64 insertions, 1 deletions
diff --git a/build/variable.cxx b/build/variable.cxx
index d215b02..03c910d 100644
--- a/build/variable.cxx
+++ b/build/variable.cxx
@@ -144,6 +144,15 @@ namespace build
bool value_traits<string>::
assign (name& n)
{
+ // The below code is quite convoluted because we don't want to
+ // modify the name until we know it good (if it is not, then it
+ // will most likely be printed by the caller in diagnostics).
+
+ // Suspend project qualification.
+ //
+ const string* p (n.proj);
+ n.proj = nullptr;
+
// Convert directory to string.
//
if (n.directory ())
@@ -158,7 +167,23 @@ namespace build
n.value += '/';
}
- return n.simple ();
+ if (!n.simple ())
+ {
+ n.proj = p; // Restore.
+ return false;
+ }
+
+ // Convert project qualification to its string representation.
+ //
+ if (p != nullptr)
+ {
+ string s (*p);
+ s += '%';
+ s += n.value;
+ s.swap (n.value);
+ }
+
+ return true;
}
static bool
diff --git a/tests/variable/representation/build/bootstrap.build b/tests/variable/representation/build/bootstrap.build
new file mode 100644
index 0000000..6a48e2e
--- /dev/null
+++ b/tests/variable/representation/build/bootstrap.build
@@ -0,0 +1,4 @@
+project = variable-representation
+amalgamation = # Disabled.
+using config
+using test
diff --git a/tests/variable/representation/buildfile b/tests/variable/representation/buildfile
new file mode 100644
index 0000000..22913d5
--- /dev/null
+++ b/tests/variable/representation/buildfile
@@ -0,0 +1,18 @@
+# Test reversibility of variable representation.
+#
+val = -L/
+val += -L/foo/
+#val += dir{-L/}
+
+val += foo%bar
+val += foo%
+val += %bar
+val += foo%{bar}
+#val += foo%file{x}
+
+using cxx
+cxx.ext = cxx
+
+exe{driver}: cxx{driver}
+exe{driver}: test.output = test.out
+exe{driver}: test.options = $val
diff --git a/tests/variable/representation/driver.cxx b/tests/variable/representation/driver.cxx
new file mode 100644
index 0000000..ecff9e2
--- /dev/null
+++ b/tests/variable/representation/driver.cxx
@@ -0,0 +1,10 @@
+#include <iostream>
+
+using namespace std;
+
+int
+main (int argc, const char* argv[])
+{
+ for (int i (1); i < argc; ++i)
+ cout << "'" << argv[i] << "'" << endl;
+}
diff --git a/tests/variable/representation/test.out b/tests/variable/representation/test.out
new file mode 100644
index 0000000..af12c6f
--- /dev/null
+++ b/tests/variable/representation/test.out
@@ -0,0 +1,6 @@
+'-L/'
+'-L/foo/'
+'foo%bar'
+'foo%'
+'%bar'
+'foo%bar'