if ($_[0] eq "!specialobj" and &mfval($_[1])) { $specialobj{$_[1]}->{$_[2]} = 1; next;}
if ($_[0] eq "!begin") {
if (&mfval($_[1])) {
- $divert = \$makefile_extra{$_[1]};
+ $sect = $_[2] ? $_[2] : "end";
+ $divert = \($makefile_extra{$_[1]}->{$sect});
} else {
$divert = \$dummy;
}
next;
}
- # If we're gathering help text, keep doing so.
+ # If we're gathering help/verbatim text, keep doing so.
if (defined $divert) { ${$divert} .= "$_\n"; next; }
# Ignore blank lines.
next if scalar @_ == 0;
if ($groups{$i}) {
foreach $j (@{$groups{$i}}) { unshift @objs, $j; }
} elsif (($i eq "[G]" or $i eq "[C]" or $i eq "[M]" or
- $i eq "[X]" or $i eq "[U]") and defined $prog) {
- $type = substr($i,1,1);
+ $i eq "[X]" or $i eq "[U]" or $i eq "[MX]") and defined $prog) {
+ $type = substr($i,1,(length $i)-2);
} else {
push @$listref, $i;
}
sort @{$programs{$i}};
$programs{$i} = [@list];
foreach $j (@list) {
- # Dependencies for "x" start with "x.c".
+ # Dependencies for "x" start with "x.c" or "x.m" (depending on
+ # which one exists).
# Dependencies for "x.res" start with "x.rc".
# Dependencies for "x.rsrc" start with "x.r".
# Both types of file are pushed on the list of files to scan.
$file = "$1.r";
$depends{$j} = [$file];
push @scanlist, $file;
- } elsif ($j =~ /\.lib$/) {
- # libraries don't have dependencies
- } else {
+ } elsif ($j !~ /\./) {
$file = "$j.c";
+ $file = "$j.m" unless &findfile($file);
$depends{$j} = [$file];
push @scanlist, $file;
}
# added back on to @scanlist to be scanned in turn (if not already
# done).
#
-# Resource scripts (.rc) can also include a file by means of a line
-# ending `ICON "filename"'. Files included by this method are not
-# added to @scanlist because they can never include further files.
+# Resource scripts (.rc) can also include a file by means of:
+# - a line # ending `ICON "filename"';
+# - a line ending `RT_MANIFEST "filename"'.
+# Files included by this method are not added to @scanlist because
+# they can never include further files.
#
# In this pass we write out a hash %further which maps a source
# file name into a listref containing further source file names.
push @scanlist, $1;
next;
};
- /ICON\s+\"([^\"]+)\"\s*$/ and do {
- push @{$further{$file}}, $1;
+ /(RT_MANIFEST|ICON)\s+\"([^\"]+)\"\s*$/ and do {
+ push @{$further{$file}}, $2;
next;
}
}
# 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")) {
+ ("vc","vcproj","cygwin","borland","lcc","gtk","ac","mpw","osx")) {
return 1;
}
warn "$.:unknown makefile type '$type'\n";
sub findfile {
my ($name) = @_;
- my $dir, $i, $outdir = "";
+ my $dir;
+ my $i;
+ my $outdir = undef;
unless (defined $findfilecache{$name}) {
$i = 0;
foreach $dir (@srcdirs) {
$outdir=~s/^\.\///;
}
die "multiple instances of source file $name\n" if $i > 1;
- $findfilecache{$name} = $outdir . $name;
+ $findfilecache{$name} = (defined $outdir ? $outdir . $name : undef);
}
return $findfilecache{$name};
}
} elsif ($i =~ /^(.*)\.lib/) {
$y = $1;
($x = $ltmpl) =~ s/X/$y/;
- } else {
+ } elsif ($i !~ /\./) {
($x = $otmpl) =~ s/X/$i/;
}
push @ret, $x if $x ne "";
return join " ", @ret;
}
+sub special {
+ my ($prog, $suffix) = @_;
+ my @ret;
+ my ($i, $x, $y);
+ @ret = ();
+ foreach $i (@{$programs{$prog}}) {
+ if (substr($i, (length $i) - (length $suffix)) eq $suffix) {
+ push @ret, $i;
+ }
+ }
+ return (scalar @ret) ? (join " ", @ret) : undef;
+}
+
sub splitline {
my ($line, $width, $splitchar) = @_;
my ($result, $len);
@ret = ();
foreach $n (@prognames) {
($prog, $type) = split ",", $n;
- push @ret, $n if index($types, $type) >= 0;
+ push @ret, $n if index(":$types:", ":$type:") >= 0;
}
return @ret;
}
@ret = ();
foreach $n (@prognames) {
($prog, $type) = split ",", $n;
- push @ret, $prog if index($types, $type) >= 0;
+ push @ret, $prog if index(":$types:", ":$type:") >= 0;
}
return @ret;
}
my ($types,$suffix) = @_;
# assume that all UNIX programs have a man page
- if($suffix eq "1" && $types =~ /X/) {
+ if($suffix eq "1" && $types =~ /:X:/) {
return map("$_.1", &progrealnames($types));
}
return ();
"\n".
"LDFLAGS = -mno-cygwin -s\n".
&splitline("RCFLAGS = \$(RCINC) --define WIN32=1 --define _WIN32=1".
- " --define WINVER=0x0400 --define MINGW32_FIX=1")."\n".
+ " --define WINVER=0x0400")."\n".
+ "\n".
+ $makefile_extra{'cygwin'}->{'vars'} .
"\n".
".SUFFIXES:\n".
"\n";
- print &splitline("all:" . join "", map { " $_.exe" } &progrealnames("GC"));
+ print &splitline("all:" . join "", map { " $_.exe" } &progrealnames("G:C"));
print "\n\n";
- foreach $p (&prognames("GC")) {
+ foreach $p (&prognames("G:C")) {
($prog, $type) = split ",", $p;
$objstr = &objects($p, "X.o", "X.res.o", undef);
print &splitline($prog . ".exe: " . $objstr), "\n";
print &splitline(sprintf("%s: %s", $d->{obj}, join " ", @{$d->{deps}})),
"\n";
if ($d->{obj} =~ /\.res\.o$/) {
- print "\t\$(RC) \$(FWHACK) \$(RCFL) \$(RCFLAGS) ".$d->{deps}->[0]." ".$d->{obj}."\n\n";
+ print "\t\$(RC) \$(RCFL) \$(RCFLAGS) ".$d->{deps}->[0]." ".$d->{obj}."\n\n";
} else {
- print "\t\$(CC) \$(COMPAT) \$(FWHACK) \$(XFLAGS) \$(CFLAGS) -c ".$d->{deps}->[0]."\n\n";
+ print "\t\$(CC) \$(COMPAT) \$(XFLAGS) \$(CFLAGS) -c ".$d->{deps}->[0]."\n\n";
}
}
print "\n";
- print $makefile_extra{'cygwin'};
+ print $makefile_extra{'cygwin'}->{'end'};
print "\nclean:\n".
"\trm -f *.o *.exe *.res.o *.map\n".
"\n";
"BCB = \$(MAKEDIR)\\..\n".
"!endif\n".
"\n".
+ $makefile_extra{'borland'}->{'vars'} .
+ "\n".
".c.obj:\n".
- &splitline("\tbcc32 -w-aus -w-ccc -w-par -w-pia \$(COMPAT) \$(FWHACK)".
+ &splitline("\tbcc32 -w-aus -w-ccc -w-par -w-pia \$(COMPAT)".
" \$(XFLAGS) \$(CFLAGS) ".
(join " ", map {"-I$dirpfx$_"} @srcdirs) .
" /c \$*.c",69)."\n".
".rc.res:\n".
- &splitline("\tbrcc32 \$(FWHACK) \$(RCFL) -i \$(BCB)\\include -r".
+ &splitline("\tbrcc32 \$(RCFL) -i \$(BCB)\\include -r".
" -DNO_WINRESRC_H -DWIN32 -D_WIN32 -DWINVER=0x0401 \$*.rc",69)."\n".
"\n";
- print &splitline("all:" . join "", map { " $_.exe" } &progrealnames("GC"));
+ print &splitline("all:" . join "", map { " $_.exe" } &progrealnames("G:C"));
print "\n\n";
- foreach $p (&prognames("GC")) {
+ foreach $p (&prognames("G:C")) {
($prog, $type) = split ",", $p;
$objstr = &objects($p, "X.obj", "X.res", undef);
print &splitline("$prog.exe: " . $objstr . " $prog.rsp"), "\n";
my $ap = ($type eq "G") ? "-aa" : "-ap";
print "\tilink32 $ap -Gn -L\$(BCB)\\lib \@$prog.rsp\n\n";
}
- foreach $p (&prognames("GC")) {
+ foreach $p (&prognames("G:C")) {
($prog, $type) = split ",", $p;
print $prog, ".rsp: \$(MAKEFILE)\n";
$objstr = &objects($p, "X.obj", undef, undef);
"\n";
}
print "\n";
- print $makefile_extra{'borland'};
+ print $makefile_extra{'borland'}->{'end'};
print "\nclean:\n".
"\t-del *.obj\n".
"\t-del *.exe\n".
" /D_WINDOWS /D_WIN32_WINDOWS=0x401 /DWINVER=0x401\n".
"LFLAGS = /incremental:no /fixed\n".
"\n".
+ $makefile_extra{'vc'}->{'vars'} .
+ "\n".
"\n";
- print &splitline("all:" . join "", map { " $_.exe" } &progrealnames("GC"));
+ print &splitline("all:" . join "", map { " $_.exe" } &progrealnames("G:C"));
print "\n\n";
- foreach $p (&prognames("GC")) {
+ foreach $p (&prognames("G:C")) {
($prog, $type) = split ",", $p;
$objstr = &objects($p, "X.obj", "X.res", undef);
print &splitline("$prog.exe: " . $objstr . " $prog.rsp"), "\n";
print "\tlink \$(LFLAGS) -out:$prog.exe -map:$prog.map \@$prog.rsp\n\n";
}
- foreach $p (&prognames("GC")) {
+ foreach $p (&prognames("G:C")) {
($prog, $type) = split ",", $p;
print $prog, ".rsp: \$(MAKEFILE)\n";
$objstr = &objects($p, "X.obj", "X.res", "X.lib");
print &splitline(sprintf("%s: %s", $d->{obj}, join " ", @{$d->{deps}})),
"\n";
if ($d->{obj} =~ /.obj$/) {
- print "\tcl \$(COMPAT) \$(FWHACK) \$(XFLAGS) \$(CFLAGS) /c ".$d->{deps}->[0],"\n\n";
+ print "\tcl \$(COMPAT) \$(XFLAGS) \$(CFLAGS) /c ".$d->{deps}->[0],"\n\n";
} else {
- print "\trc \$(FWHACK) \$(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 ".$d->{deps}->[0],"\n\n";
+ print "\trc \$(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 ".$d->{deps}->[0],"\n\n";
}
}
print "\n";
- print $makefile_extra{'vc'};
+ print $makefile_extra{'vc'}->{'end'};
print "\nclean: tidy\n".
"\t-del *.exe\n\n".
"tidy:\n".
%all_object_deps = map {$_->{obj} => $_->{deps}} @deps;
# Create the project files
# Get names of all Windows projects (GUI and console)
- my @prognames = &prognames("GC");
+ my @prognames = &prognames("G:C");
foreach $progname (@prognames) {
create_project(\%all_object_deps, $progname);
}
"mandir=\$(prefix)/man\n",
"man1dir=\$(mandir)/man1\n",
"\n".
+ $makefile_extra{'gtk'}->{'vars'} .
+ "\n".
".SUFFIXES:\n".
"\n".
"\n";
- print &splitline("all:" . join "", map { " $_" } &progrealnames("XU"));
+ print &splitline("all:" . join "", map { " $_" } &progrealnames("X:U"));
print "\n\n";
- foreach $p (&prognames("XU")) {
+ foreach $p (&prognames("X:U")) {
+ ($prog, $type) = split ",", $p;
+ $objstr = &objects($p, "X.o", undef, undef);
+ print &splitline($prog . ": " . $objstr), "\n";
+ $libstr = &objects($p, undef, undef, "-lX");
+ print &splitline("\t\$(CC)" . $mw . " \$(${type}LDFLAGS) -o \$@ " .
+ $objstr . " $libstr", 69), "\n\n";
+ }
+ foreach $d (&deps("X.o", undef, $dirpfx, "/", "gtk")) {
+ print &splitline(sprintf("%s: %s", $d->{obj}, join " ", @{$d->{deps}})),
+ "\n";
+ print &splitline("\t\$(CC) \$(COMPAT) \$(XFLAGS) \$(CFLAGS) -c $d->{deps}->[0]\n");
+ }
+ print "\n";
+ print $makefile_extra{'gtk'}->{'end'};
+ print "\nclean:\n".
+ "\trm -f *.o". (join "", map { " $_" } &progrealnames("X:U")) . "\n";
+ select STDOUT; close OUT;
+}
+
+if (defined $makefiles{'ac'}) {
+ $dirpfx = &dirpfx($makefiles{'ac'}, "/");
+
+ ##-- Unix/autoconf makefile
+ open OUT, ">$makefiles{'ac'}"; select OUT;
+ print
+ "# Makefile.in for $project_name under Unix with Autoconf.\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";
+ # gcc command line option is -D not /D
+ ($_ = $help) =~ s/=\/D/=-D/gs;
+ print $_;
+ print
+ "\n".
+ "CC = \@CC\@\n".
+ "\n".
+ &splitline("CFLAGS = \@CFLAGS\@ \@CPPFLAGS\@ \@DEFS\@ \@GTK_CFLAGS\@ " .
+ (join " ", map {"-I$dirpfx$_"} @srcdirs))."\n".
+ "XLDFLAGS = \@LDFLAGS\@ \@LIBS\@ \@GTK_LIBS\@\n".
+ "ULDFLAGS = \@LDFLAGS\@ \@LIBS\@\n".
+ "INSTALL=\@INSTALL\@\n",
+ "INSTALL_PROGRAM=\$(INSTALL)\n",
+ "INSTALL_DATA=\$(INSTALL)\n",
+ "prefix=\@prefix\@\n",
+ "exec_prefix=\@exec_prefix\@\n",
+ "bindir=\@bindir\@\n",
+ "mandir=\@mandir\@\n",
+ "man1dir=\$(mandir)/man1\n",
+ "\n".
+ $makefile_extra{'gtk'}->{'vars'} .
+ "\n".
+ ".SUFFIXES:\n".
+ "\n".
+ "\n".
+ "all: \@all_targets\@\n".
+ &splitline("all-cli:" . join "", map { " $_" } &progrealnames("U"))."\n".
+ &splitline("all-gtk:" . join "", map { " $_" } &progrealnames("X"))."\n";
+ print "\n";
+ foreach $p (&prognames("X:U")) {
($prog, $type) = split ",", $p;
$objstr = &objects($p, "X.o", undef, undef);
print &splitline($prog . ": " . $objstr), "\n";
foreach $d (&deps("X.o", undef, $dirpfx, "/", "gtk")) {
print &splitline(sprintf("%s: %s", $d->{obj}, join " ", @{$d->{deps}})),
"\n";
- print &splitline("\t\$(CC) \$(COMPAT) \$(FWHACK) \$(XFLAGS) \$(CFLAGS) -c $d->{deps}->[0]\n");
+ print &splitline("\t\$(CC) \$(COMPAT) \$(XFLAGS) \$(CFLAGS) -c $d->{deps}->[0]\n");
}
print "\n";
- print $makefile_extra{'gtk'};
+ print $makefile_extra{'gtk'}->{'end'};
print "\nclean:\n".
- "\trm -f *.o". (join "", map { " $_" } &progrealnames("XU")) . "\n";
+ "\trm -f *.o". (join "", map { " $_" } &progrealnames("X:U")) . "\n";
select STDOUT; close OUT;
}
"\n".
"\n".
"# Get include directory for resource compiler\n".
+ "\n".
+ $makefile_extra{'lcc'}->{'vars'} .
"\n";
- print &splitline("all:" . join "", map { " $_.exe" } &progrealnames("GC"));
+ print &splitline("all:" . join "", map { " $_.exe" } &progrealnames("G:C"));
print "\n\n";
- foreach $p (&prognames("GC")) {
+ foreach $p (&prognames("G:C")) {
($prog, $type) = split ",", $p;
$objstr = &objects($p, "X.obj", "X.res", undef);
print &splitline("$prog.exe: " . $objstr ), "\n";
print &splitline(sprintf("%s: %s", $d->{obj}, join " ", @{$d->{deps}})),
"\n";
if ($d->{obj} =~ /\.obj$/) {
- print &splitline("\tlcc -O -p6 \$(COMPAT) \$(FWHACK)".
+ print &splitline("\tlcc -O -p6 \$(COMPAT)".
" \$(XFLAGS) \$(CFLAGS) ".$d->{deps}->[0],69)."\n";
} else {
- print &splitline("\tlrc \$(FWHACK) \$(RCFL) -r ".$d->{deps}->[0],69)."\n";
+ print &splitline("\tlrc \$(RCFL) -r ".$d->{deps}->[0],69)."\n";
}
}
print "\n";
- print $makefile_extra{'lcc'};
+ print $makefile_extra{'lcc'}->{'end'};
print "\nclean:\n".
"\t-del *.obj\n".
"\t-del *.exe\n".
select STDOUT; close OUT;
}
+
+if (defined $makefiles{'osx'}) {
+ $dirpfx = &dirpfx($makefiles{'osx'}, "/");
+
+ ##-- Mac OS X makefile
+ open OUT, ">$makefiles{'osx'}"; select OUT;
+ print
+ "# Makefile for $project_name under Mac OS X.\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";
+ # gcc command line option is -D not /D
+ ($_ = $help) =~ s/=\/D/=-D/gs;
+ print $_;
+ print
+ "CC = \$(TOOLPATH)gcc\n".
+ "\n".
+ &splitline("CFLAGS = -O2 -Wall -Werror -g " .
+ (join " ", map {"-I$dirpfx$_"} @srcdirs))."\n".
+ "MLDFLAGS = -framework Cocoa\n".
+ "ULDFLAGS =\n".
+ "\n" .
+ $makefile_extra{'osx'}->{'vars'} .
+ "\n" .
+ &splitline("all:" . join "", map { " $_" } &progrealnames("MX:U")) .
+ "\n";
+ foreach $p (&prognames("MX")) {
+ ($prog, $type) = split ",", $p;
+ $objstr = &objects($p, "X.o", undef, undef);
+ $icon = &special($p, ".icns");
+ $infoplist = &special($p, "info.plist");
+ print "${prog}.app:\n\tmkdir -p \$\@\n";
+ print "${prog}.app/Contents: ${prog}.app\n\tmkdir -p \$\@\n";
+ print "${prog}.app/Contents/MacOS: ${prog}.app/Contents\n\tmkdir -p \$\@\n";
+ $targets = "${prog}.app/Contents/MacOS/$prog";
+ if (defined $icon) {
+ print "${prog}.app/Contents/Resources: ${prog}.app/Contents\n\tmkdir -p \$\@\n";
+ print "${prog}.app/Contents/Resources/${prog}.icns: ${prog}.app/Contents/Resources $icon\n\tcp $icon \$\@\n";
+ $targets .= " ${prog}.app/Contents/Resources/${prog}.icns";
+ }
+ if (defined $infoplist) {
+ print "${prog}.app/Contents/Info.plist: ${prog}.app/Contents/Resources $infoplist\n\tcp $infoplist \$\@\n";
+ $targets .= " ${prog}.app/Contents/Info.plist";
+ }
+ $targets .= " \$(${prog}_extra)";
+ print &splitline("${prog}: $targets", 69) . "\n\n";
+ print &splitline("${prog}.app/Contents/MacOS/$prog: ".
+ "${prog}.app/Contents/MacOS " . $objstr), "\n";
+ $libstr = &objects($p, undef, undef, "-lX");
+ print &splitline("\t\$(CC)" . $mw . " \$(MLDFLAGS) -o \$@ " .
+ $objstr . " $libstr", 69), "\n\n";
+ }
+ foreach $p (&prognames("U")) {
+ ($prog, $type) = split ",", $p;
+ $objstr = &objects($p, "X.o", undef, undef);
+ print &splitline($prog . ": " . $objstr), "\n";
+ $libstr = &objects($p, undef, undef, "-lX");
+ print &splitline("\t\$(CC)" . $mw . " \$(ULDFLAGS) -o \$@ " .
+ $objstr . " $libstr", 69), "\n\n";
+ }
+ foreach $d (&deps("X.o", undef, $dirpfx, "/")) {
+ print &splitline(sprintf("%s: %s", $d->{obj}, join " ", @{$d->{deps}})),
+ "\n";
+ $firstdep = $d->{deps}->[0];
+ if ($firstdep =~ /\.c$/) {
+ print "\t\$(CC) \$(COMPAT) \$(FWHACK) \$(XFLAGS) \$(CFLAGS) -c \$<\n";
+ } elsif ($firstdep =~ /\.m$/) {
+ print "\t\$(CC) -x objective-c \$(COMPAT) \$(FWHACK) \$(XFLAGS) \$(CFLAGS) -c \$<\n";
+ }
+ }
+ print "\n".$makefile_extra{'osx'}->{'end'};
+ print "\nclean:\n".
+ "\trm -f *.o *.dmg". (join "", map { " $_" } &progrealnames("U")) . "\n";
+ "\trm -rf *.app\n";
+ select STDOUT; close OUT;
+}