16 v-tag = $(call v-tag.$V,$1)
17 v-tag.0 = @printf " %-8s %s\n" '$1' '$@';
21 objify = $(addsuffix $1, \
23 $(filter $(addprefix %.,$(SRCEXT)), \
30 DICT = /usr/share/dict/british-english-insane
34 CFLAGS = $(OPTIMIZE) $(WARNINGS)
37 OPTIMIZE = -O2 -g3 -fno-omit-frame-pointer
38 WARNINGS = -pedantic -Wall
45 compile-c = $(call v-tag,CC)$(CC) -c $(CFLAGS) $3 \
46 -MD -MF $(1:.o=.d) -o$1 $2
48 $(call compile-c,$@,$<)
50 compile-c++ = $(call v-tag,CXX)$(CXX) -c $(CFLAGS) $3 \
51 -MD -MF $(1:.o=.d) -o$1 $2
53 $(call compile-c++,$@,$<)
57 RUSTFLAGS = --edition=2018 -L$(abspath .) $(OPTIMIZE_RUST)
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
67 RUSTLIBS += typed_arena
68 typed_arena_DIR = $(CARGODIR)/typed-arena-2.0.0
69 typed_arena_RUSTFLAGS = --cfg 'feature="std"'
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))
85 xyla_VARIANTS = avl rb splay treap
86 XYLADIR = $(HOME)/src/xyla
87 xyla_LIBS := $(shell pkg-config --libs xyla)
88 xyla_CFLAGS := $(shell pkg-config --cflags xyla)
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
95 QPDIR = $(HOME)/src/ext/qp
98 qptrie_CFLAGS = -I$(QPDIR)
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)
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)
121 sgt_VARIANTS = tree234
122 SGTDIR = $(HOME)/src/sgt/puzzles
124 sgt_CFLAGS = -I$(SGTDIR)
125 sgt-tree234_CFLAGS = -DTREE=SGT_TREE234
126 sgt-tree234_SRCS = tree234.c malloc.c nullfe.c
130 LIBAVLDIR = $(HOME)/src/ext/avl
131 VPATH += $(LIBAVLDIR)
132 libavl_CFLAGS = -I$(LIBAVLDIR)
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
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
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
167 mLib-sym_CFLAGS = -DTREE=MLIB_SYM
171 posix_VARIANTS += hsearch1
172 posix-hsearch1_CFLAGS += -DTREE=POSIX_HSEARCH
173 posix_VARIANTS += hsearchg
174 posix-hsearchg_CFLAGS += -DTREE=POSIX_HSEARCH -DHSEARCH_INITSZ=1048576
175 posix_VARIANTS += tsearch
176 posix-tsearch_CFLAGS += -DTREE=POSIX_TSEARCH
179 c++-map_CXXFLAGS = -DTREE=CXX_MAP
180 c++_VARIANTS += uomap
181 c++-uomap_CXXFLAGS = -DTREE=CXX_UOMAP
183 rust_VARIANTS += btree
184 rust-btree_RUSTFLAGS = --cfg 'feature="btree"'
185 rust_VARIANTS += hash
186 rust-hash_RUSTFLAGS = --cfg 'feature="hash"'
188 ALL_VARIANTS += golang
189 TARGETS += chain.golang
190 CLEAN += chain.golang
191 chain.golang: chain.go
192 $(call v-tag,GOBUILD)$(GOBUILD) -o $@ $<
194 ALL_VARIANTS += perl python
196 lisp_VARIANTS = clisp cmucl ccl ecl sbcl
198 runlisp -L$1 chain.lisp -Ttime.$2.new $(DICT) >chain.$2.out
199 define def-lisp-variant
200 ALL_VARIANTS += lisp-$1
201 lisp-$1_PROGRAM = chain.lisp
202 lisp-$1_MEASURE = $$(call measure-lisp,$1,$$*)
204 $(foreach v,$(lisp_VARIANTS), \
205 $(eval $(call def-lisp-variant,$v)))
210 ALL_VARIANTS += $1-$2
211 TARGETS += chain.$1-$2
213 $1-$2_OBJS = chain.$1-$2.o \
214 $$(call objify,.o,$$($1_SRCS) $$($1-$2_SRCS))
215 run-$1-$2 = ./chain.$1-$2 <$$1
216 DEPOBJS += $$($1-$2_OBJS)
217 chain.$1-$2: $$($1-$2_OBJS)
218 $$(call v-tag,CCLD)$$(CCLD) $$(LDFLAGS) -o$$@ $$+ $$($1_LIBS)
219 chain.$1-$2.o: chain.c
220 $$(call compile-c,$$@,$$<,$$($1_CFLAGS) $$($1-$2_CFLAGS))
222 $(foreach t,$(TREELIBS), \
223 $(foreach v,$($t_VARIANTS), \
224 $(eval $(call def-c-variant,$t,$v))))
226 define def-c++-variant
227 ALL_VARIANTS += c++-$1
228 TARGETS += chain.c++-$1
229 CLEAN += chain.c++-$1
230 c++-$1_OBJS = chain.c++-$1.o
231 run-c++-$1 = ./chain.c++-$1 <$$1
232 DEPOBJS += $$(c++-$1_OBJS)
233 chain.c++-$1: $$(c++-$1_OBJS)
234 $$(call v-tag,CXXLD)$$(CXXLD) $$(LDFLAGS) -o$$@ $$+
235 chain.c++-$1.o: chain.cc
236 $$(call compile-c++,$$@,$$<,$$(c++-$1_CXXFLAGS))
238 $(foreach v,$(c++_VARIANTS), \
239 $(eval $(call def-c++-variant,$v)))
241 define def-rust-variant
242 ALL_VARIANTS += rust-$1
243 TARGETS += chain.rust-$1
244 CLEAN += chain.rust-$1
245 run-rust-$1 = ./chain.rust-$1 <$$1
246 chain.rust-$1: chain.rs $$(RUSTLIB_OBJS)
247 $$(call compile-rust,chain-$1,$$@,$$<, \
248 $$(foreach l,$$(RUSTLIBS), \
249 $$(rust-$1_RUSTFLAGS) --extern=$$l))
251 $(foreach v,$(rust_VARIANTS), \
252 $(eval $(call def-rust-variant,$v)))
256 $(call v-tag,GEN)./chain.perl $(DICT) >$@.new && mv $@.new $@
258 CLEAN += *.out *.new time.*
260 set -- $$($(TIME) -f"%U %S" 2>&1 ./chain.$* <$(DICT) >chain.$*.out) && \
261 { echo "$$1 $$2 + p" | dc; } >time.$*.new
264 $(call v-tag,CAT)cat $(DICT) >/dev/null
267 MEASURES = $(foreach v,$(ALL_VARIANTS), measure/$v)
269 $(MEASURES): measure/%: $$(or $$($$*_PROGRAM),chain.$$*) ref warm-cache
270 $(call v-tag,MEASURE)$(or $($*_MEASURE),$(COMMON_MEASURE)) && \
271 ./chkref chain.$*.out ref && mv time.$*.new time.$*
274 for i in $(ALL_VARIANTS); do echo $$i; done
277 .PHONY: measure $(MEASURES)
280 clean::; rm -f $(CLEAN)
282 -include $(DEPOBJS:.o=.d)