]>
git.proxmox.com Git - dh-cargo.git/blob - dh-cargo-built-using
2 # Generates Built-Using after a successful cargo build.
3 # Run this in the package top-level directory where debian/ is.
7 DEB_HOST_RUST_TYPE
="${DEB_HOST_RUST_TYPE:-$(printf "include /usr/share/rustc/architecture.mk\nall:\n\techo \$(DEB_HOST_RUST_TYPE)\n" | make --no-print-directory -sf -)}"
8 CARGO_REGISTRY
="${CARGO_REGISTRY:-debian/cargo_registry}"
9 CARGO_CHANNEL
="${CARGO_CHANNEL:-release}"
11 # CARGO_REGISTRY="$HOME/.cargo/registry/src/github.com-1ecc6299db9ec823" DEB_HOST_RUST_TYPE="." CARGO_CHANNEL=debug
13 CARGO_TARGET_DIR
="target/$DEB_HOST_RUST_TYPE/$CARGO_CHANNEL"
14 CARGO_TARGET_DIR_ABS
="$(readlink -f "$CARGO_TARGET_DIR")"
16 CPRIGHT_FORMAT
="https://www.debian.org/doc/packaging-manuals/copyright-format/1.0"
17 SRCLEFT_LICENSES
="$(echo GPL LGPL AGPL GFDL MPL CDDL CPL Artistic Perl QPL | tr ' ' '\n')"
18 pkg_has_srcleft_license
() {
21 local f
="/usr/share/doc/$pkg/copyright"
22 if ! sed -nre 's ^Format: (.*) \1 gp' "$f" |
grep -qiw "$CPRIGHT_FORMAT"; then
23 echo >&2 "$0: abort: Not in machine-readable format: $f"
25 elif sed -nre 's ^X-Binary-Requires-Source: (.*) \1 gp' "$f" |
grep -qiw yes; then
27 elif sed -nre 's ^License: (.*) \1 gp' "$f" |
grep -qiwF "$SRCLEFT_LICENSES"; then
35 cat "$CARGO_TARGET_DIR/deps"/*.d \
36 |
sed -nre 's ^(('"$PWD/"')?'"$CARGO_REGISTRY"'/[^/]*)/.* \1 gp' \
38 |
xargs -r readlink
-f \
40 |
sed -nre 's (.*): .* \1 gp' \
41 |
xargs -r dpkg-query
--show \
42 |
while read pkg ver
; do echo "$pkg $ver $(pkg_has_srcleft_license "${pkg%:*}" "$ver")"; done
43 # pkg_has_srcleft_license should be accurate for all rust crates, no need to give a $containing_crate
44 # this is due to nature of crate copyright info, and the debian rust packaging policy
47 gcc_default_searchdirs
() {
48 gcc
-print-search-dirs \
49 |
sed -nre 's ^libraries: (.*) \1 gp' \
51 |
sed -e 's ^= '"$(gcc -print-sysroot)"' g' \
52 |
xargs readlink
-m 2>/dev
/null
# suppress errors caused by early pipe closure
59 # rust does not actually search normal paths when linking static libs
60 # - see https://github.com/rust-lang/rust/issues/43118
61 # - see also `fn link_rlib` in back/link.rs which calls
62 # `pub fn find_library` in back/archive.rs which generates the error message
63 #gcc_default_searchdirs
64 } |
while read searchdir
; do
65 #echo >&2 "searching $searchdir for static lib $lib"
66 local f
="$(readlink -m "$searchdir/lib
${lib}.a
")"
75 ls -1d "$CARGO_TARGET_DIR/build"/*/output
2>/dev
/null |
while read output
; do
76 sed -nre 's ^cargo:rustc-link-lib=static=(.*) \1 '"$output"' gp' "$output"
77 done |
while read lib output
; do
78 local containing_crate
="$(basename "$
(dirname "$output")")"
79 test -n "$lib" ||
continue
80 local libfile
="$(sed -nre 's ^cargo:rustc-link-search=native=(.*) \1 gp' "$output" | rust_search_lib "$lib")"
82 test -n "$libfile" ||
{ echo >&2 "$0: abort: could not find static lib '$lib'; rustc should have failed already?"; exit 1; }
83 echo >&2 "$0: found static lib $lib at $libfile"
84 if [ "${libfile#$CARGO_TARGET_DIR_ABS/}" != "$libfile" ]; then
85 # static library source code embedded in crate
86 local srcstat
="$(sed -nre 's ^dh-cargo:deb-built-using='"$lib"'=([01]=.*) \1 gp' "$output")"
89 srcleft
="${srcstat%%=*}"
90 libfile
="${srcstat#*=}"
91 if [ "$(readlink -f "$libfile")" = "$(readlink -f "$PWD")" ]; then
92 echo >&2 "$0: static library derived from $libfile which is the top-level crate being built, no need to add Built-Using"
97 echo >&2 "$0: abort: could not determine source-distribution conditions of ${libfile#$CARGO_TARGET_DIR_ABS/}."
98 echo >&2 "You must patch build.rs of ${containing_crate%-*} to output 'println!(\"dh-cargo:deb-built-using=$lib=\$s={}\", env::var(\"CARGO_MANIFEST_DIR\").unwrap());' where:"
99 echo >&2 "- \$s is 1 if the license(s) of the included static libs require source distribution alongside binaries, otherwise 0"
104 local wpkg
="$(dpkg -S "$libfile")"
105 test -n "$wpkg" ||
{ echo >&2 "$0: abort: could not find Debian package for file $libfile"; exit 1; }
106 local pkgstat
="$(echo "$wpkg" | sed -nre 's (.*): .* \1 gp' | xargs -r dpkg-query --show)"
107 local pkg
="$(echo "$pkgstat" | cut -f1)"
108 local ver
="$(echo "$pkgstat" | cut -f2)"
109 # static library source code embedded in crate (from earlier)
110 if [ -n "$srcleft" ]; then
111 echo "$pkg $ver $srcleft"
112 # static libraries from another Debian package
113 elif sed -nre 's ^dh-cargo:deb-built-using='"$lib"'=0~=(.*) \1 gp' "$output" |
{ echo "${pkg%:*} $ver" |
grep -qExf /dev
/fd
/3; } 3<&0; then
115 elif sed -nre 's ^dh-cargo:deb-built-using='"$lib"'=1~=(.*) \1 gp' "$output" |
{ echo "${pkg%:*} $ver" |
grep -qExf /dev
/fd
/3; } 3<&0; then
118 # guess the conditions based on the whole d/copyright file
119 # this loses granularity, e.g. gcc is mostly distributed as GPL-3 but the libbacktrace portion is BSD-3
120 # to retain granularity the crate package maintainer should patch build.rs as suggested
121 echo >&2 "$0: warning: guessing source-distribution conditions of $libfile, this may be inaccurate."
122 echo >&2 "$0: warning: patch build.rs to suppress the above warning"
123 srcleft
="$(pkg_has_srcleft_license "${pkg%:*}" "$ver")"
124 if [ "$srcleft" -gt 1 ]; then
125 echo >&2 "You must patch build.rs of ${containing_crate%-*} to output 'dh-cargo:deb-built-using=$lib=\$s~=\$PAT' where:"
126 echo >&2 "- \$s is 1 if the license(s) of the included static libs require source distribution alongside binaries, otherwise 0"
127 echo >&2 "- \$PAT is an egrep pattern matching the \"\$pkg \$ver\" combinations that satisfy \$s"
128 echo >&2 " for example '$pkg .*' matches the currently-relevant package, $pkg $ver"
131 echo "$pkg $ver $srcleft"
138 if [ -z "$binpkg" ]; then
142 local built_using_x
=""
143 while read pkg ver srcleft
; do
146 1) built_using
="${built_using}$pkg (= $ver), ";;
148 built_using_x
="${built_using_x}$pkg (= $ver), "
150 echo "cargo:Built-Using=${built_using%, }" >> "debian/$binpkg.substvars"
151 echo "cargo:X-Cargo-Built-Using=${built_using_x%, }" >> "debian/$binpkg.substvars"
155 native_libs
="$(native_libs)" # capture output outside of pipe so set -e works
158 test -z "$native_libs" ||
echo "$native_libs"