Improved Makefile for PRL Bignum package
Per Bothner
bothner at sevenlayer.cs.wisc.edu
Thu Oct 11 09:40:45 AEST 1990
This message contains a replement Makefile for the PRL bignum package.
It also contains the file cpp-Makefile.
The Bignum package is from DEC's Paris Reserach Lab.
You can receive it by sending a request to librarian at decprl.dec.com.
It implements infinite-precision integer arithmetic.
It contains portable C versions of the primitives, as well
as tuned assembly language versions for selected machines.
The main advantage of my replacement Makefile is that it automatically
selects the correct version of the primitives. It does this by
having /lib/cpp process cpp-Makefile, and select the correct version
depending on pre-defined cpp macros.
My Makefile also cleans up various other problems:
* It doesn't recompile unless something is out of date.
* Generally cleaner logic and fewer circular dependencies.
* There is a 'clean' entry.
* The default target is 'BigNum.a', not 'all'. (The latter compiles
a number of test programs that are not used by BigNum *clients*.)
This Makefile has been tested on both Sony-News and DECstation 3100.
The Bnn part of the library has been used to implement a generic
(Lisp-like) arithmetic system written in C++. The latter (which I
may make available soon) has in turn been used as part of the
run-time system of two different experimental programming languages.
There are certainly some bugs/problems remaining, and I would
appreciate hearing about them.
==== Makefile ====
MAKE=make
LIB = BigNum.a
CC = cc
CPP=/lib/cpp -P
TMPMAKE=tmp-Makefile
BigNum.a: $(TMPMAKE)
$(MAKE) -f $(TMPMAKE) $@
$(TMPMAKE): cpp-Makefile
$(CPP) cpp-Makefile >$(TMPMAKE)
clean:
-rm -f ,* .,* *~ #*# .emacs_[0-9]* *.BAK *.CKP core a.out
-rm -f */,* */.,* */*~ */#*# */.emacs_[0-9]* */*.BAK */*.CKP
-rm -f o/*.o $(LIB) $(TMPMAKE)
.DEFAULT: $(TMPMAKE)
$(MAKE) -f $(TMPMAKE) $@
==== cpp-Makefile ====
/* Added automatic version selection Mon Oct 1 1990 bothner at cs.wisc.edu */
/*
* Copyright Digital Equipment Corporation & INRIA 1988, 1989
* Last modified_on Tue Sep 25 14:52:15 GMT+2:00 1990 by herve
* modified_on Tue Apr 10 20:34:44 GMT+2:00 1990 by shand
* modified_on Thu Nov 2 14:23:14 GMT+1:00 1989 by gangnet
* modified_on Wed Jul 5 10:23:54 GMT+2:00 1989 by bertin
*/
#ifdef __GNUC__
CC = gcc
#else
CC = cc
#endif
LIB = BigNum.a
KERNH = h/BigNum.h
CFLAGS = -c `cat .Version` -I./h -O #-g -pg
LKFLAGS = -O #-g
SENDMAIL=/usr/lib/sendmail
SENDMAILFLAGS=
/* Use predefined pre-processor macros to select a version. */
/* More machines should be added here. */
#if !defined(VERSION) && defined(vax)
#define VERSION vax
#endif
#if !defined(VERSION) && (defined(sun2) || defined(sun3))
#define VERSION 68K
#endif
#if !defined(VERSION) && (defined(MIPSEL) || defined(MIPSEB))
#define VERSION mips
#define MULT /* BnnMultiply is in KerN */
#endif
#if !defined(VERSION) && defined(pyr)
#define VERSION pyramid
#endif
#if !defined(VERSION) && defined(NeXT)
#define VERSION 68K
#endif
#if !defined(VERSION) && defined(sony)
/*#define VERSION 68K_mot -- Doesn't seen to work; /bin/as complains. */
#define VERSION 68K /* Use gnu assembler */
#ifndef AS
#define AS gas
#endif
#endif
#if !defined(VERSION) && defined(ns32000)
#define VERSION ns
#endif
/* Select a default version. */
#if !defined(VERSION)
#define VERSION C32
#endif
#ifndef AS
#define AS as
#endif
#ifndef MULT
#define MULT o/bnMult.o
#endif
OBJECT = o/KerN.o o/bnInit.o MULT o/bnDivide.o o/bnCmp.o o/bzf.o o/bz.o
/* extra entries:
* all - make all the stuff
* tidy - cleanup directories
* scratch - start from scratch
*/
/* build the BigNum library */
$(LIB): $(OBJECT)
-rm -f $(LIB)
ar cr $(LIB) $(OBJECT)
ranlib $(LIB)
default:
@echo "Usage: make <version>"
@echo "see README for valid versions."
@sh -c 'exit 1'
all: testKerN bztest
echo All is done !
tidy:
-rm -f ,* .,* *~ #*# .emacs_[0-9]* *.BAK *.CKP core a.out
-rm -f */,* */.,* */*~ */#*# */.emacs_[0-9]* */*.BAK */*.CKP
scratch:tidy
cd o; rm -f *.o
o/KerN.o: VERSION
o/bn.o: c/bn.c
$(CC) -c $(CFLAGS) $(DFLAG) c/bn.c
mv bn.o o
C16: c/KerN.c
echo "-DDIGITon16BITS" >.Version
$(CC) $(CFLAGS) c/KerN.c
mv KerN.o o
C32: c/KerN.c
echo "-DDIGITon32BITS" >.Version
$(CC) $(CFLAGS) c/KerN.c
mv KerN.o o
68K: s/68KerN.s
echo "-DDIGITon32BITS" >.Version
AS s/68KerN.s -o o/KerN.o
68K_mot: s/68KerN_mot.s
echo "-DDIGITon32BITS" >.Version
AS s/68KerN_mot.s -o o/KerN.o
vax: s/vaxKerN.s
echo "-DDIGITon32BITS" >.Version
AS s/vaxKerN.s -o o/KerN.o
ns: s/nsKerN.s
echo "-DDIGITon32BITS" >.Version
AS s/nsKerN.s -o o/KerN.o
mips: s/mipsKerN.s
echo "-DDIGITon32BITS" >.Version
AS -w s/mipsKerN.s -o o/KerN.o
pyramid: s/pyramidKerN.s
echo "-DDIGITon32BITS" >.Version
AS s/pyramidKerN.s -o o/KerN.o
i960: s/i960KerN.s
echo "-DDIGITon32BITS" >.Version
AS s/i960KerN.s -o o/KerN.o
/* Construct VMS assembler from UNIX version */
s/vaxKerN.mar: s/vaxKerN.s
sed -f s/unix2vms.sed < s/vaxKerN.s > $@
/* Level N */
o/bnInit.o: c/bn/bnInit.c $(KERNH)
$(CC) $(CFLAGS) c/bn/bnInit.c
mv bnInit.o o
o/bnMult.o: c/bn/bnMult.c $(KERNH)
$(CC) $(CFLAGS) c/bn/bnMult.c
mv bnMult.o o
o/bnDivide.o: c/bn/bnDivide.c $(KERNH)
$(CC) $(CFLAGS) c/bn/bnDivide.c
mv bnDivide.o o
o/bnCmp.o: c/bn/bnCmp.c $(KERNH)
$(CC) $(CFLAGS) c/bn/bnCmp.c
mv bnCmp.o o
/* Level Z */
o/bz.o: c/bz.c h/BigZ.h $(KERNH)
$(CC) $(CFLAGS) c/bz.c
mv bz.o o
/* Some functions built with BigZ */
o/bzf.o: c/bzf.c h/BigZ.h $(KERNH)
$(CC) $(CFLAGS) c/bzf.c
mv bzf.o o
/* Tests of KerN */
testKerN: Makefile o/testKerN.o $(LIB)
$(CC) o/testKerN.o $(LIB) $(LKFLAGS) -o testKerN
o/testKerN.o: c/testKerN.c $(KERNH) h/BntoBnn.h
$(CC) $(CFLAGS) c/testKerN.c
mv testKerN.o o
/* Tests of BigZ */
bztest: o/bztest.o $(LIB)
$(CC) o/bztest.o $(LIB) $(LKFLAGS) -o bztest
o/bztest.o: c/bztest.c h/BigZ.h $(KERNH)
$(CC) $(CFLAGS) c/bztest.c
mv bztest.o o
/* documentation */
doc: doc/bn.ps doc/bnf.ps
docprl: doc/bnprl.ps
doc/bn.dvi: doc/bn.tex doc/bnbody.tex
cd doc;\
latex bn;\
makeindex bn;\
sed -e "s/\\item Bz/\\newpage \\Bz/g" < bn.ind > bn.index;\
mv bn.index bn.ind;\
latex bn;\
cd ..
doc/bn.ps: doc/bn.dvi
cd doc;\
dvips -o bn.ps bn;\
cd ..
doc/bnf.dvi: doc/bnf.tex
cd doc;\
latex bnf;\
cd ..
doc/bnf.ps: doc/bnf.dvi
cd doc;\
dvips -o bnf.ps bnf;\
cd ..
doc/bnprl.dvi: doc/bnprl.tex doc/bnbody.tex
cd doc;\
latex bnprl;\
makeindex bnprl;\
sed -e "s/\\item Bz/\\newpage \\Bz/g" < bnprl.ind > bnprl.index;\
mv bnprl.index bnprl.ind;\
latex bnprl;\
cd ..
doc/bnprl.ps: doc/bnprl.dvi
cd doc;\
dvips -o bnprl.ps bnprl;\
cd ..
/* build shell archives */
shar: bignum01
PACKET_SIZE=90
/* If you modify the list of files in the package kit, don't forget */
/* to update README. */
bignum01: README Makefile VMSmakefile\
doc/bn.tex doc/bnbody.tex doc/bnf.tex doc/intro\
c/KerN.c c/bn/bnInit.c c/bn/bnMult.c c/bn/bnDivide.c\
c/bn/bnCmp.c c/bz.c c/bzf.c \
c/bztest.c c/testKerN.c \
h/BigNum.h h/BigZ.h h/BntoBnn.h \
s/vaxKerN.s s/68KerN.s s/nsKerN.s s/68KerN_mot.s \
s/mipsKerN.s s/pyramidKerN.s s/vaxKerN.mar s/unix2vms.sed \
s/i960KerN.s \
o/EMPTY
makekit -s$(PACKET_SIZE)k -nbignum -t"Now do 'make'" \
README Makefile VMSmakefile\
doc doc/bn.tex doc/bnbody.tex doc/bnf.tex \
doc/intro doc/makeidx.sty \
c c/KerN.c c/bz.c c/bzf.c c/bztest.c c/testKerN.c \
c/bn c/bn/bnInit.c c/bn/bnMult.c c/bn/bnDivide.c c/bn/bnCmp.c \
h h/BigNum.h h/BigZ.h h/BntoBnn.h \
s s/vaxKerN.s s/68KerN.s s/nsKerN.s s/68KerN_mot.s \
s/mipsKerN.s s/pyramidKerN.s s/vaxKerN.mar s/unix2vms.sed \
s/i960KerN.s \
o o/EMPTY
/* send shell archives */
USER=nil
FULLNAME=nil
COPY=librarian at prl.dec.com
mail: bignum01
@sh -c "if [ x$(USER) = xnil -o 'x$(FULLNAME)' = xnil ]; \
then echo must specify USER and FULLNAME; \
echo EG make USER=herve at prl FULLNAME="'\"'"J-C Herve, Digital PRL"'\"'" mail; exit 1; \
else :; fi"
@touch Recipients
@echo '' >> Recipients
@date >> Recipients
@echo "$(FULLNAME)" >> Recipients
@echo '<'"$(USER)"'>' >> Recipients
@echo "To: $(COPY)" >tosend
@echo "Subject: BIGNUM DAEMON" >>tosend
@echo "Madeleine and Monique, I have sent the package bignum to:" >>tosend
@echo >>tosend
@echo " $(FULLNAME)" >>tosend
@echo " $(USER)" >>tosend
@echo >>tosend
@echo "Thanks to register this address in your distribution list." >>tosend
@$(SENDMAIL) $(SENDMAILFLAGS) $(COPY) <tosend
echo To: $(USER) > sendmail_header
cp sendmail_header tosend
echo "Subject: BigNum package from Digital PRL" >>tosend
ls bignum[0-9][0-9] | sed -e "s/^bignum0*/ BigNum - Part /" > _flist1
ls bignum[0-9][0-9] | sed -e "s/^/ /" > _flist2
ls bignum[0-9][0-9] | sed -e "s/^/ \/bin\/sh /" > _flist3
ls bignum[0-9][0-9] | sed -e "s/^/ shar -u /" > _flist4
cc -E -Uvax -I. doc/intro >intro.tosend
sed \
-e "s/modified_on/modified_on/g" \
-e "/doc\/intro/d" \
-e "/.\/README/d" \
-e "s/NN/"`ls bignum?? | wc -l | sed -e "s/ //g"`"/g" \
-e "/^INCLUDE1/r _flist1" \
-e "/^INCLUDE2/r _flist2" \
-e "/^INCLUDE3/r _flist3" \
-e "/^INCLUDE4/r _flist4" \
-e "/^INCLUDE./d" \
<intro.tosend >>tosend
$(SENDMAIL) $(SENDMAILFLAGS) $(USER) <tosend
for i in `ls bignum[0-9][0-9]`; \
do cp sendmail_header tosend; \
echo $$i | sed -e "s/^bignum0*/Subject: BigNum - Part /" >>tosend; \
echo "# Remove all text above and including this line." >>tosend; \
sed -e "s/modified_on/modified_on/g" <$$i >>tosend; \
$(SENDMAIL) $(SENDMAILFLAGS) $(USER) <tosend; \
done
rm -f sendmail_header tosend _flist[1-9] bignum[0-9][0-9] intro.tosend
--
--Per Bothner
bothner at cs.wisc.edu Computer Sciences Dept, U. of Wisconsin-Madison
More information about the Alt.sources
mailing list