algol68-fringe: New language.
[fringe] / Makefile
1 ### Makefile for same-fringe implementations.
2
3 ###--------------------------------------------------------------------------
4 ### Notes about organization.
5 ###
6 ### Most projects have lots of stuff in just a few languages, so it makes
7 ### sense to put the language configuration in one place. This one's
8 ### different. Its entire purpose is to demonstrate lots of different
9 ### approaches.
10 ###
11 ### So, at the top we declare the main targets; then each language has its
12 ### configuration and build rules.
13
14 .SUFFIXES: .o
15 LANGS =
16 SOURCES =
17 TARGETS = $(patsubst %,%-fringe,$(LANGS))
18 CLEANFILES = $(TARGETS)
19
20 all::
21 clean::; rm -f $(CLEANFILES)
22
23 ###--------------------------------------------------------------------------
24 ### Silent rules stuff.
25
26 ## Default verbosity setting.
27 V = 0
28
29 ## Infrastructure.
30 v_echo = $(call v_echo_$V,$1)
31 v_echo_1 =
32 v_echo_0 = @printf " %-6s %s\n" "$1" "$@";
33 V_HIDE = $(V_HIDE_$V)
34 V_HIDE_0 = @
35
36 ###--------------------------------------------------------------------------
37 ### Testing.
38
39 CLEANFILES += test.*
40 test:: all
41 @win=0 lose=0; \
42 for lang in $(LANGS); do \
43 echo >&3 "*** $$lang"; \
44 printf "Test $$lang..."; \
45 time=`command time -o/dev/stdout -f "%U user; %S system; %E" \
46 ./test ./$${lang}-fringe 2>&3`; \
47 if [ $$? -eq 0 ]; then \
48 win=$$(expr $$win + 1); \
49 printf " ok ($$time)\n"; \
50 else \
51 lose=$$(expr $$lose + 1); \
52 printf " FAILED\n"; \
53 fi; \
54 done 3>test.log; \
55 if [ $$lose -eq 0 ]; then \
56 echo "All $$win test(s) OK"; \
57 else \
58 echo "FAILED $$lose test(s)!"; \
59 exit 1; \
60 fi
61
62 ###--------------------------------------------------------------------------
63 ### Reporting.
64
65 report::
66 wc -l $(SOURCES) | sort -n
67
68 ###--------------------------------------------------------------------------
69 ### C.
70
71 CC = gcc
72 CFLAGS = -O2 -g -pedantic -Wall
73 CLEANFILES += *.o
74 .SUFFIXES: .c
75 .c.o:; $(call v_echo,CC)$(CC) -c $(CFLAGS) -o $@ $<
76
77 LANGS += c
78 SOURCES += c-fringe.c
79 c-fringe: c-fringe.o
80 $(call v_echo,CCLD)$(CC) -o $@ $^
81
82 ###--------------------------------------------------------------------------
83 ### Haskell.
84
85 HC = ghc
86 HFLAGS = -O2
87 CLEANFILES += *.hi *.hc
88 .SUFFIXES: .hs
89 .hs.o:; $(call v_echo,HC)$(HC) -c $(HFLAGS) -o $@ $<
90
91 LANGS += haskell
92 SOURCES += haskell-fringe.hs
93 haskell-fringe: haskell-fringe.o
94 $(call v_echo,HCLD)$(HC) -o $@ $^
95
96 ###--------------------------------------------------------------------------
97 ### Icon.
98
99 ICONT = icont
100 IFLAGS = -u -s -fa
101
102 LANGS += icon
103 SOURCES += icon-fringe.icn
104 icon-fringe: icon-fringe.icn
105 $(call v_echo,ICONT)$(ICONT) $(IFLAGS) -o $@ $^
106
107 ###--------------------------------------------------------------------------
108 ### Common Lisp.
109
110 CLEANFILES += *.core *.fasl
111
112 .SUFFIXES: .lisp .fasl
113 .lisp.fasl:
114 $(call v_echo,CL)sbcl --noinform --eval \
115 '(quit :unix-status (if (compile-file "$<" :verbose nil :print nil) 0 1))'
116
117 LANGS += cl
118 SOURCES += cl-fringe.lisp
119 cl-fringe: cl-fringe.fasl
120 $(call v_echo,CP)cp $< $@.new && chmod +x $@.new && mv $@.new $@
121 ## $(call v_echo,CL)cl-launch -o $@ -f `pwd`/$^ +I -r launch -d $@.core
122
123 ###--------------------------------------------------------------------------
124 ### F#.
125
126 FSC = fsc
127 FSCFLAGS =
128 CLEANFILES += *.exe
129 .SUFFIXES: .fs .exe
130 .fs.exe:; $(call v_echo,FSC)$(FSC) --nologo $(FSCFLAGS) -o $@ $<
131
132 LANGS += f\#
133 SOURCES += f\#-fringe.fs
134 f\#-fringe: f\#-fringe.exe
135 $(call v_echo,CP)chmod +x $< && cp $< $@
136
137 ###--------------------------------------------------------------------------
138 ### Scheme.
139
140 SCMC = csc
141 SCMFLAGS = -c -O2
142 .SUFFIXES: .scm
143 .scm.o:; $(call v_echo,SCMC)$(SCMC) $(SCMFLAGS) -o $@ $<
144
145 LANGS += scheme
146 SOURCES += scheme-fringe.scm
147 scheme-fringe: scheme-fringe.o
148 $(call v_echo,SCMLD)$(SCMC) -o $@ $^
149
150 ###--------------------------------------------------------------------------
151 ### Go.
152
153 GOOBJ = 8
154 GOC = $(GOOBJ)g
155 GOLINK = $(GOOBJ)l
156 CLEANFILES += *.$(GOOBJ)
157 .SUFFIXES: .$(GOOBJ) .go
158 .go.$(GOOBJ):; $(call v_echo,GOC)$(GOC) $(GOFLAGS) $<
159
160 LANGS += go
161 SOURCES += go-fringe.go
162 go-fringe: go-fringe.$(GOOBJ)
163 $(call v_echo,GOLD)$(GOLINK) -o $@ $^
164
165 ###--------------------------------------------------------------------------
166 ### Smalltalk.
167
168 LANGS += smalltalk
169 TARGETS += smalltalk-fringe.im
170 SOURCES += smalltalk-fringe.st
171 smalltalk-fringe.im: smalltalk-fringe.st
172 $(call v_echo,GSTIM)echo "ObjectMemory snapshot: '$@.new'" | gst $^ -
173 $(V_HIDE)mv $@.new $@
174 smalltalk-fringe:
175 $(call v_echo,GENSH){ echo '#! /bin/sh'; \
176 echo '"exec" "gst" "-I" "$@.im" "-f" "$$0" "$$@"'; \
177 echo 'ObjectMemory quit: (Node main: Smalltalk arguments)'; \
178 } >$@.new
179 $(V_HIDE)chmod +x $@.new && mv $@.new $@
180
181 ###--------------------------------------------------------------------------
182 ### Forth.
183
184 LANGS += forth
185 TARGETS += forth-fringe
186 SOURCES += forth-fringe.fth
187 forth-fringe: forth-fringe.fth
188 $(call v_echo,FORTHI)gforthmi $@ $<
189
190 ###--------------------------------------------------------------------------
191 ### Erlang.
192
193 ERLC = erlc
194 CLEANFILES += *.beam erl_crash.dump
195 .SUFFIXES: .erl .beam
196 .erl.beam:; $(call v_echo,ERLC)$(ERLC) $(ERLCFLAGS) $<
197
198 LANGS += erlang
199 TARGETS += erlang-fringe.beam
200 SOURCES += erlang-fringe.erl
201 erlang-fringe:
202 $(call v_echo,GENSH){ echo '#! /bin/sh'; \
203 echo 'exec erl -pa . -noshell -run erlang-fringe main -extra "$$@"'; \
204 } >$@.new
205 $(V_HIDE)chmod +x $@.new && mv $@.new $@
206
207 ###--------------------------------------------------------------------------
208 ### Algol 68.
209
210 ALGOL68 = /usr/local/bin/a68g
211
212 LANGS += algol68
213 TARGETS += algol68-fringe
214 SOURCES += algol68-fringe.a68
215
216 algol68-fringe: algol68-fringe.a68
217 $(call v_echo,GENSH){ echo '#! $(ALGOL68) --script'; \
218 cat $<; \
219 } >$@.new
220 $(V_HIDE)chmod +x $@.new && mv $@.new $@
221
222 ###----- That's all, folks --------------------------------------------------
223
224 all:: $(TARGETS)