#!/usr/bin/perl # $Id: mkdep.perl $ # # Created: Thu Aug 15 11:57:33 1996 too # Last modified: Fri Dec 28 12:24:38 EET 2007 too # # Copyright (c) 1996-2002 Tomi Ollila # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. 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 AUTHOR ``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 REGENTS 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. # # HISTORY # $Log: $ die "Usage: mkdep CPP-command [CPP options] [dir1 [dir2... ] file1 [file2...]\n" if ($#ARGV < 1); $cmdl = shift(@ARGV); $cmdl = "$cmdl " . shift (@ARGV) while ($ARGV[0] =~ /^-[A-Z]/); push(@dirs, "$ARGV[0]/"), shift while (-d $ARGV[0]); push @dirs, "" unless (defined @dirs); while ($file = shift(@ARGV)) { $file =~ s/\.o$/.c/; warn("warning: $file: no such file.\n"), next unless -f $file; open(FOO, "$cmdl $file|"); &parseout; close(FOO); } sub parseout { %used = (); undef @list; $target = $file; $target =~ s/\.c$/.o/; push @list, $file; $used{$file} = 1; while () { next unless (/^# \d+ "([^"<]+)"/); next if ($1 =~ /^\//); next if $used{$1}; $used{$1} = 1; push @list, $1; } foreach (@dirs) { $o = "$_$target:\t"; $nlen = length $o; print $o; foreach (@list) { if (length ($_) + $nlen > 70) # 70 + 8, that is. { print "\\\n\t"; $nlen = 1; } $nlen += length ($_) + 1; print "$_ "; } print "\n"; } }