&:<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
`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
&: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:
- - - - - - - - - - -
&-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
---------------------------------------------
=================
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
next;
}
if (s{^\\$esc}{}) { od "$$esclitr" }
+ elsif (s{^:}{}) { od "$$esclitr:" }
elsif (s{^\\\$}{}) { oud '$' }
elsif (s{^\\\s+$}{}) { }
elsif (s{^$esc}{}) { od "$$esclitr$$esclitr" }
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?)";
# &$NOWARN1 $(NOWARN1)
# &$NOWARN2 $(NOWARN2)
-&${ some-macro, 42, $x, { &$- $(foreach something) } }
+&{ some-macro, 42, $x, { &$- $(foreach something) } }
$&FBAR
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;
$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
# 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,
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)