e2fsprogs: fix glibc compile issue (FS#1749,FS#1796)
[openwrt/openwrt.git] / scripts / patch-specs.sh
index 4d02a009ecbfd84d3a1babfd3094198a3be4dc14..3307b6b0904501a83a5f8bc8824d91c9304c6fd1 100755 (executable)
@@ -1,7 +1,6 @@
 #!/usr/bin/env bash
 
 DIR="$1"
-FOUND=0
 
 if [ -d "$DIR" ]; then
        DIR="$(cd "$DIR"; pwd)"
@@ -26,39 +25,66 @@ if [ ! -x "$CPP" ]; then
        exit 1
 fi
 
-for lib in $(STAGING_DIR="$dir" "$CPP" -x c -v /dev/null 2>&1 | sed -ne 's#:# #g; s#^LIBRARY_PATH=##p'); do
-       if [ -d "$lib" ]; then
-               grep -qs "STAGING_DIR" "$lib/specs" && rm -f "$lib/specs"
-               if [ $FOUND -lt 1 ]; then
-                       echo -n "Patching specs ... "
-                       STAGING_DIR="$dir" "$CPP" -dumpspecs | awk '
-                               mode ~ "link" {
-                                       sub("%{L.}", "%{L*} -L %:getenv(STAGING_DIR /usr/lib) -rpath-link %:getenv(STAGING_DIR /usr/lib)")
-                               }
-                               mode ~ "cpp" {
-                                       $0 = $0 " -idirafter %:getenv(STAGING_DIR /usr/include)"
-                               }
-                               {
-                                       print $0
-                                       mode = ""
-                               }
-                               /^\*cpp:/ {
-                                       mode = "cpp"
-                               }
-                               /^\*link.*:/ {
-                                       mode = "link"
-                               }
-                       ' > "$lib/specs"
-                       echo "ok"
-                       FOUND=1
+patch_specs() {
+       local found=0
+
+       for lib in $(STAGING_DIR="$DIR" "$CPP" -x c -v /dev/null 2>&1 | sed -ne 's#:# #g; s#^LIBRARY_PATH=##p'); do
+               if [ -d "$lib" ]; then
+                       grep -qs "STAGING_DIR" "$lib/specs" && rm -f "$lib/specs"
+                       if [ $found -lt 1 ]; then
+                               echo -n "Patching specs ... "
+                               STAGING_DIR="$DIR" "$CPP" -dumpspecs | awk '
+                                       mode ~ "link" {
+                                               sub("%{L.}", "%{L*} -L %:getenv(STAGING_DIR /usr/lib) -rpath-link %:getenv(STAGING_DIR /usr/lib)")
+                                       }
+                                       mode ~ "cpp" {
+                                               $0 = $0 " -idirafter %:getenv(STAGING_DIR /usr/include)"
+                                       }
+                                       {
+                                               print $0
+                                               mode = ""
+                                       }
+                                       /^\*cpp:/ {
+                                               mode = "cpp"
+                                       }
+                                       /^\*link.*:/ {
+                                               mode = "link"
+                                       }
+                               ' > "$lib/specs"
+                               echo "ok"
+                               found=1
+                       fi
                fi
-       fi
-done
+       done
 
-if [ $FOUND -lt 1 ]; then
-       echo "Failed to locate library directory!"
-       exit 1
-else
-       echo "Toolchain successfully patched."
-       exit 0
-fi
+       [ $found -gt 0 ]
+       return $?
+}
+
+
+VERSION="$(STAGING_DIR="$DIR" "$CPP" --version | sed -ne 's/^.* (.*) //; s/ .*$//; 1p')"
+VERSION="${VERSION:-unknown}"
+
+case "${VERSION##* }" in
+       2.*|3.*|4.0.*|4.1.*|4.2.*)
+               echo "The compiler version does not support getenv() in spec files."
+               echo -n "Wrapping binaries instead ... "
+
+               if "${0%/*}/ext-toolchain.sh" --toolchain "$DIR" --wrap "${CPP%/*}"; then
+                       echo "ok"
+                       exit 0
+               else
+                       echo "failed"
+                       exit $?
+               fi
+       ;;
+       *)
+               if patch_specs; then
+                       echo "Toolchain successfully patched."
+                       exit 0
+               else
+                       echo "Failed to locate library directory!"
+                       exit 1
+               fi
+       ;;
+esac