chiark / gitweb /
Syntax: Refine &TARGETS_things, mostly to avoid # wrinkle
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 9 Dec 2019 15:05:22 +0000 (15:05 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 29 Dec 2019 16:04:31 +0000 (16:04 +0000)
We will add a test case in a moment, since it is quite a noisy diff.

We have to upate clean.sd.mk, which uses this feature.

Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
README
clean.sd.mk
generate

diff --git a/README b/README
index 63e4188..fd10056 100644 (file)
--- a/README
+++ b/README
@@ -295,7 +295,8 @@ So pathname syntax is a subset of:
                NEWQUOTE:changequote &  set escape back to &
 
 &TARGETS_things
-       Handled specially.  If mentioned, declares that this
+       Handled specially.  If mentioned at the start of a line
+       (possibly following whitespace), declares that this
        subdir ought to have a target `things'.  The rule will be
                &/things:: $(&TARGETS_things)
 
@@ -309,9 +310,9 @@ So pathname syntax is a subset of:
        which recursively implies this directory's `things'.
 
        Must be spelled exactly &TARGETS_things.  &_TARGETS_things,
-       for example, is not magic.  But mentioning &TARGETS_things in
-       a #-comment *does* work because the & filter does not care
-       about comments.
+       for example, is not magic.  To make the target exist
+       without providing any prerequisites for it, write a line
+       containing just `&TARGETS_things +='.
 
        `all' is extra special: every directory has an `all'
        target, which corresponds to &TARGETS.
index 045561c..80c40bc 100644 (file)
@@ -19,7 +19,7 @@
 &CLEAN += $(&OBJECTS)
 &CLEAN += $(&TARGETS)
 
-# &TARGETS_clean
+&TARGETS_clean +=
 
 &/clean::
        $(RM) $(&CLEAN)
index e1efc06..e853912 100755 (executable)
--- a/generate
+++ b/generate
@@ -155,6 +155,10 @@ sub process_input_mk ($$$$$$$$$) {
            $buffering_output='';
        } elsif (m#^\s*$esc\:([a-z][-0-9a-z_]*)#) {
            die "unknown directive $1";
+       } elsif (s{^\s*${esc}TARGETS(?:_([0-9a-zA-Z_]+))?(?=\W)}{}) {
+           my $t = $1 // 'all';
+           o target_varname($var_prefix, $t);
+           $targets->{$t} //= [ ];
        }
        for (;;) {
            unless (s{^(.*?)$esc}{}) { o $_; last; }
@@ -162,11 +166,6 @@ sub process_input_mk ($$$$$$$$$) {
            if (s{^\\$esc}{}) { o "$$esclitr" }
            elsif (s{^\\\$}{}) { o '$' }
            elsif (s{^$esc}{}) { o "$$esclitr$$esclitr" }
-           elsif (s{^TARGETS(?:_([0-9a-zA-Z_]+))?(?=\W)}{}) {
-               my $t = $1 // 'all';
-               o target_varname($var_prefix, $t);
-               $targets->{$t} //= [ ];
-           }
            elsif (m{^(?=$caps_re)}) { o $var_prefix }
            elsif (s{^\$([A-Za-z]\w+)}{}) { o "\$(${var_prefix}$1)" }
            elsif (s{^([~^]?)(?=$lc_re)}{}) { o $pfxmap{$1} }