1# Makefile for Sequoia's bindings.
2
3# Configuration.
4PREFIX		?= /usr/local
5DESTDIR		?=
6
7CARGO	?= cargo
8CARGO_TARGET_DIR	?= $(shell pwd)/../target
9# We currently only support absolute paths.
10CARGO_TARGET_DIR	:= $(abspath $(CARGO_TARGET_DIR))
11
12VERSION		?= $(shell grep '^version[[:space:]]*=[[:space:]]*' Cargo.toml | cut -d'"' -f2)
13VERSION_MAJOR	= $(shell echo $(VERSION) | cut -d'.' -f1)
14
15# Build the right library
16ifeq ($(shell uname -s), Darwin)
17	_SEQ_LIB_EXT	= dylib
18else
19	_SEQ_LIB_EXT	= so
20endif
21
22# Tools.
23ifeq ($(shell uname -s), Darwin)
24	INSTALL		?= ginstall
25else
26	INSTALL		?= install
27endif
28
29# Make sure subprocesses pick these up.
30export PREFIX
31export DESTDIR
32
33# $(1) = install dir
34# $(2) = whether to set libdir and prefix to $(1) (empty string = false)
35sequoia_openpgp_pc = \
36	sed -e 's|VERSION|$(VERSION)|g' \
37	    $(if $(2),-e 's|PREFIX|$(shell pwd)|g',-e's|PREFIX|$(PREFIX)|g') \
38	    $(if $(2),-e 's|libdir=.*|libdir=$(1)|g') \
39	  sequoia-openpgp.pc.in \
40	  > $(1)/sequoia-openpgp.pc
41
42all: build
43
44.PHONY: build
45build:
46	$(call sequoia_openpgp_pc,$(CARGO_TARGET_DIR)/debug,true)
47
48.PHONY: force-build
49force-build:
50	cd .. ; cargo build -p sequoia-openpgp-ffi
51
52# Testing and examples.
53.PHONY: test check
54test check: check-headers
55
56# Header files.
57.PHONY: check-headers
58check-headers: force-build
59	nm -g --defined-only \
60		$(CARGO_TARGET_DIR)/debug/libsequoia_openpgp_ffi.$(_SEQ_LIB_EXT) \
61		| cut -d' ' -f3 | sed s/^_// | sort -u | grep pgp_ \
62		| while read SYM ; \
63			do grep -r -q "$$SYM" include || echo $$SYM ; \
64		done | tee $(CARGO_TARGET_DIR)/debug/.check-headers ; \
65	! test -s $(CARGO_TARGET_DIR)/debug/.check-headers
66
67.PHONY: examples
68examples:
69	$(MAKE) -Cexamples --always-make
70
71# Installation.
72.PHONY: build-release
73build-release:
74	CARGO_TARGET_DIR=$(CARGO_TARGET_DIR) \
75	    $(CARGO) build $(CARGO_FLAGS) --release --package sequoia-openpgp-ffi
76	$(call sequoia_openpgp_pc,$(CARGO_TARGET_DIR)/release,true)
77
78.PHONY: install
79install: build-release
80	$(INSTALL) -d $(DESTDIR)$(PREFIX)/share/pkgconfig
81	$(call sequoia_openpgp_pc,$(DESTDIR)$(PREFIX)/share/pkgconfig,)
82	$(INSTALL) -d $(DESTDIR)$(PREFIX)/include
83	$(INSTALL) -d $(DESTDIR)$(PREFIX)/include/sequoia
84	$(INSTALL) -t $(DESTDIR)$(PREFIX)/include/sequoia \
85		include/sequoia/*.h
86	$(INSTALL) -d $(DESTDIR)$(PREFIX)/include/sequoia/openpgp
87	$(INSTALL) -t $(DESTDIR)$(PREFIX)/include/sequoia/openpgp \
88		include/sequoia/openpgp/*.h
89	$(INSTALL) -d $(DESTDIR)$(PREFIX)/lib
90	$(INSTALL) $(CARGO_TARGET_DIR)/release/libsequoia_openpgp_ffi.$(_SEQ_LIB_EXT) \
91		$(DESTDIR)$(PREFIX)/lib/libsequoia_openpgp_ffi.$(_SEQ_LIB_EXT).$(VERSION)
92	ln -fs libsequoia_openpgp_ffi.$(_SEQ_LIB_EXT).$(VERSION) \
93		$(DESTDIR)$(PREFIX)/lib/libsequoia_openpgp_ffi.$(_SEQ_LIB_EXT).$(VERSION_MAJOR)
94	ln -fs libsequoia_openpgp_ffi.$(_SEQ_LIB_EXT).$(VERSION) \
95		$(DESTDIR)$(PREFIX)/lib/libsequoia_openpgp_ffi.$(_SEQ_LIB_EXT)
96	$(INSTALL) $(CARGO_TARGET_DIR)/release/libsequoia_openpgp_ffi.a \
97		$(DESTDIR)$(PREFIX)/lib/libsequoia_openpgp_ffi.a
98
99# Housekeeping.
100.PHONY: clean
101clean:
102	$(MAKE) -Cexamples clean
103