'perl -w' safety in mkfiles.pl.
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Sat, 29 May 2010 14:04:09 +0000 (14:04 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Sat, 29 May 2010 14:04:09 +0000 (14:04 +0000)
git-svn-id: svn://svn.tartarus.org/sgt/putty@8958 cda61777-01e9-0310-a592-d414129be87e

mkfiles.pl

index 4c58e4c..118667b 100755 (executable)
@@ -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 (<IN>) {
-  # 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 (<IN>) {
           $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;