#*=====================================================================*/
#*    serrano/prgm/project/bigloo/runtime1.7/Makefile ...              */
#*    -------------------------------------------------------------    */
#*    Author      :  Manuel Serrano                                    */
#*    Creation    :  Wed Nov 16 08:44:32 1994                          */
#*    Last change :  Fri Dec 23 08:56:15 1994 (serrano)                */
#*    -------------------------------------------------------------    */
#*    Le makefile pour construire la librarie de bigloo ...            */
#*    -------------------------------------------------------------    */
#*    Ce fichier peut-etre interprete soit par `make' sur les machines */
#*    SUN soit par `gmake' sur toutes les autres machines.             */
#*=====================================================================*/

#*---------------------------------------------------------------------*/
#*     Les flags ...                                                   */
#*---------------------------------------------------------------------*/
MACH        	= `arch`
PWD         	= `pwd`
CC          	= gcc
VERSION         = 1.7
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_3)

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

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

OBJ_C		= $(_OBJ_C:%=Clib/%)                  
O_OBJ_C     	= $(OBJ_C:%=$(O)/%)

#*---------------------------------------------------------------------*/
#*    Les objets Scheme de la librairie                                */
#*---------------------------------------------------------------------*/
_OBJ_IEEE  	= booleans.o input.o equiv.o pair-list.o       \
                  symbols.o numbers.o fixnum.o flonum.o        \
                  characters.o strings.o vectors.o control.o   \
                  ports.o output.o
               
OBJ_IEEE	= $(_OBJ_IEEE:%=Ieee/%)  
O_OBJ_IEEE	= $(OBJ_IEEE:%=$(O)/%)                 
C_OBJ_IEEE    	= $(OBJ_IEEE:%.o=$(O)/%.c)

#*---------------------------------------------------------------------*/
#*    Les objets des extansions                                        */
#*---------------------------------------------------------------------*/
_OBJ_LLIB	= make-lib.o bit.o system.o  foreign.o         \
                  casting.o error.o struct.o rgc.o unix-file.o \
                  intext.o binary.o hash.o

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

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

OBJ_EVAL	= $(_OBJ_EVAL:%=Eval/%)  
O_OBJ_EVAL	= $(OBJ_EVAL:%=.Olib_u/%)
C_OBJ_EVAL    	= $(OBJ_EVAL:%.o=.Olib_u/%.c)

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

OBJ_MATCH	= $(_OBJ_MATCH:%=Match/%)  
O_OBJ_MATCH	= $(OBJ_MATCH:%=.Olib_u/%)
C_OBJ_MATCH    	= $(OBJ_MATCH:%.o=.Olib_u/%.c)

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

OBJ_RGC		= $(_OBJ_RGC:%=Rgc/%)  
O_OBJ_RGC	= $(OBJ_RGC:%=.Olib_u/%)
C_OBJ_RGC    	= $(OBJ_RGC:%.o=.Olib_u/%.c)

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

OBJ_PP		= $(_OBJ_PP:%=Pp/%)  
O_OBJ_PP	= $(OBJ_PP:%=.Olib_u/%)
C_OBJ_PP    	= $(OBJ_PP:%.o=.Olib_u/%.c)

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

OBJ_READ	= $(_OBJ_READ:%=Read/%)  
O_OBJ_READ	= $(OBJ_READ:%=.Olib_u/%)
C_OBJ_READ    	= $(OBJ_READ:%.o=.Olib_u/%.c)

#*---------------------------------------------------------------------*/
#*    Tous les objets Scheme                                           */
#*---------------------------------------------------------------------*/
O_OBJ_SCHEME	= $(O_OBJ_IEEE) $(O_OBJ_LLIB) $(O_OBJ_MATCH)            \
                  $(O_OBJ_RGC) $(O_OBJ_PP) $(O_OBJ_READ) $(O_OBJ_EVAL)
C_OBJ_SCHEME	= $(C_OBJ_IEEE) $(C_OBJ_LLIB) $(C_OBJ_MATCH)            \
                  $(C_OBJ_RGC) $(C_OBJ_PP) $(C_OBJ_READ) $(C_OBJ_EVAL)

#*---------------------------------------------------------------------*/
#*    Les objets du GC de boehm version 2.6                            */
#*---------------------------------------------------------------------*/
_OBJ_BOEHM_2_6	= alloc.o reclaim.o allochblk.o misc.o         \
                  mach_dep.o os_dep.o mark_roots.o headers.o   \
                  mark.o obj_map.o black_list.o finalize.o     \
                  new_hblk.o real_malloc.o dynamic_load.o      \
                  debug_malloc.o

OBJ_BOEHM_2_6	= $(_OBJ_BOEHM_2_6:%=Gc/%)  
O_OBJ_BOEHM_2_6	= $(OBJ_BOEHM_2_6:%=$(O)/%)

#*---------------------------------------------------------------------*/
#*    Les objets du GC de boehm version 3.6                            */
#*---------------------------------------------------------------------*/
_OBJ_BOEHM_3_6	= alloc.o reclaim.o allochblk.o misc.o         \
                  mach_dep.o os_dep.o mark_roots.o headers.o   \
                  mark.o obj_map.o black_list.o finalize.o     \
                  new_hblk.o real_malloc.o dynamic_load.o      \
                  debug_malloc.o malloc.o stubborn.o           \
                  checksums.o

OBJ_BOEHM_3_6	= $(_OBJ_BOEHM_3_6:%=Gc/%)  
O_OBJ_BOEHM_3_6	= $(OBJ_BOEHM_3_6:%=$(O)/%) 
                 

#*---------------------------------------------------------------------*/
#*    Les objets du GC de boehm version 4.2                            */
#*---------------------------------------------------------------------*/
_OBJ_BOEHM_4_2	= alloc.o reclaim.o allchblk.o misc.o         \
                  mach_dep.o os_dep.o mark_rts.o headers.o    \
                  mark.o obj_map.o blacklst.o finalize.o      \
                  new_hblk.o dyn_load.o dbg_mlc.o malloc.o    \
                  stubborn.o checksums.o typd_mlc.o

OBJ_BOEHM_4_2	= $(_OBJ_BOEHM_4_2:%=Gc/%)  
O_OBJ_BOEHM_4_2	= $(OBJ_BOEHM_4_2:%=$(O)/%) 
                   
#*---------------------------------------------------------------------*/
#*    Les objets du GC de boehm version 4.3                            */
#*---------------------------------------------------------------------*/
_OBJ_BOEHM_4_3	= alloc.o reclaim.o allchblk.o misc.o         \
                  mach_dep.o os_dep.o mark_rts.o headers.o    \
                  mark.o obj_map.o blacklst.o finalize.o      \
                  new_hblk.o dbg_mlc.o malloc.o stubborn.o    \
                  checksums.o solaris_thrd.o typd_mlc.o       \
                  ptr_chck.o dyn_load.o
OBJ_BOEHM_4_3	= $(_OBJ_BOEHM_4_3:%=Gc/%)  
O_OBJ_BOEHM_4_3	= $(OBJ_BOEHM_4_3:%=$(O)/%) 
                   
#*---------------------------------------------------------------------*/
#*    La construction du `heap'                                        */
#*---------------------------------------------------------------------*/
heap: 
	@ $(BIGLOO) -q Llib/make-lib.scm -mkheap +ALPHA        \
	  -heap $(LIB_DIR)/bigloo.heap
	@ echo "Heap Done..."
	@ $(BEEP)
	@ echo "-------------------------------"

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

#*---------------------------------------------------------------------*/
#*    La libarie `libbigloo.a'                                         */
#*---------------------------------------------------------------------*/
lib:
	@ $(MAKE) blib BFLAGS="-O3 -mklib -g3 -cg -cc $(CC) -fshared-data -q -rm" \
	            CFLAGS="$(INCLUDE) -g"                                 \
	            ERRORFLAGS="-mklib -cg -q -rm"                         \
	            EVALFLAGS="-mklib -cg -O3 -q -rm"                      \
	            O=".Olib"                                              \
	            D="libbigloo.a"

dist-lib:
	@ $(MAKE) dist-blib BFLAGS="-O3 -mklib -g -cc $(CC) -q"            \
	                 CFLAGS="$(INCLUDE) -O -DGC_DEBUG -DTRACE_BUF"                 \
	                 ERRORFLAGS="-mklib -O -q"                      \
	                 EVALFLAGS="-mklib -O3 -q"                      \
    	                 O=".Olib"                                      \
	                 D="libbigloo.a"

#*---------------------------------------------------------------------*/
#*    La libarie `libbigloo_u.a'                                       */
#*---------------------------------------------------------------------*/
lib_u:
	@ $(MAKE) blib BFLAGS="-O3 -mklib -unsafe -cc $(CC) -fshared-data -q" \
	            CFLAGS="$(INCLUDE) -O"                                 \
	            ERRORFLAGS="-O -unsafe -mklib -q -rm"                  \
	            EVALFLAGS="-O3 -unsafe -mklib -q"                      \
	            O=".Olib_u"                                            \
	            D="libbigloo_u.a"

dist-lib_u:
	@ $(MAKE) dist-blib BFLAGS="-O3 -mklib -unsafe -cc $(CC) -fshared-data -q"\
	                 CFLAGS="$(INCLUDE) -O"                            \
	                 ERRORFLAGS="-O -unsafe -mklib -q"                 \
	                 EVALFLAGS="-O3 -unsafe -mklib -q"                 \
	                 O=".Olib_u"                                       \
	                 D="libbigloo_u.a"

#*---------------------------------------------------------------------*/
#*    La libarie `libbigloo_p.a'                                       */
#*---------------------------------------------------------------------*/
lib_p:
	@ $(MAKE) blib BFLAGS="-O3 -mklib -unsafe -pg -cc $(CC) -fshared-data -q"\
	            CFLAGS="$(INCLUDE) -pg"                                   \
	            ERRORFLAGS="-O -unsafe -pg -mklib -q"                     \
	            EVALFLAGS="-O3 -unsafe -pg -mklib -q"                     \
	            O=".Olib_p"                                               \
	            D="libbigloo_p.a"
	@ \rm -f gmon.out

#*---------------------------------------------------------------------*/
#*    blib                                                             */
#*---------------------------------------------------------------------*/
blib: $(O_OBJ_C) $(O_OBJ_GC) $(O_OBJ_SCHEME)
	@ \rm -f $(LIB_DIR)/$(D).old
	@ mv $(LIB_DIR)/$(D) $(LIB_DIR)/$(D).old
	@ ar rcv $(LIB_DIR)/$(D) $(O_OBJ_C)                   \
	                         $(O_OBJ_SCHEME)              \
	                         $(O_OBJ_GC)
	@ ranlib $(LIB_DIR)/$(D)
	@ echo "$(D) Done..."
	@ $(BEEP)
	@ echo "-------------------------------"

#*---------------------------------------------------------------------*/
#*    dist-blib (la construction des `.c' pour la distribution)        */
#*---------------------------------------------------------------------*/
dist-blib: $(C_OBJ_SCHEME)
	@ echo "$(D) (distribution) Done..."
	@ $(BEEP)
	@ echo "-------------------------------"

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

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

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

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

#*---------------------------------------------------------------------*/
#*    Llib/error.o                                                     */
#*    -------------------------------------------------------------    */
#*    Ce fichier doit etre compile a part car on ne peut pas           */
#*    utiliser les fonctions de debug puisqu'elles sont definies dans  */
#*    ce module. On looperait si on le faisait.                        */
#*---------------------------------------------------------------------*/
$(O)/Llib/error.o: Llib/error.scm
	@ $(BIGLOO) $(ERRORFLAGS) Llib/error.scm -o $(O)/Llib/error.o -c

$(O)/Llib/error.c: Llib/error.scm
	@ $(BIGLOO) $(ERRORFLAGS) Llib/error.scm -o $(O)/Llib/error.o -C

#*---------------------------------------------------------------------*/
#*    eval.c                                                           */
#*---------------------------------------------------------------------*/
$(O)/Llib/eval.c: Llib/eval.scm
	@ $(BIGLOO) $(EVALFLAGS) Llib/eval.scm -o $(O)/Llib/eval.c -C
	
#*---------------------------------------------------------------------*/
#*    evmeaning.c                                                      */
#*---------------------------------------------------------------------*/
$(O)/Llib/evmeaning.c: Llib/evmeaning.scm
	@ $(BIGLOO) $(EVALFLAGS) Llib/evmeaning.scm -o $(O)/Llib/evmeaning.c -C
	
#*---------------------------------------------------------------------*/
#*    La regle implicite `.scm.o'                                      */
#*---------------------------------------------------------------------*/
.Olib/%.o: %.scm
	@ $(BIGLOO) $(BFLAGS) $*.scm -o .Olib/$*.o -c
.Olib_u/%.o: %.scm
	@ $(BIGLOO) $(BFLAGS) $*.scm -o .Olib_u/$*.o -c
.Olib_p/%.o: %.scm
	@ $(BIGLOO) $(BFLAGS) $*.scm -o .Olib_p/$*.o -c
	
#*---------------------------------------------------------------------*/
#*    La regle implicite `.scm.c'                                      */
#*---------------------------------------------------------------------*/
.Olib/%.c: %.scm
	@ $(BIGLOO) $(BFLAGS) $*.scm -o .Olib/$*.c -C
.Olib_u/%.c: %.scm
	@ $(BIGLOO) $(BFLAGS) $*.scm -o .Olib_u/$*.c -C
.Olib_p/%.c: %.scm
	@ $(BIGLOO) $(BFLAGS) $*.scm -o .Olib_p/$*.c -C
	
#*---------------------------------------------------------------------*/
#*    La regle implicite `.c.o'                                        */
#*---------------------------------------------------------------------*/
$(O)/%.o: %.c
	@ echo "$*.c:"
	@ $(CC) $(CFLAGS) $*.c -o $(O)/$*.o -c
	
#*---------------------------------------------------------------------*/
#*    mach_dep.o                                                       */
#*---------------------------------------------------------------------*/
$(O)/Gc/mach_dep.o: Gc/mach_dep.c          \
                    Gc/mips_mach_dep.s     \
                    Gc/rs6000_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_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

#*---------------------------------------------------------------------*/
#*    Les dependances                                                  */
#*---------------------------------------------------------------------*/
$(O)/Clib/inline-alloc.o: Gc/gc_private.h Gc
