chiark / gitweb /
More things.
[wordchain] / Makefile
index 33f909007bc3b892bb23a7cc1dee1883ff385431..d6522790c7733695f031b68ef230aa10f9731983 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -25,6 +25,10 @@ objify                        = $(addsuffix $1, \
 DEPOBJS                         =
 CLEAN                  += *.o *.d
 
+TIME                    = /usr/bin/time
+
+DICT                    = /usr/share/dict/british-english-insane
+
 SRCEXT                 += c
 CC                      = gcc
 CFLAGS                  = $(OPTIMIZE) $(WARNINGS)
@@ -50,12 +54,15 @@ compile-c++          = $(call v-tag,CXX)$(CXX) -c $(CFLAGS) $3 \
 
 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
@@ -63,10 +70,14 @@ 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, \
+$(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                   =
 
@@ -81,22 +92,30 @@ 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_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
@@ -195,23 +214,55 @@ 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,$$@,$$<, \
+       $$(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