#*---------------------------------------------------------------------*/
#*    serrano/prgm/project/bigloo/runtime1.3/Makefile ...              */
#*                                                                     */
#*    Auteur      :  Manuel SERRANO                                    */
#*    Creation    :  Tue May 14 14:21:00 1991                          */
#*    Last change :  Wed Jun 23 16:29:22 1993  (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.3
BIGLOO          = `cat ../distribution/SITE`/bin/bigloo$(VERSION)
LIB_DIR         = `cat ../distribution/SITE`/lib/$(VERSION)
INCLUDE     	= -I`cat ../distribution/SITE`/lib/$(VERSION)
BEEP            = ../public/beep
SHELL           = /bin/csh
O_OBJ_GC        = $(O_OBJ_BOEHM2_6)

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

#*---------------------------------------------------------------------*/
#*    Les objects C de la librairie                                    */
#*---------------------------------------------------------------------*/
OBJ_C		= Clib/init-obj.o Clib/error.o                \
                  Clib/main.o Clib/ports.o                    \
                  Clib/string.o Clib/symbol.o                 \
                  Clib/vector.o Clib/writer.o                 \
                  Clib/apply.o Clib/struct.o                  \
                  Clib/callcc.o Clib/debug.o                  \
                  Clib/system.o Clib/control.o
                  
O_OBJ_C     	= $(OBJ_C:%=$(O)/%)

#*---------------------------------------------------------------------*/
#*    Les objects Scheme de la librairie                               */
#*---------------------------------------------------------------------*/
OBJ_SCHEME  	= Llib/make-lib.o Llib/booleans.o             \
                  Llib/equiv.o Llib/pair-list.o               \
                  Llib/symbols.o Llib/numbers.o               \
                  Llib/fixnum.o Llib/flonum.o                 \
                  Llib/characters.o Llib/strings.o            \
                  Llib/vectors.o Llib/control.o               \
                  Llib/ports.o Llib/output.o                  \
                  Llib/casting.o Llib/error.o                 \
                  Llib/struct.o Llib/input.o                  \
                  Llib/rgc.o Llib/reader.o                    \
                  Llib/eval.o Llib/expand.o                   \
                  Llib/bit.o Llib/expander.o                  \
                  Llib/expd-let.o Llib/expd-bool.o            \
                  Llib/expd-define.o Llib/expd-case.o         \
                  Llib/expd-do.o Llib/expd-try.o              \
                  Llib/expd-struct.o Llib/system.o            \
                  Llib/m-expand.o Llib/m-normalize.o          \
                  Llib/m-s2cfun.o Llib/m-compiler.o           \
                  Llib/m-descr.o                              \
                  Llib/evcomp.o Llib/evmeaning.o
                  
O_OBJ_SCHEME	= $(OBJ_SCHEME:%=$(O)/%)
C_OBJ_SCHEME    = $(OBJ_SCHEME:%.o=$(O)/%.c)

#*---------------------------------------------------------------------*/
#*    Les objects du GC de boehm version 2.6                           */
#*---------------------------------------------------------------------*/
OBJ_BOEHM2_6	= Gc/alloc.o                                  \
                  Gc/reclaim.o                                \
                  Gc/allochblk.o                              \
                  Gc/misc.o                                   \
                  Gc/mach_dep.o                               \
                  Gc/os_dep.o                                 \
                  Gc/mark_roots.o                             \
                  Gc/headers.o                                \
                  Gc/mark.o                                   \
                  Gc/obj_map.o                                \
                  Gc/black_list.o                             \
                  Gc/finalize.o                               \
                  Gc/new_hblk.o                               \
                  Gc/real_malloc.o                            \
                  Gc/dynamic_load.o                           \
                  Gc/debug_malloc.o                           \
                  Gc/inline_alloc.o
                  
O_OBJ_BOEHM2_6	= $(OBJ_BOEHM2_6:%=$(O)/%)

#*---------------------------------------------------------------------*/
#*    La construction du `heap'                                        */
#*---------------------------------------------------------------------*/
heap: 
	@ $(BIGLOO) Llib/make-lib.scm -mkheap +ALPHA          \
	  -heap $(LIB_DIR)/bigloo.heap
	@ echo "Heap Done..."
	@ $(BEEP)
	@ echo "-------------------------------"

#*---------------------------------------------------------------------*/
#*    La libarie `libbigloo.a'                                         */
#*---------------------------------------------------------------------*/
lib:
	@ make blib BFLAGS="-O2 -mklib -g -cg -cc $(CC)"      \
	            CFLAGS="$(INCLUDE) -g"                    \
	            ERRORFLAGS="-mklib -cg"                   \
	            EVALFLAGS="-mklib -cg -g -O2"             \
	            O=".Olib"                                 \
	            D="libbigloo.a"

dist-lib:
	@ make dist-blib BFLAGS="-O2 -mklib -g -cc $(CC)"     \
	                 CFLAGS="$(INCLUDE) -O"               \
	                 ERRORFLAGS="-mklib -O"               \
	                 EVALFLAGS="-mklib -O2"               \
    	                 O=".Olib"                            \
	                 D="libbigloo.a"

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

dist-lib_u:
	@ make dist-blib BFLAGS="-O2 -mklib -unsafe -cc $(CC)"\
	                 CFLAGS="$(INCLUDE) -O"               \
	                 ERRORFLAGS="-O -unsafe -mklib"       \
	                 EVALFLAGS="-O2 -unsafe -mklib"       \
	                 O=".Olib_u"                          \
	                 D="libbigloo_u.a"

#*---------------------------------------------------------------------*/
#*    La libarie `libbigloo_p.a'                                       */
#*---------------------------------------------------------------------*/
lib_p:
	@ make blib BFLAGS="-O2 -mklib -unsafe -pg -cc $(CC)" \
	            CFLAGS="$(INCLUDE) -pg"                   \
	            ERRORFLAGS="-O -unsafe -pg -mklib"        \
	            EVALFLAGS="-O2 -unsafe -pg -mklib"        \
	            O=".Olib_p"                               \
	            D="libbigloo_p.a"
	@ \rm -f gmon.out
	
#*---------------------------------------------------------------------*/
#*    blib                                                             */
#*---------------------------------------------------------------------*/
blib: $(O_OBJ_C) $(O_OBJ_GC) $(O_OBJ_SCHEME)
	@ 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 "-------------------------------"

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

#*---------------------------------------------------------------------*/
#*     touchall ...                                                    */
#*---------------------------------------------------------------------*/
touchall:
	@ touch Llib/*.{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 -A

$(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
	
#*---------------------------------------------------------------------*/
#*    evcomp.c                                                         */
#*---------------------------------------------------------------------*/
$(O)/Llib/evcomp.c: Llib/evcomp.scm
	@ $(BIGLOO) $(EVALFLAGS) Llib/evcomp.scm -o $(O)/Llib/evcomp.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'                                      */
#*---------------------------------------------------------------------*/
$(O)/%.o: %.scm
	@ $(BIGLOO) $(BFLAGS) $*.scm -o $(O)/$*.o -A
	
#*---------------------------------------------------------------------*/
#*    La regle implicite `.scm.c'                                      */
#*---------------------------------------------------------------------*/
$(O)/%.c: %.scm
	@ $(BIGLOO) $(BFLAGS) $*.scm -o $(O)/$*.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

