Blame src/util/depfix.pl

Packit fd8b60
#!env perl -w
Packit fd8b60
#
Packit fd8b60
# Copyright 1995,2001,2002,2003,2004,2005,2009 by the Massachusetts Institute of Technology.
Packit fd8b60
# All Rights Reserved.
Packit fd8b60
#
Packit fd8b60
# Export of this software from the United States of America may
Packit fd8b60
#   require a specific license from the United States Government.
Packit fd8b60
#   It is the responsibility of any person or organization contemplating
Packit fd8b60
#   export to obtain such a license before exporting.
Packit fd8b60
#
Packit fd8b60
# WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
Packit fd8b60
# distribute this software and its documentation for any purpose and
Packit fd8b60
# without fee is hereby granted, provided that the above copyright
Packit fd8b60
# notice appear in all copies and that both that copyright notice and
Packit fd8b60
# this permission notice appear in supporting documentation, and that
Packit fd8b60
# the name of M.I.T. not be used in advertising or publicity pertaining
Packit fd8b60
# to distribution of the software without specific, written prior
Packit fd8b60
# permission.  Furthermore if you modify this software you must label
Packit fd8b60
# your software as modified software and not distribute it in such a
Packit fd8b60
# fashion that it might be confused with the original M.I.T. software.
Packit fd8b60
# M.I.T. makes no representations about the suitability of
Packit fd8b60
# this software for any purpose.  It is provided "as is" without express
Packit fd8b60
# or implied warranty.
Packit fd8b60
#
Packit fd8b60
Packit fd8b60
eval 'exec perl -S $0 ${1+"$@"}'
Packit fd8b60
  if 0;
Packit fd8b60
$0 =~ s/^.*?(\w+)[\.\w+]*$/$1/;
Packit fd8b60
Packit fd8b60
# Input: srctop thisdir srcdir buildtop stlibobjs
Packit fd8b60
Packit fd8b60
# Notes: myrelativedir is something like "lib/krb5/asn.1" or ".".
Packit fd8b60
# stlibobjs will usually be empty, or include spaces.
Packit fd8b60
Packit fd8b60
# A typical set of inputs, produced with srcdir=.. at top level:
Packit fd8b60
#
Packit fd8b60
# top_srcdir = ../../../util/et/../..
Packit fd8b60
# thisdir = util/et
Packit fd8b60
# srcdir = ../../../util/et
Packit fd8b60
# BUILDTOP = ../..
Packit fd8b60
# STLIBOBJS = error_message.o et_name.o com_err.o
Packit fd8b60
Packit fd8b60
my($top_srcdir,$thisdir,$srcdir,$BUILDTOP,$STLIBOBJS) = @ARGV;
Packit fd8b60
Packit fd8b60
if (0) {
Packit fd8b60
    print STDERR "top_srcdir = $top_srcdir\n";
Packit fd8b60
    print STDERR "BUILDTOP = $BUILDTOP\n";
Packit fd8b60
    print STDERR "STLIBOBJS = $STLIBOBJS\n";
Packit fd8b60
}
Packit fd8b60
Packit fd8b60
#$srcdirpat = quotemeta($srcdir);
Packit fd8b60
Packit fd8b60
my($extrasuffixes) = ($STLIBOBJS ne "");
Packit fd8b60
Packit fd8b60
sub my_qm {
Packit fd8b60
    my($x) = @_;
Packit fd8b60
    $x = quotemeta($x);
Packit fd8b60
    $x =~ s,\\/,/,g;
Packit fd8b60
    return $x;
Packit fd8b60
}
Packit fd8b60
Packit fd8b60
sub strrep {
Packit fd8b60
    my($old,$new,$s) = @_;
Packit fd8b60
    my($l) = "strrep('$old','$new','$s')";
Packit fd8b60
    my($out) = "";
Packit fd8b60
    while ($s ne "") {
Packit fd8b60
	my($i) = index($s, $old);
Packit fd8b60
	if ($i == -1) {
Packit fd8b60
	    $out .= $s;
Packit fd8b60
	    $s = "";
Packit fd8b60
	} else {
Packit fd8b60
	    $out .= substr($s, 0, $i) . $new;
Packit fd8b60
	    if (length($s) > $i + length($old)) {
Packit fd8b60
		$s = substr($s, $i + length($old));
Packit fd8b60
	    } else {
Packit fd8b60
		$s = "";
Packit fd8b60
	    }
Packit fd8b60
	}
Packit fd8b60
    }
Packit fd8b60
#    print STDERR "$l = '$out'\n";
Packit fd8b60
    return $out;
Packit fd8b60
}
Packit fd8b60
Packit fd8b60
sub do_subs {
Packit fd8b60
    local($_) = @_;
Packit fd8b60
    s,\\$, \\,g; s, + \\$, \\,g;
Packit fd8b60
    s,//+,/,g; s, \./, ,g;
Packit fd8b60
    if ($extrasuffixes) {
Packit fd8b60
	# Only care about the additional prefixes if we're building
Packit fd8b60
	# shared libraries.
Packit fd8b60
	s,^([a-zA-Z0-9_\-]*)\.o:,$1.so $1.po \$(OUTPRE)$1.\$(OBJEXT):,;
Packit fd8b60
    } else {
Packit fd8b60
	s,^([a-zA-Z0-9_\-]*)\.o:,\$(OUTPRE)$1.\$(OBJEXT):,;
Packit fd8b60
    }
Packit fd8b60
    # Recognize $(top_srcdir) and variants.
Packit fd8b60
    my($srct) = $top_srcdir . "/";
Packit fd8b60
    $_ = strrep(" $srct", " \$(top_srcdir)/", $_);
Packit fd8b60
#    s, $pat, \$(top_srcdir)/,go;
Packit fd8b60
    while ($srct =~ m,/[a-z][a-zA-Z0-9_.\-]*/\.\./,) {
Packit fd8b60
	$srct =~ s,/[a-z][a-zA-Z0-9_.\-]*/\.\./,/,;
Packit fd8b60
	$_ = strrep(" $srct", " \$(top_srcdir)/", $_);
Packit fd8b60
    }
Packit fd8b60
    # Now try to produce pathnames relative to $(srcdir).
Packit fd8b60
    if ($thisdir eq ".") {
Packit fd8b60
	# blah
Packit fd8b60
    } else {
Packit fd8b60
	my($pat) = " \$(top_srcdir)/$thisdir/";
Packit fd8b60
	my($out) = " \$(srcdir)/";
Packit fd8b60
	$_ = strrep($pat, $out, $_);
Packit fd8b60
	while ($pat =~ m,/[a-z][a-zA-Z0-9_.\-]*/$,) {
Packit fd8b60
	    $pat =~ s,/[a-z][a-zA-Z0-9_.\-]*/$,/,;
Packit fd8b60
	    $out .= "../";
Packit fd8b60
	    if ($pat ne " \$(top_srcdir)/") {
Packit fd8b60
		$_ = strrep($pat, $out, $_);
Packit fd8b60
	    }
Packit fd8b60
	}
Packit fd8b60
    }
Packit fd8b60
    # Now substitute for BUILDTOP:
Packit fd8b60
    $_ = strrep(" $BUILDTOP/", " \$(BUILDTOP)/", $_);
Packit fd8b60
    return $_;
Packit fd8b60
}
Packit fd8b60
Packit fd8b60
sub do_subs_2 {
Packit fd8b60
    local($_) = @_;
Packit fd8b60
    # Add a trailing space.
Packit fd8b60
    s/$/ /;
Packit fd8b60
    # Remove excess spaces.
Packit fd8b60
    s/  */ /g;
Packit fd8b60
    # Delete headers external to the source and build tree.
Packit fd8b60
    s; /[^ ]*;;g;
Packit fd8b60
    # Remove foo/../ sequences.
Packit fd8b60
    while (m/\/[a-z][a-z0-9_.\-]*\/\.\.\//) {
Packit fd8b60
	s//\//g;
Packit fd8b60
    }
Packit fd8b60
    # Use VPATH.
Packit fd8b60
    s;\$\(srcdir\)/([^ /]* );$1;g;
Packit fd8b60
Packit fd8b60
    $_ = &uniquify($_);
Packit fd8b60
Packit fd8b60
    # Allow override of some util dependencies in case local tools are used.
Packit fd8b60
    s;\$\(BUILDTOP\)/include/com_err.h ;\$(COM_ERR_DEPS) ;g;
Packit fd8b60
    s;\$\(BUILDTOP\)/include/ss/ss.h \$\(BUILDTOP\)/include/ss/ss_err.h ;\$(SS_DEPS) ;g;
Packit fd8b60
    s;\$\(BUILDTOP\)/include/db-config.h \$\(BUILDTOP\)/include/db.h ;\$(DB_DEPS) ;g;
Packit fd8b60
    s;\$\(BUILDTOP\)/include/verto.h ;\$(VERTO_DEPS) ;g;
Packit fd8b60
    if ($thisdir eq "util/gss-kernel-lib") {
Packit fd8b60
	# Here com_err.h is used from the current directory.
Packit fd8b60
	s;com_err.h ;\$(COM_ERR_DEPS) ;g;
Packit fd8b60
    }
Packit fd8b60
    if ($thisdir eq "lib/krb5/ccache") {
Packit fd8b60
	# These files are only used (and kcmrpc.h only generated) on macOS.
Packit fd8b60
	# There are conditional dependencies in Makefile.in.
Packit fd8b60
	s;kcmrpc.h ;;g;
Packit fd8b60
	s;kcmrpc_types.h ;;g;
Packit fd8b60
    }
Packit fd8b60
Packit fd8b60
    $_ = &uniquify($_);
Packit fd8b60
Packit fd8b60
    # Delete trailing whitespace.
Packit fd8b60
    s; *$;;g;
Packit fd8b60
Packit fd8b60
    return $_;
Packit fd8b60
}
Packit fd8b60
Packit fd8b60
sub uniquify {
Packit fd8b60
    # Apparently some versions of gcc -- like
Packit fd8b60
    # "gcc version 3.4.4 20050721 (Red Hat 3.4.4-2)"
Packit fd8b60
    # -- will sometimes emit duplicate header file names.
Packit fd8b60
    local($_) = @_;
Packit fd8b60
    my(@sides) = split ": ", $_;
Packit fd8b60
    my($lhs) = "";
Packit fd8b60
    if ($#sides == 1) {
Packit fd8b60
	$lhs = $sides[0] . ": ";
Packit fd8b60
	$_ = $sides[1];
Packit fd8b60
    }
Packit fd8b60
    my(@words) = split " ", $_;
Packit fd8b60
    my($w);
Packit fd8b60
    my($result) = "";
Packit fd8b60
    my(%seen);
Packit fd8b60
    undef %seen;
Packit fd8b60
    foreach $w (sort { $a cmp $b; } @words) {
Packit fd8b60
	next if defined($seen{$w});
Packit fd8b60
	$seen{$w} = 1;
Packit fd8b60
	if ($result ne "") { $result .= " "; }
Packit fd8b60
	$result .= $w;
Packit fd8b60
    }
Packit fd8b60
    return $lhs . $result . " ";
Packit fd8b60
}
Packit fd8b60
Packit fd8b60
sub split_lines {
Packit fd8b60
    local($_) = @_;
Packit fd8b60
    s/(.{50}[^ ]*) /$1 \\\n  /g;
Packit fd8b60
    return $_ . "\n";
Packit fd8b60
}
Packit fd8b60
Packit fd8b60
print <
Packit fd8b60
#
Packit fd8b60
# Generated makefile dependencies follow.
Packit fd8b60
#
Packit fd8b60
EOH
Packit fd8b60
my $buf = '';
Packit fd8b60
while (<STDIN>) {
Packit fd8b60
    # Strip newline.
Packit fd8b60
    chop;
Packit fd8b60
    next if /^\s*#/;
Packit fd8b60
    # Do directory-specific path substitutions on each filename read.
Packit fd8b60
    $_ = &do_subs($_);
Packit fd8b60
    if (m/\\$/) {
Packit fd8b60
	chop;
Packit fd8b60
	$buf .= $_;
Packit fd8b60
    } else {
Packit fd8b60
	$buf = &do_subs_2($buf . $_);
Packit fd8b60
	print &split_lines($buf);
Packit fd8b60
	$buf = '';
Packit fd8b60
    }
Packit fd8b60
}
Packit fd8b60
exit 0;