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 linuxdeploy_url := https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-$(shell uname -m).AppImage linuxdeploy := .cache/linuxdeploy.AppImage pkgver := $(shell grep '^pkgver=' build-aux/PKGBUILD | cut -d= -f2) pkgrel := $(shell grep '^pkgrel=' build-aux/PKGBUILD | cut -d= -f2) 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-pacman: @$(eval staging := $(shell mktemp -d)) rsync -a --filter=':- .gitignore' --exclude='.git' . $(staging)/src cp build-aux/PKGBUILD $(staging)/ cd $(staging) && PKGEXT='.pkg.tar.gz' makepkg -fd mv $(staging)/$(app_name)-$(pkgver)-$(pkgrel)-$(firstword $(subst -, ,$(target))).pkg.tar.gz $(filename).pkg.tar.gz @rm -rf $(staging) $(linuxdeploy): @mkdir -p .cache curl -L -o $(linuxdeploy) $(linuxdeploy_url) chmod +x $(linuxdeploy) package-appimage: build $(linuxdeploy) ifeq ($(findstring linux,$(target)),linux) @rm -f *.AppImage @$(eval appdir := $(shell mktemp -d)) @install -Dm0755 target/$(target)/$(output_dir)/$(app_name) $(appdir)/usr/bin/$(app_name) @install -Dm0644 resources/logo.svg $(appdir)/usr/share/icons/hicolor/scalable/apps/systems.tranquil.Map.svg @install -Dm0644 resources/systems.tranquil.Map.desktop $(appdir)/usr/share/applications/systems.tranquil.Map.desktop @install -Dm0644 resources/systems.tranquil.Map.metainfo.xml $(appdir)/usr/share/metainfo/systems.tranquil.Map.metainfo.xml @install -Dm0644 resources/systems.tranquil.Map.service $(appdir)/usr/share/dbus-1/services/systems.tranquil.Map.service @install -Dm0644 resources/wmap.lang $(appdir)/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 $(appdir)/usr/share/locale/$$locale/LC_MESSAGES/systems.tranquil.Map.mo; \ done APPIMAGE_EXTRACT_AND_RUN=1 NO_STRIP=true $(linuxdeploy) --appdir=$(appdir) --output=appimage --desktop-file=resources/systems.tranquil.Map.desktop --icon-file=resources/logo.svg mv *.AppImage $(filename).AppImage @rm -rf $(appdir) endif package: package-rpm package-deb package-tar package-pacman package-flatpak package-appimage # 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-pacman: @$(call sign_and_deploy,$(filename).pkg.tar.gz) distribute-appimage: @$(call sign_and_deploy,$(filename).AppImage) distribute: distribute-rpm distribute-deb distribute-tar distribute-pacman distribute-flatpak distribute-appimage 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 package-pacman package-appimage distribute distribute-rpm distribute-deb distribute-tar distribute-flatpak distribute-pacman distribute-appimage arch prepare set_rust ci release release_all test coverage format update_flatpak_dependencies extract_strings find_translatable_files compile_translations install uninstall