DEPOBJS =
CLEAN += *.o *.d
+TIME = /usr/bin/time
+
+DICT = /usr/share/dict/british-english-insane
+
SRCEXT += c
CC = gcc
CFLAGS = $(OPTIMIZE) $(WARNINGS)
SRCEXT += rs
RUSTC = rustc
-RUSTFLAGS = --edition=2018 -L. $(OPTIMIZE_RUST)
+RUSTFLAGS = --edition=2018 -L$(abspath .) $(OPTIMIZE_RUST)
OPTIMIZE_RUST = -O
RUSTLIBS =
CARGODIR = /usr/share/cargo/registry
-compile-rust = $(call v-tag,RUSTC)$(RUSTC) $(RUSTFLAGS) $3 \
- -o$1 $2
+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
RUSTLIB_OBJS = $(foreach l,$(RUSTLIBS), lib$l.rlib)
CLEAN += $(RUSTLIB_OBJS)
-$(RUSTLIB_OBJS): lib%.rlib: $$($*_DEPS)
- $(call compile-rust,$@,$($*_DIR)/src/lib.rs, \
+$(RUSTLIB_OBJS): lib%.rlib: \
+ $$(or $$($$*_SRC), $$($$*_DIR)/src/lib.rs) $$($*_DEPS)
+ $(call compile-rust,$*,$@,$<, \
--crate-type=rlib --crate-name=$* $($*_RUSTFLAGS))
+SRCEXT += go
+GOBLD = go build
+
TREELIBS =
VPATH =
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_VARIANTS =
+
+qptrie_VARIANTS += qp-fanf qp-mdw qp-list
qptrie-qp_SRCS = qp.c
-qptrie-fn_SRCS = fn.c
-qptrie-qp-fanf_CFLAGS = -DTREE=QPTRIE_QP -DUSE_RECURSIVE_TNEXTL
+qptrie-qp-fanf_CFLAGS = -DTREE=QPTRIE_QP -DQPTRIE_ITER=QPITER_FANF
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_CFLAGS = -DTREE=QPTRIE_QP -DQPTRIE_ITER=QPITER_MDW
qptrie-qp-mdw_SRCS = $(qptrie-qp_SRCS)
-qptrie-fn-mdw_CFLAGS = -DTREE=QPTRIE_FN
+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
CLEAN += chain.rust-$1
run-rust-$1 = ./chain.rust-$1 <$$1
chain.rust-$1: chain.rs $$(RUSTLIB_OBJS)
- $$(call compile-rust,$$@,$$<, \
+ $$(call compile-rust,chain-$1,$$@,$$<, \
$$(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
+ALL_VARIANTS += golang
+TARGETS += chain.golang
+CLEAN += chain.golang
+chain.golang: chain.go
+ $(call v-tag,GOBLD)$(GOBLD) -o $@ $<
+
+ALL_VARIANTS += perl python
+
+lisp_VARIANTS = 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)))
+
+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/%: chain.%
- $TIME -f%U
-.PHONY: 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.$*
+.PHONY: measure $(MEASURES)
all: $(TARGETS)
clean::; rm -f $(CLEAN)
-include $(DEPOBJS:.o=.d)
+p:; : $x