1#!/usr/bin/env bash 2 3DIR="$1" 4 5if [ -d "$DIR" ]; then 6 DIR="$(cd "$DIR"; pwd)" 7else 8 echo "Usage: $0 toolchain-dir" 9 exit 1 10fi 11 12echo -n "Locating cpp ... " 13for bin in bin usr/bin usr/local/bin; do 14 for cmd in "$DIR/$bin/"*-cpp; do 15 if [ -x "$cmd" ]; then 16 echo "$cmd" 17 CPP="$cmd" 18 break 19 fi 20 done 21done 22 23if [ ! -x "$CPP" ]; then 24 echo "Can't locate a cpp executable in '$DIR' !" 25 exit 1 26fi 27 28patch_specs() { 29 local found=0 30 31 for lib in $(STAGING_DIR="$DIR" "$CPP" -x c -v /dev/null 2>&1 | sed -ne 's#:# #g; s#^LIBRARY_PATH=##p'); do 32 if [ -d "$lib" ]; then 33 grep -qs "STAGING_DIR" "$lib/specs" && rm -f "$lib/specs" 34 if [ $found -lt 1 ]; then 35 echo -n "Patching specs ... " 36 STAGING_DIR="$DIR" "$CPP" -dumpspecs | awk ' 37 mode ~ "link" { 38 sub("%{L.}", "%{L*} -L %:getenv(STAGING_DIR /usr/lib) -rpath-link %:getenv(STAGING_DIR /usr/lib)") 39 } 40 mode ~ "cpp" { 41 $0 = $0 " -idirafter %:getenv(STAGING_DIR /usr/include)" 42 } 43 { 44 print $0 45 mode = "" 46 } 47 /^\*cpp:/ { 48 mode = "cpp" 49 } 50 /^\*link.*:/ { 51 mode = "link" 52 } 53 ' > "$lib/specs" 54 echo "ok" 55 found=1 56 fi 57 fi 58 done 59 60 [ $found -gt 0 ] 61 return $? 62} 63 64 65VERSION="$(STAGING_DIR="$DIR" "$CPP" --version | sed -ne 's/^.* (.*) //; s/ .*$//; 1p')" 66VERSION="${VERSION:-unknown}" 67 68case "${VERSION##* }" in 69 2.*|3.*|4.0.*|4.1.*|4.2.*) 70 echo "The compiler version does not support getenv() in spec files." 71 echo -n "Wrapping binaries instead ... " 72 73 if "${0%/*}/ext-toolchain.sh" --toolchain "$DIR" --wrap "${CPP%/*}"; then 74 echo "ok" 75 exit 0 76 else 77 echo "failed" 78 exit $? 79 fi 80 ;; 81 *) 82 if patch_specs; then 83 echo "Toolchain successfully patched." 84 exit 0 85 else 86 echo "Failed to locate library directory!" 87 exit 1 88 fi 89 ;; 90esac 91