summaryrefslogtreecommitdiffstats
path: root/Makefile
blob: ceff5502e50dc24379d286b9e736f278502c4368 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# Makefile for Sequoia.

# Configuration.
PREFIX		?= /usr/local
DESTDIR		?=

# Signing source distributions.
SIGN_WITH	?= XXXXXXXXXXXXXXXX

# Deploying documentation.
DOC_TARGET	?= sequoia-pgp.org:docs.sequoia-pgp.org
RSYNC_FLAGS	?=

# Tools.
CARGO		?= cargo
GIT		?= git
RSYNC		?= rsync
INSTALL		?= install
TAR		?= tar
XZ		?= xz
GPG		?= gpg

VERSION		?= $(shell grep '^version = ' Cargo.toml | cut -d'"' -f2)
LIB_VERSION	?= $(shell grep '^version = ' ffi/Cargo.toml | cut -d'"' -f2)
LIB_VERSION_MAJ	= $(shell echo $(LIB_VERSION) | cut -d'.' -f1)

# Make sure subprocesses pick these up.
export PREFIX
export DESTDIR

all: build ffi/examples

.PHONY: build
build:
	$(CARGO) build --all
	$(MAKE) -Cffi build

# Testing and examples.
.PHONY: test check
test check:
	$(CARGO) test --all
	$(MAKE) -Cffi test
	$(MAKE) examples

.PHONY: examples
examples:
	$(CARGO) build --examples
	$(MAKE) -Cffi examples

# Documentation.
.PHONY: doc
doc:
	$(CARGO) doc --no-deps --all

.PHONY: deploy-doc
deploy-doc: doc
	$(RSYNC) $(RSYNC_FLAGS) -r target/doc/* $(DOC_TARGET)

# Installation.
.PHONY: build-release
build-release:
	$(CARGO) build --release --all
	$(MAKE) -Cffi build-release

.PHONY: install
install: build-release
	$(INSTALL) -d $(DESTDIR)$(PREFIX)/include
	$(INSTALL) -t $(DESTDIR)$(PREFIX)/include ffi/include/sequoia.h
	$(INSTALL) -d $(DESTDIR)$(PREFIX)/include/sequoia
	$(INSTALL) -t $(DESTDIR)$(PREFIX)/include/sequoia \
		ffi/include/sequoia/*.h
	$(INSTALL) -d $(DESTDIR)$(PREFIX)/lib
	$(INSTALL) target/release/libsequoia_ffi.so \
		$(DESTDIR)$(PREFIX)/lib/libsequoia.so.$(LIB_VERSION)
	ln -fs libsequoia.so.$(LIB_VERSION) \
		$(DESTDIR)$(PREFIX)/lib/libsequoia.so.$(LIB_VERSION_MAJ)
	$(INSTALL) -d $(DESTDIR)$(PREFIX)/lib/sequoia
	$(INSTALL) -t $(DESTDIR)$(PREFIX)/lib/sequoia target/release/keystore
	$(INSTALL) -d $(DESTDIR)$(PREFIX)/bin
	$(INSTALL) -t $(DESTDIR)$(PREFIX)/bin target/release/sq
	$(MAKE) -Cffi install

# Infrastructure for creating source distributions.
.PHONY: dist
dist: target/dist/sequoia-$(VERSION).tar.xz.sig

target/dist/sequoia-$(VERSION):
	$(GIT) clone . target/dist/sequoia-$(VERSION)
	cd target/dist/sequoia-$(VERSION) && \
		mkdir .cargo && \
		$(CARGO) vendor \
			| sed 's/^directory = ".*"$$/directory = "vendor"/' \
			> .cargo/config && \
		rm -rf .git

target/dist/sequoia-$(VERSION).tar: target/dist/sequoia-$(VERSION)
	$(TAR) cf $@ -C target/dist sequoia-$(VERSION)

%.xz: %
	$(XZ) -c $< >$@

%.sig: %
	$(GPG) --local-user $(SIGN_WITH) --detach-sign --armor $<

.PHONY: dist-test dist-check
dist-test dist-check: target/dist/sequoia-$(VERSION).tar.xz
	rm -rf target/dist-check/sequoia-$(VERSION)
	mkdir -p target/dist-check
	$(TAR) xf $< -C target/dist-check
	cd target/dist-check/sequoia-$(VERSION) && \
		CARGO_HOME=$$(mktemp -d) $(MAKE) test
	rm -rf target/dist-check/sequoia-$(VERSION)

# Housekeeping.
.PHONY: clean
clean:
	rm -rf target
	$(MAKE) -Cffi clean