BR 3392279: Fix duplicated REX prefixes
[platform/upstream/nasm.git] / mkdep.pl
index fcd7df8..9f80ed3 100755 (executable)
--- a/mkdep.pl
+++ b/mkdep.pl
@@ -1,8 +1,43 @@
 #!/usr/bin/perl
+## --------------------------------------------------------------------------
+##   
+##   Copyright 1996-2009 The NASM Authors - All Rights Reserved
+##   See the file AUTHORS included with the NASM distribution for
+##   the specific copyright holders.
+##
+##   Copyright 1996-2009 the NASM Authors - All rights reserved.
+##
+##   Redistribution and use in source and binary forms, with or without
+##   modification, are permitted provided that the following
+##   conditions are met:
+##
+##   * Redistributions of source code must retain the above copyright
+##     notice, this list of conditions and the following disclaimer.
+##   * Redistributions in binary form must reproduce the above
+##     copyright notice, this list of conditions and the following
+##     disclaimer in the documentation and/or other materials provided
+##     with the distribution.
+##     
+##     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+##     CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+##     INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+##     MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+##     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+##     CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+##     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+##     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+##     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+##     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+##     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+##     OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+##     EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+##
+## --------------------------------------------------------------------------
+
 #
 # Script to create Makefile-style dependencies.
 #
-# Usage: perl [-s path-separator] [-o obj-ext] mkdep.pl dir... > deps
+# Usage: perl mkdep.pl [-s path-separator] [-o obj-ext] dir... > deps
 #
 
 use File::Spec;
@@ -54,7 +89,7 @@ sub alldeps($) {
            $adeps{$idep} = 1;
        }
     }
-    return keys(%adeps);
+    return sort(keys(%adeps));
 }
 
 # This converts a filename from host syntax to target syntax
@@ -67,7 +102,14 @@ sub convert_file($$) {
        unshift(@fspec, basename($file));
     }
 
-    return join($sep, @fspec);
+    if ( $sep eq '' ) {
+       # This means kill path completely.  Used with Makes who do
+       # path searches, but doesn't handle output files in subdirectories,
+       # like OpenWatcom WMAKE.
+       return $fspec[scalar(@fspec)-1];
+    } else {
+       return join($sep, @fspec);
+    }
 }
 
 #
@@ -77,7 +119,7 @@ sub insert_deps($) {
     my($file) = @_;
     $nexttemp++;               # Unique serial number for each temp file
     my($tmp) = File::Spec->catfile(dirname($file), 'tmp.'.$nexttemp);
-    
+
     sysopen(IN, $file, O_RDONLY)
        or die "$0: Cannot open input: $file\n";
     sysopen(OUT, $tmp, O_WRONLY|O_CREAT|O_TRUNC, 0666)
@@ -86,7 +128,9 @@ sub insert_deps($) {
     my($line,$parm,$val);
     my($obj) = '.o';           # Defaults
     my($sep) = '/';
-    my($maxline) = 78;         # SMTP uses this value...
+    my($cont) = "\\";
+    my($maxline) = 78;         # Seems like a reasonable default
+    my @exclude = ();          # Don't exclude anything
 
     while ( defined($line = <IN>) ) {
        if ( $line =~ /^\s*\#\s*@([a-z0-9-]+):\s*\"([^\"]*)\"/ ) {
@@ -97,6 +141,10 @@ sub insert_deps($) {
                $sep = $val;
            } elsif ( $parm eq 'line-width' ) {
                $maxline = $val+0;
+           } elsif ( $parm eq 'continuation' ) {
+               $cont = $val;
+           } elsif ( $parm eq 'exclude' ) {
+               @exclude = split(/\,/, $val);
            }
        } elsif ( $line eq $barrier ) {
            last;               # Stop reading input at barrier line
@@ -105,6 +153,12 @@ sub insert_deps($) {
     }
     close(IN);
 
+    my $e;
+    my %do_exclude = ();
+    foreach $e (@exclude) {
+       $do_exclude{$e} = 1;
+    }
+
     my $dfile, $ofile, $str, $sl, $len;
     my @deps, $dep;
 
@@ -117,29 +171,31 @@ sub insert_deps($) {
            $len = length($str);
            print OUT $str;
            foreach $dep ($dfile, alldeps($dfile)) {
-               $str = convert_file($dep,$sep);
-               $sl = length($str)+1;
-               if ( $len+$sl > $maxline-2 ) {
-                   print OUT " \\\n ", $str;
-                   $len = $sl;
-               } else {
-                   print OUT ' ', $str;
-                   $len += $sl;
+               unless ($do_exclude{$dep}) {
+                   $str = convert_file($dep,$sep);
+                   $sl = length($str)+1;
+                   if ( $len+$sl > $maxline-2 ) {
+                       print OUT ' ', $cont, "\n ", $str;
+                       $len = $sl;
+                   } else {
+                       print OUT ' ', $str;
+                       $len += $sl;
+                   }
                }
            }
            print OUT "\n";
        }
     }
     close(OUT);
-    
-    (unlink($file) && rename($tmp, $file)) 
+
+    (unlink($file) && rename($tmp, $file))
        or die "$0: Failed to change $tmp -> $file\n";
 }
 
 #
 # Main program
 #
-    
+
 %deps = ();
 @files = ();
 @mkfiles = ();