X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ian/git?p=subdirmk.git;a=blobdiff_plain;f=generate;h=5273e1543d2567a79096d3103a619fd3111cee72;hp=634fdc8ce8d1d77e0c9269513f3ae24d50b91f77;hb=033421585dfa781211b558d7acc310b8540ba60e;hpb=720bbf0371f3bcb2f8ccc0b8ee1cfe03762c28b8 diff --git a/generate b/generate index 634fdc8..5273e15 100755 --- a/generate +++ b/generate @@ -114,11 +114,26 @@ Makefile run-main.mk: END } -sub process_input_mk ($$$$$$$$$); -sub process_input_mk ($$$$$$$$$) { - my ($dir_prefix, $dir_suffix, $dir_name, - $var_prefix, $var_prefix_name, $targets, - $f, $esclitr, $enoent_ok) = @_; +our ($dir_prefix, $dir_suffix, $dir_name, + $var_prefix, $var_prefix_name); + +sub dir_prefix ($) { + my ($path) = @_; + join '', map { "$_/" } @$path; +} + +sub set_dir_vars ($) { + my ($path) = @_; + $dir_prefix = dir_prefix($path); + $dir_suffix = join '', map { "/$_" } @$path; + $dir_name = join '/', @$path ? @$path : '.'; + $var_prefix_name = join '_', @$path ? @$path : qw(TOP); + $var_prefix = "${var_prefix_name}_"; +} + +sub process_input_mk ($$$$); +sub process_input_mk ($$$$) { + my ($targets, $f, $esclitr, $enoent_ok) = @_; my $caps_re = qr{[A-Z]}; my $lc_re = qr{[a-z]}; @@ -196,9 +211,7 @@ sub process_input_mk ($$$$$$$$$) { $buffering_output=undef; if (m#^(-?)include\s+(\S+)\s+$#) { my $subf = "$srcdir/$2"; - process_input_mk($dir_prefix, $dir_suffix, $dir_name, - $var_prefix, $var_prefix_name, $targets, - $subf, $esclitr, $1); + process_input_mk($targets, $subf, $esclitr, $1); o "\n"; } else { die "internal error buffering directive $_ "; @@ -209,9 +222,8 @@ sub process_input_mk ($$$$$$$$$) { close $input or die "close $f: $!\n"; } -sub filter_subdir_mk ($$$$$$) { - my ($dir_prefix, $dir_suffix, $dir_name, - $var_prefix, $var_prefix_name, $targets) = @_; +sub filter_subdir_mk ($) { + my ($targets) = @_; #use Data::Dumper; #print STDERR "filter @_\n"; @@ -220,28 +232,25 @@ sub filter_subdir_mk ($$$$$$) { my $pi = sub { my ($f, $enoentok) = @_; - process_input_mk($dir_prefix, $dir_suffix, $dir_name, - $var_prefix, $var_prefix_name, $targets, - "${srcdir}/$f", \$esclit, $enoentok); + process_input_mk($targets, "${srcdir}/$f", \$esclit, $enoentok); }; + $pi->("Prefix.sd.mk", 1); $pi->("${dir_prefix}Subdir.sd.mk", 0); - $pi->("Perdir.sd.mk", 1); + $pi->("Suffix.sd.mk", 1); } sub process_subtree ($$); sub process_subtree ($$) { - # => list of descendants (in form SUBDIR/) + # => list of targets (in form SUBDIR/) # recursive, children first my ($node, $path) = @_; #use Data::Dumper; #print STDERR Dumper(\@_); - my $dir_prefix = join '', map { "$_/" } @$path; - my $dir_suffix = join '', map { "/$_" } @$path; - my $dir_name = join '/', @$path ? @$path : '.'; - my $var_prefix_name = join '_', @$path ? @$path : qw(TOP); - my $var_prefix = "${var_prefix_name}_"; + my $dir_prefix = dir_prefix($path); + # ^ this is the only var which we need before we come back from + # the recursion. push @output_makefiles, "${dir_prefix}Subdir.mk"; write_makefile($dir_prefix, scalar @$path); @@ -254,11 +263,12 @@ sub process_subtree ($$) { push @{ $targets{$_} }, $child_subdir foreach process_subtree($child, \@childpath); } + + set_dir_vars($path); start_output_file("${dir_prefix}Subdir.mk.tmp"); if ($node->[2]) { - filter_subdir_mk($dir_prefix, $dir_suffix, $dir_name, - $var_prefix, $var_prefix_name, \%targets); + filter_subdir_mk(\%targets); } else { my $sdmk = "${dir_prefix}Subdir.sd.mk"; if (stat $sdmk) {