1#   Requirements: GNU Make, GCC 4.0 or later
2#   Options: DESTDIR, PREFIX, DATAMODEL(ILP32/LP64)
3
4PROG 	 = ypsilon
5
6CPPFLAGS = -DNDEBUG -DSYSTEM_SHARE_PATH='"$(DESTDIR)$(DATADIR)"'
7
8CXXFLAGS = -x c++ ${CFLAGS}
9
10SRCS 	 = file.cpp main.cpp vm0.cpp object_heap_compact.cpp subr_flonum.cpp vm1.cpp object_set.cpp \
11	   subr_hash.cpp vm2.cpp object_slab.cpp subr_list.cpp interpreter.cpp serialize.cpp \
12           vm3.cpp port.cpp subr_others.cpp arith.cpp printer.cpp subr_port.cpp subr_r5rs_arith.cpp \
13	   equiv.cpp reader.cpp ffi.cpp subr_base.cpp bag.cpp \
14           subr_unicode.cpp hash.cpp subr_base_arith.cpp ucs4.cpp ioerror.cpp subr_bitwise.cpp utf8.cpp \
15	   main.cpp subr_bvector.cpp violation.cpp object_factory.cpp \
16           subr_ffi.cpp object_heap.cpp subr_fixnum.cpp bit.cpp list.cpp fasl.cpp socket.cpp subr_socket.cpp
17
18VPATH 	 = src
19
20UNAME 	 = $(shell uname -a)
21
22ifndef DATAMODEL
23  ifeq (, $(findstring x86_64, $(UNAME)))
24    ifeq (, $(findstring amd64, $(UNAME)))
25      DATAMODEL = ILP32
26    else
27      DATAMODEL = LP64
28    endif
29  else
30    DATAMODEL = LP64
31  endif
32endif
33
34ifneq (, $(findstring Linux, $(UNAME)))
35  ifeq ($(shell $(CXX) -dumpspecs | grep 'march=native'), )
36    ifeq ($(DATAMODEL), ILP32)
37      CXXFLAGS += -march=i686
38    endif
39  else
40    CXXFLAGS += -march=native
41  endif
42  CXXFLAGS += -msse2 -mfpmath=sse
43  ifeq ($(DATAMODEL), ILP32)
44    CPPFLAGS += -DDEFAULT_HEAP_LIMIT=32
45    CXXFLAGS += -m32
46    LDFLAGS = -m32
47    ASFLAGS = --32
48    SRCS += ffi_stub_linux.s
49  else
50    CPPFLAGS += -DDEFAULT_HEAP_LIMIT=64
51    CXXFLAGS += -m64
52    LDFLAGS = -m64
53    ASFLAGS = --64
54    SRCS += ffi_stub_linux64.s
55  endif
56  LDLIBS = -lpthread -ldl
57endif
58
59ifneq (, $(findstring FreeBSD, $(UNAME)))
60  CPPFLAGS += -D__LITTLE_ENDIAN__
61  ifeq ($(DATAMODEL), ILP32)
62    CPPFLAGS += -DDEFAULT_HEAP_LIMIT=32
63    CXXFLAGS += -m32
64    LDFLAGS = -m32
65    ASFLAGS = --32
66    SRCS += ffi_stub_freebsd.s
67  else
68    CPPFLAGS += -DDEFAULT_HEAP_LIMIT=64
69    CXXFLAGS += -m64
70    LDFLAGS = -m64
71    ASFLAGS = --64
72    SRCS += ffi_stub_freebsd64.s
73  endif
74  LDLIBS = -pthread
75endif
76
77ifneq (, $(findstring DragonFly, $(UNAME)))
78  CPPFLAGS += -D__LITTLE_ENDIAN__
79    CPPFLAGS += -DDEFAULT_HEAP_LIMIT=64
80    CXXFLAGS += -m64
81    LDFLAGS = -m64
82    ASFLAGS = --64
83    SRCS += ffi_stub_freebsd64.s
84  LDLIBS = -pthread
85endif
86
87ifneq (, $(findstring OpenBSD, $(UNAME)))
88  ifeq ($(shell $(CXX) -dumpspecs | grep 'march=native'), )
89    ifeq ($(DATAMODEL), ILP32)
90      CXXFLAGS += -march=i686
91    endif
92  else
93    CXXFLAGS += -march=native
94  endif
95  CPPFLAGS += -D__LITTLE_ENDIAN__ -DNO_TLS
96  CXXFLAGS += -msse2 -mfpmath=sse
97  ifeq ($(DATAMODEL), ILP32)
98    CPPFLAGS += -DDEFAULT_HEAP_LIMIT=32
99    CXXFLAGS += -m32
100    LDFLAGS = -m32
101    ASFLAGS = --32
102    SRCS += ffi_stub_openbsd.s
103  else
104    CPPFLAGS += -DDEFAULT_HEAP_LIMIT=64
105    CXXFLAGS += -m64
106    LDFLAGS = -m64
107    ASFLAGS = --64
108    SRCS += ffi_stub_openbsd64.s
109  endif
110  LDLIBS = -pthread
111endif
112
113ifneq (, $(findstring Darwin, $(UNAME)))
114  CXXFLAGS += -arch i386 -msse2 -mfpmath=sse
115  CPPFLAGS += -DNO_TLS
116  SRCS += ffi_stub_darwin.s
117endif
118
119OBJS =	$(patsubst %.cpp, %.o, $(filter %.cpp, $(SRCS))) $(patsubst %.s, %.o, $(filter %.s, $(SRCS)))
120DEPS = 	$(patsubst %.cpp, %.d, $(filter %.cpp, $(SRCS)))
121
122.PHONY: all install uninstall sitelib stdlib check bench clean distclean
123
124all: $(PROG)
125
126$(PROG): $(OBJS)
127	$(CXX) $(LDFLAGS) $(LDLIBS) -o $@ $^
128
129vm1.s: vm1.cpp
130	$(CXX) $(CXXFLAGS) $(CPPFLAGS) \
131	     \
132	-fverbose-asm -S src/vm1.cpp
133
134vm1.o: vm1.cpp
135	$(CXX) $(CXXFLAGS) $(CPPFLAGS) \
136	     \
137	-c src/vm1.cpp
138
139install: all stdlib sitelib
140	mkdir -p -m755 $(DESTDIR)$(PREFIX)/bin
141	mkdir -p -m755 $(DESTDIR)$(PREFIX)/share/man/man1
142	cp $(PROG) $(DESTDIR)$(PREFIX)/bin/$(PROG)
143	cp $(PROG).1 $(DESTDIR)$(PREFIX)/share/man/man1/$(PROG).1
144	chmod 755 $(DESTDIR)$(PREFIX)/bin/$(PROG)
145	chmod 644 $(DESTDIR)$(PREFIX)/share/man/man1/$(PROG).1
146
147uninstall:
148	-rm -rf $(DESTDIR)$(PREFIX)/share/$(PROG)/stdlib
149	-rm -rf $(DESTDIR)$(PREFIX)/share/$(PROG)/sitelib
150	-rm -f $(DESTDIR)$(PREFIX)/share/man/man1/$(PROG).1
151	-rm -f $(DESTDIR)$(PREFIX)/bin/$(PROG)
152	-rmdir $(DESTDIR)$(PREFIX)/share/$(PROG)
153
154stdlib:
155	mkdir -p -m755 $(DESTDIR)$(PREFIX)/share/$(PROG)/stdlib
156	find stdlib -type f -name '*.scm' | cpio -pdu $(DESTDIR)$(PREFIX)/share/$(PROG)
157	find $(DESTDIR)$(PREFIX)/share/$(PROG)/stdlib -type d -exec chmod 755 {} \;
158	find $(DESTDIR)$(PREFIX)/share/$(PROG)/stdlib -type f -exec chmod 644 {} \;
159
160sitelib:
161	mkdir -p -m755 $(DESTDIR)$(PREFIX)/share/$(PROG)/sitelib
162	find sitelib -type f -name '*.scm' | cpio -pdu $(DESTDIR)$(PREFIX)/share/$(PROG)
163	find $(DESTDIR)$(PREFIX)/share/$(PROG)/sitelib -type d -exec chmod 755 {} \;
164	find $(DESTDIR)$(PREFIX)/share/$(PROG)/sitelib -type f -exec chmod 644 {} \;
165
166check: all
167	@echo '----------------------------------------'
168	@echo 'r4rstest.scm:'
169	@./$(PROG) --heap-limit=128 --acc=/tmp --sitelib=./test:./sitelib:./stdlib ./test/r4rstest.scm
170	@echo '----------------------------------------'
171	@echo 'tspl.scm:'
172	@./$(PROG) --heap-limit=128 --acc=/tmp --sitelib=./test:./sitelib:./stdlib ./test/tspl.scm
173	@echo '----------------------------------------'
174	@echo 'arith.scm:'
175	@./$(PROG) --heap-limit=128 --acc=/tmp --sitelib=./test:./sitelib:./stdlib ./test/arith.scm
176	@echo '----------------------------------------'
177	@echo 'r5rs_pitfall.scm:'
178	@./$(PROG) --heap-limit=128 --acc=/tmp --sitelib=./test:./sitelib:./stdlib ./test/r5rs_pitfall.scm
179	@echo '----------------------------------------'
180	@echo 'syntax-rule-stress-test.scm:'
181	@./$(PROG) --heap-limit=128 --acc=/tmp --sitelib=./test:./sitelib:./stdlib ./test/syntax-rule-stress-test.scm
182	@echo '----------------------------------------'
183	@echo 'r6rs.scm:'
184	@./$(PROG) --heap-limit=128 --acc=/tmp --sitelib=./test:./sitelib:./stdlib ./test/r6rs.scm
185	@echo '----------------------------------------'
186	@echo 'r6rs-lib.scm:'
187	@./$(PROG) --heap-limit=128 --acc=/tmp --sitelib=./test:./sitelib:./stdlib ./test/r6rs-lib.scm
188	@echo '----------------------------------------'
189	@echo 'Passed all tests'
190	@rm -f ./test/tmp*
191
192eval: all
193	./$(PROG) --heap-limit=128 --acc=/tmp --sitelib=./sitelib:./stdlib
194
195bench: all
196	./$(PROG) --heap-limit=128 --acc=/tmp --sitelib=./test:./sitelib:./stdlib -- bench/run-ypsilon.scm
197
198clean:
199	rm -f *.o *.d
200	rm -f $(HOME)/.ypsilon/*.cache
201	rm -f $(HOME)/.ypsilon/*.time
202
203distclean: clean
204	rm -f tmp1 tmp2 tmp3 spheres.pgm
205	find . -type f -name .DS_Store -print0 | xargs -0 rm -f
206	find . -type f -name '*~' -print0 | xargs -0 rm -f
207	rm -f ./test/tmp*
208	rm -f ./bench/gambit-benchmarks/tmp*
209	rm -f ./bench/gambit-benchmarks/spheres.pgm
210	rm -f -r ./build/* ./build-win32/* ./setup-win32/Debug ./setup-win32/Release
211	rm -f ./ypsilon.xcodeproj/*.mode1v3 ./ypsilon.xcodeproj/*.pbxuser
212	rm -f ./ypsilon.ncb
213	rm -f ./ypsilon
214
215%.d: %.cpp
216	$(SHELL) -ec '$(CXX) -MM $(CPPFLAGS) $< \
217	| sed '\''s/\($*\)\.o[ :]*/\1.o $@ : /g'\'' > $@; [ -s $@ ] || rm -f $@'
218
219ifeq ($(findstring clean, $(MAKECMDGOALS)), )
220  ifeq ($(findstring uninstall, $(MAKECMDGOALS)), )
221    -include $(DEPS)
222  endif
223endif
224
225
226
227