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
|
#! /usr/local/gnu/bin/perl
#
#-----------------------------------------------------------------------
#
# purpose : to provide incremental updates to the spooles.a library
#
# the spooles.a library is a global library and contains all spooles
# methods. (this is in contrast to local libraries that contain
# methods for only one object, e.g., A2/src/A2.a)
#
# the spooles.a library is usually created once, by executing
# "make global" in the spooles directory, which compiles each
# and every source file in all the object/src directories.
# on many systems this can take quite a long time.
#
# there are times when we make a change to one method and want to
# update the spooles.a library. calling "make global" in the
# spooles directory would compile all the source once again.
#
# what is needed is a way to compile only those src files that
# need to be compiled. well, we haven't quite achieved this.
# what this perl script helps do is to create a makefile (written
# to stdout) that will compile all src files that are more recent
# than spooles.a library. this perl script is called when
# executing "make updateLib" within the object's src directory.
#
# this works well in some cases. for example, let us say that we
# are working in the FrontMtx/drivers directory and we see that
# the A2/src/QRreduce.c file needs a change. we open another window,
# move to the A2/src directory, and make the change in QRreduce.c.
# we then execute "make updateLib", which first calls this
# script to generate a makefile that will compile QRreduce.c
# and load into spooles.a. the makefile is then executed to perform
# that operation, and then removed. we have a good incremental
# change to the global spooles.a library.
#
# here is a second case where it doesn't work as well. assume again
# that we are working in the FrontMtx/drivers directory, and we
# see that changes need to be made to two different src files,
# the first A2/src/QRreduce.c and the second SubMtx/src/util.c.
# we edit the two source files and then need to update the spooles.a
# library.
#
# we first go to the A2/src directory and execute "make updateLib"
# then the QRreduce.c file gets compiled and loaded into spooles.a.
# we then go to the SubMtx/src directory and execute "make updateLib"
# and the util.c file # is NOT compiled and loaded into the library.
# this is because spooles.a is more recent the SubMtx/src/util.c,
# because spooles.a was just modified when A2/src/QRreduce.c was
# compiled and loaded.
#
# i presently don't know of a clean solution to this problem
# (and am open to suggestions). a decent workaround is this.
# (1) go to A2/src, modify QRreduce.c, then "make updateLib"
# (2) go to SubMtx/src, modify util.c, then "make updateLib"
# here the util.c file is more recent than spooles.a. in other words,
# update the library after each src file is changed.
#
# this is my first perl script, so don't laugh,
# just send me comments and suggestions.
#
# created -- 98dec16, cca
#
#-----------------------------------------------------------------------
#
# open the makefile to extract out the src file names
#
$makefile = "makefile" ;
open( MAKEFILE, $makefile ) or die "Cannot open $makefile" ;
#
# get the last modification time for ../../spooles.a
#
if ( -e "../../spooles.a" ) {
$lib_time = -M "../../spooles.a" ;
}
#
# read in each line, look for $(OBJ).a(srcname.o)
# put srcname into the @srcnames array
#
while ( $line = <MAKEFILE> ) {
chop($line) ;
if ( $line =~ /OBJ =/ ) {
($first, $objname) = split /OBJ = /, $line
}
if ( $line =~ /\$\(OBJ\)\.a\(/ ) {
($first, $second) = split /\$\(OBJ\)\.a\(/, $line ;
($srcname, $remainder) = split /\.o\)/, $second ;
$srcname = $srcname . ".c" ;
#
# get the last modification time for srcname.c
#
$srcname_time = -M $srcname ;
if ( (! -e "../../spooles.a") or ($srcname_time < $lib_time) ) {
push @srcnames, $srcname
}
}
}
#
# now start printing the makefile to stdout
#
print "\ninclude ../../Make.inc" ;
print "\n" ;
print "\nOBJ = $objname" ;
print "\n\nSRC = " ;
foreach $src ( @srcnames ) {
$srcname = " \\\n " . $src ;
print $srcname ;
}
print "\n\nOBJ_FILES = \$\{SRC:.c=.o\}" ;
print "\n\n" ;
print <<'EOF' ;
.c.o :
$(PURIFY) $(CC) -c $(CFLAGS) $*.c -o $(OBJ)_$*.o
../../spooles.a : ${OBJ_FILES}
$(AR) $(ARFLAGS) ../../spooles.a $(OBJ)_*.o
rm -f $(OBJ)_*.o
$(RANLIB) ../../spooles.a
EOF
|