diff --git a/Configurations/common.tmpl b/Configurations/common.tmpl index e3f49e776ab0d1d187562ba6f4be174ad72c4305..ae6e4a12299838f25bddee017e5ff12929edf8b3 100644 --- a/Configurations/common.tmpl +++ b/Configurations/common.tmpl @@ -1,7 +1,9 @@ {- # -*- Mode: perl -*- - # A cache of objects for which a recipe has already been generated - my %cache; + use File::Basename; + + # A cache of objects for which a recipe has already been generated + my %cache; # resolvedepends and reducedepends work in tandem to make sure # there are no duplicate dependencies and that they are in the @@ -158,9 +160,47 @@ $cache{$script} = 1; } + sub dodir { + my $dir = shift; + return "" if !exists(&generatedir) or $cache{$dir}; + $OUT .= generatedir(dir => $dir, + deps => $unified_info{dirinfo}->{$dir}->{deps}, + %{$unified_info{dirinfo}->{$_}->{products}}); + $cache{$dir} = 1; + } + # Start with populating the cache with all the overrides %cache = map { $_ => 1 } @{$unified_info{overrides}}; + # For convenience collect information regarding directories where + # files are generated, those generated files and the end product + # they end up in where applicable. Then, add build rules for those + # directories + if (exists &generatedir) { + my %loopinfo = ( "dso" => [ @{$unified_info{engines}} ], + "lib" => [ @{$unified_info{libraries}} ], + "bin" => [ @{$unified_info{programs}} ], + "script" => [ @{$unified_info{scripts}} ] ); + foreach my $type (keys %loopinfo) { + foreach my $product (@{$loopinfo{$type}}) { + my %dirs = (); + my $pd = dirname($product); + foreach (@{$unified_info{sources}->{$product}}) { + my $d = dirname($_); + next if $d eq "test"; # we already have a test target + next if $d eq "."; # current directory is just silly + $dirs{$d} = 1; + push @{$unified_info{dirinfo}->{$d}->{deps}}, $_ + if $d ne $pd; + } + foreach (keys %dirs) { + push @{$unified_info{dirinfo}->{$_}->{products}->{$type}}, + $product; + } + } + } + } + # Build all known libraries, engines, programs and scripts. # Everything else will be handled as a consequence. foreach (@{$unified_info{libraries}}) { dolib($_); } @@ -168,6 +208,8 @@ foreach (@{$unified_info{programs}}) { dobin($_); } foreach (@{$unified_info{scripts}}) { doscript($_); } + foreach (sort keys %{$unified_info{dirinfo}}) { dodir($_); } + # Finally, should there be any applicable BEGINRAW/ENDRAW sections, # they are added here. $OUT .= $_."\n" foreach @{$unified_info{rawlines}}; diff --git a/Configurations/unix-Makefile.tmpl b/Configurations/unix-Makefile.tmpl index 7cdad233704830c51997294bb7789d2151fccffe..217625d7e9a82c287ec2b1b0c1db33b46081b844 100644 --- a/Configurations/unix-Makefile.tmpl +++ b/Configurations/unix-Makefile.tmpl @@ -1052,6 +1052,41 @@ $script: $sources \$(PERL) "-I\$(BLDDIR)" -Mconfigdata "$dofile" \\ "-o$target{build_file}" $sources > "$script" chmod a+x $script +EOF + } + sub generatedir { + my %args = @_; + my $dir = $args{dir}; + my @deps = map { s|\.o$|$objext|; $_ } @{$args{deps}}; + my @actions = (); + my %extinfo = ( dso => $dsoext, + lib => $libext, + bin => $exeext ); + + foreach my $type (("dso", "lib", "bin", "script")) { + next unless defined($unified_info{dirinfo}->{$dir}->{products}->{$type}); + if ($type eq "lib") { + foreach my $lib (@{$unified_info{dirinfo}->{$dir}->{products}->{$type}}) { + push @actions, <<"EOF"; + \$(AR) $lib$libext \$\? + \$(RANLIB) $lib$libext || echo Never mind. +EOF + } + } else { + foreach my $prod (@{$unified_info{dirinfo}->{$dir}->{products}->{$type}}) { + if (dirname($prod) eq $dir) { + push @deps, $prod.$extinfo{$type}; + } else { + push @actions, "\t@ : No support to produce $type ".join(", ", @{$unified_info{dirinfo}->{$dir}->{products}->{$type}}); + } + } + } + } + + my $deps = join(" ", @deps); + my $actions = join("\n", "", @actions); + return <<"EOF"; +$args{dir} $args{dir}/: $deps$actions EOF } "" # Important! This becomes part of the template result. diff --git a/Configurations/windows-makefile.tmpl b/Configurations/windows-makefile.tmpl index 3dae414344e9162227f125d2a89ced376637e16e..081e20b3f3019160e39595c35addf8d7587e7e61 100644 --- a/Configurations/windows-makefile.tmpl +++ b/Configurations/windows-makefile.tmpl @@ -488,6 +488,42 @@ EOF $script: $sources "\$(PERL)" "-I\$(BLDDIR)" -Mconfigdata "$dofile" \\ "-o$target{build_file}" $sources > "$script" +EOF + } + sub generatedir { + my %args = @_; + my $dir = $args{dir}; + my @deps = map { s|\.o$|$objext|; $_ } @{$args{deps}}; + my @actions = (); + my %extinfo = ( dso => $dsoext, + lib => $libext, + bin => $exeext ); + + foreach my $type (("dso", "lib", "bin", "script")) { + next unless defined($unified_info{dirinfo}->{$dir}->{products}->{$type}); + if ($type eq "lib") { + foreach my $lib (@{$unified_info{dirinfo}->{$dir}->{products}->{$type}}) { + push @actions, <<"EOF"; + \$(AR) \$(ARFLAGS) \$(AROUTFLAG)$lib$libext @<< +\$\? +<< +EOF + } + } else { + foreach my $prod (@{$unified_info{dirinfo}->{$dir}->{products}->{$type}}) { + if (dirname($prod) eq $dir) { + push @deps, $prod.$extinfo{$type}; + } else { + push @actions, "\t@ : No support to produce $type ".join(", ", @{$unified_info{dirinfo}->{$dir}->{products}->{$type}}); + } + } + } + } + + my $deps = join(" ", @deps); + my $actions = join("\n", "", @actions); + return <<"EOF"; +$args{dir} $args{dir}\\ : $deps$actions EOF } "" # Important! This becomes part of the template result.