* [pbs-devel] [RFC proxmox-backup] buildsys: build and package statically linked client binary @ 2025-04-09 8:18 Christian Ebner 2025-04-09 9:09 ` Fabian Grünbichler 0 siblings, 1 reply; 4+ messages in thread From: Christian Ebner @ 2025-04-09 8:18 UTC (permalink / raw) To: pbs-devel 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. Symlinks are created to invoke the client with the regular command name. 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. [0] https://lore.proxmox.com/pve-devel/20240816161942.2044889-1-c.heiss@proxmox.com/ Suggested-by: Thomas Lamprecht <t.lamprecht@proxmox.com> Signed-off-by: Christian Ebner <c.ebner@proxmox.com> --- This patch depends on: https://lore.proxmox.com/pbs-devel/15f17e0d-e493-40fc-80f2-4538376ea310@proxmox.com/T/ Makefile | 24 +++++++++++---------- debian/control | 9 ++++++++ debian/proxmox-backup-client-static.install | 4 ++++ debian/proxmox-backup-client-static.links | 1 + 4 files changed, 27 insertions(+), 11 deletions(-) create mode 100644 debian/proxmox-backup-client-static.install create mode 100644 debian/proxmox-backup-client-static.links diff --git a/Makefile b/Makefile index 428ef40b9..efab87871 100644 --- a/Makefile +++ b/Makefile @@ -37,14 +37,15 @@ SUBCRATES != cargo metadata --no-deps --format-version=1 \ | sed -e "s!.*$$PWD/!!g" -e 's/\#.*$$//g' -e 's/)$$//g' STATIC_TARGET ?= x86_64-unknown-linux-gnu +STATIC_TARGET_DIR := target/static-build ifeq ($(BUILD_MODE), release) CARGO_BUILD_ARGS += --release COMPILEDIR := target/$(DEB_HOST_RUST_TYPE)/release -STATIC_COMPILEDIR := target/$(STATIC_TARGET)/release +STATIC_COMPILEDIR := $(STATIC_TARGET_DIR)/$(DEB_HOST_RUST_TYPE)/release else COMPILEDIR := target/$(DEB_HOST_RUST_TYPE)/debug -STATIC_COMPILEDIR := target/$(STATIC_TARGET)/debug +STATIC_COMPILEDIR := $(STATIC_TARGET_DIR)/$(DEB_HOST_RUST_TYPE)/debug endif ifeq ($(valgrind), yes) @@ -64,10 +65,11 @@ 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 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) DSC = rust-$(PACKAGE)_$(DEB_VERSION).dsc @@ -199,7 +201,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) proxmox-backup-client-static install -dm755 $(DESTDIR)$(BINDIR) install -dm755 $(DESTDIR)$(ZSH_COMPL_DEST) $(foreach i,$(USR_BIN), \ @@ -218,25 +220,25 @@ 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) \ + tar cf - $(SERVER_DEB) $(SERVER_DBG_DEB) $(DOC_DEB) $(CLIENT_DEB) $(CLIENT_DBG_DEB) $(STATIC_CLIENT_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 - $(CLIENT_DEB) $(CLIENT_DBG_DEB) $(STATIC_CLIENT_DEB) | ssh -X repoman@repo.proxmox.com upload --product "pve,pmg,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: mkdir -p $(STATIC_COMPILEDIR)/deps-stubs/ && \ echo '!<arch>' > $(STATIC_COMPILEDIR)/deps-stubs/libsystemd.a # workaround for to greedy linkage and proxmox-systemd - RUSTFLAGS='-C target-feature=+crt-static -C strip=debuginfo -L $(STATIC_COMPILEDIR)/deps-stubs/' \ - $(CARGO) build $(CARGO_BUILD_ARGS) \ - --package proxmox-backup-client --bin proxmox-backup-client \ - --target $(STATIC_TARGET) + $(CARGO) rustc $(CARGO_BUILD_ARGS) --package proxmox-backup-client --bin proxmox-backup-client \ + --target $(STATIC_TARGET) --target-dir $(STATIC_TARGET_DIR) -- \ + -C target-feature=+crt-static -C strip=debuginfo -L $(STATIC_COMPILEDIR)/deps-stubs/ diff --git a/debian/control b/debian/control index 1a2661858..3bddeecc4 100644 --- a/debian/control +++ b/debian/control @@ -205,6 +205,15 @@ 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 +Provides: 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: <!nodoc> Section: doc diff --git a/debian/proxmox-backup-client-static.install b/debian/proxmox-backup-client-static.install new file mode 100644 index 000000000..d83a77f6e --- /dev/null +++ b/debian/proxmox-backup-client-static.install @@ -0,0 +1,4 @@ +usr/bin/proxmox-backup-client-static +usr/share/man/man1/proxmox-backup-client.1 +usr/share/man/man1/pxar.1 +usr/share/zsh/vendor-completions/_proxmox-backup-client diff --git a/debian/proxmox-backup-client-static.links b/debian/proxmox-backup-client-static.links new file mode 100644 index 000000000..a26ce008c --- /dev/null +++ b/debian/proxmox-backup-client-static.links @@ -0,0 +1 @@ +usr/bin/proxmox-backup-client-static usr/bin/proxmox-backup-client -- 2.39.5 _______________________________________________ pbs-devel mailing list pbs-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [pbs-devel] [RFC proxmox-backup] buildsys: build and package statically linked client binary 2025-04-09 8:18 [pbs-devel] [RFC proxmox-backup] buildsys: build and package statically linked client binary Christian Ebner @ 2025-04-09 9:09 ` Fabian Grünbichler 2025-04-09 9:22 ` Christian Ebner 2025-04-09 9:53 ` Thomas Lamprecht 0 siblings, 2 replies; 4+ messages in thread From: Fabian Grünbichler @ 2025-04-09 9:09 UTC (permalink / raw) To: Proxmox Backup Server development discussion I think the following going in first and rebasing on top might make sense: ----8<---- commit 1793d3cd1ee9e1175354350f7c3dde92c9ed4413 Author: Fabian Grünbichler <f.gruenbichler@proxmox.com> AuthorDate: Wed Apr 9 10:32:20 2025 +0200 Commit: Fabian Grünbichler <f.gruenbichler@proxmox.com> CommitDate: Wed Apr 9 10:32:20 2025 +0200 build: always set --target since it affects whether cargo puts build artifacts directly into target/debug (or target/release) or into a target-specific sub-directory. the package build will always pass `--target $(DEB_HOST_RUST_TYPE)`, since it invokes the cargo wrapper in /usr/share/cargo/bin/cargo, so this change unifies the behaviour across plain `make` and `make deb`. direct calls to `cargo build/test/..` will still work as before. Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com> diff --git a/Makefile b/Makefile index 428ef40b9..2543b1e37 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,10 @@ include /usr/share/dpkg/default.mk +include /usr/share/rustc/architecture.mk include defines.mk PACKAGE := proxmox-backup ARCH := $(DEB_BUILD_ARCH) +export DEB_HOST_RUST_TYPE SUBDIRS := etc www docs templates @@ -39,10 +41,11 @@ SUBCRATES != cargo metadata --no-deps --format-version=1 \ STATIC_TARGET ?= x86_64-unknown-linux-gnu ifeq ($(BUILD_MODE), release) -CARGO_BUILD_ARGS += --release +CARGO_BUILD_ARGS += --release --target $(DEB_HOST_RUST_TYPE) COMPILEDIR := target/$(DEB_HOST_RUST_TYPE)/release STATIC_COMPILEDIR := target/$(STATIC_TARGET)/release else +CARGO_BUILD_ARGS += --target $(DEB_HOST_RUST_TYPE) COMPILEDIR := target/$(DEB_HOST_RUST_TYPE)/debug STATIC_COMPILEDIR := target/$(STATIC_TARGET)/debug endif ---->8---- that would allow eliminating STATIC_TARGET altogether, since we can just use DEB_HOST_RUST_TYPE across the board. I also have verified this here works (on top of all the rest) diff --git a/Makefile b/Makefile index 8a6106671..3b1f945b9 100644 --- a/Makefile +++ b/Makefile @@ -243,4 +243,4 @@ proxmox-backup-client-static: echo '!<arch>' > $(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 $(DEB_HOST_RUST_TYPE) --target-dir $(STATIC_TARGET_DIR) -- \ - -C target-feature=+crt-static -C strip=debuginfo -L $(STATIC_COMPILEDIR)/deps-stubs/ + -C target-feature=+crt-static -L $(STATIC_COMPILEDIR)/deps-stubs/ and will automatically strip the static binary and put the debug information into the corresponding -dbgsym package (which should then also be uploaded ;)) - I don't think we want to completely drop debugging support just because the binary is built statically.. On April 9, 2025 10:18 am, Christian Ebner wrote: > 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. Symlinks are created to invoke > the client with the regular command name. > > 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. > > [0] https://lore.proxmox.com/pve-devel/20240816161942.2044889-1-c.heiss@proxmox.com/ > > Suggested-by: Thomas Lamprecht <t.lamprecht@proxmox.com> > Signed-off-by: Christian Ebner <c.ebner@proxmox.com> > --- > This patch depends on: > https://lore.proxmox.com/pbs-devel/15f17e0d-e493-40fc-80f2-4538376ea310@proxmox.com/T/ > > Makefile | 24 +++++++++++---------- > debian/control | 9 ++++++++ > debian/proxmox-backup-client-static.install | 4 ++++ > debian/proxmox-backup-client-static.links | 1 + > 4 files changed, 27 insertions(+), 11 deletions(-) > create mode 100644 debian/proxmox-backup-client-static.install > create mode 100644 debian/proxmox-backup-client-static.links > > diff --git a/Makefile b/Makefile > index 428ef40b9..efab87871 100644 > --- a/Makefile > +++ b/Makefile > @@ -37,14 +37,15 @@ SUBCRATES != cargo metadata --no-deps --format-version=1 \ > | sed -e "s!.*$$PWD/!!g" -e 's/\#.*$$//g' -e 's/)$$//g' > > STATIC_TARGET ?= x86_64-unknown-linux-gnu > +STATIC_TARGET_DIR := target/static-build > > ifeq ($(BUILD_MODE), release) > CARGO_BUILD_ARGS += --release > COMPILEDIR := target/$(DEB_HOST_RUST_TYPE)/release > -STATIC_COMPILEDIR := target/$(STATIC_TARGET)/release > +STATIC_COMPILEDIR := $(STATIC_TARGET_DIR)/$(DEB_HOST_RUST_TYPE)/release > else > COMPILEDIR := target/$(DEB_HOST_RUST_TYPE)/debug > -STATIC_COMPILEDIR := target/$(STATIC_TARGET)/debug > +STATIC_COMPILEDIR := $(STATIC_TARGET_DIR)/$(DEB_HOST_RUST_TYPE)/debug > endif > > ifeq ($(valgrind), yes) > @@ -64,10 +65,11 @@ 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 > 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) > > DSC = rust-$(PACKAGE)_$(DEB_VERSION).dsc > > @@ -199,7 +201,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) proxmox-backup-client-static > install -dm755 $(DESTDIR)$(BINDIR) > install -dm755 $(DESTDIR)$(ZSH_COMPL_DEST) > $(foreach i,$(USR_BIN), \ > @@ -218,25 +220,25 @@ 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 you can undo this when installing the binary into the package afterwards, no need for symlinking then (see below) > $(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) \ > + tar cf - $(SERVER_DEB) $(SERVER_DBG_DEB) $(DOC_DEB) $(CLIENT_DEB) $(CLIENT_DBG_DEB) $(STATIC_CLIENT_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 - $(CLIENT_DEB) $(CLIENT_DBG_DEB) $(STATIC_CLIENT_DEB) | ssh -X repoman@repo.proxmox.com upload --product "pve,pmg,pbs-client" --dist $(UPLOAD_DIST) I don't think it makes sense to upload the static client to PVE and PMG, we probably just want to move the pbs-client target to its own upload invocation here? > 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: > mkdir -p $(STATIC_COMPILEDIR)/deps-stubs/ && \ > echo '!<arch>' > $(STATIC_COMPILEDIR)/deps-stubs/libsystemd.a # workaround for to greedy linkage and proxmox-systemd > - RUSTFLAGS='-C target-feature=+crt-static -C strip=debuginfo -L $(STATIC_COMPILEDIR)/deps-stubs/' \ > - $(CARGO) build $(CARGO_BUILD_ARGS) \ > - --package proxmox-backup-client --bin proxmox-backup-client \ > - --target $(STATIC_TARGET) > + $(CARGO) rustc $(CARGO_BUILD_ARGS) --package proxmox-backup-client --bin proxmox-backup-client \ > + --target $(STATIC_TARGET) --target-dir $(STATIC_TARGET_DIR) -- \ > + -C target-feature=+crt-static -C strip=debuginfo -L $(STATIC_COMPILEDIR)/deps-stubs/ > diff --git a/debian/control b/debian/control > index 1a2661858..3bddeecc4 100644 > --- a/debian/control > +++ b/debian/control > @@ -205,6 +205,15 @@ 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 > +Provides: proxmox-backup-client I don't think we need/want this Provides here, unless there is a need for it that I am missing? it might make apt pull in the static version by accident, and also doesn't allow to just switch over to the static variant.. > +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: <!nodoc> > Section: doc > diff --git a/debian/proxmox-backup-client-static.install b/debian/proxmox-backup-client-static.install > new file mode 100644 > index 000000000..d83a77f6e > --- /dev/null > +++ b/debian/proxmox-backup-client-static.install > @@ -0,0 +1,4 @@ > +usr/bin/proxmox-backup-client-static we could just ship the client under the usual name instead, since the packages conflict anyway.. there's two ways to do this - either convert the .install file to use dh-exec (see `man dh_install`), or `mv` it manually in d/rules - we already override dh_auto_install there, so this should be fairly easy to do: diff --git a/debian/proxmox-backup-client-static.install b/debian/proxmox-backup-client-static.install index d83a77f6e..690303a74 100644 --- a/debian/proxmox-backup-client-static.install +++ b/debian/proxmox-backup-client-static.install @@ -1,4 +1,3 @@ -usr/bin/proxmox-backup-client-static usr/share/man/man1/proxmox-backup-client.1 usr/share/man/man1/pxar.1 usr/share/zsh/vendor-completions/_proxmox-backup-client diff --git a/debian/rules b/debian/rules index a03fe11ba..be7c93c2e 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 > +usr/share/man/man1/proxmox-backup-client.1 > +usr/share/man/man1/pxar.1 we don't build/ship pxar (should we? ;)) so this man page probably shouldn't be included here.. > +usr/share/zsh/vendor-completions/_proxmox-backup-client the bash completion is missing.. > diff --git a/debian/proxmox-backup-client-static.links b/debian/proxmox-backup-client-static.links and drop this then :) > new file mode 100644 > index 000000000..a26ce008c > --- /dev/null > +++ b/debian/proxmox-backup-client-static.links > @@ -0,0 +1 @@ > +usr/bin/proxmox-backup-client-static usr/bin/proxmox-backup-client _______________________________________________ pbs-devel mailing list pbs-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [pbs-devel] [RFC proxmox-backup] buildsys: build and package statically linked client binary 2025-04-09 9:09 ` Fabian Grünbichler @ 2025-04-09 9:22 ` Christian Ebner 2025-04-09 9:53 ` Thomas Lamprecht 1 sibling, 0 replies; 4+ messages in thread From: Christian Ebner @ 2025-04-09 9:22 UTC (permalink / raw) To: Proxmox Backup Server development discussion, Fabian Grünbichler On 4/9/25 11:09, Fabian Grünbichler wrote: > I think the following going in first and rebasing on top might make > sense: > > ----8<---- > commit 1793d3cd1ee9e1175354350f7c3dde92c9ed4413 > Author: Fabian Grünbichler <f.gruenbichler@proxmox.com> > AuthorDate: Wed Apr 9 10:32:20 2025 +0200 > Commit: Fabian Grünbichler <f.gruenbichler@proxmox.com> > CommitDate: Wed Apr 9 10:32:20 2025 +0200 > > build: always set --target > > since it affects whether cargo puts build artifacts directly into > target/debug (or target/release) or into a target-specific > sub-directory. > > the package build will always pass `--target $(DEB_HOST_RUST_TYPE)`, > since it invokes the cargo wrapper in /usr/share/cargo/bin/cargo, so > this change unifies the behaviour across plain `make` and `make > deb`. > > direct calls to `cargo build/test/..` will still work as before. > > Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com> > > diff --git a/Makefile b/Makefile > index 428ef40b9..2543b1e37 100644 > --- a/Makefile > +++ b/Makefile > @@ -1,8 +1,10 @@ > include /usr/share/dpkg/default.mk > +include /usr/share/rustc/architecture.mk > include defines.mk > > PACKAGE := proxmox-backup > ARCH := $(DEB_BUILD_ARCH) > +export DEB_HOST_RUST_TYPE > > SUBDIRS := etc www docs templates > > @@ -39,10 +41,11 @@ SUBCRATES != cargo metadata --no-deps --format-version=1 \ > STATIC_TARGET ?= x86_64-unknown-linux-gnu > > ifeq ($(BUILD_MODE), release) > -CARGO_BUILD_ARGS += --release > +CARGO_BUILD_ARGS += --release --target $(DEB_HOST_RUST_TYPE) > COMPILEDIR := target/$(DEB_HOST_RUST_TYPE)/release > STATIC_COMPILEDIR := target/$(STATIC_TARGET)/release > else > +CARGO_BUILD_ARGS += --target $(DEB_HOST_RUST_TYPE) > COMPILEDIR := target/$(DEB_HOST_RUST_TYPE)/debug > STATIC_COMPILEDIR := target/$(STATIC_TARGET)/debug > endif > ---->8---- > > that would allow eliminating STATIC_TARGET altogether, since we can > just use DEB_HOST_RUST_TYPE across the board. > > I also have verified this here works (on top of all the rest) Great, will you apply and push these changes first and I will rebase the series including your suggestions/comments onto it or should I just pick this up for the series as well? > > diff --git a/Makefile b/Makefile > index 8a6106671..3b1f945b9 100644 > --- a/Makefile > +++ b/Makefile > @@ -243,4 +243,4 @@ proxmox-backup-client-static: > echo '!<arch>' > $(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 $(DEB_HOST_RUST_TYPE) --target-dir $(STATIC_TARGET_DIR) -- \ > - -C target-feature=+crt-static -C strip=debuginfo -L $(STATIC_COMPILEDIR)/deps-stubs/ > + -C target-feature=+crt-static -L $(STATIC_COMPILEDIR)/deps-stubs/ > > > and will automatically strip the static binary and put the debug > information into the corresponding -dbgsym package (which should then > also be uploaded ;)) - I don't think we want to completely drop > debugging support just because the binary is built statically.. > > On April 9, 2025 10:18 am, Christian Ebner wrote: >> 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. Symlinks are created to invoke >> the client with the regular command name. >> >> 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. >> >> [0] https://lore.proxmox.com/pve-devel/20240816161942.2044889-1-c.heiss@proxmox.com/ >> >> Suggested-by: Thomas Lamprecht <t.lamprecht@proxmox.com> >> Signed-off-by: Christian Ebner <c.ebner@proxmox.com> >> --- >> This patch depends on: >> https://lore.proxmox.com/pbs-devel/15f17e0d-e493-40fc-80f2-4538376ea310@proxmox.com/T/ >> >> Makefile | 24 +++++++++++---------- >> debian/control | 9 ++++++++ >> debian/proxmox-backup-client-static.install | 4 ++++ >> debian/proxmox-backup-client-static.links | 1 + >> 4 files changed, 27 insertions(+), 11 deletions(-) >> create mode 100644 debian/proxmox-backup-client-static.install >> create mode 100644 debian/proxmox-backup-client-static.links >> >> diff --git a/Makefile b/Makefile >> index 428ef40b9..efab87871 100644 >> --- a/Makefile >> +++ b/Makefile >> @@ -37,14 +37,15 @@ SUBCRATES != cargo metadata --no-deps --format-version=1 \ >> | sed -e "s!.*$$PWD/!!g" -e 's/\#.*$$//g' -e 's/)$$//g' >> >> STATIC_TARGET ?= x86_64-unknown-linux-gnu >> +STATIC_TARGET_DIR := target/static-build >> >> ifeq ($(BUILD_MODE), release) >> CARGO_BUILD_ARGS += --release >> COMPILEDIR := target/$(DEB_HOST_RUST_TYPE)/release >> -STATIC_COMPILEDIR := target/$(STATIC_TARGET)/release >> +STATIC_COMPILEDIR := $(STATIC_TARGET_DIR)/$(DEB_HOST_RUST_TYPE)/release >> else >> COMPILEDIR := target/$(DEB_HOST_RUST_TYPE)/debug >> -STATIC_COMPILEDIR := target/$(STATIC_TARGET)/debug >> +STATIC_COMPILEDIR := $(STATIC_TARGET_DIR)/$(DEB_HOST_RUST_TYPE)/debug >> endif >> >> ifeq ($(valgrind), yes) >> @@ -64,10 +65,11 @@ 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 >> 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) >> >> DSC = rust-$(PACKAGE)_$(DEB_VERSION).dsc >> >> @@ -199,7 +201,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) proxmox-backup-client-static >> install -dm755 $(DESTDIR)$(BINDIR) >> install -dm755 $(DESTDIR)$(ZSH_COMPL_DEST) >> $(foreach i,$(USR_BIN), \ >> @@ -218,25 +220,25 @@ 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 > > you can undo this when installing the binary into the package > afterwards, no need for symlinking then (see below) > >> $(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) \ >> + tar cf - $(SERVER_DEB) $(SERVER_DBG_DEB) $(DOC_DEB) $(CLIENT_DEB) $(CLIENT_DBG_DEB) $(STATIC_CLIENT_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 - $(CLIENT_DEB) $(CLIENT_DBG_DEB) $(STATIC_CLIENT_DEB) | ssh -X repoman@repo.proxmox.com upload --product "pve,pmg,pbs-client" --dist $(UPLOAD_DIST) > > I don't think it makes sense to upload the static client to PVE and PMG, > we probably just want to move the pbs-client target to its own upload > invocation here? > >> 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: >> mkdir -p $(STATIC_COMPILEDIR)/deps-stubs/ && \ >> echo '!<arch>' > $(STATIC_COMPILEDIR)/deps-stubs/libsystemd.a # workaround for to greedy linkage and proxmox-systemd >> - RUSTFLAGS='-C target-feature=+crt-static -C strip=debuginfo -L $(STATIC_COMPILEDIR)/deps-stubs/' \ >> - $(CARGO) build $(CARGO_BUILD_ARGS) \ >> - --package proxmox-backup-client --bin proxmox-backup-client \ >> - --target $(STATIC_TARGET) >> + $(CARGO) rustc $(CARGO_BUILD_ARGS) --package proxmox-backup-client --bin proxmox-backup-client \ >> + --target $(STATIC_TARGET) --target-dir $(STATIC_TARGET_DIR) -- \ >> + -C target-feature=+crt-static -C strip=debuginfo -L $(STATIC_COMPILEDIR)/deps-stubs/ >> diff --git a/debian/control b/debian/control >> index 1a2661858..3bddeecc4 100644 >> --- a/debian/control >> +++ b/debian/control >> @@ -205,6 +205,15 @@ 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 >> +Provides: proxmox-backup-client > > I don't think we need/want this Provides here, unless there is a need > for it that I am missing? it might make apt pull in the static version > by accident, and also doesn't allow to just switch over to the static > variant.. > >> +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: <!nodoc> >> Section: doc >> diff --git a/debian/proxmox-backup-client-static.install b/debian/proxmox-backup-client-static.install >> new file mode 100644 >> index 000000000..d83a77f6e >> --- /dev/null >> +++ b/debian/proxmox-backup-client-static.install >> @@ -0,0 +1,4 @@ >> +usr/bin/proxmox-backup-client-static > > we could just ship the client under the usual name instead, since the > packages conflict anyway.. > > there's two ways to do this - either convert the .install file to use > dh-exec (see `man dh_install`), or `mv` it manually in d/rules - we > already override dh_auto_install there, so this should be fairly easy to > do: > > diff --git a/debian/proxmox-backup-client-static.install b/debian/proxmox-backup-client-static.install > index d83a77f6e..690303a74 100644 > --- a/debian/proxmox-backup-client-static.install > +++ b/debian/proxmox-backup-client-static.install > @@ -1,4 +1,3 @@ > -usr/bin/proxmox-backup-client-static > usr/share/man/man1/proxmox-backup-client.1 > usr/share/man/man1/pxar.1 > usr/share/zsh/vendor-completions/_proxmox-backup-client > diff --git a/debian/rules b/debian/rules > index a03fe11ba..be7c93c2e 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 > > >> +usr/share/man/man1/proxmox-backup-client.1 >> +usr/share/man/man1/pxar.1 > > we don't build/ship pxar (should we? ;)) so this man page probably > shouldn't be included here.. > >> +usr/share/zsh/vendor-completions/_proxmox-backup-client > > the bash completion is missing.. > >> diff --git a/debian/proxmox-backup-client-static.links b/debian/proxmox-backup-client-static.links > > and drop this then :) > >> new file mode 100644 >> index 000000000..a26ce008c >> --- /dev/null >> +++ b/debian/proxmox-backup-client-static.links >> @@ -0,0 +1 @@ >> +usr/bin/proxmox-backup-client-static usr/bin/proxmox-backup-client > > > _______________________________________________ > pbs-devel mailing list > pbs-devel@lists.proxmox.com > https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel _______________________________________________ pbs-devel mailing list pbs-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [pbs-devel] [RFC proxmox-backup] buildsys: build and package statically linked client binary 2025-04-09 9:09 ` Fabian Grünbichler 2025-04-09 9:22 ` Christian Ebner @ 2025-04-09 9:53 ` Thomas Lamprecht 1 sibling, 0 replies; 4+ messages in thread From: Thomas Lamprecht @ 2025-04-09 9:53 UTC (permalink / raw) To: Proxmox Backup Server development discussion, Fabian Grünbichler Am 09.04.25 um 11:09 schrieb Fabian Grünbichler: > I think the following going in first and rebasing on top might make > sense: > > ----8<---- > commit 1793d3cd1ee9e1175354350f7c3dde92c9ed4413 > Author: Fabian Grünbichler <f.gruenbichler@proxmox.com> > AuthorDate: Wed Apr 9 10:32:20 2025 +0200 > Commit: Fabian Grünbichler <f.gruenbichler@proxmox.com> > CommitDate: Wed Apr 9 10:32:20 2025 +0200 > > build: always set --target > > since it affects whether cargo puts build artifacts directly into > target/debug (or target/release) or into a target-specific > sub-directory. > > the package build will always pass `--target $(DEB_HOST_RUST_TYPE)`, > since it invokes the cargo wrapper in /usr/share/cargo/bin/cargo, so > this change unifies the behaviour across plain `make` and `make > deb`. > > direct calls to `cargo build/test/..` will still work as before. > > Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com> > > diff --git a/Makefile b/Makefile > index 428ef40b9..2543b1e37 100644 > --- a/Makefile > +++ b/Makefile > @@ -1,8 +1,10 @@ > include /usr/share/dpkg/default.mk > +include /usr/share/rustc/architecture.mk > include defines.mk > > PACKAGE := proxmox-backup > ARCH := $(DEB_BUILD_ARCH) > +export DEB_HOST_RUST_TYPE > > SUBDIRS := etc www docs templates > > @@ -39,10 +41,11 @@ SUBCRATES != cargo metadata --no-deps --format-version=1 \ > STATIC_TARGET ?= x86_64-unknown-linux-gnu > > ifeq ($(BUILD_MODE), release) > -CARGO_BUILD_ARGS += --release > +CARGO_BUILD_ARGS += --release --target $(DEB_HOST_RUST_TYPE) > COMPILEDIR := target/$(DEB_HOST_RUST_TYPE)/release > STATIC_COMPILEDIR := target/$(STATIC_TARGET)/release > else > +CARGO_BUILD_ARGS += --target $(DEB_HOST_RUST_TYPE) > COMPILEDIR := target/$(DEB_HOST_RUST_TYPE)/debug > STATIC_COMPILEDIR := target/$(STATIC_TARGET)/debug > endif > ---->8---- Reviewed-by: Thomas Lamprecht <t.lamprecht@proxmox.com> feel free to push directly. _______________________________________________ pbs-devel mailing list pbs-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2025-04-09 9:53 UTC | newest] Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2025-04-09 8:18 [pbs-devel] [RFC proxmox-backup] buildsys: build and package statically linked client binary Christian Ebner 2025-04-09 9:09 ` Fabian Grünbichler 2025-04-09 9:22 ` Christian Ebner 2025-04-09 9:53 ` Thomas Lamprecht
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inboxService provided by Proxmox Server Solutions GmbH | Privacy | Legal