[Reproducible-builds] Bug#823123: libusb: debian/rules uses unportable shell constructs; please make the build reproducible (shell)

Daniel Shahaf danielsh at apache.org
Sun May 1 01:49:00 UTC 2016


Package: libusb
Version: 0.1.12
Severity: minor
User: reproducible-builds at lists.alioth.debian.org
Usertags: environment

Dear Maintainer,

While working on the “reproducible builds” effort [1], we have noticed
that libusb could not be built reproducibly; the diff between two builds
is:

    # https://tests.reproducible-builds.org/rb-pkg/unstable/amd64/libusb.html
    ├── ./usr/lib/x86_64-linux-gnu/libusb.so
    │ @@ -1,3 +1 @@
    │ -/* GNU ld script.  */
    │ -GROUP ( /lib/x86_64-linux-gnu/libusb-0.1.so.4.4.4 )
    │ -
    │ +/* GNU ld script.  */\nGROUP ( /lib/x86_64-linux-gnu/libusb-0.1.so.4.4.4 )\n

This difference is down to debian/rules calling echo(1) with an argument
that contains a literal backslash.  The behaviour of echo(1) in that
case is (according to POSIX) implementation-defined.  Since debian/rules
uses echo(1) from the building user's shell, the build output differs
when the building user uses SHELL=bash v. SHELL=dash:

    % LC_ALL=C dash -c 'echo "foo\nbar"' 
    foo
    bar
    % LC_ALL=C bash -c 'echo "foo\nbar"' 
    foo\nbar
    % 

The following patch removes the use of implementation-defined behaviour:

[[[
diff --git a/debian/rules b/debian/rules
index c51241b..af1d9db 100755
--- a/debian/rules
+++ b/debian/rules
@@ -23,7 +23,7 @@ override_dh_auto_install-arch:
        mv $(CURDIR)/debian/tmp-deb/usr/lib/$(DEB_HOST_MULTIARCH)/libusb-0.1.so.* \
           $(CURDIR)/debian/tmp-deb/lib/$(DEB_HOST_MULTIARCH)
        rm $(CURDIR)/debian/tmp-deb/usr/lib/$(DEB_HOST_MULTIARCH)/libusb.so
-       echo "/* GNU ld script.  */\nGROUP ( /lib/$(DEB_HOST_MULTIARCH)/libusb-0.1.so.4.4.4 )\n" \
+       printf "/* GNU ld script.  */\nGROUP ( /lib/%%s/libusb-0.1.so.4.4.4 )\n" "$(DEB_HOST_MULTIARCH)" \
                > $(CURDIR)/debian/tmp-deb/usr/lib/$(DEB_HOST_MULTIARCH)/libusb.so
        dh_auto_install --builddirectory build-udeb --destdir=$(CURDIR)/debian/tmp-udeb
]]]

This patch should also make the build reproducible, but I didn't test that.

Note that when built under bash, the .so file contains a literal «\n»
sequence (two bytes).  I'm assuming that might have user-visible
consequences but I don't know what exactly they would be.

Cheers,

Daniel



More information about the Reproducible-builds mailing list