### -*-makefile-*- all: TARGETS = clean:: CLEAN = .PHONY: all clean .SECONDEXPANSION: SRCEXT = V = 0 v-tag = $(call v-tag.$V,$1) v-tag.0 = @printf " %-8s %s\n" '$1' '$@'; V_AT = $(V_AT.$V) V_AT.0 = @ objify = $(addsuffix $1, \ $(basename \ $(filter $(addprefix %.,$(SRCEXT)), \ $2))) DEPOBJS = CLEAN += *.o *.d SRCEXT += c CC = gcc CFLAGS = $(OPTIMIZE) $(WARNINGS) CCLD = $(CC) LDFLAGS = OPTIMIZE = -O2 -g3 -fno-omit-frame-pointer WARNINGS = -pedantic -Wall SRCEXT += cc CXX = g++ CXXFLAGS = $(CFLAGS) CXXLD = $(CXX) compile-c = $(call v-tag,CC)$(CC) -c $(CFLAGS) $3 \ -MD -MF $(1:.o=.d) -o$1 $2 %.o: %.c $(call compile-c,$@,$<) compile-c++ = $(call v-tag,CXX)$(CXX) -c $(CFLAGS) $3 \ -MD -MF $(1:.o=.d) -o$1 $2 %.o: %.cc $(call compile-c++,$@,$<) SRCEXT += rs RUSTC = rustc RUSTFLAGS = --edition=2018 -L. $(OPTIMIZE_RUST) OPTIMIZE_RUST = -O RUSTLIBS = CARGODIR = /usr/share/cargo/registry compile-rust = $(call v-tag,RUSTC)$(RUSTC) $(RUSTFLAGS) $3 \ -o$1 $2 RUSTLIBS += typed_arena typed_arena_DIR = $(CARGODIR)/typed-arena-2.0.0 typed_arena_RUSTFLAGS = --cfg 'feature="std"' RUSTLIB_OBJS = $(foreach l,$(RUSTLIBS), lib$l.rlib) CLEAN += $(RUSTLIB_OBJS) $(RUSTLIB_OBJS): lib%.rlib: $$($*_DEPS) $(call compile-rust,$@,$($*_DIR)/src/lib.rs, \ --crate-type=rlib --crate-name=$* $($*_RUSTFLAGS)) TREELIBS = VPATH = TREELIBS += xyla xyla_VARIANTS = avl rb splay treap XYLADIR = $(HOME)/src/libxyla xyla_LIBS = $(XYLADIR)/build/.libs/libxyla.a xyla_CFLAGS = -I$(XYLADIR) xyla-avl_CFLAGS = -DTREE=XYLA_AVL xyla-rb_CFLAGS = -DTREE=XYLA_RB xyla-splay_CFLAGS = -DTREE=XYLA_SPLAY xyla-treap_CFLAGS = -DTREE=XYLA_TREAP TREELIBS += qptrie qptrie_VARIANTS = qp-fanf qp-mdw fn-fanf fn-mdw QPDIR = $(HOME)/src/ext/qp VPATH += $(QPDIR) CFLAGS += -mpopcnt qptrie_CFLAGS = -I$(QPDIR) qptrie_SRCS = Tbl.c qptrie-qp_SRCS = qp.c qptrie-fn_SRCS = fn.c qptrie-qp-fanf_CFLAGS = -DTREE=QPTRIE_QP -DUSE_RECURSIVE_TNEXTL qptrie-qp-fanf_SRCS = $(qptrie-qp_SRCS) qptrie-fn-fanf_CFLAGS = -DTREE=QPTRIE_FN -DUSE_RECURSIVE_TNEXTL qptrie-fn-fanf_SRCS = $(qptrie-fn_SRCS) qptrie-qp-mdw_CFLAGS = -DTREE=QPTRIE_QP qptrie-qp-mdw_SRCS = $(qptrie-qp_SRCS) qptrie-fn-mdw_CFLAGS = -DTREE=QPTRIE_FN qptrie-fn-mdw_SRCS = $(qptrie-fn_SRCS) TREELIBS += sgt sgt_VARIANTS = tree234 SGTDIR = $(HOME)/src/sgt/puzzles VPATH += $(SGTDIR) sgt_CFLAGS = -I$(SGTDIR) sgt-tree234_CFLAGS = -DTREE=SGT_TREE234 sgt-tree234_SRCS = tree234.c malloc.c nullfe.c TREELIBS += libavl libavl_VARIANTS = LIBAVLDIR = $(HOME)/src/ext/avl VPATH += $(LIBAVLDIR) libavl_CFLAGS = -I$(LIBAVLDIR) libavl_VARIANTS += avl pavl rtavl tavl libavl-avl_CFLAGS = -DTREE=LIBAVL_AVL libavl-avl_SRCS = avl.c libavl-pavl_CFLAGS = -DTREE=LIBAVL_PAVL libavl-pavl_SRCS = pavl.c libavl-rtavl_CFLAGS = -DTREE=LIBAVL_RTAVL libavl-rtavl_SRCS = rtavl.c libavl-tavl_CFLAGS = -DTREE=LIBAVL_TAVL libavl-tavl_SRCS = tavl.c libavl_VARIANTS += rb prb rtrb trb libavl-rb_CFLAGS = -DTREE=LIBAVL_RB libavl-rb_SRCS = rb.c libavl-prb_CFLAGS = -DTREE=LIBAVL_PRB libavl-prb_SRCS = prb.c libavl-rtrb_CFLAGS = -DTREE=LIBAVL_RTRB libavl-rtrb_SRCS = rtrb.c libavl-trb_CFLAGS = -DTREE=LIBAVL_TRB libavl-trb_SRCS = trb.c #libavl_VARIANTS += bst pbst rtbst tbst libavl-bst_CFLAGS = -DTREE=LIBAVL_BST libavl-bst_SRCS = bst.c libavl-pbst_CFLAGS = -DTREE=LIBAVL_PBST libavl-pbst_SRCS = pbst.c libavl-rtbst_CFLAGS = -DTREE=LIBAVL_RTBST libavl-rtbst_SRCS = rtbst.c libavl-tbst_CFLAGS = -DTREE=LIBAVL_TBST libavl-tbst_SRCS = tbst.c TREELIBS += mLib mLib_VARIANTS = sym mLib_LIBS = -lmLib mLib-sym_CFLAGS = -DTREE=MLIB_SYM define def-c-variant ALL_VARIANTS += $1-$2 TARGETS += chain.$1-$2 CLEAN += chain.$1-$2 $1-$2_OBJS = chain.$1-$2.o \ $$(call objify,.o,$$($1_SRCS) $$($1-$2_SRCS)) run-$1-$2 = ./chain.$1-$2 <$$1 DEPOBJS += $$($1-$2_OBJS) chain.$1-$2: $$($1-$2_OBJS) $$(call v-tag,CCLD)$$(CCLD) $$(LDFLAGS) -o$$@ $$+ $$($1_LIBS) chain.$1-$2.o: chain.c $$(call compile-c,$$@,$$<,$$($1_CFLAGS) $$($1-$2_CFLAGS)) endef $(foreach t,$(TREELIBS), \ $(foreach v,$($t_VARIANTS), \ $(eval $(call def-c-variant,$t,$v)))) c++_VARIANTS += map c++-map_CXXFLAGS = -DTREE=CXX_MAP c++_VARIANTS += uomap c++-uomap_CXXFLAGS = -DTREE=CXX_UOMAP define def-c++-variant ALL_VARIANTS += c++-$1 TARGETS += chain.c++-$1 CLEAN += chain.c++-$1 c++-$1_OBJS = chain.c++-$1.o run-c++-$1 = ./chain.c++-$1 <$$1 DEPOBJS += $$(c++-$1_OBJS) chain.c++-$1: $$(c++-$1_OBJS) $$(call v-tag,CXXLD)$$(CXXLD) $$(LDFLAGS) -o$$@ $$+ chain.c++-$1.o: chain.cc $$(call compile-c++,$$@,$$<,$$(c++-$1_CXXFLAGS)) endef $(foreach v,$(c++_VARIANTS), \ $(eval $(call def-c++-variant,$v))) rust_VARIANTS += btree rust-btree_RUSTFLAGS = --cfg 'feature="btree"' rust_VARIANTS += hash rust-hash_RUSTFLAGS = --cfg 'feature="hash"' define def-rust-variant ALL_VARIANTS += rust-$1 TARGETS += chain.rust-$1 CLEAN += chain.rust-$1 run-rust-$1 = ./chain.rust-$1 <$$1 chain.rust-$1: chain.rs $$(RUSTLIB_OBJS) $$(call compile-rust,$$@,$$<, \ $$(foreach l,$$(RUSTLIBS), \ $$(rust-$1_RUSTFLAGS) --extern=$$l)) endef $(foreach v,$(rust_VARIANTS), \ $(eval $(call def-rust-variant,$v))) DICT = /usr/share/dict/british-english-insane MEASURES = $(foreach v,$(ALL_VARIANTS), measure/$v) measure: $(MEASURES) $(MEASURES): measure/%: chain.% $TIME -f%U .PHONY: measure $(MEASURES) all: $(TARGETS) clean::; rm -f $(CLEAN) -include $(DEPOBJS:.o=.d)