chiark / gitweb /
Makefile, chain.c: Use Xyla found using `pkg-config'.
[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/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
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 TREELIBS                += posix
170 posix_VARIANTS           =
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
177
178 c++_VARIANTS            += map
179 c++-map_CXXFLAGS         = -DTREE=CXX_MAP
180 c++_VARIANTS            += uomap
181 c++-uomap_CXXFLAGS       = -DTREE=CXX_UOMAP
182
183 rust_VARIANTS           += btree
184 rust-btree_RUSTFLAGS     = --cfg 'feature="btree"'
185 rust_VARIANTS           += hash
186 rust-hash_RUSTFLAGS      = --cfg 'feature="hash"'
187
188 ALL_VARIANTS            += golang
189 TARGETS                 += chain.golang
190 CLEAN                   += chain.golang
191 chain.golang: chain.go
192         $(call v-tag,GOBUILD)$(GOBUILD) -o $@ $<
193
194 ALL_VARIANTS            += perl python
195
196 lisp_VARIANTS            = clisp cmucl ccl ecl sbcl
197 measure-lisp             = \
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,$$*)
203 endef
204 $(foreach v,$(lisp_VARIANTS), \
205         $(eval $(call def-lisp-variant,$v)))
206
207 -include local.mk
208
209 define def-c-variant
210 ALL_VARIANTS            += $1-$2
211 TARGETS                 += chain.$1-$2
212 CLEAN                   += 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))
221 endef
222 $(foreach t,$(TREELIBS), \
223         $(foreach v,$($t_VARIANTS), \
224                 $(eval $(call def-c-variant,$t,$v))))
225
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))
237 endef
238 $(foreach v,$(c++_VARIANTS), \
239         $(eval $(call def-c++-variant,$v)))
240
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))
250 endef
251 $(foreach v,$(rust_VARIANTS), \
252         $(eval $(call def-rust-variant,$v)))
253
254 CLEAN                   += ref
255 ref: $(DICT)
256         $(call v-tag,GEN)./chain.perl $(DICT) >$@.new && mv $@.new $@
257
258 CLEAN                   += *.out *.new time.*
259 COMMON_MEASURE           = \
260         set -- $$($(TIME) -f"%U %S" 2>&1 ./chain.$* <$(DICT) >chain.$*.out) && \
261                 { echo "$$1 $$2 + p" | dc; } >time.$*.new
262
263 warm-cache:
264         $(call v-tag,CAT)cat $(DICT) >/dev/null
265 .PHONY: warm-cache
266
267 MEASURES                 = $(foreach v,$(ALL_VARIANTS), measure/$v)
268 measure: $(MEASURES)
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.$*
272
273 list:
274         for i in $(ALL_VARIANTS); do echo $$i; done
275 .PHONY: list
276
277 .PHONY: measure $(MEASURES)
278 all: $(TARGETS)
279
280 clean::; rm -f $(CLEAN)
281
282 -include $(DEPOBJS:.o=.d)
283 p:; : $x