+ sub generatesrc {
+ my %args = @_;
+ my $generator = join(" ", @{$args{generator}});
+ my $incs = join("", map { " -I".$_ } @{$args{incs}});
+
+ if ($args{src} !~ /\.[sS]$/) {
+ return <<"EOF";
+$args{src}: $args{generator}->[0]
+ \$(PERL) $generator > \$@
+EOF
+ } else {
+ if ($args{generator}->[0] =~ /\.pl$/) {
+ $generator = 'CC="$(CC)" $(PERL) '.$generator;
+ } elsif ($args{generator}->[0] =~ /\.m4$/) {
+ $generator = 'm4 -B 8192 '.$generator.' >'
+ } elsif ($args{generator}->[0] =~ /\.S$/) {
+ $generator = undef;
+ } else {
+ die "Generator type for $args{src} unknown: $generator\n";
+ }
+
+ if (defined($generator)) {
+ # If the target is named foo.S in build.info, we want to
+ # end up generating foo.s in two steps.
+ if ($args{src} =~ /\.S$/) {
+ (my $target = $args{src}) =~ s|\.S$|.s|;
+ return <<"EOF";
+$target: $args{generator}->[0]
+ ( trap "rm -f \$@.*" INT 0; \\
+ $generator \$@.S; \\
+ \$(CC) \$(CFLAGS) $incs -E -P \$@.S > \$@.i && mv -f \$@.i \$@ )
+EOF
+ }
+ # Otherwise....
+ return <<"EOF";
+$args{src}: $args{generator}->[0]
+ $generator \$@
+EOF
+ }
+ return <<"EOF";
+$args{src}: $args{generator}->[0]
+ \$(CC) \$(CFLAGS) $incs -E -P \$< > \$@
+EOF
+ }
+ }
+
+ # Should one wonder about the end of the Perl snippet, it's because this
+ # second regexp eats up line endings as well, if the removed path is the
+ # last in the line. We may therefore need to put back a line ending.