# -----------------------------------------------------------------------------
# Ulm's Oberon Library
# Copyright (C) 1989-1994 by University of Ulm, SAI, D-89069 Ulm, Germany
# -----------------------------------------------------------------------------
# This makefile is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# 
# This makefile is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
# -----------------------------------------------------------------------------
# {stamp: updated by mmo Wed Jul 20 13:21:12 MET DST 1994}
# {options: +a +A +L -P}
# -----------------------------------------------------------------------------
# default settings which are overrided by the parent makefile
# the Oberon library is self-containing, so OBPATH should be "."
OBPATH :=	.
# directory of the compiler and the associated files
OBLIB :=	/usr/local/lib/oberon
# compilation flags (usually -OC -OT to suppress range and conversion checks)
ocflags :=	-OC -OT
# where to install the libraries (usually equivalent to OBLIB)
LIBDIR :=	$(OBLIB)
# -----------------------------------------------------------------------------
.SUFFIXES:
# -----------------------------------------------------------------------------
# {macros}
src :=		Sys.od Sys.om SysConversi.od SysConversi.om SysDebug.od \
		SysDebug.om SysErrors.od SysErrors.om SysFile.od SysFile.om \
		SysHost.od SysHost.om SysIO.od SysIO.om SysIPC.od SysIPC.om \
		SysMain.om SysMemory.od SysMemory.om SysProcess.od \
		SysProcess.om SysResource.od SysResource.om SysSelect.od \
		SysSelect.om SysSignalOp.od SysSignalOp.om SysSignals.od \
		SysSignals.om SysSockets.od SysSockets.om SysStat.od \
		SysStat.om SysStorage.od SysStorage.om SysTermIO.od \
		SysTermIO.om SysTime.od SysTime.om SysTypes.od SysTypes.om
libs :=
liboptions :=	$(patsubst %,-l%,$(libs))
defs :=		$(filter %.od,$(src))
mods :=		$(filter %.om,$(src))
syms :=
refs :=		$(patsubst %.om,%.r,$(mods))
objects :=
lib :=		libo.a
libobjects =	$(patsubst %.om,$(lib)(%.o),$(mods))
defsyms :=
modobjs :=	$(lib)(SysMain.o)
cyclesyms :=
# {targets}
libdeps :=	SYM(Sys.sy) $(lib)(Sys.o) SYM(SysErrors.sy) \
		$(lib)(SysErrors.o) SYM(SysHost.sy) $(lib)(SysHost.o) \
		SYM(SysResource.sy) $(lib)(SysResource.o) SYM(SysTypes.sy) \
		$(lib)(SysTypes.o) SYM(SysIO.sy) $(lib)(SysIO.o) \
		SYM(SysMemory.sy) $(lib)(SysMemory.o) SYM(SysSockets.sy) \
		$(lib)(SysSockets.o) SYM(SysStat.sy) $(lib)(SysStat.o) \
		SYM(SysTermIO.sy) $(lib)(SysTermIO.o) SYM(SysConversi.sy) \
		$(lib)(SysConversi.o) SYM(SysSignals.sy) $(lib)(SysSignals.o) \
		SYM(SysProcess.sy) $(lib)(SysProcess.o) SYM(SysDebug.sy) \
		$(lib)(SysDebug.o) SYM(SysFile.sy) $(lib)(SysFile.o) \
		SYM(SysIPC.sy) $(lib)(SysIPC.o) SYM(SysSignalOp.sy) \
		$(lib)(SysSignalOp.o) SYM(SysTime.sy) $(lib)(SysTime.o) \
		SYM(SysSelect.sy) $(lib)(SysSelect.o) $(lib)(SysMain.o) \
		SYM(SysStorage.sy) $(lib)(SysStorage.o)
$(lib):		$(libdeps)
T :=
.PHONY:		all
all:		$T $(defsyms) $(lib)
#
OC_CMD :=	OBPATH=$(OBPATH) OBLIB=$(OBLIB) oc
# {rules}
%.o:		%.r
OC :=		$(OC_CMD)
OCFLAGS :=	$(ocflags)
NEWER :=	newer
RM :=		rm -f
TOUCH :=	touch
$(lib)(%.o):	%.om SYM(%.sy)
		@$(TOUCH) $*.ts
		$(OC) $(OCFLAGS) $(liboptions) -c -u -o $(lib) $<
		@[ -z "$(D_$*)" ] || $(NEWER) $*.ts SYM || $(MAKE) $(D_$*)
		@$(RM) $*.ts
SYM(%.sy) $(lib)(%.o): %.od
		$(OC) $(OCFLAGS) $(liboptions) -c -u -o $(lib) $< $*.om
$(modobjs):	$(lib)(%.o): %.om
		$(OC) $(OCFLAGS) $(liboptions) -c -o $(lib) $<
# -----------------------------------------------------------------------------
# special dependencies
# -----------------------------------------------------------------------------
SysErrors.od:	make_error /usr/include/sys/errno.h
		make_error
SysSignals.od:	make_signal /usr/include/sys/signal.h
		make_signal
Sys.od:		make_sys /usr/include/sys/syscall.h
		make_sys
# -----------------------------------------------------------------------------
# {dependencies}
SYM(Sys.sy):
$(lib)(Sys.o):	SYM(Sys.sy)
SYM(SysConversi.sy): ./SYM(Objects.sy) ./SYM(Events.sy) SYM(SysTypes.sy)
$(lib)(SysConversi.o): ./SYM(Objects.sy) ./SYM(Events.sy) \
		./SYM(Priorities.sy) ./SYM(Streams.sy) ./SYM(Strings.sy) \
		SYM(SysTypes.sy) SYM(SysConversi.sy) ./SYM(Texts.sy)
SYM(SysDebug.sy): ./SYM(RelatedEven.sy) SYM(SysTypes.sy) SYM(SysSignals.sy) \
		SYM(SysProcess.sy)
$(lib)(SysDebug.o): ./SYM(Events.sy) ./SYM(RelatedEven.sy) SYM(Sys.sy) \
		SYM(SysErrors.sy) ./SYM(Streams.sy) ./SYM(Strings.sy) \
		SYM(SysTypes.sy) SYM(SysSignals.sy) SYM(SysProcess.sy) \
		SYM(SysDebug.sy)
SYM(SysErrors.sy): ./SYM(Events.sy) ./SYM(RelatedEven.sy)
$(lib)(SysErrors.o): ./SYM(Events.sy) ./SYM(Priorities.sy) \
		./SYM(RelatedEven.sy) SYM(Sys.sy) SYM(SysErrors.sy) \
		./SYM(Streams.sy) ./SYM(Errors.sy) ./SYM(Strings.sy)
SYM(SysFile.sy): ./SYM(RelatedEven.sy) SYM(SysStat.sy)
$(lib)(SysFile.o): ./SYM(RelatedEven.sy) SYM(Sys.sy) SYM(SysErrors.sy) \
		SYM(SysIO.sy) SYM(SysProcess.sy) SYM(SysStat.sy) \
		SYM(SysFile.sy)
SYM(SysHost.sy):
$(lib)(SysHost.o): SYM(Sys.sy) SYM(SysErrors.sy) SYM(SysHost.sy)
SYM(SysIO.sy):	./SYM(RelatedEven.sy) SYM(SysTypes.sy)
$(lib)(SysIO.o): ./SYM(RelatedEven.sy) SYM(Sys.sy) SYM(SysErrors.sy) \
		SYM(SysTypes.sy) SYM(SysIO.sy)
SYM(SysIPC.sy):	./SYM(Events.sy) ./SYM(RelatedEven.sy) SYM(SysTypes.sy) \
		SYM(SysProcess.sy)
$(lib)(SysIPC.o): ./SYM(Disciplines.sy) ./SYM(Events.sy) ./SYM(Priorities.sy) \
		./SYM(RelatedEven.sy) ./SYM(Assertions.sy) SYM(Sys.sy) \
		SYM(SysErrors.sy) ./SYM(Memory.sy) ./SYM(Strings.sy) \
		SYM(SysTypes.sy) SYM(SysConversi.sy) SYM(SysProcess.sy) \
		SYM(SysIPC.sy)
$(lib)(SysMain.o): ./SYM(Coroutines.sy) ./SYM(SysModules.sy) ./SYM(Tasks.sy) \
		./SYM(Schedulers.sy) ./SYM(RoundRobin.sy)
SYM(SysMemory.sy): ./SYM(RelatedEven.sy) SYM(SysTypes.sy)
$(lib)(SysMemory.o): ./SYM(RelatedEven.sy) SYM(Sys.sy) SYM(SysErrors.sy) \
		SYM(SysTypes.sy) SYM(SysMemory.sy)
SYM(SysProcess.sy): ./SYM(RelatedEven.sy) ./SYM(SysArgs.sy) \
		SYM(SysSignals.sy)
$(lib)(SysProcess.o): ./SYM(Events.sy) ./SYM(Priorities.sy) \
		./SYM(RelatedEven.sy) SYM(Sys.sy) ./SYM(SysArgs.sy) \
		SYM(SysErrors.sy) SYM(SysSignals.sy) SYM(SysProcess.sy)
SYM(SysResource.sy): ./SYM(RelatedEven.sy)
$(lib)(SysResource.o): ./SYM(RelatedEven.sy) SYM(Sys.sy) SYM(SysErrors.sy) \
		SYM(SysResource.sy)
SYM(SysSelect.sy): ./SYM(Objects.sy) ./SYM(RelatedEven.sy) SYM(SysTypes.sy) \
		SYM(SysTime.sy)
$(lib)(SysSelect.o): ./SYM(Objects.sy) ./SYM(RelatedEven.sy) SYM(Sys.sy) \
		SYM(SysErrors.sy) SYM(SysResource.sy) SYM(SysTypes.sy) \
		SYM(SysTime.sy) SYM(SysSelect.sy)
SYM(SysSignalOp.sy): SYM(SysSignals.sy)
$(lib)(SysSignalOp.o): SYM(Sys.sy) SYM(SysErrors.sy) SYM(SysSignals.sy) \
		SYM(SysSignalOp.sy)
SYM(SysSignals.sy): ./SYM(Events.sy) SYM(SysTypes.sy)
$(lib)(SysSignals.o): ./SYM(Events.sy) ./SYM(Priorities.sy) ./SYM(Process.sy) \
		./SYM(RelatedEven.sy) SYM(Sys.sy) SYM(SysErrors.sy) \
		SYM(SysTypes.sy) SYM(SysConversi.sy) SYM(SysSignals.sy)
SYM(SysSockets.sy): ./SYM(RelatedEven.sy) SYM(SysTypes.sy)
$(lib)(SysSockets.o): ./SYM(RelatedEven.sy) SYM(Sys.sy) SYM(SysErrors.sy) \
		SYM(SysTypes.sy) SYM(SysSockets.sy)
SYM(SysStat.sy): ./SYM(RelatedEven.sy) SYM(SysTypes.sy)
$(lib)(SysStat.o): ./SYM(RelatedEven.sy) SYM(Sys.sy) SYM(SysErrors.sy) \
		SYM(SysTypes.sy) SYM(SysStat.sy)
SYM(SysStorage.sy):
$(lib)(SysStorage.o): ./SYM(Coroutines.sy) ./SYM(Disciplines.sy) \
		./SYM(Events.sy) ./SYM(Priorities.sy) ./SYM(Process.sy) \
		./SYM(RelatedEven.sy) ./SYM(SysInterrup.sy) \
		./SYM(SysSegments.sy) SYM(SysStorage.sy) ./SYM(Types.sy) \
		./SYM(Memory.sy) ./SYM(Storage.sy) ./SYM(SysModules.sy) \
		SYM(SysTypes.sy) SYM(SysIO.sy) SYM(SysMemory.sy) \
		SYM(SysSignals.sy) SYM(SysProcess.sy) SYM(SysSignalOp.sy) \
		./SYM(UntaggedSto.sy)
SYM(SysTermIO.sy): ./SYM(RelatedEven.sy) SYM(SysIO.sy)
$(lib)(SysTermIO.o): ./SYM(RelatedEven.sy) SYM(Sys.sy) SYM(SysErrors.sy) \
		SYM(SysIO.sy) SYM(SysTermIO.sy)
SYM(SysTime.sy): SYM(SysTypes.sy)
$(lib)(SysTime.o): ./SYM(Events.sy) SYM(Sys.sy) SYM(SysErrors.sy) \
		SYM(SysTypes.sy) SYM(SysSignals.sy) SYM(SysProcess.sy) \
		SYM(SysTime.sy)
SYM(SysTypes.sy): ./SYM(Types.sy)
$(lib)(SysTypes.o): ./SYM(Types.sy) SYM(SysTypes.sy)
# {reversed-dependencies}
D_Sys :=	'$(lib)(SysDebug.o)' '$(lib)(SysErrors.o)' \
		'$(lib)(SysFile.o)' '$(lib)(SysHost.o)' '$(lib)(SysIO.o)' \
		'$(lib)(SysIPC.o)' '$(lib)(SysMemory.o)' \
		'$(lib)(SysProcess.o)' '$(lib)(SysResource.o)' \
		'$(lib)(SysSelect.o)' '$(lib)(SysSignalOp.o)' \
		'$(lib)(SysSignals.o)' '$(lib)(SysSockets.o)' \
		'$(lib)(SysStat.o)' '$(lib)(SysTermIO.o)' '$(lib)(SysTime.o)'
D_SysConversi := '$(lib)(SysIPC.o)' '$(lib)(SysSignals.o)'
D_SysDebug :=
D_SysErrors :=	'$(lib)(SysDebug.o)' '$(lib)(SysFile.o)' '$(lib)(SysHost.o)' \
		'$(lib)(SysIO.o)' '$(lib)(SysIPC.o)' '$(lib)(SysMemory.o)' \
		'$(lib)(SysProcess.o)' '$(lib)(SysResource.o)' \
		'$(lib)(SysSelect.o)' '$(lib)(SysSignalOp.o)' \
		'$(lib)(SysSignals.o)' '$(lib)(SysSockets.o)' \
		'$(lib)(SysStat.o)' '$(lib)(SysTermIO.o)' '$(lib)(SysTime.o)'
D_SysFile :=
D_SysHost :=
D_SysIO :=	'$(lib)(SysFile.o)' '$(lib)(SysStorage.o)' \
		'SYM(SysTermIO.sy)' '$(lib)(SysTermIO.o)'
D_SysIPC :=
D_SysMemory :=	'$(lib)(SysStorage.o)'
D_SysProcess :=	'SYM(SysDebug.sy)' '$(lib)(SysDebug.o)' '$(lib)(SysFile.o)' \
		'SYM(SysIPC.sy)' '$(lib)(SysIPC.o)' '$(lib)(SysStorage.o)' \
		'$(lib)(SysTime.o)'
D_SysResource := '$(lib)(SysSelect.o)'
D_SysSelect :=
D_SysSignalOp := '$(lib)(SysStorage.o)'
D_SysSignals :=	'SYM(SysDebug.sy)' '$(lib)(SysDebug.o)' 'SYM(SysProcess.sy)' \
		'$(lib)(SysProcess.o)' 'SYM(SysSignalOp.sy)' \
		'$(lib)(SysSignalOp.o)' '$(lib)(SysStorage.o)' \
		'$(lib)(SysTime.o)'
D_SysSockets :=
D_SysStat :=	'SYM(SysFile.sy)' '$(lib)(SysFile.o)'
D_SysStorage :=
D_SysTermIO :=
D_SysTime :=	'SYM(SysSelect.sy)' '$(lib)(SysSelect.o)'
D_SysTypes :=	'SYM(SysConversi.sy)' '$(lib)(SysConversi.o)' \
		'SYM(SysDebug.sy)' '$(lib)(SysDebug.o)' 'SYM(SysIO.sy)' \
		'$(lib)(SysIO.o)' 'SYM(SysIPC.sy)' '$(lib)(SysIPC.o)' \
		'SYM(SysMemory.sy)' '$(lib)(SysMemory.o)' 'SYM(SysSelect.sy)' \
		'$(lib)(SysSelect.o)' 'SYM(SysSignals.sy)' \
		'$(lib)(SysSignals.o)' 'SYM(SysSockets.sy)' \
		'$(lib)(SysSockets.o)' 'SYM(SysStat.sy)' '$(lib)(SysStat.o)' \
		'$(lib)(SysStorage.o)' 'SYM(SysTime.sy)' '$(lib)(SysTime.o)'
# -----------------------------------------------------------------------------
.PHONY:		install
install:	$(LIBDIR)/$(lib) $(LIBDIR)/REF $(LIBDIR)/SYM

$(LIBDIR)/$(lib): $(lib)
		cp $^ $@
		ranlib -t $@
$(LIBDIR)/REF:	REF
		cp $^ $@
$(LIBDIR)/SYM:	SYM
		cp $^ $@
# -----------------------------------------------------------------------------
.PHONY:		clean
clean:
		$(RM) core PROT PROT.line *.ts
# -----------------------------------------------------------------------------
PR :=		pr
SPOOL :=	lpr
.PHONY:		prdefs prmods pr
pr:		prdefs prmods
prdefs:		prdefs.stamp
prmods:		prmods.stamp
prdefs.stamp:	$(defs)
		$(PR) $? | $(SPOOL)
		@-touch $@
prmods.stamp:	$(mods)
		$(PR) $? | $(SPOOL)
		@-touch $@
# -----------------------------------------------------------------------------
OBTAGS :=	obtags
tags:		$(mods)
		$(OBTAGS) $^
# -----------------------------------------------------------------------------
