#*---------------------------------------------------------------------*/
#*    serrano/prgm/project/bigloo/runtime1.6/Makefile ...              */
#*                                                                     */
#*    Auteur      :  Manuel SERRANO                                    */
#*    Creation    :  Tue May 14 14:21:00 1991                          */
#*    Last change :  Wed Jun  1 15:27:21 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.6
BIGLOO          = ../bin/bigloo$(VERSION)
LIB_DIR         = ../lib/$(VERSION)
INCLUDE     	= -I../lib/$(VERSION)
BEEP            = ../tools/beep
SHELL           = /bin/csh
O_OBJ_GC        = $(O_OBJ_BOEHM2_6)

#*---------------------------------------------------------------------*/
#*     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

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 reader.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 eval.o expand.o bit.o expander.o  \
                  expd-let.o expd-bool.o expd-define.o         \
                  expd-case.o expd-do.o expd-try.o             \
                  expd-struct.o system.o evmeaning.o foreign.o \
                  casting.o error.o struct.o rgc.o unix-file.o \
                  intext.o

OBJ_LLIB	= $(_OBJ_LLIB:%=Llib/%)  
O_OBJ_LLIB	= $(OBJ_LLIB:%=$(O)/%)
C_OBJ_LLIB    	= $(OBJ_LLIB:%.o=$(O)/%.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		= find-rep.o make-rep.o pp.o

OBJ_PP		= $(_OBJ_PP:%=Pp/%)  
O_OBJ_PP	= $(OBJ_PP:%=.Olib_u/%)
C_OBJ_PP    	= $(OBJ_PP:%.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)
C_OBJ_SCHEME	= $(C_OBJ_IEEE) $(C_OBJ_LLIB) $(C_OBJ_MATCH)   \
                  $(C_OBJ_RGC) $(C_OBJ_PP)

#*---------------------------------------------------------------------*/
#*    Les objets du GC de boehm version 2.6                            */
#*---------------------------------------------------------------------*/
_OBJ_BOEHM2_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 inline_alloc.o

OBJ_BOEHM2_6	= $(_OBJ_BOEHM2_6:%=Gc/%)  
O_OBJ_BOEHM2_6	= $(OBJ_BOEHM2_6:%=$(O)/%)

#*---------------------------------------------------------------------*/
#*    Les objets du GC de boehm version 3.4                            */
#*---------------------------------------------------------------------*/
_OBJ_BOEHM3_4	= 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 inline_alloc.o   

OBJ_BOEHM3_4	= $(_OBJ_BOEHM3_4:%=Gc/%)  
O_OBJ_BOEHM3_4	= $(OBJ_BOEHM3_4:%=$(O)/%) 
                 
#*---------------------------------------------------------------------*/
#*    Les objets du GC de boehm version 3.6                            */
#*---------------------------------------------------------------------*/
_OBJ_BOEHM3_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 inline_alloc.o   

OBJ_BOEHM3_6	= $(_OBJ_BOEHM3_6:%=Gc/%)  
O_OBJ_BOEHM3_6	= $(OBJ_BOEHM3_6:%=$(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"                         \
	                 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 {} \;
	@ \rm $(LIB_DIR)/*.a
	@ echo "Cleanup done..."
	@ $(BEEP)
	@ echo "-------------------------------"

#*---------------------------------------------------------------------*/
#*     touchall ...                                                    */
#*---------------------------------------------------------------------*/
touchall:
	@ touch {Llib,Ieee,Match,Rgc}/*.{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

