aboutsummaryrefslogtreecommitdiff
path: root/Makefile
blob: aac7b92922fd7308f330f3031c6fb1beec53f397 (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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
profile := dev
target = $(shell rustc -vV | grep host | awk '{print $$2}')
# Cargo outputs dev profile to 'debug' directory, not 'dev'
ifeq ($(profile),dev)
output_dir := debug
else
output_dir := $(profile)
endif
architectures := x86_64-unknown-linux-gnu aarch64-unknown-linux-gnu
app_name := map
deploy_host := deploy@build.r.bdr.sh
deploy_path := /srv/http/build.r.bdr.sh/$(app_name)-linux
prefix := /usr/local
flatpak_cargo_generator := $(HOME)/projects/vendor/flatpak-builder-tools/cargo

define sign_and_deploy
		@./scripts/sign.sh "$(1)" "$(channel)" "$(architecture)"
    rsync -avz $(1) $(deploy_host):$(deploy_path)
    rsync -avz $(1).minisig $(deploy_host):$(deploy_path)
endef

default: build

set_rust:
	rustup default stable

prepare:
ifneq ($(skip_prepare),1)
	rustup target add $(target)
endif

# Build ########################################################################

build: compile_translations prepare
	@$(eval target_dir := ./target/$(target)/$(output_dir)/map)
	cargo build --profile $(profile) --target $(target)

# Code Quality #################################################################

test:
	cargo test

coverage:
	cargo tarpaulin

format:
	cargo fmt && cargo clippy --fix

lint:
	cargo fmt -- --check && cargo clippy

# Internationalization / Localization ##########################################

find_translatable_files:
	@find ./ -not -path '*/.*' -type f -name "*.rs" -exec grep -l "tr!(\"\|gettext" {} \; | sort > po/POTFILES

extract_strings: find_translatable_files
	@xgettext --files-from=po/POTFILES --output=po/systems.tranquil.Map.pot --from-code=UTF-8 --add-comments --keyword='tr!'

po_files := $(wildcard po/*.po)
mo_files := $(patsubst po/%.po,po/%/LC_MESSAGES/systems.tranquil.Map.mo,$(po_files))

compile_translations: $(mo_files)

po/%/LC_MESSAGES/systems.tranquil.Map.mo: po/%.po
	@mkdir -p $(dir $@)
	msgfmt $< -o $@

# Packaging ####################################################################

filename = $(app_name)-$(target)-$(channel)

update_flatpak_dependencies:
	cd $(flatpak_cargo_generator) && `poetry env activate` && python3 flatpak-cargo-generator.py $(CURDIR)/Cargo.lock -o $(CURDIR)/build-aux/cargo-sources.json && deactivate

package-rpm: build
ifeq ($(findstring linux,$(target)),linux)
	cargo generate-rpm --profile $(profile) --target $(target)
	mv target/$(target)/generate-rpm/*.rpm $(filename).rpm
endif

package-deb: build
ifeq ($(findstring linux,$(target)),linux)
	cargo deb --profile $(profile) --target $(target)
	mv target/$(target)/debian/*.deb $(filename).deb
endif

package-tar: build
	@$(eval staging := $(shell mktemp -d))
	@install -Dm0755 target/$(target)/$(output_dir)/$(app_name) $(staging)/usr/bin/$(app_name)
	@install -Dm0644 resources/logo.svg $(staging)/usr/share/icons/hicolor/scalable/apps/systems.tranquil.Map.svg
	@install -Dm0644 resources/systems.tranquil.Map.desktop $(staging)/usr/share/applications/systems.tranquil.Map.desktop
	@install -Dm0644 resources/systems.tranquil.Map.metainfo.xml $(staging)/usr/share/metainfo/systems.tranquil.Map.metainfo.xml
	@install -Dm0644 resources/systems.tranquil.Map.service $(staging)/usr/share/dbus-1/services/systems.tranquil.Map.service
	@install -Dm0644 resources/wmap.lang $(staging)/usr/share/gtksourceview-5/language-specs/wmap.lang
	@for po_file in po/*.po; do \
		locale=$$(basename "$$po_file" .po); \
		install -Dm0644 po/$$locale/LC_MESSAGES/systems.tranquil.Map.mo $(staging)/usr/share/locale/$$locale/LC_MESSAGES/systems.tranquil.Map.mo; \
	done
	tar -czvf $(filename).tar.gz -C $(staging) usr
	@rm -rf $(staging)

package-flatpak: update_flatpak_dependencies
	flatpak-builder --force-clean --user --install-deps-from=flathub --repo=repo --install builddir ./build-aux/systems.tranquil.Map.yml
	flatpak build-bundle repo $(filename).flatpak systems.tranquil.Map

package: package-rpm package-deb package-tar package-flatpak

# Distribution #################################################################

distribute-rpm:
	@$(call sign_and_deploy,$(filename).rpm)

distribute-deb:
	@$(call sign_and_deploy,$(filename).deb)

distribute-tar:
	@$(call sign_and_deploy,$(filename).tar.gz)

distribute-flatpak:
	@$(call sign_and_deploy,$(filename).flatpak)

distribute: distribute-rpm distribute-deb distribute-tar distribute-flatpak

release: package distribute

# We can't do cross compile, so for now let's just make it easy to release
# on arm here
arm:
ifneq ($(channel),)
	$(MAKE) -e profile=release -e channel=$(channel) -e target=aarch64-unknown-linux-gnu release
else
	$(MAKE) -e profile=release -e channel=unstable -e target=aarch64-unknown-linux-gnu release
endif


# Installation #################################################################

install: build
	install -Dm0755 target/$(target)/$(output_dir)/$(app_name) $(prefix)/bin/$(app_name)
	install -Dm0644 resources/logo.svg $(prefix)/share/icons/hicolor/scalable/apps/systems.tranquil.Map.svg
	install -Dm0644 resources/systems.tranquil.Map.desktop $(prefix)/share/applications/systems.tranquil.Map.desktop
	install -Dm0644 resources/systems.tranquil.Map.metainfo.xml $(prefix)/share/metainfo/systems.tranquil.Map.metainfo.xml
	install -Dm0644 resources/systems.tranquil.Map.service $(prefix)/share/dbus-1/services/systems.tranquil.Map.service
	install -Dm0644 resources/wmap.lang $(prefix)/share/gtksourceview-5/language-specs/wmap.lang
	@for po_file in po/*.po; do \
		locale=$$(basename "$$po_file" .po); \
		install -Dm0644 po/$$locale/LC_MESSAGES/systems.tranquil.Map.mo $(prefix)/share/locale/$$locale/LC_MESSAGES/systems.tranquil.Map.mo; \
	done

uninstall:
	rm -f $(prefix)/bin/$(app_name)
	rm -f $(prefix)/share/icons/hicolor/scalable/apps/systems.tranquil.Map.svg
	rm -f $(prefix)/share/applications/systems.tranquil.Map.desktop
	rm -f $(prefix)/share/metainfo/systems.tranquil.Map.metainfo.xml
	rm -f $(prefix)/share/dbus-1/services/systems.tranquil.Map.service
	rm -f $(prefix)/share/gtksourceview-5/language-specs/wmap.lang
	@for po_file in po/*.po; do \
		locale=$$(basename "$$po_file" .po); \
		rm -f $(prefix)/share/locale/$$locale/LC_MESSAGES/systems.tranquil.Map.mo; \
	done

# CI ###########################################################################

ci: lint
ifeq ($(GIT_REF),refs/heads/main)
	$(MAKE) -e profile=release -e channel=unstable $(architectures)
else ifneq (,$(findstring refs/tags/,$(GIT_REF)))
	$(MAKE) -e profile=release -e channel=$(subst refs/tags/,,$(GIT_REF)) $(architectures)
endif

$(architectures):
ifneq ($(channel),)
	$(MAKE) -e channel=$(channel) -e target=$@ release
else
	$(MAKE) -e target=$@ build
endif

release_all:
ifndef channel
	$(error channel is required for release_all)
endif
	$(MAKE) -e profile=release $(architectures)


.PHONY: default build $(architectures) package package-rpm package-deb package-tar package-flatpak distribute distribute-rpm distribute-deb distribute-tar distribute-flatpak prepare set_rust ci release release_all test coverage format update_flatpak_dependencies extract_strings find_translatable_files compile_translations install uninstall