# (C) Copyright International Business Machines Corporation 23 January 
# 1990.  All Rights Reserved. 
#  
# See the file USERAGREEMENT distributed with this software for full 
# terms and conditions of use. 
# File: Makefile.libuild
# Author: Andy Lowry
# SCCS Info: @(#)Makefile	1.12 5/10/90

# Makefile to build the Hermes code generator from LI assembler
# sources that were generated from the Hermes sources.

# Set the default target here at the top so there's no confusion...
all:

# Get standard stuff
include ../../make/includefile

# Can't use '.' in paths at this point in boot sequence, since we
# don't yet have a working cwd module
LOADPATH =	$(HROOT)/codegen/p1:$(PROCDIR)

# Handcoded source files
LIPPFILES =	listuff.lipp liunstuff.lipp
HANDLIFILES =	listuff.li liunstuff.li
VARSFILES =	listuff.vars liunstuff.vars
OTHERHANDSRC =	const.def vars.awk
SOURCES =	$(LIPPFILES) $(VARSFILES) $(OTHERHANDSRC)

# Include files giving component offsets for hand-coded LI files
VHFILES =	listuff.vh liunstuff.vh

# Generated source files
LIFILES =	codegen.li cginit.li cgprocess.li cgprocinit.li \
			cgclause.li cgstmt.li cgdirectstmt.li \
			cgtypedstmt.li cgstmtstub.li cgblock.li \
			cgif.li cgwhile.li cgevery.li cgexists.li \
			cgextract.li cgforinsp.li cginsptbl.li \
			cgremove.li cgforall.li cgposition.li cgposofelt.li \
			cgtheelement.li cgselect.li cgexprblock.li \
			cgnamedlit.li cgproglit.li cgconvert.li \
			cgforenum.li cginsppoly.li cgnew.li \
			cgselector.li breakselector.li newtableinfo.li \
			bbassemble.li objaddr.li objalias.li optimize.li \
			cgatoi.li lkuptype.li typedef.li compoffsets.li \
			varcaseid.li clauseusesobj.li makeopmap.li
GENFILES =	$(LIFILES)
# Files needed from the common build directory...
DOFILES	=	cginternal.do cginit.do \
			bbassemble.do objaddr.do compoffsets.do \
			exprtree.do cgstmt.do
COMMFILES =	$(DOFILES)

# Object files produced from the build
PROCOBJS =	codegen.po cginit.po cgprocess.po cgprocinit.po \
			cgclause.po cgstmt.po cgdirectstmt.po \
			cgtypedstmt.po cgstmtstub.po cgblock.po \
			cgif.po cgwhile.po cgevery.po cgexists.po \
			cgextract.po cgforinsp.po cginsptbl.po \
			cgremove.po cgforall.po cgposition.po cgposofelt.po \
			cgtheelement.po cgselect.po cgexprblock.po \
			cgnamedlit.po cgproglit.po cgconvert.po \
			cgforenum.po cginsppoly.po cgnew.po \
			cgselector.po breakselector.po newtableinfo.po \
			bbassemble.po objaddr.po objalias.po optimize.po \
			cgatoi.po lkuptype.po typedef.po compoffsets.po \
			varcaseid.po clauseusesobj.po \
			listuff.po liunstuff.po
COMMOBJS =	../com/listuff.po ../com/liunstuff.po ../com/opmap.obj
OTHEROBJ =	opmap.obj
OBJECTS =	$(PROCOBJS)  $(OTHEROBJ) $(COMMOBJS)

# default target builds all the object files
all:	$(OBJECTS)
install: all
	cp $(PROCOBJS) $(PROCDIR)
	cp $(OTHEROBJ) $(DEFDIR)

# Just the object files for the common directory
commobj:	$(COMMOBJS)

# listuff.po in the common directory is made by creating a local
# copy in the work directory and then copying it
../com/listuff.po: listuff.po
	cp listuff.po ../com
# Ditto for liunstuff.po, its counterpart
../com/liunstuff.po: liunstuff.po
	cp liunstuff.po ../com
# and again for opmap.obj
../com/opmap.obj: opmap.obj
	cp opmap.obj ../com

# Suffix rules say how to build the following, but we need to give the
# dependencies explicitly since they are several layers deep.
listuff.po:	listuff.li
listuff.li:	listuff.lipp listuff.vh
listuff.vh:	listuff.vars

liunstuff.po:	liunstuff.li
liunstuff.li:	liunstuff.lipp liunstuff.vh
liunstuff.vh:	liunstuff.vars

# Category-wide dependencies for some categories of file
$(HANDLIFILES):	const.def
$(VHFILES):	vars.awk

# Explicit dependencies for assembling automatically generated .li files
codegen.po:	codegen.li cginternal.do cginit.do
cginit.po:	cginit.li cginternal.do cginit.do cgstmt.do
cgprocess.po:	cgprocess.li cginternal.do
cgprocinit.po:	cgprocinit.li cginternal.do
cgclause.po:	cgclause.li cginternal.do
cgstmt.po:	cgstmt.li cginternal.do cginit.do cgstmt.do
cgdirectstmt.po: cgdirectstmt.li cginternal.do cginit.do
cgtypedstmt.po:	cgtypedstmt.li cginternal.do cginit.do
cgstmtstub.po:	cgstmtstub.li cginternal.do
cgevery.po:	cgevery.li cginternal.do
cgexists.po:	cgexists.li cginternal.do
cgextract.po:	cgextract.li cginternal.do
cgforinsp.po:	cgforinsp.li cginternal.do
cginsptbl.po:	cginsptbl.li cginternal.do
cgposition.po:	cgposition.li cginternal.do
cgposofelt.po:	cgposofelt.li cginternal.do
cgremove.po:	cgremove.li cginternal.do
cgforall.po:	cgforall.li cginternal.do
cgtheelement.po: cgtheelement.li cginternal.do
cgselect.po:	cgselect.li cginternal.do
cgexprblock.po:	cgexprblock.li cginternal.do
cgnamedlit.po:	cgnamedlit.li cginternal.do
cgproglit.po:	cgproglit.li cginternal.do
cgconvert.po:	cgconvert.li cginternal.do
cgforenum.po:	cgforenum.li cginternal.do
cginsppoly.po:	cginsppoly.li cginternal.do
cgblock.po:	cgblock.li cginternal.do
cgif.po:	cgif.li cginternal.do
cgwhile.po:	cgwhile.li cginternal.do
cgnew.po:	cgnew.li cginternal.do
cgselector.po:	cgselector.li cginternal.do
breakselector.po: breakselector.li cginternal.do exprtree.do
newtableinfo.po: newtableinfo.li cginternal.do
bbassemble.po:	bbassemble.li cginternal.do bbassemble.do
objaddr.po:	objaddr.li cginternal.do objaddr.do objalias.po
objalias.po:	objalias.li cginternal.do
optimize.po:	optimize.li cginternal.do
cgatoi.po:	cgatoi.li cginternal.do
lkuptype.po:	lkuptype.li cginternal.do
typedef.po:	typedef.li cginternal.do cginit.do
compoffsets.po:	compoffsets.li cginternal.do cginit.do compoffsets.do
varcaseid.po:	varcaseid.li cginternal.do
clauseusesobj.po: clauseusesobj.li cginternal.do
makeopmap.po:	makeopmap.li cginternal.do

# Dependencies among definitions modules
cginit.do:	cginternal.do
bbassemble.do:	cginternal.do
objaddr.do:	cginternal.do
cgstmt.do:	cginternal.do

# Generate the opcode map
opmap.obj:	makeopmap.po
	env HROOTDIR=$(HROOT) HLOADPATH=$(LOADPATH) $(HERMI) makeopmap

# Get links to missing files from the main source directory, the ligen
# directory, and the common directory
$(SOURCES):
	@ if [ ! -f $@ ] ; then ln -s ../$@ . ; fi
$(GENFILES):
	@ if [ ! -f $@ ] ; then ln -s ../li/$@ . ; fi
$(COMMFILES):
	@ if [ ! -f $@ ] ; then ln -s ../com/$@ . ; fi

# Extra suffix rules we need

.SUFFIXES: .vars .vh .lipp 

.lipp.li: $<
	$(CPP) $(HCPPFLAGS) $< $@

.li.po: $<
	env HROOTDIR=$(HROOT) HPATH=$(DEFPATH) $(ASM) $<

.vars.vh: $<
	awk -f vars.awk $< >$@

# 'make clean' discards all files except source files
clean::
	-@ rm $(PROCOBJS) $(OTHEROBJ) 2>/dev/null
	-@ rm *.po *.li 2>/dev/null
	-@ rm *.vh *.cd 2>/dev/null
	-@ rm $(COMMFILES) 2>/dev/null

# Discard all the source and files... normally they should just be
# symbolic links into the source directory, so this is not a dangerous
# operation unless you're doing things you probably shouldn't be doing
cleansrc::
	-@ rm $(SOURCES) $(GENFILES) 2>/dev/null
