Skip to content

dh-cargo-built-using does not support internal static libs in non-default dir

I have a number of packages building rust libraries which are statically linked into the rest of the (C++) program. The build is managed by the upstream build system (autoconf/meson). (Example package: dnsdist).

The static library for these packages tends to be in a subdirectory of the source, for example dnsdist-rust-lib/rust.

To make this work, I use this snippet in d/rules:

include /usr/share/dpkg/architecture.mk
include /usr/share/dpkg/buildflags.mk
include /usr/share/rustc/architecture.mk
export CFLAGS CXXFLAGS CPPFLAGS LDFLAGS
export DEB_HOST_RUST_TYPE DEB_HOST_GNU_TYPE

export CARGO=/usr/share/cargo/bin/cargo
export CARGO_HOME=$(CURDIR)/debian/cargo_home
export CARGO_REGISTRY=$(CURDIR)/debian/cargo_registry
export DEB_CARGO_CRATE=$(DEB_SOURCE)_$(DEB_VERSION_UPSTREAM)

# for pdns makefile
export RUSTC_TARGET_ARCH=$(DEB_HOST_RUST_TYPE)

But dh-cargo-built-using then fails.

Snippet I tried originally:

override_dh_auto_build-arch:
	dh_auto_build -- V=1
	# workaround for static libs in non-default dir
	ln -s ./dnsdist-rust-lib/rust/target .
	/usr/share/cargo/bin/dh-cargo-built-using dnsdist

This fails with:

ln -s ./dnsdist-rust-lib/rust/target .
/usr/share/cargo/bin/dh-cargo-built-using dnsdist
/usr/share/cargo/bin/dh-cargo-built-using: found static lib cxxbridge1 at /build/reproducible-path/dnsdist-2.0.0~rc2/dnsdist-rust-lib/rust/target/aarch64-unknown-linux-gnu/release/build/cxx-b56f63de7748d09c/out/libcxxbridge1.a
/usr/share/cargo/bin/dh-cargo-built-using: found static lib dnsdist_rust at /build/reproducible-path/dnsdist-2.0.0~rc2/dnsdist-rust-lib/rust/target/aarch64-unknown-linux-gnu/release/build/dnsdist-rust-e4eb237ed11f7142/out/libdnsdist_rust.a
dpkg-query: no path found matching pattern /build/reproducible-path/dnsdist-2.0.0~rc2/dnsdist-rust-lib/rust
/usr/share/cargo/bin/dh-cargo-built-using: abort: could not find Debian package for file /build/reproducible-path/dnsdist-2.0.0~rc2/dnsdist-rust-lib/rust
make[1]: *** [debian/rules:66: override_dh_auto_build-arch] Error 1

With @fg's help we arrived at:

override_dh_auto_build-arch:
	dh_auto_build -- V=1
	# workaround for static libs in non-default dir
	ln -s ./dnsdist-rust-lib/rust/target .
	sed -e '/rustc-link-lib=static=dnsdist_rust/d' -i target/*/release/build/dnsdist-rust*/output
	/usr/share/cargo/bin/dh-cargo-built-using dnsdist