#*=====================================================================*/
#*    serrano/prgm/project/bigloo/runtime1.8/Makefile                  */
#*    -------------------------------------------------------------    */
#*    Author      :  Manuel Serrano                                    */
#*    Creation    :  Tue Mar 21 08:14:18 1995                          */
#*    Last change :  Wed Apr 10 16:50:59 1996 (serrano)                */
#*    -------------------------------------------------------------    */
#*    The makefile to build the Bigloo's library.                      */
#*    -------------------------------------------------------------    */
#*    This makefile can be interpreted by `make' with Sun computers    */
#*    and with `gmake' on other ones.                                  */
#*=====================================================================*/

#*---------------------------------------------------------------------*/
#*     Les flags ...                                                   */
#*---------------------------------------------------------------------*/
MACH        	= `arch`
CC          	= gcc
AS		= as
VERSION         = 1.8
BIGLOO          = ../bin/bigloo$(VERSION)
LIB_DIR         = ../lib/$(VERSION)
INCLUDE     	= -I../lib/$(VERSION) -IGc
BEEP            = ../tools/beep
SHELL           = /bin/csh

O_OBJ_GC        = $(O_OBJ_BOEHM_4_7)

BHEAPFLAGS	= -v -unsafe -q -mkheap -mklib

BSAFEFLAGS	= -cg -O3 -mklib -g -cg -cc $(CC) -fsharing -q -rm
BUNSAFEFLAGS	= -O4 -mklib -unsafe -cc $(CC) -fsharing -q -rm
BUNSAFEPFLAGS	= -O3 -mklib -unsafe -pg -cc $(CC) -fsharing -q

CSAFEFLAGS	= $(INCLUDE) -g -DBIGLOO_DEBUG
CUNSAFEFLAGS	= $(INCLUDE) -O2
CPFLAGS		= $(INCLUDE) -pg
BUMPY		= 

AFLAGS		= -O

AR		= ar
RANLIB		= ranlib

#*---------------------------------------------------------------------*/
#*     Les suffixes ...                                                */
#*---------------------------------------------------------------------*/
.SUFFIXES:
.SUFFIXES: .scm .c .s .o

#*---------------------------------------------------------------------*/
#*    The assembler objects.                                           */
#*---------------------------------------------------------------------*/
_OBJ_MLIB	= mach_dep 

OBJ_MLIB	= $(_OBJ_MLIB:%=Mlib/%.o)                  
O_OBJ_MLIB     	= $(OBJ_MLIB:%=$(O)/%)

#*---------------------------------------------------------------------*/
#*    Les objets C de la librairie                                     */
#*---------------------------------------------------------------------*/
_OBJ_CLIB	= init-obj error main ports string symbol vector writer \
                  apply struct system control eval hash nogc            \
                  inline-alloc trace callcc binary foreign

OBJ_CLIB	= $(_OBJ_CLIB:%=Clib/%.o)                  
O_OBJ_CLIB     	= $(OBJ_CLIB:%=$(O)/%)

#*---------------------------------------------------------------------*/
#*    Les objets de Bumpy                                              */
#*---------------------------------------------------------------------*/
_OBJ_BUMPY	= bumpy dbumpy

OBJ_BUMPY	= $(_OBJ_BUMPY:%=Bumpy/%.o)                  
O_OBJ_BUMPY     = $(OBJ_BUMPY:%=$(O)/%)

#*---------------------------------------------------------------------*/
#*    Les objets Scheme de la librairie                                */
#*---------------------------------------------------------------------*/
_OBJ_IEEE  	= boolean equiv pair-list char string control number    \
                  fixnum flonum port vector symbol input output 

OBJ_IEEE	= $(_OBJ_IEEE:%=Ieee/%.o)  
O_OBJ_IEEE	= $(OBJ_IEEE:%=$(O)/%)                 
C_OBJ_IEEE    	= $(OBJ_IEEE:%.o=$(O)/%.c)

#*---------------------------------------------------------------------*/
#*    Les objets des extansions                                        */
#*---------------------------------------------------------------------*/
_OBJ_LLIB	= bexit type bigloo error struct unix hash              \
                  tvector bit binary intext foreign tstruct

OBJ_LLIB	= $(_OBJ_LLIB:%=Llib/%.o)  
O_OBJ_LLIB	= $(OBJ_LLIB:%=$(O)/%)
C_OBJ_LLIB    	= $(OBJ_LLIB:%.o=$(O)/%.c)

#*---------------------------------------------------------------------*/
#*    Les objets de l'interprete                                       */
#*---------------------------------------------------------------------*/
_OBJ_EVAL	= eval expand expanders expd-let expd-bool expd-define  \
                  expd-case expd-do expd-try expd-struct evmeaning      \
                  evcompile evenv progn macro expd-quote evprimop

OBJ_EVAL	= $(_OBJ_EVAL:%=Eval/%.o)  
O_OBJ_EVAL	= $(OBJ_EVAL:%=.Olib$(BUMPY)_u/%)
C_OBJ_EVAL    	= $(OBJ_EVAL:%.o=.Olib$(BUMPY)_u/%.c)

#*---------------------------------------------------------------------*/
#*    Les objets de Match                                              */
#*---------------------------------------------------------------------*/
_OBJ_MATCH	= compiler descr expand normalize s2cfun

OBJ_MATCH	= $(_OBJ_MATCH:%=Match/%.o)  
O_OBJ_MATCH	= $(OBJ_MATCH:%=.Olib$(BUMPY)_u/%)
C_OBJ_MATCH    	= $(OBJ_MATCH:%.o=.Olib$(BUMPY)_u/%.c)

#*---------------------------------------------------------------------*/
#*    Les objets de Rgc                                                */
#*---------------------------------------------------------------------*/
_OBJ_RGC	= runtime expand rules tree dfa grammar trap automata   \
                  accept cstate ustate optimize transition

OBJ_RGC		= $(_OBJ_RGC:%=Rgc/%.o)  
O_OBJ_RGC	= $(OBJ_RGC:%=.Olib$(BUMPY)_u/%)
C_OBJ_RGC    	= $(OBJ_RGC:%.o=.Olib$(BUMPY)_u/%.c)

#*---------------------------------------------------------------------*/
#*    PP_OBJECT                                                        */
#*---------------------------------------------------------------------*/
_OBJ_PP		= pp

OBJ_PP		= $(_OBJ_PP:%=Pp/%.o)  
O_OBJ_PP	= $(OBJ_PP:%=.Olib$(BUMPY)_u/%)
C_OBJ_PP    	= $(OBJ_PP:%.o=.Olib$(BUMPY)_u/%.c)

#*---------------------------------------------------------------------*/
#*    READ_OBJECT                                                      */
#*---------------------------------------------------------------------*/
_OBJ_READ	= reader

OBJ_READ	= $(_OBJ_READ:%=Read/%.o)  
O_OBJ_READ	= $(OBJ_READ:%=.Olib$(BUMPY)_u/%)
C_OBJ_READ    	= $(OBJ_READ:%.o=.Olib$(BUMPY)_u/%.c)

#*---------------------------------------------------------------------*/
#*    LALR_OBJECT                                                      */
#*---------------------------------------------------------------------*/
_OBJ_LALR	= driver gen global lalr rewrite util

OBJ_LALR	= $(_OBJ_LALR:%=Lalr/%.o)  
O_OBJ_LALR	= $(OBJ_LALR:%=.Olib$(BUMPY)_u/%)
C_OBJ_LALR    	= $(OBJ_LALR:%.o=.Olib$(BUMPY)_u/%.c)

#*---------------------------------------------------------------------*/
#*    Tous les objets Scheme                                           */
#*---------------------------------------------------------------------*/
O_OBJ_SCHEME	= $(O_OBJ_IEEE) $(O_OBJ_LLIB) $(O_OBJ_READ) $(O_OBJ_RGC)\
                  $(O_OBJ_PP) $(O_OBJ_EVAL) $(O_OBJ_MATCH) $(O_OBJ_LALR)

C_OBJ_SCHEME	= $(C_OBJ_IEEE) $(C_OBJ_LLIB) $(C_OBJ_MATCH)            \
                  $(C_OBJ_RGC) $(C_OBJ_PP) $(C_OBJ_READ) $(C_OBJ_EVAL)  \
                  $(C_OBJ_LALR)

#*---------------------------------------------------------------------*/
#*    Les objets du GC de boehm version 4.5                            */
#*---------------------------------------------------------------------*/
_OBJ_BOEHM_4_5	= alloc reclaim allchblk misc mach_dep os_dep mark_rts  \
                  headers mark obj_map blacklst finalize new_hblk       \
                  dbg_mlc malloc stubborn checksums solaris_thrd        \
                  typd_mlc ptr_chck dyn_load
OBJ_BOEHM_4_5	= $(_OBJ_BOEHM_4_5:%=Gc/%.o)  
O_OBJ_BOEHM_4_5	= $(OBJ_BOEHM_4_5:%=$(O)/%) 
                   
#*---------------------------------------------------------------------*/
#*    Les objets du GC de boehm version 4.7                            */
#*---------------------------------------------------------------------*/
_OBJ_BOEHM_4_7	= alloc reclaim allchblk misc mach_dep os_dep mark_rts  \
                  headers mark obj_map blacklst finalize new_hblk       \
                  dbg_mlc malloc stubborn checksums solaris_thrd        \
                  typd_mlc ptr_chck dyn_load
OBJ_BOEHM_4_7	= $(_OBJ_BOEHM_4_7:%=Gc/%.o)  
O_OBJ_BOEHM_4_7	= $(OBJ_BOEHM_4_7:%=$(O)/%) 
                   
#*---------------------------------------------------------------------*/
#*    The heap construction                                            */
#*---------------------------------------------------------------------*/
heap: 
	@ \rm -f ../lib/$(VERSION)/bigloo.heap
	@ $(BIGLOO) $(BHEAPFLAGS) Llib/make-lib.scm -heap bigloo.heap
	@ echo "Heap Done..."
	@ $(BEEP)
	@ echo "-------------------------------"

#*---------------------------------------------------------------------*/
#*    libs                                                             */
#*---------------------------------------------------------------------*/
libs:
	@ $(MAKE) lib_u
	@ $(MAKE) lib

#*---------------------------------------------------------------------*/
#*    The `safe' version.                                              */
#*---------------------------------------------------------------------*/
lib:
	@ $(MAKE) blib                           \
             BFLAGS="$(BSAFEFLAGS)"              \
	     CFLAGS="$(CSAFEFLAGS)"              \
             O=".Olib"                           \
             D="libbigloo.a"

lib_bumpy:
	@ $(MAKE) blib                           \
             BFLAGS="$(BSAFEFLAGS) -bumpy"       \
	     CFLAGS="$(CSAFEFLAGS) -DBUMPY_GC"   \
             BUMPY="_bumpy"                      \
             O=".Olib_bumpy"                     \
             D="libbigloo_bumpy.a"

dist-lib:
	@ $(MAKE) dist-blib                      \
             BFLAGS="$(BSAFEFLAGS)"              \
             CFLAGS="$(CUNSAFEFLAGS)"            \
             O=".Olib"                           \
             D="libbigloo.a"

#*---------------------------------------------------------------------*/
#*    The `unsafe' version                                             */
#*---------------------------------------------------------------------*/
lib_u:
	@ $(MAKE) blib                           \
             BFLAGS="$(BUNSAFEFLAGS)"            \
             CFLAGS="$(CUNSAFEFLAGS)"            \
             O=".Olib_u"                         \
	     D="libbigloo_u.a"

lib_bumpy_u:
	@ $(MAKE) blib                           \
             BFLAGS="$(BUNSAFEFLAGS) -bumpy"     \
             CFLAGS="$(CUNSAFEFLAGS) -DBUMPY_GC" \
             BUMPY="_bumpy"                      \
             O=".Olib_bumpy_u"                   \
	     D="libbigloo_bumpy_u.a"

dist-lib_u:
	@ $(MAKE) dist-blib                      \
             BFLAGS="$(BUNSAFEFLAGS)"            \
             CFLAGS="$(CUNSAFEFLAGS)"            \
             O=".Olib_u"                         \
	     D="libbigloo_u.a"

#*---------------------------------------------------------------------*/
#*    The profile version                                              */
#*---------------------------------------------------------------------*/
lib_p:
	@ $(MAKE) blib                           \
             BFLAGS="$(BUNSAFEPFLAGS)"           \
             CFLAGS="$(CPFLAGS)"                 \
 	     O=".Olib_p"                         \
	     D="libbigloo_p.a"
	@ \rm -f gmon.out

#*---------------------------------------------------------------------*/
#*    blib                                                             */
#*---------------------------------------------------------------------*/
blib: $(O_OBJ_MLIB) $(O_OBJ_CLIB) $(O_OBJ_BUMPY) $(O_OBJ_GC) $(O_OBJ_SCHEME)
	@ \rm -f $(LIB_DIR)/$(D).old
	@ if (-f $(LIB_DIR)/$(D)) mv $(LIB_DIR)/$(D) $(LIB_DIR)/$(D).old
	@ $(AR) qcv $(LIB_DIR)/$(D)      \
	       $(O_OBJ_GC)               \
               $(O_OBJ_CLIB)             \
               $(O_OBJ_BUMPY)            \
               $(O_OBJ_MLIB)             \
	       $(O_OBJ_SCHEME)
	@ $(RANLIB) $(LIB_DIR)/$(D)
	@ echo "$(D) Done..."
	@ $(BEEP)
	@ echo "-------------------------------"

#*---------------------------------------------------------------------*/
#*    The C production for the distribution.                           */
#*---------------------------------------------------------------------*/
dist-blib: $(C_OBJ_SCHEME)
	@ echo "$(D) (distribution) Done..."
	@ $(BEEP)
	@ echo "-------------------------------"

#*---------------------------------------------------------------------*/
#*     clean ...                                                       */
#*---------------------------------------------------------------------*/
clean:
	@ echo "removing .o files"
	@ find . -name '*.o' -exec \rm {} \;
	@- \rm -f ../tools/if_mach
	@- \rm -f ../tools/if_mach.o
	@- \rm -f ../tools/if_not_there
	@- \rm -f ../tools/if_not_there.o
	@ echo "Cleanup done..."
	@ $(BEEP)
	@ echo "-------------------------------"

#*---------------------------------------------------------------------*/
#*     touchall ...                                                    */
#*---------------------------------------------------------------------*/
touchall:
	@ touch {Llib,Ieee,Match,Rgc,Eval,Pp,Read,Lalr}/*.{scm} Clib/*.c Gc/*.[ch] Bumpy/*.c
	@ echo "touchall done..."
	@ $(BEEP)
	@ echo "-------------------------------"

#*---------------------------------------------------------------------*/
#*    touchllib                                                        */
#*---------------------------------------------------------------------*/
touchllib:
	@ touch Llib/*.scm
	@ echo "touchlib done..."
	@ $(BEEP)
	@ echo "-------------------------------"

#*---------------------------------------------------------------------*/
#*    wc                                                               */
#*---------------------------------------------------------------------*/
wc:
	@ wc Llib/*.{scm,sch} Clib/*.c Bumpy/*.c Include/*.h
	@ echo "wc done..."
	@ $(BEEP)
	@ echo "-------------------------------"

#*---------------------------------------------------------------------*/
#*    The implicit `.scm.o' rule                                       */
#*---------------------------------------------------------------------*/
.Olib/%.o: %.scm
	@ $(BIGLOO) $(BFLAGS) $*.scm -o .Olib/$*.o -c
.Olib_bumpy/%.o: %.scm
	@ $(BIGLOO) $(BFLAGS) $*.scm -o .Olib_bumpy/$*.o -c
.Olib_u/%.o: %.scm
	@ $(BIGLOO) $(BFLAGS) $*.scm -o .Olib_u/$*.o -c
.Olib_bumpy_u/%.o: %.scm
	@ $(BIGLOO) $(BFLAGS) $*.scm -o .Olib_bumpy_u/$*.o -c
.Olib_p/%.o: %.scm
	@ $(BIGLOO) $(BFLAGS) $*.scm -o .Olib_p/$*.o -c
	
#*---------------------------------------------------------------------*/
#*    The implicit `.scm.c' rule                                       */
#*---------------------------------------------------------------------*/
.Olib/%.c: %.scm
	@ $(BIGLOO) $(BFLAGS) -cgen $*.scm -o .Olib/$*.c
.Olib_bumpy/%.c: %.scm
	@ $(BIGLOO) $(BFLAGS) -cgen $*.scm -o .Olib_bumpy/$*.c
.Olib_u/%.c: %.scm
	@ $(BIGLOO) $(BFLAGS) -cgen $*.scm -o .Olib_u/$*.c
.Olib_bumpy_u/%.c: %.scm
	@ $(BIGLOO) $(BFLAGS) -cgen $*.scm -o .Olib_bumpy_u/$*.c
	
#*---------------------------------------------------------------------*/
#*    The implicit `.c.o' rule                                         */
#*---------------------------------------------------------------------*/
$(O)/%.o: %.c
	@ echo "$*.c:"
	@ $(CC) $(CFLAGS) $*.c -o $(O)/$*.o -c
	
#*---------------------------------------------------------------------*/
#*    mach_dep.o                                                       */
#*---------------------------------------------------------------------*/
$(O)/Mlib/mach_dep.o: Mlib/mach_dep.c                 \
                      Mlib/sparc_sunos5_mach_dep.s    \
                      Mlib/sparc_sunos4_mach_dep.s    \
                      ../tools/if_mach                \
                      ../tools/if_not_there
	@ echo "Mlib/mach_dep.c:"
	@ rm -f $(O)/Mlib/mach_dep.o
	@ ../tools/if_mach sparc sunos5 as -o $(O)/Mlib/mach_dep.o Mlib/sparc_sunos5_mach_dep.s
	@ ../tools/if_mach sparc sunos4 as -o $(O)/Mlib/mach_dep.o Mlib/sparc_sunos4_mach_dep.s
	@ ../tools/if_not_there $(O)/Mlib/mach_dep.o \
         $(CC) -c $(CFLAGS) Mlib/mach_dep.c -o $(O)/Mlib/mach_dep.o

../tools/if_mach: ../tools/if_mach.c 
	@ $(CC) $(CFLAGS) -o ../tools/if_mach ../tools/if_mach.c
	
../tools/if_not_there: ../tools/if_not_there.c
	@ $(CC) $(CFLAGS) -o ../tools/if_not_there ../tools/if_not_there.c

#*---------------------------------------------------------------------*/
#*    mach_dep.o                                                       */
#*---------------------------------------------------------------------*/
$(O)/Gc/mach_dep.o: Gc/mach_dep.c          \
                    Gc/mips_mach_dep.s     \
                    Gc/rs6000_mach_dep.s   \
                    Gc/sparc_mach_dep.s    \
                    $(O)/Gc/if_mach        \
                    $(O)/Gc/if_not_there
	@ echo "Gc/mach_dep.c:"
	@ rm -f $(O)/Gc/mach_dep.o
	@ $(O)/Gc/if_mach MIPS "" as -o $(O)/Gc/mach_dep.o Gc/mips_mach_dep.s
	@ $(O)/Gc/if_mach RS6000 "" as -o $(O)/Gc/mach_dep.o Gc/rs6000_mach_dep.s
	@ $(O)/Gc/if_mach ALPHA "" as -o $(O)/Gc/mach_dep.o Gc/alpha_mach_dep.s
	@ $(O)/Gc/if_mach SPARC SUNOS5 as -o $(O)/Gc/mach_dep.o Gc/alpha_mach_dep.s
	@ $(O)/Gc/if_not_there $(O)/Gc/mach_dep.o \
         $(CC) -c $(SPECIALCFLAGS) Gc/mach_dep.c -o $(O)/Gc/mach_dep.o

$(O)/Gc/if_mach: Gc/if_mach.c Gc/config.h
	@ $(CC) $(CFLAGS) -o $(O)/Gc/if_mach Gc/if_mach.c
	
$(O)/Gc/if_not_there: Gc/if_not_there.c
	@ $(CC) $(CFLAGS) -o $(O)/Gc/if_not_there Gc/if_not_there.c

#*---------------------------------------------------------------------*/
#*    Dependences                                                      */
#*---------------------------------------------------------------------*/
$(O)/Clib/inline-alloc.o: Gc/gc_private.h Gc Include/bumpy.h
$(O)/Bumpy/bumpy.o: Include/bumpy.h
$(O)/Bumpy/dbumpy.o: Include/bumpy.h
