diff options
Diffstat (limited to '.Makefile')
-rw-r--r-- | .Makefile | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/.Makefile b/.Makefile new file mode 100644 index 00000000..ecb3b2f8 --- /dev/null +++ b/.Makefile @@ -0,0 +1,167 @@ +# Makefile for Sequoia. + +# Configuration. +PREFIX ?= /usr/local +DESTDIR ?= +CARGO_FLAGS ?= +# cargo's "target" directory. Normally, this is in the root +# directory of the project, but it can be overridden by setting +# CARGO_TARGET_DIR. +CARGO_TARGET_DIR ?= $(shell pwd)/target +# We currently only support absolute paths. +CARGO_TARGET_DIR := $(abspath $(CARGO_TARGET_DIR)) +# The packages to build, test and document, e.g., "-p sequoia-openpgp" +CARGO_PACKAGES ?= --workspace +# Additional arguments to pass to cargo test, e.g., "--doc". +CARGO_TEST_ARGS ?= +# Version as stated in the top-level Cargo.toml. +VERSION ?= $(shell grep '^version[[:space:]]*=[[:space:]]*' openpgp/Cargo.toml\ + | cut -d'"' -f2) + +# Signing source distributions. +SIGN_WITH ?= XXXXXXXXXXXXXXXX + +# Tools. +CARGO ?= cargo +GIT ?= git +TAR ?= tar +GZIP ?= gzip +XZ ?= xz +GPG ?= gpg +CODESPELL ?= codespell +CODESPELL_FLAGS ?= --disable-colors --write-changes + +SOURCE_DATE_EPOCH = $(shell git show -s --no-show-signature --format=%cI) +TAR_FLAGS = --sort=name \ + --mtime="$(SOURCE_DATE_EPOCH)" \ + --owner=0 --group=0 --numeric-owner \ + --mode=go=rX,u+rw,a-s \ + --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime + +ifneq ($(filter Darwin %BSD,$(shell uname -s)),) + INSTALL ?= ginstall +else + INSTALL ?= install +endif + +VERSION ?= $(shell grep '^version[[:space:]]*=[[:space:]]*' Cargo.toml | cut -d'"' -f2) + +# Make sure subprocesses pick these up. +export PREFIX +export DESTDIR +export CARGO_FLAGS +export CARGO_TARGET_DIR +export CARGO_PACKAGES +export CARGO_TEST_ARGS + +all: build examples + +.PHONY: build +build: + CARGO_TARGET_DIR=$(CARGO_TARGET_DIR) $(CARGO) build $(CARGO_FLAGS) $(CARGO_PACKAGES) + $(MAKE) -Copenpgp-ffi build + $(MAKE) -Cffi build + +# Testing and examples. +# +# If CARGO_PACKAGES contains a package specification ("-p foo"), then +# only run cargo test. +.PHONY: test check +test check: + CARGO_TARGET_DIR=$(CARGO_TARGET_DIR) $(CARGO) test $(CARGO_FLAGS) $(CARGO_PACKAGES) $(CARGO_TEST_ARGS) + if echo "$(CARGO_TEST_ARGS)" | grep -q -e '--benches'; \ + then \ + echo 'Already tested the benchmarks.'; \ + else \ + CARGO_TARGET_DIR=$(CARGO_TARGET_DIR) $(CARGO) test $(CARGO_FLAGS) $(CARGO_PACKAGES) --benches; \ + fi + if echo "$(CARGO_PACKAGES)" | grep -q -E -e '(^| )[-]p +.'; \ + then \ + echo 'WARNING: Not running other tests, because $$CARGO_PACKAGES specifies a package.'; \ + else \ + $(MAKE) -Copenpgp-ffi test && \ + $(MAKE) -Cffi test && \ + $(MAKE) --file=.Makefile examples; \ + fi + +.PHONY: examples +examples: + CARGO_TARGET_DIR=$(CARGO_TARGET_DIR) \ + $(CARGO) build $(CARGO_FLAGS) --examples + $(MAKE) -Copenpgp-ffi examples + $(MAKE) -Cffi examples + +# Documentation. +.PHONY: doc +doc: + sed 's|"/|"file://$(shell pwd)/doc/|' doc/highlight.js/9.12.0/inc.html \ + > $(CARGO_TARGET_DIR)/inc.html + RUSTDOCFLAGS="$$RUSTDOCFLAGS --html-in-header $(CARGO_TARGET_DIR)/inc.html" \ + CARGO_TARGET_DIR=$(CARGO_TARGET_DIR) \ + $(CARGO) doc $(CARGO_FLAGS) --no-deps $(CARGO_PACKAGES) + +# Installation. +.PHONY: build-release +build-release: + $(MAKE) -Copenpgp-ffi build-release + $(MAKE) -Cffi build-release + $(MAKE) -Csq build-release + $(MAKE) -Csqv build-release + +# "install" needs "build-release" as it builds the project +# with optimizations enabled. +.PHONY: install +install: build-release + $(MAKE) -Copenpgp-ffi install + $(MAKE) -Cffi install + $(MAKE) -Csq install + $(MAKE) -Csqv install + +# Infrastructure for creating source distributions. +.PHONY: dist +dist: $(CARGO_TARGET_DIR)/dist/sequoia-$(VERSION).tar.pgp.gz \ + $(CARGO_TARGET_DIR)/dist/sequoia-$(VERSION).tar.pgp.xz + +$(CARGO_TARGET_DIR)/dist/sequoia-$(VERSION): + $(GIT) clone . $(CARGO_TARGET_DIR)/dist/sequoia-$(VERSION) + cd $(CARGO_TARGET_DIR)/dist/sequoia-$(VERSION) && \ + rm -rf .git + +$(CARGO_TARGET_DIR)/dist/sequoia-$(VERSION).tar: \ + $(CARGO_TARGET_DIR)/dist/sequoia-$(VERSION) + $(TAR) $(TAR_FLAGS) -cf $@ -C $(CARGO_TARGET_DIR)/dist sequoia-$(VERSION) + +%.gz: % + $(GZIP) -c "$<" >"$@" + +%.xz: % + $(XZ) -c "$<" >"$@" + +%.pgp: % + $(GPG) --local-user "$(SIGN_WITH)" --compression-algo=none \ + --sign --output "$@" "$<" + +# Testing source distributions. +.PHONY: dist-test dist-check +dist-test dist-check: $(CARGO_TARGET_DIR)/dist/sequoia-$(VERSION).tar.pgp.gz + mkdir -p "$(CARGO_TARGET_DIR)/dist-check" + rm -rf "$(CARGO_TARGET_DIR)/dist-check/sequoia-$(VERSION)" + $(GZIP) -d -c "$<" |\ + $(GPG) -o - --verify |\ + $(TAR) xf - -C "$(CARGO_TARGET_DIR)/dist-check" + cd "$(CARGO_TARGET_DIR)/dist-check/sequoia-$(VERSION)" && \ + CARGO_HOME=$$(mktemp -d) $(MAKE) --file=.Makefile test CARGO_FLAGS=--locked + rm -rf "$(CARGO_TARGET_DIR)/dist-check/sequoia-$(VERSION)" + +# Housekeeping. +.PHONY: clean +clean: + CARGO_TARGET_DIR=$(CARGO_TARGET_DIR) $(CARGO) $(CARGO_FLAGS) clean + $(MAKE) -Copenpgp-ffi clean + $(MAKE) -Cffi clean + +.PHONY: codespell +codespell: + $(CODESPELL) $(CODESPELL_FLAGS) \ + -L "crate,ede,iff,mut,nd,te,uint,KeyServer,keyserver,Keyserver,keyservers,Keyservers,keypair,keypairs,KeyPair,fpr,dedup" \ + -S "*.bin,*.gpg,*.pgp,./.git,data,highlight.js,*/target,Makefile" |