build/mddepend.pl
author David Anderson <dvander@alliedmods.net>
Sat Nov 17 23:11:38 2012 -0800 (2012-11-17)
changeset 209 5cbec15fadfe
parent 47 050939c6181e
permissions -rwxr-xr-x
Split ArrayType from Type.
dvander@47
     1
#!/usr/bin/env perl
dvander@47
     2
dvander@47
     3
# ***** BEGIN LICENSE BLOCK *****
dvander@47
     4
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
dvander@47
     5
#
dvander@47
     6
# The contents of this file are subject to the Mozilla Public License Version
dvander@47
     7
# 1.1 (the "License"); you may not use this file except in compliance with
dvander@47
     8
# the License. You may obtain a copy of the License at
dvander@47
     9
# http://www.mozilla.org/MPL/
dvander@47
    10
#
dvander@47
    11
# Software distributed under the License is distributed on an "AS IS" basis,
dvander@47
    12
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
dvander@47
    13
# for the specific language governing rights and limitations under the
dvander@47
    14
# License.
dvander@47
    15
#
dvander@47
    16
# The Original Code is this file as it was released upon March 8, 1999.
dvander@47
    17
#
dvander@47
    18
# The Initial Developer of the Original Code is
dvander@47
    19
# Netscape Communications Corporation.
dvander@47
    20
# Portions created by the Initial Developer are Copyright (C) 1999
dvander@47
    21
# the Initial Developer. All Rights Reserved.
dvander@47
    22
#
dvander@47
    23
# Contributor(s):
dvander@47
    24
#
dvander@47
    25
# Alternatively, the contents of this file may be used under the terms of
dvander@47
    26
# either of the GNU General Public License Version 2 or later (the "GPL"),
dvander@47
    27
# or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
dvander@47
    28
# in which case the provisions of the GPL or the LGPL are applicable instead
dvander@47
    29
# of those above. If you wish to allow use of your version of this file only
dvander@47
    30
# under the terms of either the GPL or the LGPL, and not to allow others to
dvander@47
    31
# use your version of this file under the terms of the MPL, indicate your
dvander@47
    32
# decision by deleting the provisions above and replace them with the notice
dvander@47
    33
# and other provisions required by the GPL or the LGPL. If you do not delete
dvander@47
    34
# the provisions above, a recipient may use your version of this file under
dvander@47
    35
# the terms of any one of the MPL, the GPL or the LGPL.
dvander@47
    36
#
dvander@47
    37
# ***** END LICENSE BLOCK *****
dvander@47
    38
dvander@47
    39
# mddepend.pl - Reads in dependencies generated my -MD flag. Prints list
dvander@47
    40
#   of objects that need to be rebuilt. These can then be added to the
dvander@47
    41
#   PHONY target. Using this script copes with the problem of header
dvander@47
    42
#   files that have been removed from the build.
dvander@47
    43
#    
dvander@47
    44
# Usage:
dvander@47
    45
#   mddepend.pl <output_file> <dependency_files...>
dvander@47
    46
#
dvander@47
    47
# Send comments, improvements, bugs to Steve Lamm ([email protected]).
dvander@47
    48
dvander@47
    49
use strict;
dvander@47
    50
dvander@47
    51
use constant DEBUG => 0;
dvander@47
    52
dvander@47
    53
my $outfile = shift @ARGV;
dvander@47
    54
my $silent = $ENV{MAKEFLAGS} =~ /^\w*s|\s-s/;
dvander@47
    55
dvander@47
    56
my $line = '';
dvander@47
    57
my %alldeps;
dvander@47
    58
# Parse dependency files
dvander@47
    59
while (<>) {
dvander@47
    60
  s/\r?\n$//; # Handle both unix and DOS line endings
dvander@47
    61
  $line .= $_;
dvander@47
    62
  if ($line =~ /\\$/) {
dvander@47
    63
    chop $line;
dvander@47
    64
    next;
dvander@47
    65
  }
dvander@47
    66
dvander@47
    67
  $line =~ s|\\|/|g;
dvander@47
    68
dvander@47
    69
  my ($obj,$rest) = split /\s*:\s+/, $line, 2;
dvander@47
    70
  $line = '';
dvander@47
    71
  next if !$obj || !$rest;
dvander@47
    72
dvander@47
    73
  my @deps = split /\s+/, $rest;
dvander@47
    74
  push @{$alldeps{$obj}}, @deps;
dvander@47
    75
  if (DEBUG >= 2) {
dvander@47
    76
    foreach my $dep (@deps) { print STDERR "add $obj $dep\n"; }
dvander@47
    77
  }
dvander@47
    78
}
dvander@47
    79
dvander@47
    80
# Test dependencies
dvander@47
    81
my %modtimes; # cache
dvander@47
    82
my @objs;     # force rebuild on these
dvander@47
    83
OBJ_LOOP: foreach my $obj (keys %alldeps) {
dvander@47
    84
  my $mtime = (stat $obj)[9] or next;
dvander@47
    85
dvander@47
    86
  my %not_in_cache;
dvander@47
    87
  my $deps = $alldeps{$obj};
dvander@47
    88
  foreach my $dep_file (@{$deps}) {
dvander@47
    89
    my $dep_mtime = $modtimes{$dep_file};
dvander@47
    90
    if (not defined $dep_mtime) {
dvander@47
    91
      print STDERR "Skipping $dep_file for $obj, will stat() later\n" if DEBUG >= 2;
dvander@47
    92
      $not_in_cache{$dep_file} = 1;
dvander@47
    93
      next;
dvander@47
    94
    }
dvander@47
    95
dvander@47
    96
    print STDERR "Found $dep_file in cache\n" if DEBUG >= 2;
dvander@47
    97
dvander@47
    98
    if ($dep_mtime > $mtime) {
dvander@47
    99
      print STDERR "$dep_file($dep_mtime) newer than $obj($mtime)\n" if DEBUG;
dvander@47
   100
    }
dvander@47
   101
    elsif ($dep_mtime == -1) {
dvander@47
   102
      print STDERR "Couldn't stat $dep_file for $obj\n" if DEBUG;
dvander@47
   103
    }
dvander@47
   104
    else {
dvander@47
   105
      print STDERR "$dep_file($dep_mtime) older than $obj($mtime)\n" if DEBUG >= 2;
dvander@47
   106
      next;
dvander@47
   107
    }
dvander@47
   108
dvander@47
   109
    push @objs, $obj; # dependency is missing or newer
dvander@47
   110
    next OBJ_LOOP; # skip checking the rest of the dependencies
dvander@47
   111
  }
dvander@47
   112
dvander@47
   113
  foreach my $dep_file (keys %not_in_cache) {
dvander@47
   114
    print STDERR "STAT $dep_file for $obj\n" if DEBUG >= 2;
dvander@47
   115
    my $dep_mtime = $modtimes{$dep_file} = (stat $dep_file)[9] || -1;
dvander@47
   116
dvander@47
   117
    if ($dep_mtime > $mtime) {
dvander@47
   118
      print STDERR "$dep_file($dep_mtime) newer than $obj($mtime)\n" if DEBUG;
dvander@47
   119
    }
dvander@47
   120
    elsif ($dep_mtime == -1) {
dvander@47
   121
      print STDERR "Couldn't stat $dep_file for $obj\n" if DEBUG;
dvander@47
   122
    }
dvander@47
   123
    else {
dvander@47
   124
      print STDERR "$dep_file($dep_mtime) older than $obj($mtime)\n" if DEBUG >= 2;
dvander@47
   125
      next;
dvander@47
   126
    }
dvander@47
   127
dvander@47
   128
    push @objs, $obj; # dependency is missing or newer
dvander@47
   129
    next OBJ_LOOP; # skip checking the rest of the dependencies
dvander@47
   130
  }
dvander@47
   131
dvander@47
   132
  # If we get here it means nothing needs to be done for $obj
dvander@47
   133
}
dvander@47
   134
dvander@47
   135
# Output objects to rebuild (if needed).
dvander@47
   136
if ($outfile eq '-') {
dvander@47
   137
    if (@objs) {
dvander@47
   138
	print "@objs: FORCE\n";
dvander@47
   139
    }
dvander@47
   140
} elsif (@objs) {
dvander@47
   141
  my $old_output;
dvander@47
   142
  my $new_output = "@objs: FORCE\n";
dvander@47
   143
dvander@47
   144
  # Read in the current dependencies file.
dvander@47
   145
  open(OLD, "<$outfile")
dvander@47
   146
    and $old_output = <OLD>;
dvander@47
   147
  close(OLD);
dvander@47
   148
dvander@47
   149
  # Only write out the dependencies if they are different.
dvander@47
   150
  if ($new_output ne $old_output) {
dvander@47
   151
    open(OUT, ">$outfile") and print OUT "$new_output";
dvander@47
   152
    print "Updating dependencies file, $outfile\n" unless $silent;
dvander@47
   153
    if (DEBUG) {
dvander@47
   154
      print "new: $new_output\n";
dvander@47
   155
      print "was: $old_output\n" if $old_output ne '';
dvander@47
   156
    }
dvander@47
   157
  }
dvander@47
   158
} elsif (-s $outfile) {
dvander@47
   159
  # Remove the old dependencies because all objects are up to date.
dvander@47
   160
  print "Removing old dependencies file, $outfile\n" unless $silent;
dvander@47
   161
dvander@47
   162
  if (DEBUG) {
dvander@47
   163
    my $old_output;
dvander@47
   164
    open(OLD, "<$outfile")
dvander@47
   165
      and $old_output = <OLD>;
dvander@47
   166
    close(OLD);
dvander@47
   167
    print "was: $old_output\n";
dvander@47
   168
  }
dvander@47
   169
dvander@47
   170
  unlink $outfile;
dvander@47
   171
}