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 CFLAGS = $(OPTIMIZE) $(WARNINGS)
33 OPTIMIZE = -O2 -g3 -fno-omit-frame-pointer
34 WARNINGS = -pedantic -Wall
41 compile-c = $(call v-tag,CC)$(CC) -c $(CFLAGS) $3 \
42 -MD -MF $(1:.o=.d) -o$1 $2
44 $(call compile-c,$@,$<)
46 compile-c++ = $(call v-tag,CXX)$(CXX) -c $(CFLAGS) $3 \
47 -MD -MF $(1:.o=.d) -o$1 $2
49 $(call compile-c++,$@,$<)
53 RUSTFLAGS = --edition=2018 -L. $(OPTIMIZE_RUST)
56 CARGODIR = /usr/share/cargo/registry
57 compile-rust = $(call v-tag,RUSTC)$(RUSTC) $(RUSTFLAGS) $3 \
60 RUSTLIBS += typed_arena
61 typed_arena_DIR = $(CARGODIR)/typed-arena-2.0.0
62 typed_arena_RUSTFLAGS = --cfg 'feature="std"'
64 RUSTLIB_OBJS = $(foreach l,$(RUSTLIBS), lib$l.rlib)
65 CLEAN += $(RUSTLIB_OBJS)
66 $(RUSTLIB_OBJS): lib%.rlib: $$($*_DEPS)
67 $(call compile-rust,$@,$($*_DIR)/src/lib.rs, \
68 --crate-type=rlib --crate-name=$* $($*_RUSTFLAGS))
74 xyla_VARIANTS = avl rb splay treap
75 XYLADIR = $(HOME)/src/libxyla
76 xyla_LIBS = $(XYLADIR)/build/.libs/libxyla.a
77 xyla_CFLAGS = -I$(XYLADIR)
78 xyla-avl_CFLAGS = -DTREE=XYLA_AVL
79 xyla-rb_CFLAGS = -DTREE=XYLA_RB
80 xyla-splay_CFLAGS = -DTREE=XYLA_SPLAY
81 xyla-treap_CFLAGS = -DTREE=XYLA_TREAP
84 qptrie_VARIANTS = qp-fanf qp-mdw fn-fanf fn-mdw
85 QPDIR = $(HOME)/src/ext/qp
88 qptrie_CFLAGS = -I$(QPDIR)
92 qptrie-qp-fanf_CFLAGS = -DTREE=QPTRIE_QP -DUSE_RECURSIVE_TNEXTL
93 qptrie-qp-fanf_SRCS = $(qptrie-qp_SRCS)
94 qptrie-fn-fanf_CFLAGS = -DTREE=QPTRIE_FN -DUSE_RECURSIVE_TNEXTL
95 qptrie-fn-fanf_SRCS = $(qptrie-fn_SRCS)
96 qptrie-qp-mdw_CFLAGS = -DTREE=QPTRIE_QP
97 qptrie-qp-mdw_SRCS = $(qptrie-qp_SRCS)
98 qptrie-fn-mdw_CFLAGS = -DTREE=QPTRIE_FN
99 qptrie-fn-mdw_SRCS = $(qptrie-fn_SRCS)
102 sgt_VARIANTS = tree234
103 SGTDIR = $(HOME)/src/sgt/puzzles
105 sgt_CFLAGS = -I$(SGTDIR)
106 sgt-tree234_CFLAGS = -DTREE=SGT_TREE234
107 sgt-tree234_SRCS = tree234.c malloc.c nullfe.c
111 LIBAVLDIR = $(HOME)/src/ext/avl
112 VPATH += $(LIBAVLDIR)
113 libavl_CFLAGS = -I$(LIBAVLDIR)
115 libavl_VARIANTS += avl pavl rtavl tavl
116 libavl-avl_CFLAGS = -DTREE=LIBAVL_AVL
117 libavl-avl_SRCS = avl.c
118 libavl-pavl_CFLAGS = -DTREE=LIBAVL_PAVL
119 libavl-pavl_SRCS = pavl.c
120 libavl-rtavl_CFLAGS = -DTREE=LIBAVL_RTAVL
121 libavl-rtavl_SRCS = rtavl.c
122 libavl-tavl_CFLAGS = -DTREE=LIBAVL_TAVL
123 libavl-tavl_SRCS = tavl.c
125 libavl_VARIANTS += rb prb rtrb trb
126 libavl-rb_CFLAGS = -DTREE=LIBAVL_RB
127 libavl-rb_SRCS = rb.c
128 libavl-prb_CFLAGS = -DTREE=LIBAVL_PRB
129 libavl-prb_SRCS = prb.c
130 libavl-rtrb_CFLAGS = -DTREE=LIBAVL_RTRB
131 libavl-rtrb_SRCS = rtrb.c
132 libavl-trb_CFLAGS = -DTREE=LIBAVL_TRB
133 libavl-trb_SRCS = trb.c
135 #libavl_VARIANTS += bst pbst rtbst tbst
136 libavl-bst_CFLAGS = -DTREE=LIBAVL_BST
137 libavl-bst_SRCS = bst.c
138 libavl-pbst_CFLAGS = -DTREE=LIBAVL_PBST
139 libavl-pbst_SRCS = pbst.c
140 libavl-rtbst_CFLAGS = -DTREE=LIBAVL_RTBST
141 libavl-rtbst_SRCS = rtbst.c
142 libavl-tbst_CFLAGS = -DTREE=LIBAVL_TBST
143 libavl-tbst_SRCS = tbst.c
148 mLib-sym_CFLAGS = -DTREE=MLIB_SYM
151 ALL_VARIANTS += $1-$2
152 TARGETS += chain.$1-$2
154 $1-$2_OBJS = chain.$1-$2.o \
155 $$(call objify,.o,$$($1_SRCS) $$($1-$2_SRCS))
156 run-$1-$2 = ./chain.$1-$2 <$$1
157 DEPOBJS += $$($1-$2_OBJS)
158 chain.$1-$2: $$($1-$2_OBJS)
159 $$(call v-tag,CCLD)$$(CCLD) $$(LDFLAGS) -o$$@ $$+ $$($1_LIBS)
160 chain.$1-$2.o: chain.c
161 $$(call compile-c,$$@,$$<,$$($1_CFLAGS) $$($1-$2_CFLAGS))
163 $(foreach t,$(TREELIBS), \
164 $(foreach v,$($t_VARIANTS), \
165 $(eval $(call def-c-variant,$t,$v))))
168 c++-map_CXXFLAGS = -DTREE=CXX_MAP
169 c++_VARIANTS += uomap
170 c++-uomap_CXXFLAGS = -DTREE=CXX_UOMAP
172 define def-c++-variant
173 ALL_VARIANTS += c++-$1
174 TARGETS += chain.c++-$1
175 CLEAN += chain.c++-$1
176 c++-$1_OBJS = chain.c++-$1.o
177 run-c++-$1 = ./chain.c++-$1 <$$1
178 DEPOBJS += $$(c++-$1_OBJS)
179 chain.c++-$1: $$(c++-$1_OBJS)
180 $$(call v-tag,CXXLD)$$(CXXLD) $$(LDFLAGS) -o$$@ $$+
181 chain.c++-$1.o: chain.cc
182 $$(call compile-c++,$$@,$$<,$$(c++-$1_CXXFLAGS))
184 $(foreach v,$(c++_VARIANTS), \
185 $(eval $(call def-c++-variant,$v)))
187 rust_VARIANTS += btree
188 rust-btree_RUSTFLAGS = --cfg 'feature="btree"'
189 rust_VARIANTS += hash
190 rust-hash_RUSTFLAGS = --cfg 'feature="hash"'
192 define def-rust-variant
193 ALL_VARIANTS += rust-$1
194 TARGETS += chain.rust-$1
195 CLEAN += chain.rust-$1
196 run-rust-$1 = ./chain.rust-$1 <$$1
197 chain.rust-$1: chain.rs $$(RUSTLIB_OBJS)
198 $$(call compile-rust,$$@,$$<, \
199 $$(foreach l,$$(RUSTLIBS), \
200 $$(rust-$1_RUSTFLAGS) --extern=$$l))
202 $(foreach v,$(rust_VARIANTS), \
203 $(eval $(call def-rust-variant,$v)))
205 DICT = /usr/share/dict/british-english-insane
207 MEASURES = $(foreach v,$(ALL_VARIANTS), measure/$v)
209 $(MEASURES): measure/%: chain.%
211 .PHONY: measure $(MEASURES)
215 clean::; rm -f $(CLEAN)
217 -include $(DEPOBJS:.o=.d)