chiark / gitweb /
more stuff found lying about
[wordchain] / Makefile
1 ### -*-makefile-*-
2
3 all:
4 TARGETS                  =
5
6 clean::
7 CLEAN                    =
8
9 .PHONY: all clean
10
11 .SECONDEXPANSION:
12
13 SRCEXT                   =
14
15 V                        = 0
16 v-tag                    = $(call v-tag.$V,$1)
17 v-tag.0                  = @printf "  %-8s %s\n" '$1' '$@';
18 V_AT                     = $(V_AT.$V)
19 V_AT.0                   = @
20
21 objify                   = $(addsuffix $1, \
22                                 $(basename \
23                                         $(filter $(addprefix %.,$(SRCEXT)), \
24                                                  $2)))
25 DEPOBJS                  =
26 CLEAN                   += *.o *.d
27
28 TIME                     = /usr/bin/time
29
30 DICT                     = /usr/share/dict/british-english-insane
31
32 SRCEXT                  += c
33 CC                       = gcc
34 CFLAGS                   = $(OPTIMIZE) $(WARNINGS)
35 CCLD                     = $(CC)
36 LDFLAGS                  =
37 OPTIMIZE                 = -O2 -g3 -fno-omit-frame-pointer
38 WARNINGS                 = -pedantic -Wall
39
40 SRCEXT                  += cc
41 CXX                      = g++
42 CXXFLAGS                 = $(CFLAGS)
43 CXXLD                    = $(CXX)
44
45 compile-c                = $(call v-tag,CC)$(CC) -c $(CFLAGS) $3 \
46                                 -MD -MF $(1:.o=.d) -o$1 $2
47 %.o: %.c
48         $(call compile-c,$@,$<)
49
50 compile-c++              = $(call v-tag,CXX)$(CXX) -c $(CFLAGS) $3 \
51                                 -MD -MF $(1:.o=.d) -o$1 $2
52 %.o: %.cc
53         $(call compile-c++,$@,$<)
54
55 SRCEXT                  += rs
56 RUSTC                    = rustc
57 RUSTFLAGS                = --edition=2018 -L$(abspath .) $(OPTIMIZE_RUST)
58 OPTIMIZE_RUST            = -O
59 RUSTLIBS                 =
60 CARGODIR                 = /usr/share/cargo/registry
61 compile-rust             = +$(call v-tag,RUSTC)\
62                                 rm -rf rusttmp.$1 && mkdir rusttmp.$1 && \
63                                 $(RUSTC) $(RUSTFLAGS) $4 \
64                                         -orusttmp.$1/$2 $3 && \
65                                 mv rusttmp.$1/$2 . && rmdir rusttmp.$1
66
67 RUSTLIBS                += typed_arena
68 typed_arena_DIR          = $(CARGODIR)/typed-arena-2.0.0
69 typed_arena_RUSTFLAGS    = --cfg 'feature="std"'
70
71 RUSTLIB_OBJS             = $(foreach l,$(RUSTLIBS), lib$l.rlib)
72 CLEAN                   += $(RUSTLIB_OBJS)
73 $(RUSTLIB_OBJS): lib%.rlib: \
74                 $$(or $$($$*_SRC), $$($$*_DIR)/src/lib.rs) $$($*_DEPS)
75         $(call compile-rust,$*,$@,$<, \
76                 --crate-type=rlib --crate-name=$* $($*_RUSTFLAGS))
77
78 SRCEXT                  += go
79 GOBUILD                  = go build
80
81 TREELIBS                 =
82 VPATH                    =
83
84 TREELIBS                += xyla
85 xyla_VARIANTS            = avl rb splay treap
86 XYLADIR                  = $(HOME)/src/libxyla
87 xyla_LIBS                = $(XYLADIR)/build/.libs/libxyla.a
88 xyla_CFLAGS              = -I$(XYLADIR)
89 xyla-avl_CFLAGS          = -DTREE=XYLA_AVL
90 xyla-rb_CFLAGS           = -DTREE=XYLA_RB
91 xyla-splay_CFLAGS        = -DTREE=XYLA_SPLAY
92 xyla-treap_CFLAGS        = -DTREE=XYLA_TREAP
93
94 TREELIBS                += qptrie
95 QPDIR                    = $(HOME)/src/ext/qp
96 VPATH                   += $(QPDIR)
97 CFLAGS                  += -mpopcnt
98 qptrie_CFLAGS            = -I$(QPDIR)
99 qptrie_SRCS              = Tbl.c
100 qptrie_VARIANTS          =
101
102 qptrie_VARIANTS         += qp-fanf qp-mdw qp-list
103 qptrie-qp_SRCS           = qp.c
104 qptrie-qp-fanf_CFLAGS    = -DTREE=QPTRIE_QP -DQPTRIE_ITER=QPITER_FANF
105 qptrie-qp-fanf_SRCS      = $(qptrie-qp_SRCS)
106 qptrie-qp-mdw_CFLAGS     = -DTREE=QPTRIE_QP -DQPTRIE_ITER=QPITER_MDW
107 qptrie-qp-mdw_SRCS       = $(qptrie-qp_SRCS)
108 qptrie-qp-list_CFLAGS    = -DTREE=QPTRIE_QP -DQPTRIE_ITER=QPITER_LIST
109 qptrie-qp-list_SRCS      = $(qptrie-qp_SRCS)
110
111 qptrie_VARIANTS         += fn-fanf fn-mdw fn-list
112 qptrie-fn_SRCS           = fn.c
113 qptrie-fn-fanf_CFLAGS    = -DTREE=QPTRIE_FN -DQPTRIE_ITER=QPITER_FANF
114 qptrie-fn-fanf_SRCS      = $(qptrie-fn_SRCS)
115 qptrie-fn-mdw_CFLAGS     = -DTREE=QPTRIE_FN -DQPTRIE_ITER=QPITER_MDW
116 qptrie-fn-mdw_SRCS       = $(qptrie-fn_SRCS)
117 qptrie-fn-list_CFLAGS    = -DTREE=QPTRIE_FN -DQPTRIE_ITER=QPITER_LIST
118 qptrie-fn-list_SRCS      = $(qptrie-fn_SRCS)
119
120 TREELIBS                += sgt
121 sgt_VARIANTS             = tree234
122 SGTDIR                   = $(HOME)/src/sgt/puzzles
123 VPATH                   += $(SGTDIR)
124 sgt_CFLAGS               = -I$(SGTDIR)
125 sgt-tree234_CFLAGS       = -DTREE=SGT_TREE234
126 sgt-tree234_SRCS         = tree234.c malloc.c nullfe.c
127
128 TREELIBS                += libavl
129 libavl_VARIANTS          =
130 LIBAVLDIR                = $(HOME)/src/ext/avl
131 VPATH                   += $(LIBAVLDIR)
132 libavl_CFLAGS            = -I$(LIBAVLDIR)
133
134 libavl_VARIANTS         += avl pavl rtavl tavl
135 libavl-avl_CFLAGS        = -DTREE=LIBAVL_AVL
136 libavl-avl_SRCS          = avl.c
137 libavl-pavl_CFLAGS       = -DTREE=LIBAVL_PAVL
138 libavl-pavl_SRCS         = pavl.c
139 libavl-rtavl_CFLAGS      = -DTREE=LIBAVL_RTAVL
140 libavl-rtavl_SRCS        = rtavl.c
141 libavl-tavl_CFLAGS       = -DTREE=LIBAVL_TAVL
142 libavl-tavl_SRCS         = tavl.c
143
144 libavl_VARIANTS         += rb prb rtrb trb
145 libavl-rb_CFLAGS         = -DTREE=LIBAVL_RB
146 libavl-rb_SRCS           = rb.c
147 libavl-prb_CFLAGS        = -DTREE=LIBAVL_PRB
148 libavl-prb_SRCS          = prb.c
149 libavl-rtrb_CFLAGS       = -DTREE=LIBAVL_RTRB
150 libavl-rtrb_SRCS         = rtrb.c
151 libavl-trb_CFLAGS        = -DTREE=LIBAVL_TRB
152 libavl-trb_SRCS          = trb.c
153
154 #libavl_VARIANTS        += bst pbst rtbst tbst
155 libavl-bst_CFLAGS        = -DTREE=LIBAVL_BST
156 libavl-bst_SRCS          = bst.c
157 libavl-pbst_CFLAGS       = -DTREE=LIBAVL_PBST
158 libavl-pbst_SRCS         = pbst.c
159 libavl-rtbst_CFLAGS      = -DTREE=LIBAVL_RTBST
160 libavl-rtbst_SRCS        = rtbst.c
161 libavl-tbst_CFLAGS       = -DTREE=LIBAVL_TBST
162 libavl-tbst_SRCS         = tbst.c
163
164 TREELIBS                += mLib
165 mLib_VARIANTS            = sym
166 mLib_LIBS                = -lmLib
167 mLib-sym_CFLAGS          = -DTREE=MLIB_SYM
168
169 c++_VARIANTS            += map
170 c++-map_CXXFLAGS         = -DTREE=CXX_MAP
171 c++_VARIANTS            += uomap
172 c++-uomap_CXXFLAGS       = -DTREE=CXX_UOMAP
173
174 rust_VARIANTS           += btree
175 rust-btree_RUSTFLAGS     = --cfg 'feature="btree"'
176 rust_VARIANTS           += hash
177 rust-hash_RUSTFLAGS      = --cfg 'feature="hash"'
178
179 ALL_VARIANTS            += golang
180 TARGETS                 += chain.golang
181 CLEAN                   += chain.golang
182 chain.golang: chain.go
183         $(call v-tag,GOBUILD)$(GOBUILD) -o $@ $<
184
185 ALL_VARIANTS            += perl python
186
187 lisp_VARIANTS            = clisp cmucl ccl ecl sbcl
188 measure-lisp             = \
189         runlisp -L$1 chain.lisp -Ttime.$2.new $(DICT) >chain.$2.out
190 define def-lisp-variant
191 ALL_VARIANTS            += lisp-$1
192 lisp-$1_PROGRAM          = chain.lisp
193 lisp-$1_MEASURE          = $$(call measure-lisp,$1,$$*)
194 endef
195 $(foreach v,$(lisp_VARIANTS), \
196         $(eval $(call def-lisp-variant,$v)))
197
198 -include local.mk
199
200 define def-c-variant
201 ALL_VARIANTS            += $1-$2
202 TARGETS                 += chain.$1-$2
203 CLEAN                   += chain.$1-$2
204 $1-$2_OBJS               = chain.$1-$2.o \
205                                 $$(call objify,.o,$$($1_SRCS) $$($1-$2_SRCS))
206 run-$1-$2                = ./chain.$1-$2 <$$1
207 DEPOBJS                 += $$($1-$2_OBJS)
208 chain.$1-$2: $$($1-$2_OBJS)
209         $$(call v-tag,CCLD)$$(CCLD) $$(LDFLAGS) -o$$@ $$+ $$($1_LIBS)
210 chain.$1-$2.o: chain.c
211         $$(call compile-c,$$@,$$<,$$($1_CFLAGS) $$($1-$2_CFLAGS))
212 endef
213 $(foreach t,$(TREELIBS), \
214         $(foreach v,$($t_VARIANTS), \
215                 $(eval $(call def-c-variant,$t,$v))))
216
217 define def-c++-variant
218 ALL_VARIANTS            += c++-$1
219 TARGETS                 += chain.c++-$1
220 CLEAN                   += chain.c++-$1
221 c++-$1_OBJS              = chain.c++-$1.o
222 run-c++-$1               = ./chain.c++-$1 <$$1
223 DEPOBJS                 += $$(c++-$1_OBJS)
224 chain.c++-$1: $$(c++-$1_OBJS)
225         $$(call v-tag,CXXLD)$$(CXXLD) $$(LDFLAGS) -o$$@ $$+
226 chain.c++-$1.o: chain.cc
227         $$(call compile-c++,$$@,$$<,$$(c++-$1_CXXFLAGS))
228 endef
229 $(foreach v,$(c++_VARIANTS), \
230         $(eval $(call def-c++-variant,$v)))
231
232 define def-rust-variant
233 ALL_VARIANTS            += rust-$1
234 TARGETS                 += chain.rust-$1
235 CLEAN                   += chain.rust-$1
236 run-rust-$1              = ./chain.rust-$1 <$$1
237 chain.rust-$1: chain.rs $$(RUSTLIB_OBJS)
238         $$(call compile-rust,chain-$1,$$@,$$<, \
239                 $$(foreach l,$$(RUSTLIBS), \
240                         $$(rust-$1_RUSTFLAGS) --extern=$$l))
241 endef
242 $(foreach v,$(rust_VARIANTS), \
243         $(eval $(call def-rust-variant,$v)))
244
245 CLEAN                   += ref
246 ref: $(DICT)
247         $(call v-tag,GEN)./chain.perl $(DICT) >$@.new && mv $@.new $@
248
249 CLEAN                   += *.out *.new time.*
250 COMMON_MEASURE           = \
251         set -- $$($(TIME) -f"%U %S" 2>&1 ./chain.$* <$(DICT) >chain.$*.out) && \
252                 { echo "$$1 $$2 + p" | dc; } >time.$*.new
253
254 warm-cache:
255         $(call v-tag,CAT)cat $(DICT) >/dev/null
256 .PHONY: warm-cache
257
258 MEASURES                 = $(foreach v,$(ALL_VARIANTS), measure/$v)
259 measure: $(MEASURES)
260 $(MEASURES): measure/%: $$(or $$($$*_PROGRAM),chain.$$*) ref warm-cache
261         $(call v-tag,MEASURE)$(or $($*_MEASURE),$(COMMON_MEASURE)) && \
262                 ./chkref chain.$*.out ref && mv time.$*.new time.$*
263
264 list:
265         for i in $(ALL_VARIANTS); do echo $$i; done
266 .PHONY: list
267
268 .PHONY: measure $(MEASURES)
269 all: $(TARGETS)
270
271 clean::; rm -f $(CLEAN)
272
273 -include $(DEPOBJS:.o=.d)
274 p:; : $x