GC_STACK_TEST01 = ./gc_stack_test_01
GC_STACK_TEST02 = ./gc_stack_test_02
GC_STACK_TEST03 = ./gc_stack_test_03
GC_GLOBAL_TEST01 = ./gc_global_test_01
GC_GLOBAL_TEST02 = ./gc_global_test_02
GC_HEAP_TEST01   = ./gc_heap_test_01
GC_HEAP_TEST02   = ./gc_heap_test_02
GC_HEAP_TEST03   = ./gc_heap_test_03
GC_HEAP_TEST04   = ./gc_heap_test_04
GC_HEAP_TEST05   = ./gc_heap_test_05
GC_HEAP_TEST06   = ./gc_heap_test_06
GC_REG_TEST01    = ./gc_reg_test_01

GC_TESTS = $(GC_STACK_TEST01) $(GC_STACK_TEST02) $(GC_STACK_TEST03) $(GC_GLOBAL_TEST01) $(GC_GLOBAL_TEST02) $(GC_HEAP_TEST01) $(GC_HEAP_TEST02) $(GC_HEAP_TEST03) $(GC_HEAP_TEST04) $(GC_HEAP_TEST05) $(GC_HEAP_TEST06) $(GC_REG_TEST01)
GC_STACK_TEST01_OBJECTS  = $(GC_OBJECTS) $(GC_STACK_TEST01).o
GC_STACK_TEST02_OBJECTS  = $(GC_OBJECTS) $(GC_STACK_TEST02).o
GC_STACK_TEST03_OBJECTS  = $(GC_OBJECTS) $(GC_STACK_TEST03).o
GC_GLOBAL_TEST01_OBJECTS = $(GC_OBJECTS) $(GC_GLOBAL_TEST01).o
GC_GLOBAL_TEST02_OBJECTS = $(GC_OBJECTS) $(GC_GLOBAL_TEST02).o
GC_HEAP_TEST01_OBJECTS   = $(GC_OBJECTS) $(GC_HEAP_TEST01).o
GC_HEAP_TEST02_OBJECTS   = $(GC_OBJECTS) $(GC_HEAP_TEST02).o
GC_HEAP_TEST03_OBJECTS   = $(GC_OBJECTS) $(GC_HEAP_TEST03).o
GC_HEAP_TEST04_OBJECTS   = $(GC_OBJECTS) $(GC_HEAP_TEST04).o
GC_HEAP_TEST05_OBJECTS   = $(GC_OBJECTS) $(GC_HEAP_TEST05).o
GC_HEAP_TEST06_OBJECTS   = $(GC_OBJECTS) $(GC_HEAP_TEST06).o

GC_REG_TEST01_OBJECTS   = $(GC_OBJECTS) $(GC_REG_TEST01).o

CXXFLAGS = -O3 -pg -g -idirafter . -Wall $(GC_FLAGS) -DGC_TEST -DUSE_MONA_GC -DMONASH_DONT_FREE_MEMORY #-DGC_TRACE #-O3 # O2じゃないと gc 
CFLAGS   = $(CXXFLAGS)

GC_SOURCES = GCRecord.cpp gc.cpp gc_helper.cpp
GC_OBJECTS = $(GC_SOURCES:.cpp=.o) $(MYSETJMP_OBJECTS)

GC_TEST_OBJECTS = $(GC_TESTS:=.o)
GC_TEST_SOURCES = $(GC_TESTS:=.cpp)

MYSETJMP_SOURCES = mysetjmp.c
MYSETJMP_OBJECTS = $(MYSETJMP_SOURCES:.c=.o) mysetjmp_asm.o

all : $(GC_TESTS)

$(GC_STACK_TEST01): $(GC_STACK_TEST01_OBJECTS)
	$(CXX) -pg $(CXXFLAGS) $(GC_STACK_TEST01_OBJECTS) -o $@

$(GC_STACK_TEST02): $(GC_STACK_TEST02_OBJECTS)
	$(CXX) -pg $(CXXFLAGS) $(GC_STACK_TEST02_OBJECTS) -o $@

$(GC_STACK_TEST03): $(GC_STACK_TEST03_OBJECTS)
	$(CXX) -pg $(CXXFLAGS) $(GC_STACK_TEST03_OBJECTS) -o $@

$(GC_GLOBAL_TEST01): $(GC_GLOBAL_TEST01_OBJECTS)
	$(CXX) -pg $(CXXFLAGS) $(GC_GLOBAL_TEST01_OBJECTS) -o $@

$(GC_GLOBAL_TEST02): $(GC_GLOBAL_TEST02_OBJECTS)
	$(CXX) -pg $(CXXFLAGS) $(GC_GLOBAL_TEST02_OBJECTS) -o $@

$(GC_HEAP_TEST01): $(GC_HEAP_TEST01_OBJECTS)
	$(CXX) -pg $(CXXFLAGS) $(GC_HEAP_TEST01_OBJECTS) -o $@

$(GC_HEAP_TEST02): $(GC_HEAP_TEST02_OBJECTS)
	$(CXX) -pg $(CXXFLAGS) $(GC_HEAP_TEST02_OBJECTS) -o $@

$(GC_HEAP_TEST03): $(GC_HEAP_TEST03_OBJECTS)
	$(CXX) -pg $(CXXFLAGS) $(GC_HEAP_TEST03_OBJECTS) -o $@

$(GC_HEAP_TEST04): $(GC_HEAP_TEST04_OBJECTS)
	$(CXX) -pg $(CXXFLAGS) $(GC_HEAP_TEST04_OBJECTS) -o $@

$(GC_HEAP_TEST05): $(GC_HEAP_TEST05_OBJECTS)
	$(CXX) -pg $(CXXFLAGS) $(GC_HEAP_TEST05_OBJECTS) -o $@

$(GC_HEAP_TEST06): $(GC_HEAP_TEST06_OBJECTS)
	$(CXX) -pg $(CXXFLAGS) $(GC_HEAP_TEST06_OBJECTS) -o $@

$(GC_REG_TEST01): $(GC_REG_TEST01_OBJECTS)
	$(CXX) -pg $(CXXFLAGS) $(GC_REG_TEST01_OBJECTS) -o $@

mysetjmp_asm.o: mysetjmp.asm
	nasm $< -o $@ -felf -g -F stabs

.SUFFIXES: .c .o
.c.o:
	$(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@

.SUFFIXES: .cpp .o
.cpp.o:
	$(CXX) -g $(CXXFLAGS) $(INCLUDE) -c $< -o $@

depend:
	$(CXX) -MM $(INCLUDE) $(CXXFLAGS) $(GC_SOURCES) $(GC_TEST_SOURCES) > dependencies

clean :
	rm -f $(GC_OBJECTS) $(GC_TEST_OBJECTS) $(GC_TESTS)

check : $(GC_TESTS)
#	@ruby -e '"$(GC_TESTS)".split.each{ |s| puts `#{s}`}'
ifdef GOSH
	@$(GOSH) -e '(begin (for-each sys-system (string-split "$(GC_TESTS)" #\SPACE)) (exit))'
endif
-include dependencies
