Source: newlib Version: 2.2.0+git20150830.5a3d536-1 Severity: wishlist Tags: patch User: reproducible-bui...@lists.alioth.debian.org Usertags: locale
Hi! While working on the “reproducible builds” effort [1], we have noticed that newlib could not be built reproducibly. In particular, the order in which object files get added to archives is not deterministic. I think the problem is that the locale affects how the shell sorts filenames. I've attached two patches. The first modifies Makefile.am files to use LC_ALL=C when adding members to archives, and as such is suitable for sending upstream. The second is the equivalent change for Makefile.in, and us such is suitable for applying to the Debian package (since it does not invoke automake). Regards, Daf [1]: https://wiki.debian.org/ReproducibleBuilds
diff --git a/newlib/Makefile.am b/newlib/Makefile.am index 5ecce4c..9cc1152 100644 --- a/newlib/Makefile.am +++ b/newlib/Makefile.am @@ -160,6 +160,7 @@ libc.a: libc/libc.a libm.a rm -rf libc.a libg.a tmp mkdir tmp cd tmp; \ + LC_ALL=C ; \ $(AR) x ../libm.a $(MATHOBJS_IN_LIBC) ; \ $(AR) x ../libc/libc.a ; \ $(AR) $(AR_FLAGS) ../$@ *.o diff --git a/newlib/libc/Makefile.am b/newlib/libc/Makefile.am index 21a74fe..b741f24 100644 --- a/newlib/libc/Makefile.am +++ b/newlib/libc/Makefile.am @@ -107,6 +107,7 @@ libc.a: $(SUBLIBS) rm -rf tmp mkdir tmp cd tmp; \ + LC_ALL=C ; \ for i in $(SUBLIBS); do \ $(AR) x ../$$i; \ done; \ diff --git a/newlib/libc/sys/linux/Makefile.am b/newlib/libc/sys/linux/Makefile.am index 8dcc64e..d61ad36 100644 --- a/newlib/libc/sys/linux/Makefile.am +++ b/newlib/libc/sys/linux/Makefile.am @@ -196,6 +196,7 @@ lib.a: $(lib_a_OBJECTS) rm -rf tmp mkdir tmp cd tmp; \ + LC_ALL=C ; \ for i in $(SUBLIBS); do \ $(AR) x ../$$i; \ done; \ diff --git a/newlib/libm/Makefile.am b/newlib/libm/Makefile.am index bc45816..a6bb44c 100644 --- a/newlib/libm/Makefile.am +++ b/newlib/libm/Makefile.am @@ -25,6 +25,7 @@ libm.a: $(SUBLIBS) rm -rf tmp mkdir tmp cd tmp; \ + LC_ALL=C ; \ for i in $(SUBLIBS); do \ $(AR) x ../$$i; \ done; \
diff --git a/newlib/Makefile.in b/newlib/Makefile.in index 468ae99..2dc6388 100644 --- a/newlib/Makefile.in +++ b/newlib/Makefile.in @@ -908,6 +908,7 @@ uninstall-am: uninstall-toollibDATA uninstall-toollibLIBRARIES \ @USE_LIBTOOL_FALSE@ rm -rf libc.a libg.a tmp @USE_LIBTOOL_FALSE@ mkdir tmp @USE_LIBTOOL_FALSE@ cd tmp; \ +@USE_LIBTOOL_FALSE@ LC_ALL=C; \ @USE_LIBTOOL_FALSE@ $(AR) x ../libm.a $(MATHOBJS_IN_LIBC) ; \ @USE_LIBTOOL_FALSE@ $(AR) x ../libc/libc.a ; \ @USE_LIBTOOL_FALSE@ $(AR) $(AR_FLAGS) ../$@ *.o diff --git a/newlib/libc/Makefile.in b/newlib/libc/Makefile.in index cbddc5f..abcd0c7 100644 --- a/newlib/libc/Makefile.in +++ b/newlib/libc/Makefile.in @@ -1026,6 +1026,7 @@ uninstall-am: uninstall-dvi-am uninstall-html-am uninstall-info-am \ @USE_LIBTOOL_FALSE@ rm -rf tmp @USE_LIBTOOL_FALSE@ mkdir tmp @USE_LIBTOOL_FALSE@ cd tmp; \ +@USE_LIBTOOL_FALSE@ LC_ALL=C; \ @USE_LIBTOOL_FALSE@ for i in $(SUBLIBS); do \ @USE_LIBTOOL_FALSE@ $(AR) x ../$$i; \ @USE_LIBTOOL_FALSE@ done; \ diff --git a/newlib/libc/sys/linux/Makefile.in b/newlib/libc/sys/linux/Makefile.in index b15741b..fbfd9d4 100644 --- a/newlib/libc/sys/linux/Makefile.in +++ b/newlib/libc/sys/linux/Makefile.in @@ -1599,6 +1599,7 @@ uninstall-am: @USE_LIBTOOL_FALSE@ rm -rf tmp @USE_LIBTOOL_FALSE@ mkdir tmp @USE_LIBTOOL_FALSE@ cd tmp; \ +@USE_LIBTOOL_FALSE@ LC_ALL=C; \ @USE_LIBTOOL_FALSE@ for i in $(SUBLIBS); do \ @USE_LIBTOOL_FALSE@ $(AR) x ../$$i; \ @USE_LIBTOOL_FALSE@ done; \ diff --git a/newlib/libm/Makefile.in b/newlib/libm/Makefile.in index 86c4a8e..d52cbd6 100644 --- a/newlib/libm/Makefile.in +++ b/newlib/libm/Makefile.in @@ -899,6 +899,7 @@ uninstall-am: uninstall-dvi-am uninstall-html-am uninstall-info-am \ @USE_LIBTOOL_FALSE@ rm -rf tmp @USE_LIBTOOL_FALSE@ mkdir tmp @USE_LIBTOOL_FALSE@ cd tmp; \ +@USE_LIBTOOL_FALSE@ LC_ALL=C; \ @USE_LIBTOOL_FALSE@ for i in $(SUBLIBS); do \ @USE_LIBTOOL_FALSE@ $(AR) x ../$$i; \ @USE_LIBTOOL_FALSE@ done; \