#!/usr/bin/env bash DIR="$1" if [ -d "$DIR" ]; then DIR="$(cd "$DIR"; pwd)" else echo "Usage: $0 toolchain-dir" exit 1 fi echo -n "Locating cpp ... " for bin in bin usr/bin usr/local/bin; do for cmd in "$DIR/$bin/"*-cpp; do if [ -x "$cmd" ]; then echo "$cmd" CPP="$cmd" break fi done done if [ ! -x "$CPP" ]; then echo "Can't locate a cpp executable in '$DIR' !" exit 1 fi 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 done [ $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