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
|