[pbs-devel] [RFC proxmox-backup] buildsys: build and package statically linked client binary
Christian Ebner
c.ebner at proxmox.com
Wed Apr 9 11:22:41 CEST 2025
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 at proxmox.com>
> AuthorDate: Wed Apr 9 10:32:20 2025 +0200
> Commit: Fabian Grünbichler <f.gruenbichler at 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 at 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 at proxmox.com>
>> Signed-off-by: Christian Ebner <c.ebner at 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 at repo.proxmox.com upload --product pbs --dist $(UPLOAD_DIST)
>> - tar cf - $(CLIENT_DEB) $(CLIENT_DBG_DEB) | ssh -X repoman at 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 at 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 at 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 at lists.proxmox.com
> https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel
More information about the pbs-devel
mailing list