#	START NEW ARIX SCCS HEADER
#
#	@(#) Makefile: version 25.1 created on 11/27/91 at 14:51:47
#
#	Copyright (c) 1990 by Arix Corporation
#	All Rights Reserved
#
#	@(#)Makefile	25.1	11/27/91 Copyright (c) 1990 by Arix Corporation
#
#	END NEW ARIX SCCS HEADER
#
# Makefile for Checkmate kernel

# IROOT is provided by the driving makefile or script OR
# for stand alone makes, provide PWD as a command line varible or
# environment varible (ksh).

IROOT = $(PWD)/..
SHELL	= /bin/sh
include $(IROOT)/macdefs

# newdate.file provides RELEASE
include ../../tools/newdate.file

# Local defaults.
# MACHCFLAG should be -T2 for 68020 and -T4 for 68040
# AS should be as2 for 68020 and as4 for 68040
# Local users of this makefile can turn off asserts by setting DEBUGOPT=""
# Local users of this makefile can turn on security by setting SECOPT=-DSECON
# The target 'default' allows MACH as a command line option and creates AS,
# MACHCFLAG & UMACH.

# These are overridden from the /src/build directory
MACH = M68020
UMACH = M68040
MACHCFLAG = -T2
AS = $(SGS_ROOT)/bin/as2
NM=nm

DEBUGOPT = -DASDEBUG=YES
SECOPT = -DSECOFF

#
#	Performance enables.
#	PERF_NOSUCHK will not do superuser check thus allowing anyone
#	to modify performance parameters.
#
PERFOPT=-DPERF

LOCAL_CFLAGS =	$(MACHCFLAG) -Xnostrwrite -DINKERNEL -DRFS -DS54K -DNFS \
		-DSAK $(SECOPT) $(PERFOPT) $(DEBUGOPT)

LOCAL_LCFLAGS = $(SECOPT) $(PERFOPT) $(DEBUGOPT)

ML_OBJS = \
	ml/$(MACH)/fp/fpu_sim.o ml/$(MACH)/cas.o ml/$(MACH)/cswitch.o	\
	ml/$(MACH)/fpu.o   ml/$(MACH)/misc.o   ml/$(MACH)/scb.o		\
	ml/$(MACH)/start.o ml/$(MACH)/trap.o   ml/end.o   ml/math.o

OS1_OBJS = \
	os/$(MACH)/buserr.o  os/$(MACH)/machdep.o  os/$(MACH)/trap.o	\
	os/$(MACH)/shm.o \
	os/acct.o os/bio.o os/bitmasks.o os/clock.o os/disp.o \
	os/errlog.o os/exec.o os/exit.o os/fault.o os/fio.o os/flock.o \
	os/fork.o os/fpp.o os/fstyp.o os/getpages.o \
	os/grow.o os/iget.o \
	os/lock.o os/locking.o os/main.o os/malloc.o \
	os/move.o os/nami.o os/nosys2.o os/ofile.o
OS2_OBJS = \
	os/page.o os/perf.o os/physio.o \
	os/pipe.o os/printf.o os/probe.o \
	os/region.o os/sched.o os/sig.o \
	os/schedcpu.o os/scheds5.o os/schedbsd.o os/schedmach.o \
	os/slp.o os/space.o os/startup.o os/streamio.o os/subr.o \
	os/swapalloc.o os/swtch.o os/symbol.o os/synch.o \
	os/sysarix.o os/sys2.o os/sys3.o os/sys4.o \
	os/sysent.o os/text.o os/tdb.o os/utssys.o

OS_OBJS = $(OS1_OBJS) $(OS2_OBJS)

AUTH_OBJS = \
	security/auth.o security/priv.o security/mls.o security/sat.o \
	security/audit.o security/sec.o

S5_OBJS = \
	fs/s5/s5alloc.o fs/s5/s5blklist.o fs/s5/s5nami.o \
	fs/s5/s5rdwri.o fs/s5/s5iget.o fs/s5/s5pipe.o fs/s5/s5subr.o \
	fs/s5/s5sys2.o fs/s5/s5sys3.o fs/s5/s5acl.o

IO_OBJS	= \
	io/iopm.o io/iopmb.o io/iopms.o io/iopmclone.o \
	io/clist.o io/clone.o io/cons.o io/err.o \
	io/ints.o io/ipc.o io/ldterm.o io/log.o io/mem.o \
	io/mirror.o io/mpt.o io/msg.o io/openchk.o io/partab.o \
	io/pm_iomap.o io/prf.o io/ptem.o io/root.o io/sar.o \
	io/sem.o io/sp.o io/spt.o io/stream.o \
	io/sys.o io/timod.o io/tirdwr.o io/tt0.o io/tty.o io/vd.o \
	io/lpmod.o io/spmlpdvr.o io/spmtydvr.o io/spmty_rtns.o

ADDR	= ml/addr.o

S54K_OBJS = \
 	fs/s54k/s54kalloc.o fs/s54k/s54kblklst.o fs/s54k/s54knami.o \
	fs/s54k/s54krdwri.o fs/s54k/s54kiget.o fs/s54k/s54kpipe.o \
	fs/s54k/s54ksubr.o fs/s54k/s54ksys2.o fs/s54k/s54ksys3.o \
	fs/s54k/s54kbio.o fs/s54k/s54kacl.o

RFS_OBJS = \
	ml/$(MACH)/useriorfs.o \
	fs/du/duiget.o fs/du/durdwri.o fs/du/dusubr.o fs/du/dusys3.o \
	nudnix/adv.o nudnix/auth.o nudnix/cache.o nudnix/canon.o \
	nudnix/cirmgr.o nudnix/comm.o nudnix/fileop.o nudnix/fumount.o \
	nudnix/netboot.o nudnix/que.o nudnix/queue.o nudnix/rbio.o \
	nudnix/rdebug.o nudnix/recover.o nudnix/remcall.o \
	nudnix/rfadmin.o nudnix/rfcanon.o nudnix/rfsys.o nudnix/rmount.o \
	nudnix/rmove.o nudnix/rnami.o nudnix/rsc.o nudnix/serve.o

CONF	= cf/conf.o
RCONF	= cf/conf.rfs.o

STUBS_OBJS = \
	ml/$(MACH)/userio.o \
	ml/reclock.o \
	nudnix/rstubs.o \
	os/nfsbio.o os/nfsifind.o os/nfsincore.o os/nfsiowait.o os/nfsnavail.o

S5LIB		= lib/lib.s5
MLLIB		= lib/lib.ml
IOLIB		= lib/lib.io
OSLIB		= lib/lib.os
S54KLIB		= lib/lib.s54k
RFSLIB		= lib/lib.rfs
STUBSLIB	= lib/lib.stubs
AUTHLIB		= lib/lib.auth

LIBS	= \
	$(MLLIB) $(OSLIB) $(S5LIB) $(S54KLIB) \
	$(IOLIB) $(AUTHLIB) $(RFSLIB)

MISC	= month_day makemap mktags M68020/nopush.sh M68040/nopush.sh

LIBDIR	= lib

RELDIRS	= M68020/NSECURE.NDBG M68020/NSECURE.DBG \
	  M68020/SECURE.NDBG M68020/SECURE.DBG \
	  M68040/NSECURE.NDBG M68040/NSECURE.DBG \
	  M68040/SECURE.NDBG M68040/SECURE.DBG

# The following 4 targets (default, all, 040, 020) are for users or driving
# files to use.

default: foo $(LIBDIR)
	if [ $(MACH) = M68020 ]; \
	then \
		UMACH=M68040; \
		MACHCFLAG=-T2; \
		AS=$(SGS_ROOT)/bin/as2; \
		RELEASE=2:$(RELEASE); \
	else \
		UMACH=M68020; \
		MACHCFLAG=-T4; \
		AS=$(SGS_ROOT)/bin/as4; \
		RELEASE=4:$(RELEASE); \
	fi; \
	exec $(MAKE) PM=`pwd` IROOT=$(IROOT) SECOPT=$(SECOPT) \
		DEBUGOPT=$(DEBUGOPT) MACH=$(MACH) UMACH=$$UMACH AS=$$AS \
		MACHCFLAG=$$MACHCFLAG RELEASE=$$RELEASE \
		arix
	./makemap arix &

020: foo $(LIBDIR)
	$(MAKE) PM=`pwd` IROOT=$(IROOT) SECOPT=$(SECOPT) DEBUGOPT=$(DEBUGOPT) \
		MACH=M68020 UMACH=M68040 AS=$(SGS_ROOT)/bin/as2 MACHCFLAG=-T2 \
		RELEASE=2:$(RELEASE) \
		parallel

040: foo $(LIBDIR)
	$(MAKE) PM=`pwd` IROOT=$(IROOT) SECOPT=$(SECOPT) DEBUGOPT=$(DEBUGOPT) \
		MACH=M68040 UMACH=M68020 AS=$(SGS_ROOT)/bin/as4 MACHCFLAG=-T4 \
		RELEASE=4:$(RELEASE) \
		parallel

all: $(RELDIRS) $(LIBDIR)
	$(MAKE) MACH=M68040 UMACH=M68020 RELEASE=4:$(RELEASE) spec.M68040
	$(MAKE) MACH=M68040 UMACH=M68020 RELEASE=4:$(RELEASE) sspec.M68040
	$(MAKE) MACH=M68020 UMACH=M68040 RELEASE=2:$(RELEASE) spec.M68020
	$(MAKE) MACH=M68020 UMACH=M68040 RELEASE=2:$(RELEASE) sspec.M68020
	@echo --- Now making 68040 nonsecure, nonASSERTed kernel ---
	$(MAKE) SECOPT=-DSECOFF DEBUGOPT="" 040
	cp arix cf/m.d/kernel cf/system cf/localcf.mk $(LIBS) $(STUBSLIB) \
		$(ADDR) M68040/NSECURE.NDBG
	@echo --- Now making 68040 nonsecure, ASSERTed kernel ---
	$(MAKE) SECOPT=-DSECOFF DEBUGOPT=-DASDEBUG=YES 040
	cp arix cf/m.d/kernel cf/system cf/localcf.mk $(LIBS) $(STUBSLIB) \
		$(ADDR) M68040/NSECURE.DBG
	@echo --- Now making 68040 secure, nonASSERTed kernel ---
	$(MAKE) SECOPT=-DSECON DEBUGOPT="" 040
	cp arix cf/m.d/kernel cf/system cf/localcf.mk $(LIBS) $(STUBSLIB) \
		$(ADDR) M68040/SECURE.NDBG
	@echo --- Now making 68040 secure, ASSERTed kernel ---
	$(MAKE) SECOPT=-DSECON DEBUGOPT=-DASDEBUG=YES 040
	cp arix cf/m.d/kernel cf/system cf/localcf.mk $(LIBS) $(STUBSLIB) \
		$(ADDR) M68040/SECURE.DBG
	@echo --- Now making 68020 nonsecure, nonASSERTed kernel ---
	$(MAKE) SECOPT=-DSECOFF DEBUGOPT="" 020
	cp arix cf/m.d/kernel cf/system cf/localcf.mk $(LIBS) $(STUBSLIB) \
		$(ADDR) M68020/NSECURE.NDBG
	@echo --- Now making 68020 nonsecure, ASSERTed kernel ---
	$(MAKE) SECOPT=-DSECOFF DEBUGOPT=-DASDEBUG=YES 020
	cp arix cf/m.d/kernel cf/system cf/localcf.mk $(LIBS) $(STUBSLIB) \
		$(ADDR) M68020/NSECURE.DBG
	@echo --- Now making 68020 secure, nonASSERTed kernel ---
	$(MAKE) SECOPT=-DSECON DEBUGOPT="" 020
	cp arix cf/m.d/kernel cf/system cf/localcf.mk $(LIBS) $(STUBSLIB) \
		$(ADDR) M68020/SECURE.NDBG
	@echo --- Now making 68020 secure, ASSERTed kernel ---
	$(MAKE) SECOPT=-DSECON DEBUGOPT=-DASDEBUG=YES 020
	cp arix cf/m.d/kernel cf/system cf/localcf.mk $(LIBS) $(STUBSLIB) \
		$(ADDR) M68020/SECURE.DBG

# All the rest of the targets are for internal use by this make file.

parallel:
	(echo start     `date`; \
	$(MAKE) clean; \
	$(MAKE) IROOT=$(IROOT) PM=$(PM) SECOPT=$(SECOPT) DEBUGOPT=$(DEBUGOPT) \
		MACH=$(MACH) UMACH=$(UMACH) AS=$(AS) MACHCFLAG=$(MACHCFLAG) \
		$(MLLIB) $(S5LIB) $(S54KLIB) & FSWAIT=$$!; \
	$(MAKE) IROOT=$(IROOT) PM=$(PM) SECOPT=$(SECOPT) DEBUGOPT=$(DEBUGOPT) \
		MACH=$(MACH) UMACH=$(UMACH) AS=$(AS) MACHCFLAG=$(MACHCFLAG) \
		$(IOLIB) & IOWAIT=$$!; \
	$(MAKE) IROOT=$(IROOT) PM=$(PM) SECOPT=$(SECOPT) DEBUGOPT=$(DEBUGOPT) \
		MACH=$(MACH) UMACH=$(UMACH) AS=$(AS) MACHCFLAG=$(MACHCFLAG) \
		$(OS1_OBJS) & OS1WAIT=$$!; \
	$(MAKE) IROOT=$(IROOT) PM=$(PM) SECOPT=$(SECOPT) DEBUGOPT=$(DEBUGOPT) \
		MACH=$(MACH) UMACH=$(UMACH) AS=$(AS) MACHCFLAG=$(MACHCFLAG) \
		$(OS2_OBJS) & OS2WAIT=$$!; \
	$(MAKE) IROOT=$(IROOT) PM=$(PM) SECOPT=$(SECOPT) DEBUGOPT=$(DEBUGOPT) \
		MACH=$(MACH) UMACH=$(UMACH) AS=$(AS) MACHCFLAG=$(MACHCFLAG) \
		$(RFSLIB) $(STUBSLIB) $(AUTHLIB) & MISCWAIT=$$!; \
	wait $$OS1WAIT; \
	echo os1 done  `date`; \
	wait $$OS2WAIT; \
	echo os2 done  `date`; \
	$(MAKE) MACH=$(MACH) UMACH=$(UMACH) $(OSLIB); \
	wait $$FSWAIT; \
	wait $$IOWAIT; \
	wait $$MISCWAIT; \
	$(MAKE) IROOT=$(IROOT) PM=$(PM) SECOPT=$(SECOPT) DEBUGOPT=$(DEBUGOPT) \
		MACH=$(MACH) UMACH=$(UMACH) AS=$(AS) MACHCFLAG=$(MACHCFLAG) \
		RELEASE=$(RELEASE) \
		arix;)

arix: $(MACH)/vuifile $(ADDR) $(LIBS) $(CONF) $(STUBSLIB)
	@echo "\tLinking arix"
	$(LD) $(LDFLAGS) -o arix $(MACH)/vuifile $(ADDR) \
		$(MLLIB) $(OSLIB) \
		$(CONF) $(AUTHLIB) \
		$(S5LIB) $(S54KLIB) \
		$(IOLIB) $(STUBSLIB)
	mcs -c arix
	if [ $(MACH) = M68040 ]; \
	then \
		./cf/chmagic arix 0523; \
	fi;

arix.rfs: foo $(MACH)/vuifile $(ADDR) $(LIBS) $(STUBSLIB) $(RCONF)
	@echo "\tLinking arix.rfs"
	$(LD) $(LDFLAGS) -o arix.rfs $(MACH)/vuifile $(ADDR) \
		$(MLLIB) $(OSLIB) \
		$(RCONF) $(AUTHLIB) \
		$(S5LIB) $(S54KLIB) \
		$(IOLIB) $(RFSLIB) $(STUBSLIB)
	mcs -c arix.rfs
	if [ $(MACH) = M68040 ]; \
	then \
		./cf/chmagic arix.rfs 0523
	fi; \
	./makemap arix.rfs &

$(OSLIB):	$(OS_OBJS)
	rm -f $(OSLIB)
	$(AR) q $(OSLIB) $(OS_OBJS)
	@echo os done   `date`

$(AUTHLIB): $(AUTH_OBJS)
	rm -f $(AUTHLIB)
	$(AR) q $(AUTHLIB) $(AUTH_OBJS)
	@echo auth done `date`

$(S5LIB):	$(S5_OBJS)
	rm -f $(S5LIB)
	$(AR) q $(S5LIB) $(S5_OBJS)
	@echo s5 done   `date`

$(MLLIB):	$(ML_OBJS)
	rm -f $(MLLIB)
	$(AR) q $(MLLIB) $(ML_OBJS)
	@echo ml done   `date`

$(IOLIB):	$(IO_OBJS)
	rm -f $(IOLIB)
	$(AR) q $(IOLIB) $(IO_OBJS)
	@echo io done   `date`

$(RFSLIB):	$(RFS_OBJS)
	rm -f $(RFSLIB)
	$(AR) q $(RFSLIB) $(RFS_OBJS)
	@echo rfs done  `date`

$(S54KLIB):	$(S54K_OBJS)
	rm -f $(S54KLIB)
	$(AR) q $(S54KLIB) $(S54K_OBJS)
	@echo 54 done   `date`

$(STUBSLIB):	$(STUBS_OBJS)
	rm -f $(STUBSLIB)
	$(AR) q $(STUBSLIB) $(STUBS_OBJS)
	@echo stub done `date`

clean	:
	/bin/rm -f *.o cf/*.o io/*.o ml/*.o ml/*/*.o ml/*/*/*.o
	/bin/rm -f nudnix/*.o os/*.o security/*.o  fs/*/*.o os/*/*.o
	/bin/rm -f lib/*
	/bin/rm -f arix arix.rfs s ml/addr.s ml/build_addr cf/release proto \
			cf/system

clobber :	clean
	/bin/rm -f M68020/S*/* M68020/N*/*
	/bin/rm -f M68040/S*/* M68040/N*/*
	/bin/rm -f spec.M68020 spec.M68040
	/bin/rm -f cf/conf.c cf/conf.rfs.c cf/config.h cf/config.rfs.h \
		cf/config cf/chmagic
	/bin/rm -f arix.map arix.rfs.map a.map tags */tags */*/tags
	/bin/rm -f mktags.err mktags.out make.out arix.cdb arix.rfs.cdb \
		*.out makelog tags.err FIXES

system:	/tmp
	if [ "$(SECOPT)" = -DSECON ]; \
	then \
		sys=cf/system.sec; \
	else \
		sys=cf/system.nsec; \
	fi; \
	if cmp -s $$sys cf/system ; \
	then \
		: ; \
	else \
		cat $$sys > cf/system; \
	fi

$(CONF) $(RCONF): system
	cd cf; exec $(MAKE) PM=$(PM) IROOT=$(IROOT) RELEASE=$(RELEASE) \
		PERFOPT="$(PERFOPT)" SECOPT=$(SECOPT) \
		LOCAL_CFLAGS="$(LOCAL_CFLAGS)" \
		DEBUGOPT=$(DEBUGOPT) MACH=$(MACH) UMACH=$(UMACH) AS=$(AS) \
		release_check chmagic $(@F)

$(ADDR):	ml/build_addr.c $(PMINC)/sys/kmem.h $(PMINC)/sys/lio.h \
		$(PMINC)/sys/proc.h $(PMINC)/sys/spm_mem.h \
		$(PMINC)/sys/user.h
	$(LCC) $(LCFLAGS) -YI,$(PMINC) ml/build_addr.c -o ml/build_addr
	ml/build_addr > ml/addr.s
	$(AS) -o $(ADDR) ml/addr.s
	/bin/rm ml/build_addr ml/addr.s

os/$(MACH)/trap.o:	os/$(MACH)/trap.c
	cd os/$(MACH); set -x; $(CC) $(CFLAGS) -S trap.c && \
	../../$(MACH)/nopush.sh trap.s systrap && \
	../../$(MACH)/nopush.sh trap.s u_resched && \
	../../$(MACH)/nopush.sh trap.s u_trap && \
	$(AS) trap.s -o trap.o && /bin/rm trap.s

os/$(MACH)/buserr.o:	os/$(MACH)/buserr.c
	cd os/$(MACH); set -x; $(CC) $(CFLAGS) -S buserr.c && \
	../../$(MACH)/nopush.sh buserr.s u_buserr && \
	../../$(MACH)/nopush.sh buserr.s k_buserr && \
	$(AS) buserr.s -o buserr.o && /bin/rm buserr.s

ml/$(MACH)/fp/fpu_sim.o: /tmp
	cd ml/$(MACH)/fp; exec $(MAKE) IROOT=$(IROOT) \
		MACH=$(MACH) UMACH=$(UMACH) AS=$(AS)

ml/$(MACH)/cas.o:	ml/$(MACH)/cas.s
	m4 $(DEBUGOPT) ml/$(MACH)/cas.s > c.s
	$(AS) c.s
	rm c.s
	mv c.o ml/$(MACH)/cas.o

.SUFFIX =	.o .c .y .l .s .i

.c.o:
	cd $(<D); exec $(CC) $(CFLAGS) -c $(<F)

.c.s:
	cd $(<D); exec $(CC) $(CFLAGS) -S $(<F)

.c.i:
	cd $(<D); exec $(CC) $(CFLAGS) -P $(<F)

a.o:	a.c
	$(CC) -g $(CFLAGS) -c a.c

a.map:	a.o
	-$(NM) -xv a.o > a.map

foo: /tmp
	-chmod +x $(MISC)

$(RELDIRS) $(LIBDIR):
	mkdir $@

spec.M68040 spec.M68020:	/tmp
	sed -e "s/arix\.RELEASE/arix.$(RELEASE)/;s/MACHINEDIR/$(MACH)/" $(MACH)/proto.nsec > $@

sspec.M68040 sspec.M68020:	/tmp
	sed -e "s/arix\.RELEASE/arix.$(RELEASE)/;s/MACHINEDIR/$(MACH)/" proto.sec > $@
