438 lines
12 KiB
Makefile
438 lines
12 KiB
Makefile
#
|
|
# @(#)Makefile 1.1 92/07/30 SMI
|
|
#
|
|
|
|
DESTDIR = /proto
|
|
SH = /bin/sh
|
|
ECHO = /bin/echo
|
|
RM = /bin/rm
|
|
DATE = /bin/date
|
|
CPP = /lib/cpp
|
|
CHOWN = /etc/chown
|
|
GREP = /usr/bin/grep
|
|
LS = /bin/ls
|
|
PSTAT = /usr/etc/pstat
|
|
# kludges...
|
|
RELEASE_SRC= ./release
|
|
INSTALL_SRC= ./usr.bin
|
|
MAKE_SRC= ./bin/make
|
|
SCCS_SRC= ./sccs
|
|
CONFIG_SRC= ./usr.etc/config
|
|
MAKEINSTALL= /usr/release/bin/makeinstall
|
|
WINSTALL= /usr/release/bin/winstall
|
|
UNMOUNT = /usr/release/bin/unmount
|
|
INCDIR = /usr/tmp
|
|
CRYPT = sundist/exclude.lists/crypt.kit
|
|
|
|
.DEFAULT:
|
|
sccs get $@
|
|
|
|
#
|
|
# Programs that live in subdirectories, and have makefiles of their own.
|
|
# Order here is critical for make install.
|
|
#
|
|
# suninstall *must* come last
|
|
# the libraries *must* come first
|
|
#
|
|
LAST= usr.etc/suninstall
|
|
SUBDIR= etc bin usr.etc usr.bin ucb 5bin \
|
|
xpginclude xpglib xpgbin posixlib adm files man pub sccs \
|
|
diagnostics sys demo games old ${LAST}
|
|
|
|
#LIBDIR= include lib usr.lib 5include 5lib
|
|
LIBDIR= lib usr.lib ucblib
|
|
INCLDIR= include ucbinclude
|
|
CRYPTDIR= lib 5lib include include/rpcsvc bin etc ucb share \
|
|
share/man share/man/man1 share/man/man3
|
|
|
|
#
|
|
# Directories that must exist before make install
|
|
#
|
|
DIRS= etc tmp var var/adm var/crash var/log var/preserve var/spool var/tmp \
|
|
dev mnt usr sbin home
|
|
USRDIRS= bin ucb etc include 5bin 5lib 5include lib share hosts \
|
|
boot local old kvm xpg2include xpg2lib xpg2bin
|
|
|
|
#
|
|
# The default target populates the /usr/src tree, installs the new header
|
|
# files, builds, tests, and installs the new language tools, and finally
|
|
# compiles all of /usr/src.
|
|
#
|
|
all: INCBOOT LANGBOOT lang LIBRARIES ${SUBDIR}
|
|
@${ECHO} "Build done on" `${DATE}` > BUILT
|
|
@cat BUILT
|
|
|
|
BUILT:
|
|
${MAKE} DESTDIR=${DESTDIR} CHOWN=${CHOWN} all
|
|
|
|
#########################
|
|
#
|
|
# HOW TO DO IT:
|
|
#
|
|
# At this writing, the recommended sequence of commands to produce
|
|
# an entire release starting in a bare directory is:
|
|
#
|
|
# mkdir SCCS_DIRECTORIES
|
|
# mount `pwd`/SCCS_DIRECTORIES
|
|
# ln -s SCCS_DIRECTORIES/SCCS
|
|
# make POPULATED
|
|
# su -c "make makeinstall"
|
|
# make all
|
|
# su -c "make proto"
|
|
|
|
#########################
|
|
#
|
|
# STEP 0: RESOURCES
|
|
#
|
|
# Before going any further, check to ensure that we have the resources
|
|
# and environment we need to build the release.
|
|
#
|
|
|
|
.INIT: environment
|
|
|
|
environment:
|
|
@k=`df ${INCDIR} |sed 1d|awk ' { print $$4 }'`;\
|
|
if [ $$k -lt 4000 ] ; then \
|
|
echo ${INCDIR} "does not have enough space in it!"; \
|
|
echo "Make at least 4M available and try again."; \
|
|
false;\
|
|
elif [ `csh -c limit|grep stacksize|awk '{print $$2}'` -lt 24000 ]; \
|
|
then \
|
|
echo "Stacksize limit too low!"; \
|
|
echo "Increase stack limit to at least 24M and try again."; \
|
|
false; \
|
|
fi
|
|
|
|
#########################
|
|
#
|
|
# STEP 1: POPULATE
|
|
#
|
|
# Assume a parallel hierarchy of SCCS files rooted at ./SCCS_DIRECTORIES.
|
|
# The POPULATE pass at least creates all the subdirectories and sets up
|
|
# the SCCS links. If a file named RELEASE exists in the current directory,
|
|
# and contains a string naming an SID-list file found in ./SIDlist,
|
|
# then all the source files needed to build that release will be checked out.
|
|
#
|
|
|
|
POPULATED: populate
|
|
${MAKE} clobber
|
|
${SH} populate
|
|
${MAKE} links
|
|
${ECHO} "Source Tree populated on" `${DATE}` > $@
|
|
|
|
clobber: unpopulate
|
|
if [ -f RELEASE ]; then ${SH} unpopulate; fi
|
|
${RM} -f POPULATED
|
|
|
|
links: rmlinks
|
|
${CPP} makelinks | ${SH} -x
|
|
|
|
rmlinks: makelinks
|
|
${CPP} -DCLEAN makelinks | ${SH} -x
|
|
|
|
#########################
|
|
#
|
|
# STEP 1.5 UTIL_BOOT
|
|
#
|
|
# This step makes and installs from source all those odd ball utilities
|
|
# which, in the past, have had new features added which a current build
|
|
# would depend on. Because the new version was not installed before the
|
|
# build started, the build would come to a halt at the point where the
|
|
# new feature was needed. It is expected that this list may grow.
|
|
#
|
|
# Note: there may at some time develop a "chicken/egg" loop if any of
|
|
# these utilities themselves are changed such that they need a new or
|
|
# changed header file installed before it could correctly build (the
|
|
# new header files are installed after this step in STEP number 2).
|
|
# If this rare case arises, you will have to manually install the
|
|
# header file(s) before this step.
|
|
# Another case to consider is that of config. This program depends
|
|
# on yacc, lex, and libln. As these programs are pretty stable,
|
|
# and, as any changes to them will probably not affect config,
|
|
# it probably will not be a problem. Still, they must be considered
|
|
# in the worst case.
|
|
|
|
UTIL_BOOT: POPULATED
|
|
@$(MAKE) unmount
|
|
cd ${INSTALL_SRC}; make installcmd; \
|
|
${WINSTALL} installcmd /usr/bin/install;
|
|
cd ${MAKE_SRC}; ${MAKEINSTALL} DESTDIR=
|
|
cd ${SCCS_SRC}; ${MAKEINSTALL} DESTDIR=
|
|
cd ${CONFIG_SRC}; ${MAKEINSTALL} DESTDIR=
|
|
@${ECHO} "Made UTIL_BOOT on" `${DATE}` > $@
|
|
|
|
#
|
|
# Since UTIL_BOOT is the first target after the populate pass, it's here
|
|
# that we do the rest of the environmental setup. (We couldn't do it
|
|
# sooner, or the populate pass would have clobbered anything we did.)
|
|
#
|
|
# We check to see if we're building an SID-based
|
|
# release. If so, then we need to unmount the SCCS directories
|
|
# before we actually start to build anything.
|
|
#
|
|
|
|
unmount: $(MAKEINSTALL)
|
|
@set -x; if [ -f RELEASE -a -d SCCS_DIRECTORIES/SCCS ]; then \
|
|
${UNMOUNT} `pwd`/SCCS_DIRECTORIES; \
|
|
fi
|
|
|
|
#
|
|
# Unfortunately, some parts of the build must be done as root.
|
|
# makeinstall and unmount are setuid-root scripts which are built
|
|
# and installed while running as root.
|
|
#
|
|
makeinstall: $(MAKEINSTALL)
|
|
|
|
$(MAKEINSTALL): POPULATED
|
|
@if [ ! -u $(MAKEINSTALL) ]; then \
|
|
${MAKE} rootid || (echo "You must, as root, do a \
|
|
'make makeinstall'. \
|
|
This will install /usr/release/bin with \
|
|
the appropriate programs which allow a lang boot \
|
|
to run" | fmt; false); \
|
|
cd ${RELEASE_SRC}; $(MAKE) install; \
|
|
else \
|
|
cd ${RELEASE_SRC}; $(MAKEINSTALL); \
|
|
fi
|
|
|
|
rootid:
|
|
@if [ "`whoami`x" != "root"x ] ; then \
|
|
false; \
|
|
fi
|
|
|
|
#########################
|
|
#
|
|
# STEP 2: INCBOOT
|
|
#
|
|
# The reason we do this is to make sure all the
|
|
# include files are populated correctly. Also, they really have
|
|
# to overlay our running system. Right now, this involves
|
|
# going into the include directory and doing an install as root
|
|
# of include.
|
|
#
|
|
|
|
incboot: INCBOOT
|
|
|
|
INCBOOT: UTIL_BOOT
|
|
@${MAKE} unmount
|
|
cd include; ${MAKEINSTALL} DESTDIR=
|
|
@${ECHO} "Made INCBOOT on" `${DATE}` > $@
|
|
|
|
#########################
|
|
#
|
|
# STEP 3: LANGBOOT
|
|
#
|
|
# This requires that the program /usr/release/bin/winstall
|
|
# exists. This program is suid root, because lang boot wipes the current
|
|
# system's libraries and compilers.
|
|
#
|
|
|
|
langboot: LANGBOOT
|
|
|
|
LANGBOOT: INCBOOT
|
|
@${MAKE} unmount
|
|
@set -x;CWD=`pwd`;case `mach` in \
|
|
mc68010|mc68020) \
|
|
cd lang/boot; ${MAKE} $(MFLAGS) CPU=m68k SRCROOT=$$CWD;;\
|
|
sparc) \
|
|
cd lang/boot; ${MAKE} $(MFLAGS) CPU=sparc SRCROOT=$$CWD;;\
|
|
esac
|
|
@${ECHO} "Langboot done on" `${DATE}` > $@
|
|
|
|
#########################
|
|
#
|
|
# STEP 4: BUILD
|
|
#
|
|
# Generic rules to actually build the subdirectories.
|
|
#
|
|
|
|
lang: POPULATED
|
|
@${MAKE} unmount
|
|
@set -x;CWD=`pwd`;case `mach` in \
|
|
mc68010|mc68020) cd lang; ${MAKE} $(MFLAGS) CPU=m68k SRCROOT=$$CWD;; \
|
|
sparc) cd lang; ${MAKE} $(MFLAGS) CPU=sparc SRCROOT=$$CWD;; \
|
|
esac
|
|
|
|
#
|
|
# This is a terrible, terrible hack, and I apologize for it. The right
|
|
# thing to do is to set the LD_LIBRARY_PATH up front to point to
|
|
# the libraries under development. As soon as that's tested, this
|
|
# will be fixed.
|
|
#
|
|
LIBRARIES: POPULATED
|
|
@$(MAKE) unmount
|
|
@set -x; for i in ${LIBDIR}; do \
|
|
(cd $$i; $(MAKE) $(MFLAGS)); \
|
|
(cd $$i; $(MAKEINSTALL) $(MFLAGS) DESTDIR= CHOWN=$(CHOWN)); \
|
|
done
|
|
@${ECHO} "Libraries done on" `${DATE}` > LIBRARIES
|
|
|
|
$(SUBDIR): POPULATED
|
|
@${MAKE} unmount
|
|
cd $@; $(MAKE) ${MFLAGS}
|
|
|
|
#########################
|
|
#
|
|
# STEP 5: INSTALL
|
|
#
|
|
# The "proto" target is provided as a convenience; it's important to
|
|
# carefully clean out the /proto partition before building the /proto
|
|
# file system.
|
|
#
|
|
|
|
install: BUILT install_dirs
|
|
@set -x; for i in ${INCLDIR} ${LIBDIR} ${SUBDIR}; do \
|
|
(cd $$i; \
|
|
$(MAKE) ${MFLAGS} DESTDIR=${DESTDIR} CHOWN=$(CHOWN) install); \
|
|
done
|
|
@set -x; case `mach` in \
|
|
mc680?0) cd lang; \
|
|
$(MAKE) $(MFLAGS) install DESTDIR=$(DESTDIR) CPU=m68k;;\
|
|
sparc) cd lang; \
|
|
$(MAKE) $(MFLAGS) install DESTDIR=$(DESTDIR) CPU=sparc;;\
|
|
esac
|
|
|
|
install_dirs:
|
|
@set -x; for i in ${DIRS}; do \
|
|
install -d -o bin -m 755 ${DESTDIR}/$$i; \
|
|
done
|
|
@set -x; for i in ${USRDIRS}; do \
|
|
install -d -o bin -m 755 ${DESTDIR}/usr/$$i; \
|
|
done
|
|
chmod 1777 ${DESTDIR}/tmp ${DESTDIR}/var/tmp
|
|
${RM} -f ${DESTDIR}/bin && ln -s usr/bin ${DESTDIR}/bin
|
|
${RM} -f ${DESTDIR}/lib && ln -s usr/lib ${DESTDIR}/lib
|
|
${RM} -f ${DESTDIR}/sys && ln -s usr/kvm/sys ${DESTDIR}/sys
|
|
${RM} -f ${DESTDIR}/usr/ucbinclude && ln -s include ${DESTDIR}/usr/ucbinclude
|
|
${RM} -f ${DESTDIR}/usr/ucblib && ln -s lib ${DESTDIR}/usr/ucblib
|
|
${RM} -f ${DESTDIR}/usr/src && ln -s share/src ${DESTDIR}/usr/src
|
|
|
|
userinstall: ${MAKEINSTALL}
|
|
${MAKEINSTALL} DESTDIR=${DESTDIR} CHOWN=${CHOWN}
|
|
|
|
proto: PROTO INTERNATIONAL NWZ CDROM SUNUPGRADE
|
|
|
|
PROTO: BUILT
|
|
@$(MAKE) rootid || (echo "You must make proto as root."; false)
|
|
@${MAKE} unmount
|
|
@RAW=`egrep /proto /etc/fstab | awk -F/ '{print "/dev/r"$$3}'`; \
|
|
if [ ! -n "$$RAW" ]; then \
|
|
echo "no device in fstab for /proto?"; \
|
|
exit 1; \
|
|
fi; \
|
|
echo using $$RAW; \
|
|
umount /proto; \
|
|
newfs $$RAW; \
|
|
mount /proto; \
|
|
chmod g+s /proto; \
|
|
chown root /proto; \
|
|
chgrp staff /proto; \
|
|
chmod g+s /proto/lost+found
|
|
$(MAKE) install DESTDIR=/proto
|
|
@echo "Prototype file system built on" `${DATE}` > $@
|
|
@echo running ranlib -t on library archives under ${DESTDIR}/usr...
|
|
@-for i in "`find ${DESTDIR}/usr -name '*lib*' -name '*\.*a*' \
|
|
-type f -print`"; do \
|
|
(file $$i | grep archive > /dev/null && ranlib -t $$i); \
|
|
done
|
|
@echo done
|
|
|
|
#########################
|
|
#
|
|
# STEP 6: TAPES
|
|
#
|
|
# This actually gets done in sundist, and is provided here as a convenience.
|
|
#
|
|
#
|
|
#tapes: PROTO
|
|
# @$(MAKE) rootid || (echo "You must make tapes as root."; false)
|
|
# @${MAKE} unmount
|
|
# @cd sundist; $(MAKE)
|
|
# @cd sundist; $(MAKE) quarter_hd_tapes
|
|
# @cd sundist; $(MAKE) half_tapes
|
|
#
|
|
#########################
|
|
#
|
|
# STEP 6: INTERNATIONALIZE
|
|
#
|
|
|
|
INTERNATIONAL: international
|
|
|
|
international: PROTO CRYPTKIT Makefile.inter
|
|
$(MAKE) $(MFLAGS) DESTDIR=$(DESTDIR) -f Makefile.inter international
|
|
@echo "Internationalizationa done on " `${DATE}` > INTERNATIONAL
|
|
|
|
CRYPTKIT: PROTO Cryptlist
|
|
@if [ -f $@ ]; then \
|
|
echo "$@ already exists; I mustn't clobber it."; \
|
|
echo "Have you already run 'make international?'"; \
|
|
false; \
|
|
fi
|
|
k=`cat Cryptlist`; (cd $(DESTDIR); tar cBfv - $$k) > $@
|
|
|
|
Cryptlist: PROTO $(CRYPT)
|
|
for i in `cat $(CRYPT)`; do \
|
|
( cd $(DESTDIR); $(LS) $$i ); \
|
|
done > $@
|
|
|
|
#########################
|
|
#
|
|
# STEP 7: Nuclear Waste Zone (NWZ)
|
|
#
|
|
# Move the patches up to proto
|
|
#
|
|
|
|
NWZ: nwz
|
|
|
|
nwz:
|
|
install -d /proto/UNDISTRIBUTED/patches
|
|
cd /UNDISTRIBUTED; \
|
|
find . -print | cpio -pdlm /proto/UNDISTRIBUTED/patches
|
|
@echo "NWZ done on " `${DATE}` > NWZ
|
|
|
|
#########################
|
|
#
|
|
# STEP 8: CDROM
|
|
# CDROM image for this arch only
|
|
#
|
|
|
|
CDROM: cdrom
|
|
|
|
cdrom:
|
|
cd sundist; ${MAKE}
|
|
cd sundist; ${MAKE} cdrom
|
|
@echo "CDROM done on " `${DATE}` > CDROM
|
|
|
|
#########################
|
|
#
|
|
# STEP 9: sunupgrade
|
|
#
|
|
|
|
SUNUPGRADE: sunupgrade
|
|
|
|
sunupgrade:
|
|
cd sundist; $(MAKE) sunupgrade_target
|
|
@echo "SUNUPGRADE done on " `${DATE}` > SUNUPGRADE
|
|
|
|
#########################
|
|
#
|
|
# STEP 10: PREINSTALL
|
|
#
|
|
# This is only used for machines which will ship a preinstalled distribution.
|
|
#
|
|
|
|
preinstall:
|
|
@${MAKE} unmount
|
|
@cd sundist/pre; $(MAKE)
|
|
@echo "See sundist/pre/build-from-suni for build instructions."
|
|
|
|
clean: POPULATED makelinks
|
|
rm -f a.out core *.s *.o
|
|
-for i in ${SUBDIR}; do (cd $$i; $(MAKE) ${MFLAGS} clean); done
|
|
@set -x;case `mach` in \
|
|
mc68010|mc68020)cd lang; $(MAKE) $(MFLAGS) clean CPU=m68k;;\
|
|
sparc) cd lang; $(MAKE) $(MFLAGS) clean CPU=sparc;;\
|
|
esac
|
|
|
|
FRC:
|