+$target: "$gen0" $deps
+ \$(CPP) $incs $cppflags $defs "$gen0" > \$@.i
+ move /Y \$@.i \$@
+EOF
+ } elsif ($gen0 =~ m|^.*\.in$|) {
+ #
+ # "dofile" generator (file.in -> file)
+ #
+ my $dofile = abs2rel(rel2abs(catfile($config{sourcedir},
+ "util", "dofile.pl")),
+ rel2abs($config{builddir}));
+ my @modules = ( 'configdata.pm',
+ grep { $_ =~ m|\.pm$| } @{$args{deps}} );
+ my %moduleincs = map { '"-I'.dirname($_).'"' => 1 } @modules;
+ $deps = join(' ', $deps, @modules);
+ @modules = map { "-M".basename($_, '.pm') } @modules;
+ my $modules = join(' ', '', sort keys %moduleincs, @modules);
+ return <<"EOF";
+$args{src}: "$gen0" $deps
+ "\$(PERL)"$modules "$dofile" "-o$target{build_file}" "$gen0"$gen_args > \$@
+EOF
+ } elsif (grep { $_ eq $gen0 } @{$unified_info{programs}}) {
+ #
+ # Generic generator using OpenSSL programs
+ #
+
+ # Redo $deps, because programs aren't expected to have deps of their
+ # own. This is a little more tricky, though, because running programs
+ # may have dependencies on all sorts of files, so we search through
+ # our database of programs and modules to see if our dependencies
+ # are one of those.
+ $deps = join(' ', map { my $x = $_;
+ if (grep { $x eq $_ }
+ @{$unified_info{programs}}) {
+ platform->bin($x);
+ } elsif (grep { $x eq $_ }
+ @{$unified_info{modules}}) {
+ platform->dso($x);
+ } else {
+ $x;
+ }
+ } @{$args{deps}});
+ # Also redo $gen0, to ensure that we have the proper extension.
+ $gen0 = platform->bin($gen0);
+ return <<"EOF";
+$args{src}: $gen0 $deps
+ $gen0$gen_args > \$@
+EOF
+ } else {
+ #
+ # Generic generator using Perl
+ #
+ return <<"EOF";
+$args{src}: "$gen0" $deps
+ "\$(PERL)"$gen_incs $gen0$gen_args > \$@