Remove cmplr DEPENDS options and simplify .depends build rules.

This commit is contained in:
Janet B. Anderson
2002-07-05 21:59:35 +00:00
parent 621e2f2e50
commit d472e1dfbf
11 changed files with 131 additions and 241 deletions

View File

@ -35,5 +35,3 @@ STATIC_LDFLAGS_NO =
SHRLIB_LDFLAGS_YES = -shared
SHRLIB_LDFLAGS_NO =
HDEPENDS_FLAGS_CMPLR = -MM

View File

@ -268,36 +268,22 @@ COMPILE.c = $(CC) -c $(CPPFLAGS) $(CFLAGS) $(call PATH_FILTER,$(INCLUDES)) $(SOU
COMPILE.cpp = $(CCC) -c $(CPPFLAGS) $(CXXFLAGS) $(call PATH_FILTER,$(INCLUDES)) $(SOURCE_CXXFLAG)
#--------------------------------------------------
# Build depends command here
# Depends command
HOST_HDEPENDS_CMD = MKMF
CROSS_HDEPENDS_CMD = MKMF
HDEPENDS_CMD = $($(BUILD_CLASS)_HDEPENDS_CMD)
HDEPENDS.c_CMPLR = $(CC)
HDEPENDS.cpp_CMPLR = $(CCC)
HDEPENDSFLAGS_CMPLR += $(CPPFLAGS) $(INCLUDES) $< > $*$(DEP)
HDEPENDS.c_MKMF = $(PERL) $(TOOLS)/mkmf.pl
HDEPENDS.cpp_MKMF = $(PERL) $(TOOLS)/mkmf.pl
HDEPENDSFLAGS_MKMF = -m $*$(DEP) $(HDEPENDS_INCLUDES_MKMF) $@ $<
HDEPENDS_INCLUDES_MKMF = $(filter .%,$(subst -I,,$(INCLUDES)))
HDEPENDS.c = $(HDEPENDS.c_$(HDEPENDS_CMD))
HDEPENDS.cpp = $(HDEPENDS.cpp_$(HDEPENDS_CMD))
HDEPENDSFLAGS = $(HDEPENDSFLAGS_$(HDEPENDS_CMD))
HDEPENDS_FLAGS = $(HDEPENDS_FLAGS_$(HDEPENDS_CMD))
HDEPENDS_CMD.c = -$(HDEPENDS.c) $(HDEPENDS_FLAGS) $(HDEPENDSFLAGS)
HDEPENDS_CMD.cpp = -$(HDEPENDS.cpp) $(HDEPENDS_FLAGS) $(HDEPENDSFLAGS)
HDEPENDS_TARGETS_CMD = $(PERL) $(TOOLS)/makeDependsTargets.pl $*$(DEP)
HDEPENDS_FLAGS =
HDEPENDS_INCLUDES = $(filter .%,$(subst -I,,$(INCLUDES)))
HDEPENDSFLAGS = -m $*$(DEP) $(HDEPENDS_INCLUDES) $@ $<
HDEPENDS_CMD_YES = -$(MKMF) $(HDEPENDS_FLAGS) $(HDEPENDSFLAGS)
HDEPENDS_CMD_NO = echo ""
HDEPENDS_CMD = $(HDEPENDS_CMD_$(HDEPENDS))
#--------------------------------------------------
# depends definition
TARGET_SRCS = $(foreach name, $(TESTPROD) $(PROD) $(LIBRARY), $($(name)_SRCS))
SRC_FILES = $(LIB_SRCS) $(LIBSRCS) $(SRCS) $(PROD_SRCS) $(TARGET_SRCS)
HDEPENDS_FILES = $(addsuffix $(DEP),$(notdir $(basename $(SRC_FILES))))
HDEPENDS_FILES_YES = $(addsuffix $(DEP),$(notdir $(basename $(SRC_FILES))))
HDEPENDS_FILES = $(HDEPENDS_FILES_$(HDEPENDS))
#---------------------------------------------------------------
# Names of installed items

View File

@ -81,11 +81,9 @@ all: install
-include $(CONFIG)/RULES_JAVA
ifeq ($(HDEPENDS),YES)
ifneq (,$(strip $(HDEPENDS_FILES)))
-include $(HDEPENDS_FILES)
endif
endif
#---------------------------------------------------------------
# Create included Makefile for prod,testprod, and library targets
@ -197,38 +195,22 @@ $(OBJLIBNAME):%$(OBJ): $(OBJLIB_LD_OBJS)
$(COMPILE.c) -traditional $<
%$(OBJ): %.c
ifeq ($(HDEPENDS),YES)
@$(RM) $*$(DEP)
@$(HDEPENDS_CMD.c)
@$(HDEPENDS_TARGETS_CMD) $*$(DEP)
endif
@$(HDEPENDS_CMD)
@$(RM) $@
$(COMPILE.c) $(call PATH_FILTER,$<)
%$(OBJ): %.cc
ifeq ($(HDEPENDS),YES)
@$(RM) $*$(DEP)
@$(HDEPENDS_CMD.cpp)
@$(HDEPENDS_TARGETS_CMD) $*$(DEP)
endif
@$(HDEPENDS_CMD)
@$(RM) $@
$(COMPILE.cpp) $(call PATH_FILTER,$<) $(COMPILE_FILTER.cpp)
%$(OBJ): %.cpp
ifeq ($(HDEPENDS),YES)
@$(RM) $*$(DEP)
@$(HDEPENDS_CMD.cpp)
@$(HDEPENDS_TARGETS_CMD) $*$(DEP)
endif
@$(HDEPENDS_CMD)
@$(RM) $@
$(COMPILE.cpp) $(call PATH_FILTER,$<) $(COMPILE_FILTER.cpp)
%$(OBJ): %.C
ifeq ($(HDEPENDS),YES)
@$(RM) $*$(DEP)
@$(HDEPENDS_CMD.cpp)
@$(HDEPENDS_TARGETS_CMD) $*$(DEP)
endif
@$(HDEPENDS_CMD)
@$(RM) $@
$(COMPILE.cpp) $(call PATH_FILTER,$<) $(COMPILE_FILTER.cpp)

View File

@ -56,4 +56,3 @@ TARGET_LDFLAGS += -AA -mt
SHRLIB_LDFLAGS_YES = -G -h $@
HDEPENDS_FLAGS_CMPLR = +m

View File

@ -42,8 +42,6 @@ STATIC_LDLIBS_NO=
SHRLIB_LDFLAGS_YES = -shared
HDEPENDS_FLAGS_CMPLR =
############# ???????????
#####ACC_SFLAGS_YES= -non_shared
#####ACC_SFLAGS_NO= -call_shared

View File

@ -52,5 +52,4 @@ STATIC_LDLIBS_NO=
SHRLIB_LDFLAGS_YES = -G -h $@ -z ignore -z combreloc -z lazyload
HDEPENDS_FLAGS_CMPLR = -xM1

View File

@ -53,5 +53,3 @@ STATIC_LDLIBS_NO=
SHRLIB_LDFLAGS_YES = -G -h $@ -z ignore -z combreloc -z lazyload
HDEPENDS_FLAGS_CMPLR = -xM1

View File

@ -46,5 +46,3 @@ STATIC_LDLIBS_NO=
SHRLIB_LDFLAGS_YES = -assert pure-text -h $@
HDEPENDS_FLAGS_CMPLR = -xM1

View File

@ -270,13 +270,5 @@ LINK.cpp += , $@ ,,$(LINKLIBS) $(subst /,\\,$(LDLIBS))
# override of CONFIG_SITE default
SHARED_LIBRARIES = YES
# gnu compiler used to create depends files
HDEPENDS_FLAGS_CMPLR = -MM
HDEPENDS.c_CMPLR = gcc
HDEPENDS.cpp_CMPLR = g++
# override of CONFIG_COMMON
HDEPENDS_INCLUDES_MKMF = $(filter-out $(BORLAND_INC),$(subst -I,,$(INCLUDES)))
# override of CONFIG_SITE
HOST_HDEPENDS_CMD=MKMF

View File

@ -1,63 +0,0 @@
eval 'exec perl -S $0 ${1+"$@"}' # -*- Mode: perl -*-
if $running_under_some_shell; # makeDependsTargets.pl
# $Id$
#
# Author: Janet Anderson
#
sub Usage
{
my ($txt) = @_;
print "Usage:\n";
print "\makeDependsTargets infile\n";
print "\nError: $txt\n" if $txt;
exit 2;
}
# need at least one args: ARGV[0]
Usage("need an arg") if $#ARGV < 0;
use Cwd;
use File::Path;
use File::Copy;
$depfile = $ARGV[0];
$tempfile = "$ARGV[0].temp";
if (-f $depfile) {
unlink("$tempfile");
copy ($depfile, $tempfile) or die "$! copying $depfile";
open(OUT,">> $depfile") or die "$! opening $depfile";
open(IN,"< $tempfile") or die "$! opening $tempfile";
print OUT "\n#Depend files must be targets to avoid 'No rule to make target ...' errors\n";
$startline = 1;
while ($line = <IN>) {
next if ( $line =~ /\s*#/ ); # skip comments
chomp($line);
#$line =~ s/[ ]//g; # remove blanks and tabs
next if ( $line =~ /^$/ ); # skip empty lines
$depends = $line;
if ( $startline ) {
$depends =~ s/.*?://;
}
@dependsarray = split(//,$depends);
if ( $dependsarray[$#dependsarray] =~ /\\/
or ( $dependsarray[$#dependsarray-1] =~ /\\/ ) ) {
$depends =~ s/[ ]*\\\cM?$//;
$startline = 0;
} else {
$depends =~ s/[ ]*\cM?$//;
$startline = 1;
}
print OUT "$depends : \n";
}
print OUT "\n";
close IN or die "Cannot close $tempfile: $!";
close OUT or die "Cannot close $depfile: $!";
unlink("$tempfile");
}

View File

@ -1,6 +1,6 @@
#!/usr/bin/perl
#-----------------------------------------------------------------------
# mkmf.pl: Perl script to create include file dependancies
# mkmf.pl: Perl script to create #include file dependancies
#
# Limitations:
#
@ -11,148 +11,151 @@
# 3) Does not keep track of the macros defined in #include files so can't
# do #ifdefs #ifndef ...
# 4) Does not know where system include files are located
#
# 5) Uses only #include lines with single or double quoted file names
#
#-----------------------------------------------------------------------
require 5;
use strict;
use File::Basename;
use Getopt::Std;
use vars qw( $opt_d $opt_m $opt_v ); # declare these global to be shared with Getopt:Std
my $version = '$Id$ ';
my $version = 'mkmf.pl,v 1.5 2002/03/25 21:33:24 jba Exp $ ';
my $endline = $/;
my %delim_match = ( q/'/ => q/'/, q/"/ => q/"/);
my %output;
my @includes;
# initialize variables: use getopts for these
getopts( 'dm:v' ) || die "\aSyntax: $0 [-d] [-m makefile] [-v] [targets]\n";
$opt_v = 1 if $opt_d; # debug flag turns on verbose flag also
print "$0 $version\n" if $opt_v;
use vars qw( $opt_d $opt_m );
getopts( 'dm:' ) || die "\aSyntax: $0 [-d] [-f dependsFile] includeDirs objFile srcFile\n";
my $debug = $opt_d;
my $depFile = $opt_m;
$opt_m = 'depends' unless $opt_m; # set default file name
print "Making depends file $opt_m ...\n" if $opt_v;
print "$0 $version\n" if $debug;
# directory list
my @dirs;
my $i;
foreach $i (0 .. $#ARGV-2) {
push @dirs, $ARGV[$i];
}
#some generic declarations
my( $file, $line);
my %scanned; # list of directories/files already scanned
my $object = $ARGV[$#ARGV-1]; # object file
my $source = $ARGV[$#ARGV]; # sourcefile from object
my $objFile = $ARGV[$#ARGV-1];
my $srcFile = $ARGV[$#ARGV];
#some constants
my $endline = $/;
my %delim_match = ( q/'/ => q/'/, # hash to find includefile delimiter pair
q/"/ => q/"/,
q/</ => q/>/ );
if( $debug ) {
print "DEBUG: dirs= @dirs\n";
print "DEBUG: source= $srcFile\n";
print "DEBUG: object= $objFile\n";
}
#formatting command for MAKEFILE, keeps very long lines to 80 characters
format MAKEFILE =
^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< \~
print "Generating dependencies for $objFile\n" if $debug;
scanFile($srcFile);
scanIncludesList();
$depFile = 'depends' unless $depFile;
print "Creating file $depFile\n" if $debug;
printList($depFile,$objFile);
print "\n ALL DONE \n\n" if $debug;
#----------------------------------------
sub printList{
my $depFile = shift;
my $objFile = shift;
my $line;
unlink($depFile) or die "Can't delete $depFile: $!\n" if -f $depFile;
open DEPENDS, ">$depFile" or die "\aERROR opening file $depFile for writing: $!\n";
my $old_handle = select(DEPENDS);
#Limit lines to 80 characters
# a dot marks the end of the format
format DEPENDS_FMT =
^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\~
$line
.
sub print_formatted_list{
#this routine, in conjunction with the format line above, can be used to break up long lines
# it is currently used to break up the potentially long defs of SRC, OBJ, CPPDEFS, etc.
# not used for the dependency lists
$line = "@_";
local $: = " \t\n"; # the default formatting word boundary includes the hyphen, but not here
format TARGETS_FMT =
^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:~
$line
.
print "# DO NOT EDIT: This file created by $version\n\n";
local $: = " \t\n"; # remove hyphen from word boundary defaults
$~ = DEPENDS_FMT;
$line = "$objFile : @includes";
while ( length $line > 78 ) {
write MAKEFILE, $line;
write ;
}
print MAKEFILE $line unless $line eq '';
print MAKEFILE "\n";
print $line unless $line eq '';
print "\n\n";
print "#Depend files must be targets to avoid 'No rule to make target ...' errors\n";
$~ = TARGETS_FMT;
$line = "@includes";
while ( length $line > 78 ) {
write ;
}
print "$line :" unless $line eq '';
select($old_handle) ; # in this case, STDOUT
}
#begin writing makefile
open MAKEFILE, ">$opt_m" or die "\aERROR opening file $opt_m for writing: $!\n";
printf MAKEFILE "# Makefile created by %s $version\n\n", basename($0);
if( $opt_d ) {
print "DEBUG: dirs= @dirs\n";
print "DEBUG: source= $source\n";
print "DEBUG: object= $object\n";
}
my %includes_in; # hash of includes in a given source file (hashed against the corresponding object)
#subroutine to scan file for include files
# first argument is $object, second is $file
sub scanfile_for_keywords {
my $object = shift;
#-------------------------------------------
# scan file for #includes
sub scanFile {
my $file = shift;
local $/ = $endline;
#if file has already been scanned, return
return if $scanned{$file};
print "Scanning file $file of object $object ...\n" if $opt_v;
open FILE, $file or die "\aERROR opening file $file of object $object: $!\n";
my $incfile;
my $line;
print "Scanning file $file\n" if $debug;
open FILE, $file or return;
foreach $line ( <FILE> ) {
next if !($line =~ m/^[ ]*\#?[ ]*include/);
if( $line =~ /^[\#?\s]*include\s*(['""'<])([\w\.\/]*)$delim_match{\1}/ix ) {
$includes_in{$file} .= ' ' . $2 if $2;
}
$incfile = findNextIncName($line);
next if !$incfile;
next if $output{$incfile};
push @includes,$incfile;
$output{$incfile} = 1;
}
close FILE;
$scanned{$file} = 1;
print " uses includes=$includes_in{$file}.\n" if $opt_d;
}
&scanfile_for_keywords( $object, $source );
my %includes; # global list of includes
my @cmdline;
my %obj_of_include; # hash of includes for current object
print "Collecting dependencies for $object ...\n" if $opt_v;
@cmdline = "$object: ";
#includes: done in subroutine since it must be recursively called to look for embedded includes
&get_include_list( $object, $source );
#write the command line: if no file-specific command, use generic command for this suffix
&print_formatted_list(@cmdline) if $#cmdline > 1 ;
# subroutine to seek out includes recursively
sub get_include_list {
my( $incfile, $incname, $incpath );
my @paths;
my $object = shift;
my $file = shift;
my $include;
foreach ( split /\s+/, $includes_in{$file} ) {
print "object=$object, file=$file, include=$_.\n" if $opt_d;
if ( $scanned{"$_"} ) {
print "DEBUG: skipping scanned file $_\n" if $opt_d;
next;
}
$include = $_;
$incname = basename($_);
next if ( $incname eq '' );
$incpath = dirname($_);
undef $incpath if $incpath eq './';
undef $incpath if $incpath eq '.';
if( $incpath =~ /^\// ) {
@paths = $incpath; # exact incpath specified, use it
} else {
@paths = @dirs;
}
foreach ( @paths ) {
local $/ = '/'; chomp; # remove trailing / if present
my $newincpath = "$_/$incpath" if $_;
undef $newincpath if $newincpath eq './';
$incfile = "$newincpath$incname";
print "DEBUG: checking for $incfile in $_\n" if $opt_d;
if ( -f $incfile and $obj_of_include{$incfile} ne $object ) {
push @cmdline, $incfile;
$includes{$incfile} = 1;
chomp( $newincpath );
$newincpath = '.' if $newincpath eq '';
&scanfile_for_keywords($object,$incfile);
$obj_of_include{$incfile} = $object;
&get_include_list($object,$incfile); # recursively look for includes
last;
}
}
$scanned{"$include"} = 1;
#------------------------------------------
# scan files in includes list
sub scanIncludesList {
my $file;
foreach $file (@includes) {
scanFile($file);
}
}
#-----------------------------------------
# find filename on #include line
sub findNextIncName {
my $line = shift;
my $incname = "";
my $incfile = 0;
my $dir;
local $/ = $endline;
return 0 if !($line =~ m/^[ ]*\#?[ ]*include/);
return 0 if !($line =~ /^[\#?\s]*include\s*(['""'<])([\w\.\/]*)$delim_match{\1}/ix);
return 0 if !$2;
$incname = $2;
return $incname if -f $incname;
return 0 if ( $incname =~ /^\// || $incname =~ /^\\/ );
foreach $dir ( @dirs ) {
chomp($dir);
$incfile = "$dir/$incname";
print "DEBUG: checking for $incname in $dir\n" if $debug;
return $incfile if -f $incfile;
}
return 0;
}