chiark / gitweb /
Merge subdirmk 0.4
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 16 Feb 2020 18:45:25 +0000 (18:45 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 16 Feb 2020 18:47:51 +0000 (18:47 +0000)
git subtree pull.  Fix up test-example/Dir.sd.mk for the incompatible
change (`&${' needs to become `&{').

Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
subdirmk/README
subdirmk/generate
subdirmk/tests/filter/Dir.sd.mk
subdirmk/tests/filter/extract-doctests
test-example/Dir.sd.mk

index 3d18dc28294f0f2dfe87062cd8ca4660b3cd2219..f79a280c5746f16954513f7023b5221deb2c0aef 100644 (file)
@@ -130,6 +130,10 @@ So pathname syntax is a subset of:
 &:<directive> <args>....
        recognised at start of line only (possibly after lwsp)
 
+&:             =>      &:
+       for make multiple targets syntax
+       recognised anywhere *except* start of line
+
 &:include filename             filename should usually be [&]foo.sd.mk
 &:-include filename            tolerate nonexistent file
        RHS is &-expanded but filenames are relative to the top
@@ -166,6 +170,9 @@ So pathname syntax is a subset of:
        `all' is extra special: every directory has an `all'
        target, which corresponds to &TARGETS.
 
+Directives
+- - - - -
+
 &:warn [!]WARNTAG ...
        Suppress (with !) or re-enable (without !) warnings tagged
        WARNTAG (see section `Warnings', below).  The suppression list
@@ -219,17 +226,18 @@ STUFF $ THINGS    ..      STUFF $$ THINGS
 &:endm         ..      endef
        NAME is processed for &
 
-&${..$..} =>   ${eval ${call ..$$..}}
+&{..$..}       =>      ${eval ${call ..$$..}}
        (matches { } pairs to find the end)
        content is $-doubled (unless it contains &$- to turn that off)
+       contrast &(...), see "Convenience syntax for call", below.
 
-Together &:macro and &${...} provide a more reasonable macro facility
+Together &:macro and &{...} provide a more reasonable macro facility
 than raw make.  They solve the problem that make expansions cannot
-directly generate multiple rules, variable, etc.; instead, `$(eval )'
+directly generate multiple rules, variables, etc.; instead, `$(eval )'
 must be used, but that re-expands the argument, meaning that all the
 literal text must be $-doubled.  This applies to the macro text and to
 the arguments.  Also `$(eval $(call ...))' is an unfortunate syntax.
-Hence &:macro and &${...}.
+Hence &:macro and &{...}.
 
 While dollar-doubling:
 - - - - - - - - - - -
@@ -238,13 +246,29 @@ $ =>      $$      including $'s produced by other
                         &-expansions not mentioned here
 
 &\$    =>      $
-&$(    =>      ${      (expands to { } so it is useable for shell too)
+&$(    =>      $(
 &$NN   =>      ${NN}   where N are digits
 
 A few contexts do not support $-doubling, such as directive arguments
 or places where this might imply $-quadrupling.  (There is no way to
 get $-quadrupling.)
 
+Convenience syntax for call
+- - - - - - - - - - - - - -
+
+&(thing                =>      $(call thing
+&( thing       =>      $(call thing
+       and specially:
+&(&lc          =>      $(call sub_dir_lc       or $(call TOP_lc
+&( &lc         =>      $(call sub_dir_lc       or $(call TOP_lc
+       even though lc would normally be thought a filename
+
+Unlike &{...}, this does not involve any dollar-doubling.
+
+Use this when the expansion is going to be a piece of text to be used
+as part of a rule, filename, etc.  When the expansion is top-level
+make text (eg, rules), use &:macro and &{...}.
+
 
 Invocation, "recursive" per-directory targets
 ---------------------------------------------
@@ -518,8 +542,8 @@ Legal information
 =================
 
 subdirmk is
+ Copyright 2019-2020 Ian Jackson
  Copyright 2019 Mark Wooding
- Copyright 2019 Ian Jackson
 
     subdirmk and its example is free software; you can redistribute it
     and/or modify it under the terms of the GNU Library General Public
index bcbbf79dde7d86b5ad1b3ff5ba3b30b1ca2359d8..b65ba1de66ce0883a63f33dffe6548b88d37921e 100755 (executable)
@@ -350,6 +350,7 @@ sub process_input_mk ($$$$) {
                next;
            }
            if (s{^\\$esc}{}) { od "$$esclitr" }
+           elsif (s{^:}{}) { od "$$esclitr:" }
            elsif (s{^\\\$}{}) { oud '$' }
            elsif (s{^\\\s+$}{}) { }
            elsif (s{^$esc}{}) { od "$$esclitr$$esclitr" }
@@ -367,15 +368,17 @@ sub process_input_mk ($$$$) {
            elsif (s{^\$\-}{}) { $ddbl=undef; }
            elsif (s{^\$\+}{}) { $ddbl=1; }
            elsif (s{^\$\(}{}) {
-               ddbl_only($&); oud "\${";
+               ddbl_only($&); oud "\$(";
                $note_varref->($2,!!$1) if m{^($esc)?([^()\$]+\))};
            }
            elsif (s{^\$(\d+)}{}) { ddbl_only($&); oud "\${$1}"; }
-           elsif (s{^\$\{}{}) {
+           elsif (s{^\(\s*$esc(?=$lc_re)}{}) { od "\$(call ${var_prefix}" }
+           elsif (s{^\(\s*(?=\S)}{}        ) { od "\$(call "              }
+           elsif (s{^\{}{}) {
                err 'macro invocation cannot be re-$-doubled' if $ddbl;
                od '${eval ${call ';
                $evalcall_brackets = 1;
-               $push_nest->('eval',1, '&${...}');
+               $push_nest->('eval',1, '&{...}');
                $note_varref->($2,!!$1) if m{^\s*($esc)?([^,{}\$]+)};
            } elsif (s{^([~^]?)(?=[ \t])}{}) {
                my $prefix = $pfxmap{$1} // die "internal error ($1?)";
index a9da21fcb2599153b26d03d67d4020d0dc352843..f5e2868805869b90edcb7187728040d85e33d72a 100644 (file)
@@ -14,7 +14,7 @@ WARN += 3
 # &$NOWARN1 $(NOWARN1)
 # &$NOWARN2 $(NOWARN2)
 
-&${ some-macro, 42, $x, { &$- $(foreach something) } }
+&{ some-macro, 42, $x, { &$- $(foreach something) } }
 
 $&FBAR
 
index 130c23705b2828968fceeacd233ec010460221b5..44a94b2a001825b61d515c4aae888c78f5186172 100755 (executable)
@@ -45,9 +45,9 @@ while (<>) {
     next unless m{\=\>} or ($cent and m{ \.\. });
     my $mapop = '=>';
     # adhoc: special case NEWQUOTE here so we recognise things in changequote
-    if (s{^(\s*)(\&\S+|NEWQUOTE\S+|\$)\s+(\=\>|\.\.)\s+(\S+)\s+}{} ||
-       s{^()(\&\:\w+(?: \S+)*)\s{2,}(\=\>)\s{2,}($withspcs)$}{} ||
-        $cent && s{^()($withspcs)\s{2,}(\.\.)\s{2,}($withspcs)$}{}) {
+    if (s{^()(\&\:\w+(?: \S+)*)\s{2,}(\=\>)\s{2,}($withspcs)$}{} ||
+        s{^(\s*)(\&$withspcs|NEWQUOTE\S+|\$)\s+(\=\>|\.\.)\s+($withspcs)\s+}{} ||
+       $cent && s{^()($withspcs)\s{2,}(\.\.)\s{2,}($withspcs)$}{}) {
        # adhoc: expected indented iff in changequote part
        confess if length($1) xor $in_changequote;
        $mapop = $3;
@@ -55,16 +55,13 @@ while (<>) {
        $e->{In} = $2;
        $e->{Out} = $4;
        if (# adhoc: `or ...' introduces the `at toplevel' expansion
-           s{^or (\S+)$}{}) {
+           s{^or ($withspcs)$}{}) {
            $e->{OutTop} = $1 eq 'nothing' ? '' : $1;
        } elsif (# parse: expect other wordish things to be comments
                 m{^(?!or\b)\(?\w{2,} }) {
-       } elsif (# adhoc: slightly special case for $(eval $(call
-                m{^\$\{.*}) {
-           $e->{Out} .= ' '.$&;
        } elsif (m/^$/) {
        } else {
-           confess "unk rhs $_ ?";
+           confess "unk rhs $_ (In=\"$e->{In}\" out=\"$e->{Out}\"?";
        }
        $e->{CQ} = $in_changequote;
        # adhoc: rely on this specific section title
@@ -147,7 +144,7 @@ sub writeout ($) {
                      # adhoc: skip &:macro in already-doubling part
                      return 0 if $e->{In} =~ m{^\&\:macro};
                      # adhoc: skip &${ ie eval in already-doubling part
-                     return 0 if $e->{In} =~ m{^\&\$\{};
+                     return 0 if $e->{In} =~ m{^\&\{};
                      return 0 if $e->{CQ};
                      return $e->{DD} || !grep {
                          # If there are two entries with the same In,
index 2e790679b582a661dc7bfe9f44a50f303c005a6c..ff34215be05e8aed4434c11996cd6cee4d85177f 100644 (file)
@@ -24,9 +24,9 @@ include common.make
        rm -rf &/&$1.privkeys
 &:endm
 
-&${&privkey,outside,5dc36a4700,rsa1-sites2.key}
-&${&privkey,outside,0000000000,outside.key}
-&${&privkey,inside,0000000000,inside.key}
+&{&privkey,outside,5dc36a4700,rsa1-sites2.key}
+&{&privkey,outside,0000000000,outside.key}
+&{&privkey,inside,0000000000,inside.key}
 
 &all-privkeys:: $(&PRIVKEYS)