chiark / gitweb /
Much Makefile sorting-out
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 10 Oct 2020 17:08:38 +0000 (18:08 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 10 Oct 2020 17:08:38 +0000 (18:08 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Makefile

index e1ef891cca8bf4ca0e2b5869d5eb92f39c9b78a1..d227d4956eefad4023c2923212d455ebb4ab1937 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -10,81 +10,112 @@ SHELL=/bin/bash
 
 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,$^)
@@ -100,26 +131,26 @@ js-check: templates/bigfloat-tests.js
        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