]> granicus.if.org Git - python/commitdiff
- Issue #3754: Use readelf instead of ldd for the cross build readline check
authordoko@ubuntu.com <doko@ubuntu.com>
Sat, 30 Jun 2012 16:25:32 +0000 (18:25 +0200)
committerdoko@ubuntu.com <doko@ubuntu.com>
Sat, 30 Jun 2012 16:25:32 +0000 (18:25 +0200)
Makefile.pre.in
configure
configure.ac
setup.py

index 88f6967cde630759f0e9e04bc126274caaa9fa77..29a42df77832e36f47c9e3c95999891ebf7d380c 100644 (file)
@@ -34,6 +34,7 @@ MAINCC=               @MAINCC@
 LINKCC=                @LINKCC@
 AR=            @AR@
 RANLIB=                @RANLIB@
+READELF=       @READELF@
 SOABI=         @SOABI@
 LDVERSION=     @LDVERSION@
 HGVERSION=     @HGVERSION@
index 72ad97ab7e0a2e138fdd44f8be491ebcdc938d02..c61546680ce1a7513136f7e60ad863c88481351f 100755 (executable)
--- a/configure
+++ b/configure
@@ -646,6 +646,8 @@ INSTALL_SCRIPT
 INSTALL_PROGRAM
 HAS_PYTHON
 DISABLE_ASDLGEN
+ac_ct_READELF
+READELF
 ARFLAGS
 ac_ct_AR
 AR
@@ -5742,6 +5744,115 @@ then
         ARFLAGS="rc"
 fi
 
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in readelf
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_READELF+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$READELF"; then
+  ac_cv_prog_READELF="$READELF" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_READELF="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+READELF=$ac_cv_prog_READELF
+if test -n "$READELF"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $READELF" >&5
+$as_echo "$READELF" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$READELF" && break
+  done
+fi
+if test -z "$READELF"; then
+  ac_ct_READELF=$READELF
+  for ac_prog in readelf
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_READELF+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_READELF"; then
+  ac_cv_prog_ac_ct_READELF="$ac_ct_READELF" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_READELF="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_READELF=$ac_cv_prog_ac_ct_READELF
+if test -n "$ac_ct_READELF"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_READELF" >&5
+$as_echo "$ac_ct_READELF" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_READELF" && break
+done
+
+  if test "x$ac_ct_READELF" = x; then
+    READELF=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    READELF=$ac_ct_READELF
+  fi
+fi
+
+if test "$cross_compiling" = yes; then
+    case "$READELF" in
+       readelf|:)
+       as_fn_error $? "readelf for the host is required for cross builds" "$LINENO" 5
+       ;;
+    esac
+fi
+
+
 
 DISABLE_ASDLGEN=""
 # Extract the first word of "python", so it can be a program name with args.
index eb0763afcf289dedd659daa0ab8732b75527f5c4..00ed902d540da095373af84343dec2ca91fb59e2 100644 (file)
@@ -926,6 +926,16 @@ then
         ARFLAGS="rc"
 fi
 
+AC_CHECK_TOOLS([READELF], [readelf], [:])
+if test "$cross_compiling" = yes; then
+    case "$READELF" in
+       readelf|:)
+       AC_MSG_ERROR([readelf for the host is required for cross builds])
+       ;;
+    esac
+fi
+AC_SUBST(READELF)
+
 AC_SUBST(DISABLE_ASDLGEN)
 DISABLE_ASDLGEN=""
 AC_CHECK_PROG(HAS_PYTHON, python, found, not-found)
index 19e6bc366867aa4580f736508b5f10f24fd77807..e26f083483bddb7f1ee0070bc4d00f257a3e1382 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -590,13 +590,20 @@ class PyBuildExt(build_ext):
         do_readline = self.compiler.find_library_file(lib_dirs, 'readline')
         readline_termcap_library = ""
         curses_library = ""
+        # Cannot use os.popen here in py3k.
+        tmpfile = os.path.join(self.build_temp, 'readline_termcap_lib')
+        if not os.path.exists(self.build_temp):
+            os.makedirs(self.build_temp)
         # Determine if readline is already linked against curses or tinfo.
-        if do_readline and find_executable('ldd'):
-            # Cannot use os.popen here in py3k.
-            tmpfile = os.path.join(self.build_temp, 'readline_termcap_lib')
-            if not os.path.exists(self.build_temp):
-                os.makedirs(self.build_temp)
-            ret = os.system("ldd %s > %s" % (do_readline, tmpfile))
+        if do_readline:
+            if cross_compiling:
+                ret = os.system("%s -d %s | grep '(NEEDED)' > %s" \
+                                % (sysconfig.get_config_var('READELF'),
+                                   do_readline, tmpfile))
+            elif find_executable('ldd'):
+                ret = os.system("ldd %s > %s" % (do_readline, tmpfile))
+            else:
+                ret = 256
             if ret >> 8 == 0:
                 with open(tmpfile) as fp:
                     for ln in fp: