### -*-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 TIME = /usr/bin/time DICT = /usr/share/dict/british-english-insane 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$(abspath .) $(OPTIMIZE_RUST) OPTIMIZE_RUST = -O RUSTLIBS = CARGODIR = /usr/share/cargo/registry compile-rust = +$(call v-tag,RUSTC)\ rm -rf rusttmp.$1 && mkdir rusttmp.$1 && \ $(RUSTC) $(RUSTFLAGS) $4 \ -orusttmp.$1/$2 $3 && \ mv rusttmp.$1/$2 . && rmdir rusttmp.$1 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: \ $$(or $$($$*_SRC), $$($$*_DIR)/src/lib.rs) $$($*_DEPS) $(call compile-rust,$*,$@,$<, \ --crate-type=rlib --crate-name=$* $($*_RUSTFLAGS)) SRCEXT += go GOBUILD = go build TREELIBS = VPATH = TREELIBS += xyla xyla_VARIANTS = avl rb splay treap XYLADIR = $(HOME)/src/xyla xyla_LIBS := $(shell pkg-config --libs xyla) xyla_CFLAGS := $(shell pkg-config --cflags xyla) 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 QPDIR = $(HOME)/src/ext/qp VPATH += $(QPDIR) CFLAGS += -mpopcnt qptrie_CFLAGS = -I$(QPDIR) qptrie_SRCS = Tbl.c qptrie_VARIANTS = qptrie_VARIANTS += qp-fanf qp-mdw qp-list qptrie-qp_SRCS = qp.c qptrie-qp-fanf_CFLAGS = -DTREE=QPTRIE_QP -DQPTRIE_ITER=QPITER_FANF qptrie-qp-fanf_SRCS = $(qptrie-qp_SRCS) qptrie-qp-mdw_CFLAGS = -DTREE=QPTRIE_QP -DQPTRIE_ITER=QPITER_MDW qptrie-qp-mdw_SRCS = $(qptrie-qp_SRCS) qptrie-qp-list_CFLAGS = -DTREE=QPTRIE_QP -DQPTRIE_ITER=QPITER_LIST qptrie-qp-list_SRCS = $(qptrie-qp_SRCS) qptrie_VARIANTS += fn-fanf fn-mdw fn-list qptrie-fn_SRCS = fn.c qptrie-fn-fanf_CFLAGS = -DTREE=QPTRIE_FN -DQPTRIE_ITER=QPITER_FANF qptrie-fn-fanf_SRCS = $(qptrie-fn_SRCS) qptrie-fn-mdw_CFLAGS = -DTREE=QPTRIE_FN -DQPTRIE_ITER=QPITER_MDW qptrie-fn-mdw_SRCS = $(qptrie-fn_SRCS) qptrie-fn-list_CFLAGS = -DTREE=QPTRIE_FN -DQPTRIE_ITER=QPITER_LIST qptrie-fn-list_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 TREELIBS += posix posix_VARIANTS = posix_VARIANTS += hsearch1 posix-hsearch1_CFLAGS += -DTREE=POSIX_HSEARCH posix_VARIANTS += hsearchg posix-hsearchg_CFLAGS += -DTREE=POSIX_HSEARCH -DHSEARCH_INITSZ=1048576 posix_VARIANTS += tsearch posix-tsearch_CFLAGS += -DTREE=POSIX_TSEARCH c++_VARIANTS += map c++-map_CXXFLAGS = -DTREE=CXX_MAP c++_VARIANTS += uomap c++-uomap_CXXFLAGS = -DTREE=CXX_UOMAP rust_VARIANTS += btree rust-btree_RUSTFLAGS = --cfg 'feature="btree"' rust_VARIANTS += hash rust-hash_RUSTFLAGS = --cfg 'feature="hash"' ALL_VARIANTS += golang TARGETS += chain.golang CLEAN += chain.golang chain.golang: chain.go $(call v-tag,GOBUILD)$(GOBUILD) -o $@ $< ALL_VARIANTS += perl python lisp_VARIANTS = clisp cmucl ccl ecl sbcl measure-lisp = \ runlisp -L$1 chain.lisp -Ttime.$2.new $(DICT) >chain.$2.out define def-lisp-variant ALL_VARIANTS += lisp-$1 lisp-$1_PROGRAM = chain.lisp lisp-$1_MEASURE = $$(call measure-lisp,$1,$$*) endef $(foreach v,$(lisp_VARIANTS), \ $(eval $(call def-lisp-variant,$v))) -include local.mk 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)))) 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))) 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,chain-$1,$$@,$$<, \ $$(foreach l,$$(RUSTLIBS), \ $$(rust-$1_RUSTFLAGS) --extern=$$l)) endef $(foreach v,$(rust_VARIANTS), \ $(eval $(call def-rust-variant,$v))) CLEAN += ref ref: $(DICT) $(call v-tag,GEN)./chain.perl $(DICT) >$@.new && mv $@.new $@ CLEAN += *.out *.new time.* COMMON_MEASURE = \ set -- $$($(TIME) -f"%U %S" 2>&1 ./chain.$* <$(DICT) >chain.$*.out) && \ { echo "$$1 $$2 + p" | dc; } >time.$*.new warm-cache: $(call v-tag,CAT)cat $(DICT) >/dev/null .PHONY: warm-cache MEASURES = $(foreach v,$(ALL_VARIANTS), measure/$v) measure: $(MEASURES) $(MEASURES): measure/%: $$(or $$($$*_PROGRAM),chain.$$*) ref warm-cache $(call v-tag,MEASURE)$(or $($*_MEASURE),$(COMMON_MEASURE)) && \ ./chkref chain.$*.out ref && mv time.$*.new time.$* list: for i in $(ALL_VARIANTS); do echo $$i; done .PHONY: list .PHONY: measure $(MEASURES) all: $(TARGETS) clean::; rm -f $(CLEAN) -include $(DEPOBJS:.o=.d) p:; : $x