diff --git a/core/Dockerfile.deb b/core/Dockerfile.deb new file mode 100644 index 0000000..f33032c --- /dev/null +++ b/core/Dockerfile.deb @@ -0,0 +1,25 @@ +FROM debian:bookworm + +RUN apt-get update && apt-get install -y --no-install-recommends \ + ca-certificates \ + curl \ + build-essential \ + make \ + pkg-config \ + libssl-dev \ + libsqlite3-dev \ + libdbus-1-dev \ + libsystemd-dev \ + dpkg \ + && rm -rf /var/lib/apt/lists/* + +RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y +ENV PATH="/root/.cargo/bin:${PATH}" + +RUN cargo install cargo-deb + +WORKDIR /workspace + +COPY . . + +CMD ["make", "deb"] diff --git a/core/Makefile b/core/Makefile index 9a70c16..337e73b 100644 --- a/core/Makefile +++ b/core/Makefile @@ -15,6 +15,14 @@ rpm: strip -s target/release/kptui cargo generate-rpm -p kordophoned +.PHONY: deb +deb: + cargo build --release --workspace + strip -s target/release/kordophoned + strip -s target/release/kpcli + strip -s target/release/kptui + cargo deb -p kordophoned --no-build + .PHONY: pi-zero pi-zero: CARGO_TARGET_DIR=target/cross/arm-unknown-linux-gnueabihf \ diff --git a/core/README.md b/core/README.md index 8ad5a13..74cc425 100644 --- a/core/README.md +++ b/core/README.md @@ -91,6 +91,16 @@ strip -s target/release/kordophoned cargo generate-rpm ``` +### Packaging (DEB example) + +`kordophoned` is configured for Debian packaging via `cargo-deb`. + +```bash +cargo install cargo-deb +cd core +cargo deb -p kordophoned +``` + ## `kpcli` (CLI) Useful for quick testing and interacting with the daemon/cache. diff --git a/core/kordophoned/Cargo.toml b/core/kordophoned/Cargo.toml index aea6f4c..6bb47ba 100644 --- a/core/kordophoned/Cargo.toml +++ b/core/kordophoned/Cargo.toml @@ -50,3 +50,14 @@ assets = [ { source = "../target/release/kptui", dest = "/usr/bin/kptui", mode = "755" }, { source = "include/net.buzzert.kordophonecd.service", dest = "/usr/share/dbus-1/services/net.buzzert.kordophonecd.service", mode = "644" }, ] + +[package.metadata.deb] +maintainer = "James Magahern " +section = "net" +priority = "optional" +assets = [ + ["../target/release/kordophoned", "usr/libexec/kordophoned", "755"], + ["../target/release/kpcli", "usr/bin/kpcli", "755"], + ["../target/release/kptui", "usr/bin/kptui", "755"], + ["include/net.buzzert.kordophonecd.service", "usr/share/dbus-1/services/net.buzzert.kordophonecd.service", "644"], +] diff --git a/core/kordophoned/README.md b/core/kordophoned/README.md index 9691a3c..5269b1d 100644 --- a/core/kordophoned/README.md +++ b/core/kordophoned/README.md @@ -14,6 +14,17 @@ strip -s target/release/kordophoned cargo generate-rpm ``` +# Building DEB + +Make sure cargo-deb is installed, `cargo install cargo-deb`. + +Then: + +```bash +cd core +cargo deb -p kordophoned +``` + ## Running on macOS Before any client can talk to the kordophone daemon on macOS, the XPC service needs to be manually registered with launchd. @@ -34,4 +45,3 @@ and the following in Info.plist: MachServicesnet.buzzert.kordophonecd KeepAlive ``` - diff --git a/gtk/Dockerfile.deb b/gtk/Dockerfile.deb new file mode 100644 index 0000000..37dcecd --- /dev/null +++ b/gtk/Dockerfile.deb @@ -0,0 +1,25 @@ +FROM debian:trixie + +RUN apt-get update && apt-get install -y --no-install-recommends \ + ca-certificates \ + dpkg \ + make \ + build-essential \ + python3 \ + imagemagick \ + meson \ + ninja-build \ + valac \ + pkg-config \ + libgtk-4-dev \ + libadwaita-1-dev \ + libglib2.0-dev \ + libgee-0.8-dev \ + libsecret-1-dev \ + && rm -rf /var/lib/apt/lists/* + +WORKDIR /workspace + +COPY . . + +CMD ["make", "deb"] diff --git a/gtk/Makefile b/gtk/Makefile index 2273063..b444bba 100644 --- a/gtk/Makefile +++ b/gtk/Makefile @@ -11,4 +11,6 @@ rpm: git -C .. archive --format=tar.gz --prefix=kordophone/ -o $(TMP)/v$(VER).tar.gz HEAD rpmbuild -ba dist/rpm/kordophone.spec --define "_sourcedir $(TMP)" +deb: + ./dist/deb/build-deb.sh $(VER) diff --git a/gtk/README.md b/gtk/README.md index 262c0ff..af05cf3 100644 --- a/gtk/README.md +++ b/gtk/README.md @@ -5,3 +5,5 @@ Libadwaita/GTK4 client for the Kordophone client daemon. # Building Build an RPM using `rpmbuild -ba dist/rpm/kordophone.spec` + +Build a DEB using `make deb` diff --git a/gtk/dist/deb/.gitignore b/gtk/dist/deb/.gitignore new file mode 100644 index 0000000..eaef894 --- /dev/null +++ b/gtk/dist/deb/.gitignore @@ -0,0 +1,6 @@ +*.deb +*.buildinfo +*.changes +*.dsc +*.tar.* +*.build diff --git a/gtk/dist/deb/build-deb.sh b/gtk/dist/deb/build-deb.sh new file mode 100755 index 0000000..fb0e0ac --- /dev/null +++ b/gtk/dist/deb/build-deb.sh @@ -0,0 +1,49 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +cd "$ROOT_DIR" + +VERSION="${1:-}" +if [[ -z "$VERSION" ]]; then + VERSION="$(sed -n "s/.*version[[:space:]]*:[[:space:]]*'\\([^']*\\)'.*/\\1/p" meson.build | head -n1)" +fi +if [[ -z "$VERSION" ]]; then + echo "Could not determine version (pass as first arg)" >&2 + exit 1 +fi + +ARCH="$(dpkg --print-architecture)" +PKG="kordophone" + +STAGE="$(mktemp -d)" +trap 'rm -rf "$STAGE"' EXIT + +PKGROOT="$STAGE/pkgroot" +mkdir -p "$PKGROOT/DEBIAN" + +BUILD_DIR="$STAGE/build" +meson setup "$BUILD_DIR" --prefix=/usr +ninja -C "$BUILD_DIR" +DESTDIR="$PKGROOT" ninja -C "$BUILD_DIR" install + +INSTALLED_SIZE_KB="$(du -sk "$PKGROOT/usr" | awk '{print $1}')" + +cat >"$PKGROOT/DEBIAN/control" < +Installed-Size: ${INSTALLED_SIZE_KB} +Depends: libgtk-4-1, libadwaita-1-0, libglib2.0-0, libgee-0.8-2, libsecret-1-0, kordophoned (>= 1.0.0) +Description: GTK4/Libadwaita client for Kordophone + A GTK4/Libadwaita Linux client for the Kordophone client daemon. +EOF + +OUT_DIR="$ROOT_DIR/dist/deb" +mkdir -p "$OUT_DIR" +OUT_DEB="${OUT_DIR}/${PKG}_${VERSION}_${ARCH}.deb" +dpkg-deb --root-owner-group --build "$PKGROOT" "$OUT_DEB" +echo "$OUT_DEB" diff --git a/gtk/meson.build b/gtk/meson.build index 317872f..c4f17ba 100644 --- a/gtk/meson.build +++ b/gtk/meson.build @@ -1,5 +1,5 @@ project('kordophone', 'vala', - version : '1.0.1', + version : '1.0.2', meson_version : '>=0.56.0', default_options : ['warning_level=2'] )