patch-specs.sh 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #!/usr/bin/env bash
  2. DIR="$1"
  3. FOUND=0
  4. if [ -d "$DIR" ]; then
  5. DIR="$(cd "$DIR"; pwd)"
  6. else
  7. echo "Usage: $0 toolchain-dir"
  8. exit 1
  9. fi
  10. echo -n "Locating cpp ... "
  11. for bin in bin usr/bin usr/local/bin; do
  12. for cmd in "$DIR/$bin/"*-cpp; do
  13. if [ -x "$cmd" ]; then
  14. echo "$cmd"
  15. CPP="$cmd"
  16. break
  17. fi
  18. done
  19. done
  20. if [ ! -x "$CPP" ]; then
  21. echo "Can't locate a cpp executable in '$DIR' !"
  22. exit 1
  23. fi
  24. for lib in $(STAGING_DIR="$dir" "$CPP" -x c -v /dev/null 2>&1 | sed -ne 's#:# #g; s#^LIBRARY_PATH=##p'); do
  25. if [ -d "$lib" ]; then
  26. grep -qs "STAGING_DIR" "$lib/specs" && rm -f "$lib/specs"
  27. if [ $FOUND -lt 1 ]; then
  28. echo -n "Patching specs ... "
  29. STAGING_DIR="$dir" "$CPP" -dumpspecs | awk '
  30. mode ~ "link" {
  31. sub("%{L.}", "%{L*} -L %:getenv(STAGING_DIR /usr/lib) -rpath-link %:getenv(STAGING_DIR /usr/lib)")
  32. }
  33. mode ~ "cpp" {
  34. $0 = $0 " -idirafter %:getenv(STAGING_DIR /usr/include)"
  35. }
  36. {
  37. print $0
  38. mode = ""
  39. }
  40. /^\*cpp:/ {
  41. mode = "cpp"
  42. }
  43. /^\*link.*:/ {
  44. mode = "link"
  45. }
  46. ' > "$lib/specs"
  47. echo "ok"
  48. FOUND=1
  49. fi
  50. fi
  51. done
  52. if [ $FOUND -lt 1 ]; then
  53. echo "Failed to locate library directory!"
  54. exit 1
  55. else
  56. echo "Toolchain successfully patched."
  57. exit 0
  58. fi