util/postprocess-makedepend.pl: make an effort to collect dependencies
authorRichard Levitte <levitte@openssl.org>
Wed, 14 Mar 2018 12:24:12 +0000 (13:24 +0100)
committerRichard Levitte <levitte@openssl.org>
Thu, 15 Mar 2018 14:21:52 +0000 (15:21 +0100)
Instead of just working line by line, we collect all dependencies for
every target and print everything out at the end, with each target
getting a potentially long list of dependencies.

Reviewed-by: Andy Polyakov <appro@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/5591)

util/postprocess-makedepend.pl

index 5d0cf3d02aeb0b3df898b59aaddef3ce95fc8906..323ce9e0e4eac43f6746cbcb0c73159b0d002abb 100644 (file)
@@ -48,9 +48,10 @@ my $procedure = {
             # Finally, discard all empty lines or comment lines
             return undef if $line =~ /:\s*$/ || $line =~ /^(#.*|\s*)$/;
 
-            $line.="\n" unless $line =~ /\R$/g;
-
-            return $line;
+            my ($target, $deps) = $line =~ /^((?:\\.|[^:])*):(.*)/;
+            $deps =~ s/^\s+//;
+            $deps =~ s/\s+$//;
+            return ($target, $deps);
         },
     'VMS C' =>
         sub {
@@ -79,7 +80,10 @@ my $procedure = {
             # .TLB.
             return undef if /\.TLB\s*$/;
 
-            return $line;
+            my ($target, $deps) = $line =~ /^(.*)\s:\s(.*)/;
+            $deps =~ s/^\s+//;
+            $deps =~ s/\s+$//;
+            return ($target, $deps);
         },
     'VC' =>
         sub {
@@ -112,7 +116,7 @@ my $procedure = {
                 $tail = canonpath($tail);
                 if ($tail =~ m|^\Q$abs_srcdir\E|i
                         || $tail =~ m|^\Q$abs_blddir\E|i) {
-                    return "${object}: \"$tail\"\n";
+                    return ($object, "\"$tail\"");
                 }
             }
 
@@ -122,8 +126,35 @@ my $procedure = {
 
 die "Producer unrecognised: $producer\n" unless defined $procedure;
 
+my %collect = ();
 while (<STDIN>) {
-    if ($_ = $procedure->($_, @ARGV)) {
-        print or die "$!\n";
+    s|\R$||;                    # The better chomp
+    my ($target, $deps) = $procedure->($_, @ARGV);
+    $collect{$target}->{$deps} = 1
+        if defined $target;
+}
+
+my $continuation = {
+    'makedepend' => "\\",
+    'VMS C' => "-",
+    'VC' => "\\",
+} -> {$producer};
+
+die "Producer unrecognised: $producer\n" unless defined $continuation;
+
+foreach my $target (sort keys %collect) {
+    my $prefix = $target . ' :';
+    my @deps = sort keys %{$collect{$target}};
+
+    while (@deps) {
+        my $buf = $prefix;
+        $prefix = '';
+
+        while (@deps && ($buf eq '' || length($buf) + length($deps[0]) <= 77)) {
+            $buf .= ' ' . shift @deps;
+        }
+        $buf .= ' '.$continuation if @deps;
+
+        print $buf,"\n";
     }
 }