pkg-autotools: generic configure fix for powerpc64
authorSam bobroff <sam.bobroff@au1.ibm.com>
Mon, 28 Nov 2016 05:11:39 +0000 (16:11 +1100)
committerThomas Petazzoni <thomas.petazzoni@free-electrons.com>
Mon, 5 Dec 2016 21:51:17 +0000 (22:51 +0100)
Many (100+) packages supported by buildroot contain old configure
scripts (or build them from old versions of autotools) that are unable
to determine how to link shared libraries on powerpc64 and
powerpc64le. This causes that test to erroneously fail on toolchains
that are not "bi-endian" (which is the case for toolchains built by
buildroot), which causes configure to build static libraries instead
of dynamic ones. Although these builds succeed, they tend to cause
linker failures in binaries later linked against them.

Because affected configure files can be discovered automatically, this
patch introduces a hook (enabled only when building for powerpc64 and
powerpc64le) that uses a script to scan and fix each package.

Signed-off-by: Sam Bobroff <sam.bobroff@au1.ibm.com>
Reviewed-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
package/pkg-autotools.mk
support/scripts/fix-configure-powerpc64.sh [new file with mode: 0755]

index d1cdb89fb565abf690da9a8e1e8bf87d379c381f..00822e2a9d4f259a06ec74a98581b1ccc85e25a0 100644 (file)
@@ -78,6 +78,15 @@ define LIBTOOL_PATCH_HOOK
        done
 endef
 
+#
+# Hook to patch common issue with configure on powerpc64{,le} failing
+# to detect shared library support:
+#
+define CONFIGURE_FIX_POWERPC64_HOOK
+       @$(call MESSAGE,"Checking configure (powerpc64/powerpc64le)")
+       support/scripts/fix-configure-powerpc64.sh $($(PKG)_DIR)
+endef
+
 #
 # Hook to gettextize the package if needed
 #
@@ -255,6 +264,13 @@ endif
 
 endif
 
+# Append a configure hook if building for a powerpc64 (or powerpc64le) arch.
+# Must be added after other pre-configure hooks that might regenerate the
+# configure script and overwrite the changes made here.
+ifneq ($$(filter powerpc64%,$$(if $$(filter target,$(4)),$$(ARCH),$$(HOSTARCH))),)
+$(2)_PRE_CONFIGURE_HOOKS += CONFIGURE_FIX_POWERPC64_HOOK
+endif
+
 #
 # Build step. Only define it if not already defined by the package .mk
 # file.
diff --git a/support/scripts/fix-configure-powerpc64.sh b/support/scripts/fix-configure-powerpc64.sh
new file mode 100755 (executable)
index 0000000..ad71042
--- /dev/null
@@ -0,0 +1,47 @@
+#!/bin/bash
+
+# This is a script to find, and correct, a problem with old versions of
+# configure that affect powerpc64 and powerpc64le.
+
+# The issue causes configure to incorrectly determine that shared library
+# support is not present in the linker. This causes the package to build a
+# static library rather than a dynamic one and although the build will succeed,
+# it may cause packages that link with the static library it to fail due to
+# undefined symbols.
+
+# This script searches for files named 'configure' that appear to have this
+# issue (by searching for a known bad pattern) and patching them.
+
+set -e
+
+if [ $# -ne 1 ]; then
+       echo "Usage: $0 <package build directory>"
+       exit 2
+fi
+
+srcdir="$1"
+files=$(cd "$srcdir" && find . -name configure \
+-exec grep -qF 'Generated by GNU Autoconf' {} \; \
+-exec grep -qF 'ppc*-*linux*|powerpc*-*linux*)' {} \; -print)
+
+# --ignore-whitespace is needed because some packages have included
+# copies of configure scripts where tabs have been replaced with spaces.
+for c in $files; do
+       patch --ignore-whitespace "$srcdir"/"$c" <<'EOF'
+--- a/configure        2016-11-16 15:31:46.097447271 +1100
++++ b/configure        2008-07-21 12:17:23.000000000 +1000
+@@ -4433,7 +4433,10 @@
+         x86_64-*linux*)
+           LD="${LD-ld} -m elf_x86_64"
+           ;;
+-        ppc*-*linux*|powerpc*-*linux*)
++        powerpcle-*linux*)
++          LD="${LD-ld} -m elf64lppc"
++          ;;
++        powerpc-*linux*)
+           LD="${LD-ld} -m elf64ppc"
+           ;;
+         s390*-*linux*)
+EOF
+done
+