PageRenderTime 14ms CodeModel.GetById 1ms app.highlight 10ms RepoModel.GetById 1ms app.codeStats 1ms

/build/mergedep.pl

http://github.com/digego/extempore
Perl | 86 lines | 50 code | 7 blank | 29 comment | 5 complexity | 771315ed53a32ea24a9b727f974f568c MD5 | raw file
 1#!/usr/bin/perl
 2# Copyright 2003 Bryan Ford
 3# Distributed under the GNU General Public License.
 4#
 5# Usage: mergedep <main-depfile> [<new-depfiles> ...]
 6#
 7# This script merges the contents of all <new-depfiles> specified
 8# on the command line into the single file <main-depfile>,
 9# which may or may not previously exist.
10# Dependencies in the <new-depfiles> will override
11# any existing dependencies for the same targets in <main-depfile>.
12# The <new-depfiles> are deleted after <main-depfile> is updated.
13#
14# The <new-depfiles> are typically generated by GCC with the -MD option,
15# and the <main-depfile> is typically included from a Makefile,
16# as shown here for GNU 'make':
17#
18#	.deps: $(wildcard *.d)
19#		perl mergedep $@ $^
20#	-include .deps
21#
22# This script properly handles multiple dependencies per <new-depfile>,
23# including dependencies having no target,
24# so it is compatible with GCC3's -MP option.
25#
26
27sub readdeps {
28	my $filename = shift;
29
30	open(DEPFILE, $filename) or return 0;
31	while (<DEPFILE>) {
32		if (/([^:]*):([^\\:]*)([\\]?)$/) {
33			my $target = $1;
34			my $deplines = $2;
35			my $slash = $3;
36			while ($slash ne '') {
37				$_ = <DEPFILE>;
38				defined($_) or die
39					"Unterminated dependency in $filename";
40				/(^[ \t][^\\]*)([\\]?)$/ or die
41					"Bad continuation line in $filename";
42				$deplines = "$deplines\\\n$1";
43				$slash = $2;
44			}
45			#print "DEPENDENCY [[$target]]: [[$deplines]]\n";
46			$dephash{$target} = $deplines;
47		} elsif (/^[#]?[ \t]*$/) {
48			# ignore blank lines and comments
49		} else {
50			die "Bad dependency line in $filename: $_";
51		}
52	}
53	close DEPFILE;
54	return 1;
55}
56
57
58if ($#ARGV < 0) {
59	print "Usage: mergedep <main-depfile> [<new-depfiles> ..]\n";
60	exit(1);
61}
62
63%dephash = ();
64
65# Read the main dependency file
66$maindeps = $ARGV[0];
67readdeps($maindeps);
68
69# Read and merge in the new dependency files
70foreach $i (1 .. $#ARGV) {
71	readdeps($ARGV[$i]) or die "Can't open $ARGV[$i]";
72}
73
74# Update the main dependency file
75open(DEPFILE, ">$maindeps.tmp") or die "Can't open output file $maindeps.tmp";
76foreach $target (keys %dephash) {
77	print DEPFILE "$target:$dephash{$target}";
78}
79close DEPFILE;
80rename("$maindeps.tmp", "$maindeps") or die "Can't overwrite $maindeps";
81
82# Finally, delete the new dependency files
83foreach $i (1 .. $#ARGV) {
84	unlink($ARGV[$i]) or print "Error removing $ARGV[$i]\n";
85}
86