From 4877ec8d0d0d4dfac61b4858bb1cf6a5bb661f76 Mon Sep 17 00:00:00 2001 From: simon Date: Sat, 29 May 2010 14:04:09 +0000 Subject: [PATCH] 'perl -w' safety in mkfiles.pl. git-svn-id: svn://svn.tartarus.org/sgt/putty@8958 cda61777-01e9-0310-a592-d414129be87e --- mkfiles.pl | 96 ++++++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 59 insertions(+), 37 deletions(-) diff --git a/mkfiles.pl b/mkfiles.pl index 4c58e4c2..118667bb 100755 --- a/mkfiles.pl +++ b/mkfiles.pl @@ -1,4 +1,4 @@ -#!/usr/bin/env perl +#!/usr/bin/env perl -w # # Cross-platform Makefile generator. # @@ -42,12 +42,21 @@ $project_name = "project"; # this is a good enough default %groups = (); # maps group name to listref of objects/resources while () { - # Skip comments (unless the comments belong, for example because - # they're part of a diversion). - next if /^\s*#/ and !defined $divert; - chomp; - split; + @_ = split; + + # If we're gathering help text, keep doing so. + if (defined $divert) { + if ((defined $_[0]) && $_[0] eq "!end") { + $divert = undef; + } else { + ${$divert} .= "$_\n"; + } + next; + } + # Skip comments and blank lines. + next if /^\s*#/ or scalar @_ == 0; + if ($_[0] eq "!begin" and $_[1] eq "help") { $divert = \$help; next; } if ($_[0] eq "!end") { $divert = undef; next; } if ($_[0] eq "!name") { $project_name = $_[1]; next; } @@ -60,6 +69,7 @@ while () { $sect = $_[2] ? $_[2] : "end"; $divert = \($makefile_extra{$_[1]}->{$sect}); } else { + $dummy = ''; $divert = \$dummy; } next; @@ -121,7 +131,7 @@ close IN; foreach $i (@prognames) { ($prog, $type) = split ",", $i; # Strip duplicate object names. - $prev = undef; + $prev = ''; @list = grep { $status = ($prev ne $_); $prev=$_; $status } sort @{$programs{$i}}; $programs{$i} = [@list]; @@ -169,7 +179,6 @@ foreach $i (@prognames) { while (scalar @scanlist > 0) { $file = shift @scanlist; next if defined $further{$file}; # skip if we've already done it - $resource = ($file =~ /\.rc$/ ? 1 : 0); $further{$file} = []; $dirfile = &findfile($file); open IN, "$dirfile" or die "unable to open source file $file\n"; @@ -198,7 +207,7 @@ foreach $i (keys %depends) { while (scalar @scanlist > 0) { $file = shift @scanlist; foreach $j (@{$further{$file}}) { - if ($dep{$j} != 1) { + if (!$dep{$j}) { $dep{$j} = 1; push @{$depends{$i}}, $j; push @scanlist, $j; @@ -225,10 +234,16 @@ sub mfval($) { # Utility routines while writing out the Makefiles. +sub def { + my ($x) = shift @_; + return (defined $x) ? $x : ""; +} + sub dirpfx { my ($path) = shift @_; my ($sep) = shift @_; - my $ret = "", $i; + my $ret = ""; + my $i; while (($i = index $path, $sep) >= 0 || ($j = index $path, "/") >= 0) { @@ -244,14 +259,17 @@ sub dirpfx { sub findfile { my ($name) = @_; - my $dir; + my $dir = ''; my $i; my $outdir = undef; unless (defined $findfilecache{$name}) { $i = 0; foreach $dir (@srcdirs) { - $outdir = $dir, $i++ if -f "$dir$name"; - $outdir=~s/^\.\///; + if (-f "$dir$name") { + $outdir = $dir; + $i++; + $outdir =~ s/^\.\///; + } } die "multiple instances of source file $name\n" if $i > 1; $findfilecache{$name} = (defined $outdir ? $outdir . $name : undef); @@ -263,6 +281,7 @@ sub objects { my ($prog, $otmpl, $rtmpl, $ltmpl, $prefix, $dirsep) = @_; my @ret; my ($i, $x, $y); + ($otmpl, $rtmpl, $ltmpl) = map { defined $_ ? $_ : "" } ($otmpl, $rtmpl, $ltmpl); @ret = (); foreach $i (@{$programs{$prog}}) { $x = ""; @@ -284,6 +303,7 @@ sub special { my ($prog, $suffix) = @_; my @ret; my ($i, $x, $y); + ($otmpl, $rtmpl, $ltmpl) = map { defined $_ ? $_ : "" } ($otmpl, $rtmpl, $ltmpl); @ret = (); foreach $i (@{$programs{$prog}}) { if (substr($i, (length $i) - (length $suffix)) eq $suffix) { @@ -295,7 +315,8 @@ sub special { sub splitline { my ($line, $width, $splitchar) = @_; - my ($result, $len); + my $result = ""; + my $len; $len = (defined $width ? $width : 76); $splitchar = (defined $splitchar ? $splitchar : '\\'); while (length $line > $len) { @@ -311,7 +332,8 @@ sub splitline { sub deps { my ($otmpl, $rtmpl, $prefix, $dirsep, $mftyp, $depchar, $splitchar) = @_; my ($i, $x, $y); - my @deps, @ret; + my @deps; + my @ret; @ret = (); $depchar ||= ':'; foreach $i (sort keys %depends) { @@ -380,7 +402,7 @@ if (defined $makefiles{'cygwin'}) { "#\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/\1-D/gs; + ($_ = $help) =~ s/([=" ])\/D/$1-D/gs; print $_; print "\n". @@ -464,7 +486,7 @@ if (defined $makefiles{'borland'}) { "#\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"; # bcc32 command line option is -D not /D - ($_ = $help) =~ s/([=" ])\/D/\1-D/gs; + ($_ = $help) =~ s/([=" ])\/D/$1-D/gs; print $_; print "\n". @@ -497,7 +519,7 @@ if (defined $makefiles{'borland'}) { print "\n\n"; foreach $p (&prognames("G:C")) { ($prog, $type) = split ",", $p; - $objstr = &objects($p, "X.obj", "X.res", undef); + $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"; @@ -917,7 +939,7 @@ if (defined $makefiles{'gtk'}) { "#\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/\1-D/gs; + ($_ = $help) =~ s/([=" ])\/D/$1-D/gs; print $_; print "\n". @@ -962,7 +984,7 @@ if (defined $makefiles{'gtk'}) { "mandir=\$(prefix)/man\n". "man1dir=\$(mandir)/man1\n". "\n". - $makefile_extra{'gtk'}->{'vars'} . + &def($makefile_extra{'gtk'}->{'vars'}) . "\n". ".SUFFIXES:\n". "\n". @@ -974,7 +996,7 @@ if (defined $makefiles{'gtk'}) { $objstr = &objects($p, "X.o", undef, undef); print &splitline($prog . ": " . $objstr), "\n"; $libstr = &objects($p, undef, undef, "-lX"); - print &splitline("\t\$(CC)" . $mw . " -o \$@ " . + print &splitline("\t\$(CC) -o \$@ " . $objstr . " \$(${type}LDFLAGS) $libstr", 69), "\n\n"; } foreach $d (&deps("X.o", undef, $dirpfx, "/", "gtk")) { @@ -1004,7 +1026,7 @@ if (defined $makefiles{'unix'}) { "#\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/\1-D/gs; + ($_ = $help) =~ s/([=" ])\/D/$1-D/gs; print $_; print "\n". @@ -1029,7 +1051,7 @@ if (defined $makefiles{'unix'}) { "mandir=\$(prefix)/man\n". "man1dir=\$(mandir)/man1\n". "\n". - $makefile_extra{'unix'}->{'vars'} . + &def($makefile_extra{'unix'}->{'vars'}) . "\n". ".SUFFIXES:\n". "\n". @@ -1041,7 +1063,7 @@ if (defined $makefiles{'unix'}) { $objstr = &objects($p, "X.o", undef, undef); print &splitline($prog . ": " . $objstr), "\n"; $libstr = &objects($p, undef, undef, "-lX"); - print &splitline("\t\$(CC)" . $mw . " -o \$@ " . + print &splitline("\t\$(CC) -o \$@ " . $objstr . " \$(${type}LDFLAGS) $libstr", 69), "\n\n"; } foreach $d (&deps("X.o", undef, $dirpfx, "/", "unix")) { @@ -1054,7 +1076,7 @@ if (defined $makefiles{'unix'}) { print &splitline("\t\$(CC) \$(COMPAT) \$(CFLAGS) \$(XFLAGS) -c $d->{deps}->[0]\n"); } print "\n"; - print $makefile_extra{'unix'}->{'end'}; + print &def($makefile_extra{'unix'}->{'end'}); print "\nclean:\n". "\trm -f *.o". (join "", map { " $_" } &progrealnames("U")) . "\n"; print "\nFORCE:\n"; @@ -1071,7 +1093,7 @@ if (defined $makefiles{'ac'}) { "#\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/\1-D/gs; + ($_ = $help) =~ s/([=" ])\/D/$1-D/gs; print $_; print "\n". @@ -1092,7 +1114,7 @@ if (defined $makefiles{'ac'}) { "mandir=\@mandir\@\n". "man1dir=\$(mandir)/man1\n". "\n". - $makefile_extra{'gtk'}->{'vars'} . + &def($makefile_extra{'gtk'}->{'vars'}) . "\n". ".SUFFIXES:\n". "\n". @@ -1106,7 +1128,7 @@ if (defined $makefiles{'ac'}) { $objstr = &objects($p, "X.o", undef, undef); print &splitline($prog . ": " . $objstr), "\n"; $libstr = &objects($p, undef, undef, "-lX"); - print &splitline("\t\$(CC)" . $mw . " -o \$@ " . + print &splitline("\t\$(CC) -o \$@ " . $objstr . " \$(${type}LDFLAGS) $libstr", 69), "\n\n"; } foreach $d (&deps("X.o", undef, $dirpfx, "/", "gtk")) { @@ -1137,7 +1159,7 @@ if (defined $makefiles{'mpw'}) { "# 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"; # MPW command line option is -d not /D (FIXME further massaging?) - ($_ = $help) =~ s/([=" ])\/D/\1-d /gs; + ($_ = $help) =~ s/([=" ])\/D/$1-d /gs; print $_; print "\n\n". "ROptions = `Echo \"{VER}\" | StreamEdit -e \"1,\$ replace /=(\xc5)\xa81\xb0/ 'STR=\xb6\xb6\xb6\xb6\xb6\"' \xa81 '\xb6\xb6\xb6\xb6\xb6\"'\"`". @@ -1279,7 +1301,7 @@ if (defined $makefiles{'lcc'}) { "#\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"; # lcc command line option is -D not /D - ($_ = $help) =~ s/([=" ])\/D/\1-D/gs; + ($_ = $help) =~ s/([=" ])\/D/$1-D/gs; print $_; print "\n". @@ -1304,7 +1326,7 @@ if (defined $makefiles{'lcc'}) { ($prog, $type) = split ",", $p; $objstr = &objects($p, "X.obj", "X.res", undef); print &splitline("$prog.exe: " . $objstr ), "\n"; - $subsystemtype = undef; + $subsystemtype = ''; if ($type eq "G") { $subsystemtype = "-subsystem windows"; } my $libss = "shell32.lib wsock32.lib ws2_32.lib winspool.lib winmm.lib imm32.lib"; print &splitline("\tlcclnk $subsystemtype -o $prog.exe $objstr $libss"); @@ -1348,7 +1370,7 @@ if (defined $makefiles{'osx'}) { "#\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/\1-D/gs; + ($_ = $help) =~ s/([=" ])\/D/$1-D/gs; print $_; print "CC = \$(TOOLPATH)gcc\n". @@ -1385,7 +1407,7 @@ if (defined $makefiles{'osx'}) { 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 \$@ " . + print &splitline("\t\$(CC) \$(MLDFLAGS) -o \$@ " . $objstr . " $libstr", 69), "\n\n"; } foreach $p (&prognames("U")) { @@ -1393,10 +1415,10 @@ if (defined $makefiles{'osx'}) { $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 \$@ " . + print &splitline("\t\$(CC) \$(ULDFLAGS) -o \$@ " . $objstr . " $libstr", 69), "\n\n"; } - foreach $d (&deps("X.o", undef, $dirpfx, "/")) { + foreach $d (&deps("X.o", undef, $dirpfx, "/", "osx")) { if ($forceobj{$d->{obj_orig}}) { printf("%s: FORCE\n", $d->{obj}); } else { @@ -1410,10 +1432,10 @@ if (defined $makefiles{'osx'}) { print "\t\$(CC) -x objective-c \$(COMPAT) \$(FWHACK) \$(CFLAGS) \$(XFLAGS) -c \$<\n"; } } - print "\n".$makefile_extra{'osx'}->{'end'}; + print "\n".&def($makefile_extra{'osx'}->{'end'}); print "\nclean:\n". "\trm -f *.o *.dmg". (join "", map { " $_" } &progrealnames("U")) . "\n". - "\trm -rf *.app\n"; + "\trm -rf *.app\n". "\n". "FORCE:\n"; select STDOUT; close OUT; -- 2.11.0