[backfire] scripts: merge r29944 - r29948
authorjow <jow@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Sun, 29 Jan 2012 20:21:46 +0000 (20:21 +0000)
committerjow <jow@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Sun, 29 Jan 2012 20:21:46 +0000 (20:21 +0000)
git-svn-id: svn://svn.openwrt.org/openwrt/branches/backfire@29949 3c298f89-4303-0410-b956-a3cf2f4a3e73

scripts/download.pl
scripts/ext-toolchain.sh
scripts/patch-specs.sh

index 50ecfc6..912d21b 100755 (executable)
@@ -142,8 +142,6 @@ foreach my $mirror (@ARGV) {
                        push @extra, "$extra[0]/longterm/v$1";
                }               
                foreach my $dir (@extra) {
-                       push @mirrors, "ftp://ftp.geo.kernel.org/pub/$dir";
-                       push @mirrors, "http://ftp.geo.kernel.org/pub/$dir";
                        push @mirrors, "ftp://ftp.all.kernel.org/pub/$dir";
                        push @mirrors, "http://ftp.all.kernel.org/pub/$dir";
                        push @mirrors, "ftp://ftp.de.kernel.org/pub/$dir";
index 257e0d8..a34ef06 100755 (executable)
@@ -197,6 +197,47 @@ find_bins() {
 }
 
 
+wrap_bin_cc() {
+       local out="$1"
+       local bin="$2"
+
+       echo    '#!/bin/sh'                                                > "$out"
+       echo    'for arg in "$@"; do'                                     >> "$out"
+       echo    ' case "$arg" in -l*|-L*|-shared|-static)'                >> "$out"
+       echo -n '  exec "'"$bin"'" '"$CFLAGS"' ${STAGING_DIR:+'           >> "$out"
+       echo -n '-idirafter "$STAGING_DIR/usr/include" '                  >> "$out"
+       echo -n '-L "$STAGING_DIR/usr/lib" '                              >> "$out"
+       echo    '-Wl,-rpath-link,"$STAGING_DIR/usr/lib"} "$@" ;;'         >> "$out"
+       echo    ' esac'                                                   >> "$out"
+       echo    'done'                                                    >> "$out"
+       echo -n 'exec "'"$bin"'" '"$CFLAGS"' ${STAGING_DIR:+'             >> "$out"
+       echo    '-idirafter "$STAGING_DIR/usr/include"} "$@"'             >> "$out"
+
+       chmod +x "$out"
+}
+
+wrap_bin_ld() {
+       local out="$1"
+       local bin="$2"
+
+       echo    '#!/bin/sh'                                                > "$out"
+       echo -n 'exec "'"$bin"'" '"$CFLAGS"' ${STAGING_DIR:+'             >> "$out"
+       echo -n '-L "$STAGING_DIR/usr/lib" '                              >> "$out"
+       echo    '-rpath-link "$STAGING_DIR/usr/lib"} "$@"'                >> "$out"
+
+       chmod +x "$out"
+}
+
+wrap_bin_other() {
+       local out="$1"
+       local bin="$2"
+
+       echo    '#!/bin/sh'                                                > "$out"
+       echo    'exec "'"$bin"'" "$@"'                                    >> "$out"
+
+       chmod +x "$out"
+}
+
 wrap_bins() {
        if probe_cc; then
                mkdir -p "$1" || return 1
@@ -205,28 +246,24 @@ wrap_bins() {
                for cmd in "${CC%-*}-"*; do
                        if [ -x "$cmd" ]; then
                                local out="$1/${cmd##*/}"
+                               local bin="$cmd"
+
+                               if [ -x "$out" ] && ! grep -q STAGING_DIR "$out"; then
+                                       mv "$out" "$out.bin"
+                                       bin='$(dirname "$0")/'"${out##*/}"'.bin'
+                               fi
 
-                               echo '#!/bin/sh' > "$out"
                                case "${cmd##*/}" in
                                        *-*cc|*-*cc-*|*-*++|*-*++-*|*-cpp)
-                                               echo -n 'exec "'"$cmd"'" '"$CFLAGS"' '         >> "$out"
-                                               echo -n '${STAGING_DIR:+-idirafter '           >> "$out"
-                                               echo -n '"$STAGING_DIR/usr/include" '          >> "$out"
-                                               echo -n '-L "$STAGING_DIR/usr/lib" '           >> "$out"
-                                               echo -n '-Wl,-rpath-link,'                     >> "$out"
-                                               echo    '"$STAGING_DIR/usr/lib"} "$@"'         >> "$out"
+                                               wrap_bin_cc "$out" "$bin"
                                        ;;
                                        *-ld)
-                                               echo -n 'exec "'"$cmd"'" ${STAGING_DIR:+'      >> "$out"
-                                               echo -n '-L "$STAGING_DIR/usr/lib" '           >> "$out"
-                                               echo -n '-rpath-link '                         >> "$out"
-                                               echo    '"$STAGING_DIR/usr/lib"} "$@"'         >> "$out"
+                                               wrap_bin_ld "$out" "$bin"
                                        ;;
                                        *)
-                                               echo "exec '$cmd' \"\$@\"" >> "$out"
+                                               wrap_bin_other "$out" "$bin"
                                        ;;
                                esac
-                               chmod +x "$out"
                        fi
                done
 
index 4d02a00..3307b6b 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