Jelajahi Sumber

Only add -rpath if it is really needed.

This uses an ABI check for std::__throw_out_of_range_fmt(char const*, ...)
which is in GLIBCXX_3.4.20
Bryan Drewery 11 tahun lalu
induk
melakukan
8832ef1a41
2 mengubah file dengan 125 tambahan dan 19 penghapusan
  1. 42 10
      build/autotools/includes/acinclude.m4
  2. 83 9
      configure

+ 42 - 10
build/autotools/includes/acinclude.m4

@@ -215,17 +215,49 @@ dnl Fix GCC lame compiler paths (FreeBSD)
 dnl @summary check whether compiler requires -rpath for libstdc++.so
 AC_DEFUN([CXX_RPATH_CHECK],
 [
-  AC_CACHE_CHECK([whether the compiler requires -rpath], ax_cv_prog_cc_rpath, [
-    ax_cv_prog_cc_rpath=no
-    for path in `${CXX} -print-search-dirs | awk '/^libraries:/ {print substr([$]0, 13)}' | tr ':' ' '`; do
-      if [[ -r "${path}/libstdc++.so" ]]; then
-        ax_cv_prog_cc_rpath="${path}"
-        break
-      fi
-    done
-  ])
+  AC_CACHE_CHECK([whether the compiler requires -rpath], ax_cv_prog_cc_need_rpath, [
+  AC_TRY_RUN([
+#include <vector>
+int main() {
+        std::vector<int> test;
+        try {
+                return test.at(5);
+        } catch (...) {
+                ;
+        }
+        return 0;
+}
+  ], ax_cv_prog_cc_need_rpath=no, ax_cv_prog_cc_need_rpath=yes)])
+
+  if [[ "${ax_cv_prog_cc_need_rpath}" = "yes" ]]; then
+    save_ldflags="$LDFLAGS"
+    AC_CACHE_CHECK([whether the compiler requires -rpath], ax_cv_prog_cc_rpath, [
+      ax_cv_prog_cc_rpath=
+
+      for path in `${CXX} -print-search-dirs | awk '/^libraries:/ {print substr([$]0, 13)}' | tr ':' ' '`; do
+        if [[ -r "${path}/libstdc++.so" ]]; then
+          LDFLAGS="-Wl,-rpath,${path}"
+          AC_TRY_RUN([
+#include <vector>
+int main() {
+        std::vector<int> test;
+        try {
+                return test.at(5);
+        } catch (...) {
+                ;
+        }
+        return 0;
+}
+          ], ax_cv_prog_cc_rpath="`realpath ${path}`")
+          LDFLAGS="$save_ldflags"
+          [[ -n "${ax_cv_prog_cc_rpath}" ]] && break
+        fi
+      done
+    ])
+    LDFLAGS="$save_ldflags"
+  fi
 
-  if [ "${ax_cv_prog_cc_rpath}" != "no" ]; then
+  if [[ -n "${ax_cv_prog_cc_rpath}" ]]; then
     LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-Wl,-rpath,${ax_cv_prog_cc_rpath}"
   fi
 ])

+ 83 - 9
configure

@@ -2996,25 +2996,100 @@ fi
 
 
 
+
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler requires -rpath" >&5
 $as_echo_n "checking whether the compiler requires -rpath... " >&6; }
+if ${ax_cv_prog_cc_need_rpath+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+  if test "$cross_compiling" = yes; then :
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run test program while cross compiling
+See \`build/config.log' for more details" "$LINENO" 5; }
+else
+  cat build/confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end build/confdefs.h.  */
+
+#include <vector>
+int main() {
+        std::vector<int> test;
+        try {
+                return test.at(5);
+        } catch (...) {
+                ;
+        }
+        return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"; then :
+  ax_cv_prog_cc_need_rpath=no
+else
+  ax_cv_prog_cc_need_rpath=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_prog_cc_need_rpath" >&5
+$as_echo "$ax_cv_prog_cc_need_rpath" >&6; }
+
+  if [ "${ax_cv_prog_cc_need_rpath}" = "yes" ]; then
+    save_ldflags="$LDFLAGS"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler requires -rpath" >&5
+$as_echo_n "checking whether the compiler requires -rpath... " >&6; }
 if ${ax_cv_prog_cc_rpath+:} false; then :
   $as_echo_n "(cached) " >&6
 else
 
-    ax_cv_prog_cc_rpath=no
-    for path in `${CXX} -print-search-dirs | awk '/^libraries:/ {print substr($0, 13)}' | tr ':' ' '`; do
-      if [ -r "${path}/libstdc++.so" ]; then
-        ax_cv_prog_cc_rpath="${path}"
-        break
-      fi
-    done
+      ax_cv_prog_cc_rpath=
+
+      for path in `${CXX} -print-search-dirs | awk '/^libraries:/ {print substr($0, 13)}' | tr ':' ' '`; do
+        if [ -r "${path}/libstdc++.so" ]; then
+          LDFLAGS="-Wl,-rpath,${path}"
+          if test "$cross_compiling" = yes; then :
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run test program while cross compiling
+See \`build/config.log' for more details" "$LINENO" 5; }
+else
+  cat build/confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end build/confdefs.h.  */
+
+#include <vector>
+int main() {
+        std::vector<int> test;
+        try {
+                return test.at(5);
+        } catch (...) {
+                ;
+        }
+        return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"; then :
+  ax_cv_prog_cc_rpath="`realpath ${path}`"
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+          LDFLAGS="$save_ldflags"
+          [ -n "${ax_cv_prog_cc_rpath}" ] && break
+        fi
+      done
 
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_prog_cc_rpath" >&5
 $as_echo "$ax_cv_prog_cc_rpath" >&6; }
+    LDFLAGS="$save_ldflags"
+  fi
 
-  if  "${ax_cv_prog_cc_rpath}" != "no" ; then
+  if [ -n "${ax_cv_prog_cc_rpath}" ]; then
     LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-Wl,-rpath,${ax_cv_prog_cc_rpath}"
   fi
 
@@ -3108,7 +3183,6 @@ rm -f confcache
 
 # Speedup compile
 
-
   if test -n "$GXX" && test -z "$no_wall"; then
     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler understands -Wall" >&5
 $as_echo_n "checking whether the compiler understands -Wall... " >&6; }