use warnings;
use IO::Handle;
use Cwd;
+use File::Basename;
+
+while ($#ARGV >= 0) {
+ if ($ARGV[0] eq "-U") {
+ # Convenience for Unix users: -U means that after we finish what
+ # we're doing here, we also run mkauto.sh and then 'configure'. So
+ # it's a one-stop shop for regenerating the actual end-product
+ # Unix makefile.
+ #
+ # Arguments supplied after -U go to configure.
+ $do_unix = 1;
+ shift @ARGV;
+ @confargs = @ARGV;
+ @ARGV = ();
+ } else {
+ die "unrecognised command-line argument '$ARGV[0]'\n";
+ }
+}
@filestack = ();
$in = new IO::Handle;
if ($_[0] eq "!srcdir") { push @srcdirs, $_[1]; next; }
if ($_[0] eq "!makefile" and &mfval($_[1])) { $makefiles{$_[1]}=$_[2]; next;}
if ($_[0] eq "!specialobj" and &mfval($_[1])) { $specialobj{$_[1]}->{$_[2]} = 1; next;}
+ if ($_[0] eq "!cflags" and &mfval($_[1])) {
+ ($rest = $_) =~ s/^\s*\S+\s+\S+\s+\S+\s*//; # find rest of input line
+ $rest = 1 if $rest eq "";
+ $cflags{$_[1]}->{$_[2]} = $rest;
+ next;
+ }
if ($_[0] eq "!begin") {
if ($_[1] =~ /^>(.*)/) {
$divert = \$auxfiles{$1};
# Returns true if the argument is a known makefile type. Otherwise,
# prints a warning and returns false;
if (grep { $type eq $_ }
- ("vc","vcproj","cygwin","borland","lcc","gtk","mpw","nestedvm","osx","wce","gnustep","emcc")) {
+ ("vc","vcproj","cygwin","borland","lcc","gtk","am","mpw","nestedvm","osx","wce","gnustep","emcc")) {
return 1;
}
warn "$.:unknown makefile type '$type'\n";
return ();
}
+$orig_dir = cwd;
+
# Now we're ready to output the actual Makefiles.
if (defined $makefiles{'cygwin'}) {
if (defined $makefiles{'vcproj'}) {
$mftyp = 'vcproj';
- $orig_dir = cwd;
-
##-- MSVC 6 Workspace and projects
#
# Note: All files created in this section are written in binary
select STDOUT; close OUT;
}
+if (defined $makefiles{'am'}) {
+ $mftyp = 'am';
+ $dirpfx = "\$(srcdir)/" . &dirpfx($makefiles{'am'}, "/");
+
+ ##-- Unix/autoconf Makefile.am
+ open OUT, ">$makefiles{'am'}"; select OUT;
+ print
+ "# Makefile.am for $project_name under Unix with Autoconf/Automake.\n".
+ "#\n# This file was created by `mkfiles.pl' from the `Recipe' file.\n".
+ "# DO NOT EDIT THIS FILE DIRECTLY; edit Recipe or mkfiles.pl instead.\n\n";
+
+ @binprogs = ();
+ @noinstprogs = ();
+ foreach $p (&prognames("X:U")) {
+ ($prog, $type) = split ",", $p;
+ if ("FIXME") { # decide which programs go where
+ push @binprogs, # FIXME "\$(BINPREFIX)" .
+ $prog;
+ } else {
+ push @noinstprogs, # FIXME "\$(BINPREFIX)" .
+ $prog;
+ }
+ }
+ print &splitline(join " ", "bin_PROGRAMS", "=", @binprogs), "\n";
+ print &splitline(join " ", "noinst_PROGRAMS", "=", @noinstprogs), "\n";
+
+ %objtosrc = ();
+ %amspeciallibs = ();
+ %amlibobjname = ();
+ %allsources = ();
+ foreach $d (&deps("X", undef, $dirpfx, "/", "am")) {
+ my $obj = $d->{obj};
+ my $use_archive = 0;
+
+ if (defined $d->{defs}) {
+ # This file needs to go in an archive, so that we can
+ # change the preprocess flags to include some -Ds
+ $use_archive = 1;
+ $archivecppflags{$obj} = [map { " -D$_" } @{$d->{defs}}];
+ }
+ if (defined $cflags{'am'} && $cflags{'am'}->{$obj}) {
+ # This file needs to go in an archive, so that we can
+ # change the compile flags as specified in Recipe
+ $archivecflags{$obj} = [$cflags{'am'}->{$obj}];
+ }
+ if ($use_archive) {
+ $amspeciallibs{$obj} = "lib${obj}.a";
+ $amlibobjname{$obj} = "lib${obj}_a-" .
+ basename($d->{deps}->[0], ".c", ".m") .
+ ".\$(OBJEXT)";
+ }
+ $objtosrc{$obj} = $d->{deps};
+ map { $allsources{$_} = 1 } @{$d->{deps}};
+ }
+
+ # Complete list of source and header files. Not used by the
+ # auto-generated parts of this makefile, but Recipe might like to
+ # have it available as a variable so that mandatory-rebuild things
+ # (version.o) can conveniently be made to depend on it.
+ print &splitline(join " ", "allsources", "=",
+ sort {$a cmp $b} keys %allsources), "\n\n";
+
+ @amcppflags = map {"-I$dirpfx$_"} @srcdirs;
+ print &splitline(join " ", "AM_CPPFLAGS", "=", @amcppflags, "\n");
+
+ @amcflags = ("\$(GTK_CFLAGS)", "\$(WARNINGOPTS)");
+ print &splitline(join " ", "AM_CFLAGS", "=", @amcflags), "\n";
+
+ %amlibsused = ();
+ foreach $p (&prognames("X:U")) {
+ ($prog, $type) = split ",", $p;
+ @progsources = ("${prog}_SOURCES", "=");
+ %sourcefiles = ();
+ @ldadd = ();
+ $objstr = &objects($p, "X", undef, undef);
+ foreach $obj (split / /,$objstr) {
+ if ($amspeciallibs{$obj}) {
+ $amlibsused{$obj} = 1;
+ push @ldadd, $amlibobjname{$obj};
+ } else {
+ map { $sourcefiles{$_} = 1 } @{$objtosrc{$obj}};
+ }
+ }
+ push @progsources, sort { $a cmp $b } keys %sourcefiles;
+ print &splitline(join " ", @progsources), "\n";
+ if ($type eq "X") {
+ push @ldadd, "\$(GTK_LIBS)";
+ }
+ push @ldadd, "-lm";
+ print &splitline(join " ", "${prog}_LDADD", "=", @ldadd), "\n";
+ print "\n";
+ }
+
+ foreach $obj (sort { $a cmp $b } keys %amlibsused) {
+ print &splitline(join " ", "lib${obj}_a_SOURCES", "=",
+ @{$objtosrc{$obj}}), "\n";
+ print &splitline(join " ", "lib${obj}_a_CPPFLAGS", "=",
+ @amcflags, @{$archivecppflags{$obj}}), "\n"
+ if $archivecppflags{$obj};
+ print &splitline(join " ", "lib${obj}_a_CFLAGS", "=",
+ @amcflags, @{$archivecflags{$obj}}), "\n"
+ if $archivecflags{$obj};
+ }
+ print &splitline(join " ", "noinst_LIBRARIES", "=",
+ sort { $a cmp $b }
+ map { $amspeciallibs{$_} }
+ keys %amlibsused),
+ "\n\n";
+
+ print $makefile_extra{'am'} || "";
+ select STDOUT; close OUT;
+}
+
if (defined $makefiles{'mpw'}) {
$mftyp = 'mpw';
##-- MPW Makefile
"\trm -rf *.o $output_js_files\n";
select STDOUT; close OUT;
}
+
+# All done, so do the Unix postprocessing if asked to.
+
+if ($do_unix) {
+ chdir $orig_dir;
+ system "./mkauto.sh";
+ die "mkfiles.pl: mkauto.sh returned $?\n" if $? > 0;
+ system "./configure", @confargs;
+ die "mkfiles.pl: configure returned $?\n" if $? > 0;
+}