| #!/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 %: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 |