add patch-specs.sh, a utility for modifying GCC specs The patch-specs.sh utility dumps the GCC specs of a given toolchain and modifies them to always include $STAGING_DIR in the link and compiler command lines, this makes most -I and -L flags unnecessary and lets the compiler automatically find libraries and headers in the staging dir, also solves the majority of -rpath issues.

SVN-Revision: 29767
This commit is contained in:
Jo-Philipp Wich 2012-01-18 03:11:45 +00:00
parent 5b7668ca44
commit 6df3af8a36
1 changed files with 64 additions and 0 deletions

64
scripts/patch-specs.sh Executable file
View File

@ -0,0 +1,64 @@
#!/usr/bin/env bash
DIR="$1"
FOUND=0
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
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
if [ $FOUND -lt 1 ]; then
echo "Failed to locate library directory!"
exit 1
else
echo "Toolchain successfully patched."
exit 0
fi