DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Mercurial (5b81998bb7ab)

VCS Links

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
#!/usr/bin/env perl

# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

# mddepend.pl - Reads in dependencies generated my -MD flag. Prints list
#   of objects that need to be rebuilt. These can then be added to the
#   PHONY target. Using this script copes with the problem of header
#   files that have been removed from the build.
#    
# Usage:
#   mddepend.pl <output_file> <dependency_files...>
#
# Send comments, improvements, bugs to Steve Lamm (slamm@netscape.com).

use strict;

use constant DEBUG => 0;

my $outfile = shift @ARGV;
my $silent = $ENV{MAKEFLAGS} =~ /^\w*s|\s-s/;

my $line = '';
my %alldeps;
# Parse dependency files
while (<>) {
  s/\r?\n$//; # Handle both unix and DOS line endings
  $line .= $_;
  if ($line =~ /\\$/) {
    chop $line;
    next;
  }

  $line =~ s|\\|/|g;

  my ($obj,$rest) = split /\s*:\s+/, $line, 2;
  $line = '';
  next if !$obj || !$rest;

  my @deps = split /\s+/, $rest;
  push @{$alldeps{$obj}}, @deps;
  if (DEBUG >= 2) {
    foreach my $dep (@deps) { print STDERR "add $obj $dep\n"; }
  }
}

# Test dependencies
my %modtimes; # cache
my @objs;     # force rebuild on these
OBJ_LOOP: foreach my $obj (keys %alldeps) {
  my $mtime = (stat $obj)[9] or next;

  my %not_in_cache;
  my $deps = $alldeps{$obj};
  foreach my $dep_file (@{$deps}) {
    my $dep_mtime = $modtimes{$dep_file};
    if (not defined $dep_mtime) {
      print STDERR "Skipping $dep_file for $obj, will stat() later\n" if DEBUG >= 2;
      $not_in_cache{$dep_file} = 1;
      next;
    }

    print STDERR "Found $dep_file in cache\n" if DEBUG >= 2;

    if ($dep_mtime > $mtime) {
      print STDERR "$dep_file($dep_mtime) newer than $obj($mtime)\n" if DEBUG;
    }
    elsif ($dep_mtime == -1) {
      print STDERR "Couldn't stat $dep_file for $obj\n" if DEBUG;
    }
    else {
      print STDERR "$dep_file($dep_mtime) older than $obj($mtime)\n" if DEBUG >= 2;
      next;
    }

    push @objs, $obj; # dependency is missing or newer
    next OBJ_LOOP; # skip checking the rest of the dependencies
  }

  foreach my $dep_file (keys %not_in_cache) {
    print STDERR "STAT $dep_file for $obj\n" if DEBUG >= 2;
    my $dep_mtime = $modtimes{$dep_file} = (stat $dep_file)[9] || -1;

    if ($dep_mtime > $mtime) {
      print STDERR "$dep_file($dep_mtime) newer than $obj($mtime)\n" if DEBUG;
    }
    elsif ($dep_mtime == -1) {
      print STDERR "Couldn't stat $dep_file for $obj\n" if DEBUG;
    }
    else {
      print STDERR "$dep_file($dep_mtime) older than $obj($mtime)\n" if DEBUG >= 2;
      next;
    }

    push @objs, $obj; # dependency is missing or newer
    next OBJ_LOOP; # skip checking the rest of the dependencies
  }

  # If we get here it means nothing needs to be done for $obj
}

# Output objects to rebuild (if needed).
if ($outfile eq '-') {
    if (@objs) {
	print "@objs: FORCE\n";
    }
} elsif (@objs) {
  my $old_output;
  my $new_output = "@objs: FORCE\n";

  # Read in the current dependencies file.
  open(OLD, "<$outfile")
    and $old_output = <OLD>;
  close(OLD);

  # Only write out the dependencies if they are different.
  if ($new_output ne $old_output) {
    open(OUT, ">$outfile") and print OUT "$new_output";
    print "Updating dependencies file, $outfile\n" unless $silent;
    if (DEBUG) {
      print "new: $new_output\n";
      print "was: $old_output\n" if $old_output ne '';
    }
  }
} elsif (-s $outfile) {
  # Remove the old dependencies because all objects are up to date.
  print "Removing old dependencies file, $outfile\n" unless $silent;

  if (DEBUG) {
    my $old_output;
    open(OLD, "<$outfile")
      and $old_output = <OLD>;
    close(OLD);
    print "was: $old_output\n";
  }

  unlink $outfile;
}