default: debug
+#---------- funky macros etc. ----------
+
+cr = $(addprefix --,$(filter-out debug,$1))
+
+#---------- programs and config variables ----------
+
CARGO ?= cargo
CARGO_TARGET_DIR ?= target
+
USVG ?= usvg
USVG_OPTIONS = "--sans-serif-family=DejaVu Sans"
+BUNDLE_SOURCES ?= bundle-rust-sources
+
+DEPLOY_ARCH=x86_64-unknown-linux-musl
+DEPLOY_RELEASE=debug
+DEPLOY_TARGET_DIR=$(CARGO_TARGET_DIR)/$(addsuffix /,$(DEPLOY_ARCH))$(DEPLOY_RELEASE)
+
+#---------- nailing-cargo ----------
+
ifneq (,$(wildcard(../Cargo.nail)))
+
NAILING_CARGO = nailing-cargo
CARGO = $(NAILING_CARGO)
-CARGO_TARGET_DIR = ../Build/$(notdir $(PWD))/target
+BUILD_SUBDIR ?= ../Build
+CARGO_TARGET_DIR = $(BUILD_SUBDIR)/$(notdir $(PWD))/target
-BUNDLE_SOURCES_DIR = ../bundle-sources
-BUNDLE_SOURCES = ../Build/bundle-sources/target/debug/bundle-rust-sources
+BUNDLE_SOURCES_CMD ?= $(NAILING_CARGO) --- $(BUNDLE_SOURCES)
+USVG_CMD ?= $(NAILING_CARGO) --just-run -q --- $(USVG)
-USVG_BINARY = ../resvg/target/release/usvg
-USVG = $(NAILING_CARGO) --just-run -q --- $(USVG_BINARY)
-# To build usvg
-# zealot:resvg$ nailing-cargo build -p usvg --release
+endif # Cargo.nail
-ifneq (,$(wildcard $(BUNDLE_SOURCES_DIR)))
-$(BUNDLE_SOURCES):
- cd ../bundle-sources && $(CARGO) build
-.PHONY: $(BUNDLE_SOURCES)
-endif
-endif
+BUILD_SUBDIR ?= ../Build
+BUNDLE_SOURCES_CMD ?= $(BUNDLE_SOURCES)
+USVG_CMD ?= =$(USVG)
-include $(wildcard library/*/files.make)
+#---------- local programs ----------
-USVG_PROCESSOR = usvg-processor
-LIBRARY_PROCESS_SVG = ./$(USVG_PROCESSOR) $@ $(wordlist 1,2,$^) '$(USVG) $(USVG_OPTIONS)'
-$(LIBRARY_FILES): $(USVG_PROCESSOR) Makefile
+define lp
+$(if $(wildcard $(BUILD_SUBDIR)/$2),
+$(shell echo >&2 'Makefile: lp: Using program $4 from $(BUILD_SUBDIR)/$2')
+$1 := $(abspath $(BUILD_SUBDIR)/$2/target/$3/$4)
+$(abspath $(BUILD_SUBDIR)/$2/target/$3/$4):; cd ../$2 && $$(CARGO) build $(call cr,$3)
+)
+endef
-TS_SRCS= script bigfloat
-TS_SRC_FILES= $(addprefix templates/,$(addsuffix .ts,$(TS_SRCS)))
+$(eval $(call lp,BUNDLE_SOURCES,bundle-sources,debug,bundle-rust-sources))
+$(eval $(call lp,USVG,resvg,release,usvg))
-LITFILES= LICENCE AGPLv3
-TXTFILES= CC-BY-SA-3.0 CC-BY-SA-4.0
+#---------- variables defining bits of source etc. ----------
-FILEASSETS = $(addprefix templates/,$(LITFILES) $(TXTFILES))
+PROGRAMS=daemon-otter otter
-assets: templates/script.js libraries $(FILEASSETS)
+FILEASSETS = $(addprefix templates/,$(LITFILES) $(TXTFILES))
-$(addprefix templates/,$(LITFILES)): templates/%: %;
- cp $< $@.new && mv -f $@.new $@
+WASM := wasm32-unknown-unknown
-$(addprefix templates/,$(TXTFILES)): templates/%: %.txt
- cp $< $@.new && mv -f $@.new $@
+#---------- toplevel aggregate targets ----------
-libraries: $(LIBRARY_FILES)
+check: cargo/check js-check
+ @echo 'All tests passed.'
-debug release:: %: cargo-% assets extra-%
-cargo-debug cargo-release:: cargo-%: $(CARGO_TARGET_DIR)/%/server
- @echo Built $@.
-.PHONY: $(CARGO_TARGET_DIR)/debug/server
-.PHONY: $(CARGO_TARGET_DIR)/release/server
+debug release:: %: cargo/% assets extra-%
-check: cargo-check js-check
- @echo 'All tests passed.'
+assets: templates/script.js libraries $(FILEASSETS)
extra-debug:
extra-release: bundled-sources
+#---------- cargo ----------
+
+CARGOES=$(foreach t, / /wasm- , \
+ $(addprefix $t, , \
+ check debug release))
+
+.PHONY: $(addprefix cargo, $(CARGOES))
+
+cargo/check cargo/debug:: cargo/%:; $(CARGO) test $(call cr,$*)
+cargo/wasm-%:; $(CARGO) -TWASM build -p otter-wasm $(call cr,$*)
+cargo/deploy-build: $(CARGO) -T$(DEPLOY_ARCH) build $(call cr,$(DEPLOY_RELEASE))
+
+#---------- bundle-sources ----------
+
bundled-sources: $(CARGO_TARGET_DIR)/bundled-sources
$(CARGO_TARGET_DIR)/bundled-sources: $(BUNDLE_SOURCES)
- nailing-cargo --- $(abspath $(BUNDLE_SOURCES)) --output $(abspath $@)
+ $(BUNDLE_SOURCES_CMD) --output $(abspath $@)
@echo Bundled sources.
.PHONY: bundle-sources $(CARGO_TARGET_DIR)/bundled-sources
-cargo-check:
- $(CARGO) test
+#---------- svg processing ----------
+
+include $(wildcard library/*/files.make)
+
+USVG_PROCESSOR = usvg-processor
+LIBRARY_PROCESS_SVG = ./$(USVG_PROCESSOR) $@ $(wordlist 1,2,$^) '$(USVG_CMD) $(USVG_OPTIONS)'
+$(LIBRARY_FILES): $(USVG_PROCESSOR) $(USVG_BINARY) Makefile
+
+# actual command for each of $(LIBRARY_FILES) is in one of the files.make
-$(CARGO_TARGET_DIR)/debug/server:
- $(CARGO) build
+#---------- typescript ----------
+
+TS_SRCS= script bigfloat
+TS_SRC_FILES= $(addprefix templates/,$(addsuffix .ts,$(TS_SRCS)))
-$(CARGO_TARGET_DIR)/release/server:
- $(CARGO) build --release
+LITFILES= LICENCE AGPLv3
+TXTFILES= CC-BY-SA-3.0 CC-BY-SA-4.0
templates/%.js: tsc-wrap tsconfig.json
./tsc-wrap $@ tsconfig.json $(filter %.ts,$^)
nodejs <$<
@echo 'nodejs check $< ok'
-DEPLOY_ARCH=x86_64-unknown-linux-musl
-DEPLOY_RELEASE=debug
-DEPLOY_TARGET_DIR=$(CARGO_TARGET_DIR)/$(addsuffix /,$(DEPLOY_ARCH))$(DEPLOY_RELEASE)
+#---------- other templates ----------
+
+$(addprefix templates/,$(LITFILES)): templates/%: %;
+ cp $< $@.new && mv -f $@.new $@
-deploy-build: $(DEPLOY_TARGET_DIR)/server
-ifneq (,$(DEPLOY_ARCH))
-$(DEPLOY_TARGET_DIR)/server:
- $(CARGO) -T$(DEPLOY_ARCH) build $(addprefix --,$(filter-out debug,$(DEPLOY_RELEASE)))
- @echo Built $@.
-.PHONY: $(DEPLOY_TARGET_DIR)/server
-endif
+$(addprefix templates/,$(TXTFILES)): templates/%: %.txt
+ cp $< $@.new && mv -f $@.new $@
-PROGRAMS=daemon-otter otter
+libraries: $(LIBRARY_FILES)
+
+#---------- deployment ----------
DEPLOY_BASE=Otter@login.chiark.greenend.org.uk:/volatile/Otter
-deploy: deploy-build bundled-sources
+deploy: cargo/deploy-build bundled-sources
rsync -zv --progress $(addprefix $(DEPLOY_TARGET_DIR)/,$(PROGRAMS)) $(DEPLOY_BASE)/bin/
rsync -rv --progress $(CARGO_TARGET_DIR)/bundled-sources/. $(DEPLOY_BASE)/bundled-sources
+#---------- clean ----------
+
clean:
rm -f templates/script.js library/*/*.usvg
rm -rf target