[pbs-devel] [PATCH proxmox-backup] fix static build

Fabian Grünbichler f.gruenbichler at proxmox.com
Mon Jun 23 09:50:09 CEST 2025


this currently breaks using the static client pointed at hostnames
instead of IPs on some platforms:

https://forum.proxmox.com/threads/proxmox-backup-client-static-floating-point-exception-core-dumped.167731/#post-779723

so we should probably also backport this (and preceding build fixes) to
bookworm and roll out a fixed package.

On June 23, 2025 8:17 am, Fabian Grünbichler wrote:
> `cargo rustc` only passes the flags (like `target-feature` in this case) for
> the final invocation, not for any dependency compilation.
> 
> unfortunately, switching to `cargo build` is not straight-forward:
> - during a package build, $CARGO is the cargo wrapper which only honors
>   RUSTFLAGS in its `prepare-debian` invocation
> - rustflags in cargo's config.toml are global/per target
> - the unstable override that would allow setting them per profile is broken
> - and it would only work for the final invocation anyway, just like `cargo rustc`
> 
> as a stop-gap measure, let's duplicate and adapt the generated config.toml, and
> select it explicitly when doing the static compilation as part of the package
> build. manual `make proxmox-backup-client-static` can still just pass RUSTFLAGS
> via the environment..
> 
> Signed-off-by: Fabian Grünbichler <f.gruenbichler at proxmox.com>
> ---
> verified that this passes the right --target-feature to the build, and that
> code guarded under that feature with an intentionally introduced compilation
> error trips up the static client build..
> 
> sed is not my strongest suite, so feel free to make that part in d/rules
> nicer..
> 
> we could also put some of the variables into a shared file source by Makefile
> and d/rules, maybe..
> 
>  Makefile     | 14 +++++++++-----
>  debian/rules | 13 +++++++++++++
>  2 files changed, 22 insertions(+), 5 deletions(-)
> 
> diff --git a/Makefile b/Makefile
> index 1ae8da6f5..f14b4d8ce 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -38,19 +38,23 @@ SUBCRATES != cargo metadata --no-deps --format-version=1 \
>  	| grep "$$PWD/" \
>  	| sed -e "s!.*$$PWD/!!g" -e 's/\#.*$$//g' -e 's/)$$//g'
>  
> +# sync with debian/rules!
>  STATIC_TARGET_DIR := target/static-build
> -
>  ifeq ($(BUILD_MODE), release)
>  CARGO_BUILD_ARGS += --release --target $(DEB_HOST_RUST_TYPE)
> +CARGO_STATIC_CONFIG ?= --config debian/cargo_home/config.static.toml
> +CARGO_STATIC_BUILD_ARGS += $(CARGO_STATIC_CONFIG) --release --target $(DEB_HOST_RUST_TYPE) --target-dir $(STATIC_TARGET_DIR)
>  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)
> +CARGO_STATIC_BUILD_ARGS += --target $(DEB_HOST_RUST_TYPE) --target-dir $(STATIC_TARGET_DIR)
>  COMPILEDIR := target/$(DEB_HOST_RUST_TYPE)/debug
>  STATIC_COMPILEDIR := $(STATIC_TARGET_DIR)/$(DEB_HOST_RUST_TYPE)/debug
>  endif
>  
>  STATIC_RUSTC_FLAGS := -C target-feature=+crt-static -L $(STATIC_COMPILEDIR)/deps-stubs/
> +# end sync with debian/rules
>  
>  ifeq ($(valgrind), yes)
>  CARGO_BUILD_ARGS += --features valgrind
> @@ -209,11 +213,11 @@ $(STATIC_BINS) &:
>  	mkdir -p $(STATIC_COMPILEDIR)/deps-stubs/ && \
>            echo '!<arch>' > $(STATIC_COMPILEDIR)/deps-stubs/libsystemd.a # workaround for to greedy linkage and proxmox-systemd
>  	OPENSSL_STATIC=1 \
> -	$(CARGO) rustc $(CARGO_BUILD_ARGS) --package pxar-bin --bin pxar \
> -	  --target-dir $(STATIC_TARGET_DIR) -- $(STATIC_RUSTC_FLAGS)
> +	RUSTFLAGS="$(STATIC_RUSTC_FLAGS)" \
> +	$(CARGO) build $(CARGO_STATIC_BUILD_ARGS) --package pxar-bin --bin pxar
>  	OPENSSL_STATIC=1 \
> -	$(CARGO) rustc $(CARGO_BUILD_ARGS) --package proxmox-backup-client --bin proxmox-backup-client \
> -	  --target-dir $(STATIC_TARGET_DIR) -- $(STATIC_RUSTC_FLAGS)
> +	RUSTFLAGS="$(STATIC_RUSTC_FLAGS)" \
> +	$(CARGO) build $(CARGO_STATIC_BUILD_ARGS) --package proxmox-backup-client --bin proxmox-backup-client
>  
>  .PHONY: lint
>  lint:
> diff --git a/debian/rules b/debian/rules
> index 70cec4754..6f1773eaf 100755
> --- a/debian/rules
> +++ b/debian/rules
> @@ -7,6 +7,16 @@ include /usr/share/dpkg/pkg-info.mk
>  include /usr/share/rustc/architecture.mk
>  
>  export BUILD_MODE=release
> +export CARGO_STATIC_CONFIG=--config debian/cargo_home/config.static.toml
> +
> +# sync with Makefile!
> +STATIC_TARGET_DIR := target/static-build
> +ifeq ($(BUILD_MODE), release)
> +STATIC_COMPILEDIR := $(STATIC_TARGET_DIR)/$(DEB_HOST_RUST_TYPE)/release
> +else
> +STATIC_COMPILEDIR := $(STATIC_TARGET_DIR)/$(DEB_HOST_RUST_TYPE)/debug
> +endif
> +# end sync with Makefile!
>  
>  export CARGO=/usr/share/cargo/bin/cargo
>  
> @@ -28,6 +38,9 @@ override_dh_auto_configure:
>  	@perl -ne 'if (/^version\s*=\s*"(\d+(?:\.\d+)+)"/) { my $$v_cargo = $$1; my $$v_deb = "$(DEB_VERSION_UPSTREAM)"; \
>  	    die "ERROR: d/changelog <-> Cargo.toml version mismatch: $$v_cargo != $$v_deb\n" if $$v_cargo ne $$v_deb; exit(0); }' Cargo.toml
>  	$(CARGO) prepare-debian $(CURDIR)/debian/cargo_registry --link-from-system
> +	# add a new config for static building, sync with Makefile!
> +	cp debian/cargo_home/config.toml debian/cargo_home/config.static.toml
> +	sed -ie 's!^\(rustflags = .*\)\]$$!\1, "-C", "target-feature=+crt-static", "-L", "$(STATIC_COMPILEDIR)/deps-stubs/"\]!' debian/cargo_home/config.static.toml
>  	# `cargo build` and `cargo install` have different config precedence, symlink
>  	# the wrapper config into a place where `build` picks it up as well..
>  	# https://doc.rust-lang.org/cargo/commands/cargo-install.html#configuration-discovery
> -- 
> 2.39.5
> 
> 
> 
> _______________________________________________
> 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