X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=generate;h=ae3a9e367c3f85c51cffe0330e24f2c853bed3de;hb=be6adeda08efd5a21ef79347d93d2f555aaf340a;hp=ca54f944d13cf5011df25c77e4ca86f3c5af5821;hpb=61f8c1504443809e6a86217bc8f35ba9c1b7ab5f;p=subdirmk.git diff --git a/generate b/generate index ca54f94..ae3a9e3 100755 --- a/generate +++ b/generate @@ -6,11 +6,11 @@ # # $(srcdir)/subdirmk/generate [--srcdir=SRCDIR] [--] SUBDIR... # -# generates in each subdirectory from in each subdirectory -# Subdir.mk.tmp Subdir.sd.mk -# Makefile and included files -# and in toplevel and in toplevel -# main.mk.tmp Perdir.sd.mk +# generates in each subdirectory +# Subdir.mk.tmp +# Makefile +# and in toplevel +# main.mk.tmp use strict; use POSIX; @@ -137,33 +137,44 @@ sub process_input_mk ($$$$$$$$$) { } $input_files{$f}++; + my %srcdirmap = ( + '^' => "\$(top_srcdir)${dir_suffix}", + '~' => "\$(top_srcdir)", + ); my %pfxmap = ( '' => $dir_prefix, - '^' => "\$(top_srcdir)${dir_suffix}/", - '~' => "\$(top_srcdir)/", ); + $pfxmap{$_} = $srcdirmap{$_}.'/' foreach keys %srcdirmap; while (<$input>) { - if (s#^\s*$esc\:##) { + if (s#^\s*$esc\:changequote\s+(\S+)\s+$##) { + $$esclitr = $1; + $set_esc->(); + next; + } elsif (s#^\s*$esc\:(?=(-?)include)##) { $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; } + unless (s{^(.*?)$esc}{}) { o $_; last; } o $1; - if ($2) { s#^$esc##; o $$esclitr; next; } - s{^$esc}{} or die "$_ ?"; - if (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} //= [ ]; - } + if (s{^\\$esc}{}) { o "$$esclitr" } + elsif (s{^\\\$}{}) { o '$' } + elsif (s{^\\\s+$}{}) { } + elsif (s{^$esc}{}) { o "$$esclitr$$esclitr" } elsif (m{^(?=$caps_re)}) { o $var_prefix } + elsif (s{^\$([A-Za-z]\w+)}{}) { o "\$(${var_prefix}$1)" } elsif (s{^([~^]?)(?=$lc_re)}{}) { o $pfxmap{$1} } elsif (s{^_}{}) { o $var_prefix } - elsif (s{^=_}{}) { o $var_prefix } + elsif (s{^=}{}) { o $var_prefix_name } elsif (s{^([~^]?)/}{}) { o $pfxmap{$1} } - elsif (s{^=/}{}) { o $dir_name } + elsif (s{^\.}{}) { o $dir_name } + elsif (s{^([~^])\.}{}) { o $srcdirmap{$1} } elsif (s{^([~^]?)(?=[ \t])}{}) { my $prefix = $pfxmap{$1} // die; my $after=''; @@ -189,11 +200,8 @@ sub process_input_mk ($$$$$$$$$) { $var_prefix, $var_prefix_name, $targets, $subf, $esclitr, $1); o "\n"; - } elsif (m#^changequote\s+(\S+)\s+$#) { - $$esclitr = $1; - $set_esc->(); } else { - die "unknown directive $_ "; + die "internal error buffering directive $_ "; } } } @@ -222,7 +230,7 @@ sub filter_subdir_mk ($$$$$$) { sub process_subtree ($$); sub process_subtree ($$) { - # => list of descendants (in form SUBDIR/) + # => list of targets (in form SUBDIR/) # recursive, children first my ($node, $path) = @_;