postit-debian/debian/rules
Lum 69ec916c4e packaging: derive Debian version from POSTIT_GIT_TAG via a changelog template
The .deb was hardcoded to 1.0.0-1 in debian/changelog regardless of
POSTIT_GIT_TAG, so 'make POSTIT_GIT_TAG=1.0.1-rc01' produced a
postit_1.0.0-1_amd64.deb (wrong name) and the trailing mv into
POSTIT_OUT_DIR silently fell back to the same wrong-name glob.

Move the version into a @VERSION@-bearing debian/changelog.in
template and render debian/changelog from it in the Makefile, before
dpkg-buildpackage runs (it reads debian/changelog during
dpkg-source --before-build, before any rule fires). debian/changelog
is .gitignored; the template is the source of truth.

debian/rules re-renders the changelog as a safety net for direct
dpkg-buildpackage invocations and adds it to override_dh_auto_clean
so partial builds leave no stale rendered file behind.
2026-06-28 13:20:17 +01:00

119 lines
4.3 KiB
Makefile
Executable file

#!/usr/bin/make -f
#
# Debian package build for PostIt (Yavsc desktop client).
#
# Pipeline:
# 1. Clone pazof/yavsc at POSTIT_GIT_TAG into a clean working
# tree under build/yavsc-src.
# 2. dotnet publish src/PostIt/PostIt.Desktop — framework-
# dependent (not self-contained), into build/postit-app.
# 3. Render the icon at the hicolor sizes from
# src/PostIt/PostIt/Assets/Icon.png, plus the SVG as the
# scalable form.
# 4. Stage everything under debian/tmp/ — the layout dh_install
# expects:
# /usr/lib/postit/ (managed assemblies)
# /usr/bin/postit (wrapper script)
# /usr/share/applications/ (postit.desktop)
# /usr/share/icons/hicolor/ (icons)
# 5. dh_install moves it all into debian/postit/ and the rest
# of the dh_* helpers assemble the .deb.
POSTIT_GIT_URL ?= https://github.com/pazof/yavsc.git
POSTIT_GIT_TAG ?= 1.0.0
# Runtime identifier passed to `dotnet publish --runtime`. Override
# at build time for non-amd64 targets:
# make deb POSTIT_RUNTIME=linux-arm64
POSTIT_RUNTIME ?= linux-x64
POSTIT_DESKTOP_PROJECT := src/PostIt/PostIt.Desktop/PostIt.Desktop.csproj
POSTIT_BUILD_DIR := $(CURDIR)/build
POSTIT_SRC_DIR := $(POSTIT_BUILD_DIR)/yavsc-src
POSTIT_TMP := $(CURDIR)/debian/tmp
POSTIT_TMP_LIB := $(POSTIT_TMP)/usr/lib/postit
POSTIT_TMP_BIN := $(POSTIT_TMP)/usr/bin
POSTIT_TMP_SHARE := $(POSTIT_TMP)/usr/share
ICON_SIZES := 16 32 48 64 128 256
%:
dh $@
override_dh_auto_clean:
rm -rf $(POSTIT_BUILD_DIR) $(POSTIT_TMP) $(CURDIR)/debian/changelog
override_dh_auto_build:
# The rendered changelog (debian/changelog) is generated from
# debian/changelog.in by the Makefile *before* dpkg-buildpackage
# runs, because dpkg-buildpackage reads debian/changelog before
# any rule (in dpkg-source --before-build) and would fail with
# "changelog missing" if it were not present. If somebody invokes
# dpkg-buildpackage directly without going through the Makefile
# (rare, but cheap to guard against), render the changelog on
# the fly from the current POSTIT_GIT_TAG so the package still
# builds and ships the right version.
if [ ! -f $(CURDIR)/debian/changelog ] && [ -f $(CURDIR)/debian/changelog.in ]; then \
sed 's/@VERSION@/$(POSTIT_GIT_TAG)/g' \
$(CURDIR)/debian/changelog.in > $(CURDIR)/debian/changelog; \
fi
# 1. Fetch the upstream source.
mkdir -p $(POSTIT_BUILD_DIR)
if [ -d $(POSTIT_SRC_DIR) ]; then \
git -C $(POSTIT_SRC_DIR) fetch --depth=1 origin $(POSTIT_GIT_TAG); \
git -C $(POSTIT_SRC_DIR) reset --hard $(POSTIT_GIT_TAG); \
else \
git clone --depth=1 --branch $(POSTIT_GIT_TAG) \
$(POSTIT_GIT_URL) $(POSTIT_SRC_DIR); \
fi
# 2. Publish PostIt.Desktop for the host architecture.
# --self-contained false : rely on the system .NET
# runtime (declared in Depends: in debian/control).
# -p:PublishReadyToRun=false : avoid R2R which inflates
# the binary for marginal startup gain on a desktop GUI.
dotnet publish $(POSTIT_SRC_DIR)/$(POSTIT_DESKTOP_PROJECT) \
-c Release \
--self-contained false \
--runtime $(POSTIT_RUNTIME) \
-p:PublishReadyToRun=false \
-o $(POSTIT_BUILD_DIR)/postit-app
override_dh_auto_test:
# No upstream test suite for PostIt.Desktop at this stage
# (Yavsc.Org.Tests covers the web front, not the desktop
# client). Build smoke is sufficient for the package.
override_dh_shlibdeps:
dh_shlibdeps
override_dh_strip:
dh_strip --exclude=.pdb
define stage_postit
mkdir -p $(POSTIT_TMP_LIB)
cp -r $(POSTIT_BUILD_DIR)/postit-app/. $(POSTIT_TMP_LIB)/
mkdir -p $(POSTIT_TMP_BIN)
cp $(CURDIR)/debian/postit.wrapper $(POSTIT_TMP_BIN)/postit
chmod 0755 $(POSTIT_TMP_BIN)/postit
mkdir -p $(POSTIT_TMP_SHARE)/applications
cp $(CURDIR)/debian/postit.desktop \
$(POSTIT_TMP_SHARE)/applications/postit.desktop
mkdir -p $(POSTIT_TMP_SHARE)/icons/hicolor/scalable/apps
cp $(POSTIT_SRC_DIR)/src/PostIt/PostIt/Assets/yavsc-logo.svg \
$(POSTIT_TMP_SHARE)/icons/hicolor/scalable/apps/postit.svg
for size in $(ICON_SIZES); do \
mkdir -p $(POSTIT_TMP_SHARE)/icons/hicolor/$${size}x$${size}/apps; \
convert $(POSTIT_SRC_DIR)/src/PostIt/PostIt/Assets/Icon.png \
-resize $${size}x$${size} \
$(POSTIT_TMP_SHARE)/icons/hicolor/$${size}x$${size}/apps/postit.png; \
done
endef
override_dh_install:
$(call stage_postit)
dh_install