From 601a84ae74404c66aa416157d27ec8124a7fcfd8 Mon Sep 17 00:00:00 2001 From: Christian Ebner Date: Wed, 9 Apr 2025 13:05:17 +0200 Subject: [PATCH] fix #4788: build static version of client MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes: https://bugzilla.proxmox.com/show_bug.cgi?id=4788 Build and package the a statically linked binary version of proxmox-backup-client to facilitate updates and distribution. This provides a mechanism to obtain and repackage the client for external parties and Linux distributions. The statically linked client is provided as dedicated package, conflicting with the regular package. Since the RUSTFLAGS env variables are not preserved when building with dpkg-buildpackage, invoke via `cargo rustc` instead which allows to set the recquried arguments. Credit goes also to Christoph Heiss, as this patch is loosely based on his pre-existing work for the proxmox-auto-install-assistant [0], which provided a good template. Also, place the libsystemd stub into its own subdirectory for cleaner separation from the compiled artifacts. [0] https://lore.proxmox.com/pve-devel/20240816161942.2044889-1-c.heiss@proxmox.com/ Suggested-by: Christoph Heiss Originally-by: Thomas Lamprecht Signed-off-by: Christian Ebner FG: fold in fixups Signed-off-by: Fabian Grünbichler --- Makefile | 30 ++++++++++++++++--- debian/control | 8 +++++ ...oxmox-backup-client-static.bash-completion | 1 + debian/proxmox-backup-client-static.install | 2 ++ debian/rules | 2 ++ 5 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 debian/proxmox-backup-client-static.bash-completion create mode 100644 debian/proxmox-backup-client-static.install diff --git a/Makefile b/Makefile index dc6aa72f..d7470146 100644 --- a/Makefile +++ b/Makefile @@ -38,12 +38,16 @@ SUBCRATES != cargo metadata --no-deps --format-version=1 \ | grep "$$PWD/" \ | sed -e "s!.*$$PWD/!!g" -e 's/\#.*$$//g' -e 's/)$$//g' +STATIC_TARGET_DIR := target/static-build + ifeq ($(BUILD_MODE), release) CARGO_BUILD_ARGS += --release --target $(DEB_HOST_RUST_TYPE) COMPILEDIR := target/$(DEB_HOST_RUST_TYPE)/release +STATIC_COMPILEDIR := $(STATIC_TARGET_DIR)/$(DEB_HOST_RUST_TYPE)/release else CARGO_BUILD_ARGS += --target $(DEB_HOST_RUST_TYPE) COMPILEDIR := target/$(DEB_HOST_RUST_TYPE)/debug +STATIC_COMPILEDIR := $(STATIC_TARGET_DIR)/$(DEB_HOST_RUST_TYPE)/debug endif ifeq ($(valgrind), yes) @@ -55,6 +59,9 @@ CARGO ?= cargo COMPILED_BINS := \ $(addprefix $(COMPILEDIR)/,$(USR_BIN) $(USR_SBIN) $(SERVICE_BIN) $(RESTORE_BIN)) +STATIC_BIN := \ + $(addprefix $(STATIC_COMPILEDIR)/,proxmox-backup-client-static) + export DEB_VERSION DEB_VERSION_UPSTREAM SERVER_DEB=$(PACKAGE)-server_$(DEB_VERSION)_$(ARCH).deb @@ -63,10 +70,12 @@ CLIENT_DEB=$(PACKAGE)-client_$(DEB_VERSION)_$(ARCH).deb CLIENT_DBG_DEB=$(PACKAGE)-client-dbgsym_$(DEB_VERSION)_$(ARCH).deb RESTORE_DEB=proxmox-backup-file-restore_$(DEB_VERSION)_$(ARCH).deb RESTORE_DBG_DEB=proxmox-backup-file-restore-dbgsym_$(DEB_VERSION)_$(ARCH).deb +STATIC_CLIENT_DEB=$(PACKAGE)-client-static_$(DEB_VERSION)_$(ARCH).deb +STATIC_CLIENT_DBG_DEB=$(PACKAGE)-client-static-dbgsym_$(DEB_VERSION)_$(ARCH).deb DOC_DEB=$(PACKAGE)-docs_$(DEB_VERSION)_all.deb DEBS=$(SERVER_DEB) $(SERVER_DBG_DEB) $(CLIENT_DEB) $(CLIENT_DBG_DEB) \ - $(RESTORE_DEB) $(RESTORE_DBG_DEB) + $(RESTORE_DEB) $(RESTORE_DBG_DEB) $(STATIC_CLIENT_DEB) $(STATIC_CLIENT_DBG_DEB) DSC = rust-$(PACKAGE)_$(DEB_VERSION).dsc @@ -74,7 +83,7 @@ DESTDIR= tests ?= --workspace -all: $(SUBDIRS) +all: proxmox-backup-client-static $(SUBDIRS) .PHONY: $(SUBDIRS) $(SUBDIRS): @@ -198,7 +207,7 @@ $(COMPILED_BINS) $(COMPILEDIR)/dump-catalog-shell-cli $(COMPILEDIR)/docgen: .do- lint: cargo clippy -- -A clippy::all -D clippy::correctness -install: $(COMPILED_BINS) +install: $(COMPILED_BINS) $(STATIC_BIN) install -dm755 $(DESTDIR)$(BINDIR) install -dm755 $(DESTDIR)$(ZSH_COMPL_DEST) $(foreach i,$(USR_BIN), \ @@ -217,16 +226,29 @@ install: $(COMPILED_BINS) install -m4755 -o root -g root $(COMPILEDIR)/sg-tape-cmd $(DESTDIR)$(LIBEXECDIR)/proxmox-backup/sg-tape-cmd $(foreach i,$(SERVICE_BIN), \ install -m755 $(COMPILEDIR)/$(i) $(DESTDIR)$(LIBEXECDIR)/proxmox-backup/ ;) + install -m755 $(STATIC_COMPILEDIR)/proxmox-backup-client $(DESTDIR)$(BINDIR)/proxmox-backup-client-static $(MAKE) -C www install $(MAKE) -C docs install $(MAKE) -C templates install .PHONY: upload upload: UPLOAD_DIST ?= $(DEB_DISTRIBUTION) -upload: $(SERVER_DEB) $(CLIENT_DEB) $(RESTORE_DEB) $(DOC_DEB) +upload: $(SERVER_DEB) $(CLIENT_DEB) $(RESTORE_DEB) $(DOC_DEB) $(STATIC_CLIENT_DEB) # check if working directory is clean git diff --exit-code --stat && git diff --exit-code --stat --staged tar cf - $(SERVER_DEB) $(SERVER_DBG_DEB) $(DOC_DEB) $(CLIENT_DEB) $(CLIENT_DBG_DEB) \ | ssh -X repoman@repo.proxmox.com upload --product pbs --dist $(UPLOAD_DIST) tar cf - $(CLIENT_DEB) $(CLIENT_DBG_DEB) | ssh -X repoman@repo.proxmox.com upload --product "pve,pmg,pbs-client" --dist $(UPLOAD_DIST) + tar cf - $(STATIC_CLIENT_DEB) $(STATIC_CLIENT_DBG_DEB) | ssh -X repoman@repo.proxmox.com upload --product "pbs-client" --dist $(UPLOAD_DIST) tar cf - $(RESTORE_DEB) $(RESTORE_DBG_DEB) | ssh -X repoman@repo.proxmox.com upload --product "pve" --dist $(UPLOAD_DIST) + +.PHONY: proxmox-backup-client-static +proxmox-backup-client-static: + rm -f $(STATIC_BIN) + $(MAKE) $(STATIC_BIN) + +$(STATIC_BIN): + mkdir -p $(STATIC_COMPILEDIR)/deps-stubs/ && \ + echo '!' > $(STATIC_COMPILEDIR)/deps-stubs/libsystemd.a # workaround for to greedy linkage and proxmox-systemd + $(CARGO) rustc $(CARGO_BUILD_ARGS) --package proxmox-backup-client --bin proxmox-backup-client \ + --target-dir $(STATIC_TARGET_DIR) -- -C target-feature=+crt-static -L $(STATIC_COMPILEDIR)/deps-stubs/ diff --git a/debian/control b/debian/control index 9687ebff..b8f7cfa4 100644 --- a/debian/control +++ b/debian/control @@ -205,6 +205,14 @@ Description: Proxmox Backup Client tools This package contains the Proxmox Backup client, which provides a simple command line tool to create and restore backups. +Package: proxmox-backup-client-static +Architecture: any +Depends: qrencode, ${misc:Depends}, +Conflicts: proxmox-backup-client +Description: Proxmox Backup Client tools (statically linked) + This package contains the Proxmox Backup client, which provides a + simple command line tool to create and restore backups. + Package: proxmox-backup-docs Build-Profiles: Section: doc diff --git a/debian/proxmox-backup-client-static.bash-completion b/debian/proxmox-backup-client-static.bash-completion new file mode 100644 index 00000000..f8b9b439 --- /dev/null +++ b/debian/proxmox-backup-client-static.bash-completion @@ -0,0 +1 @@ +debian/proxmox-backup-client.bc proxmox-backup-client diff --git a/debian/proxmox-backup-client-static.install b/debian/proxmox-backup-client-static.install new file mode 100644 index 00000000..f8a681d0 --- /dev/null +++ b/debian/proxmox-backup-client-static.install @@ -0,0 +1,2 @@ +usr/share/man/man1/proxmox-backup-client.1 +usr/share/zsh/vendor-completions/_proxmox-backup-client diff --git a/debian/rules b/debian/rules index a03fe11b..be7c93c2 100755 --- a/debian/rules +++ b/debian/rules @@ -47,6 +47,8 @@ override_dh_auto_install: dh_auto_install -- \ PROXY_USER=backup \ LIBDIR=/usr/lib/$(DEB_HOST_MULTIARCH) + mkdir -p debian/proxmox-backup-client-static/usr/bin + mv debian/tmp/usr/bin/proxmox-backup-client-static debian/proxmox-backup-client-static/usr/bin/proxmox-backup-client override_dh_installsystemd: dh_installsystemd -pproxmox-backup-server proxmox-backup-daily-update.timer