generate_defs.sh 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #! /bin/sh
  2. ### Export LC_ALL=C so sort(1) stays consistent
  3. export LC_ALL=C
  4. if [ -z "$SED" -o -z "$CXX" ]; then
  5. echo "This must be ran by configure" >&2
  6. exit 1
  7. fi
  8. echo "==== Generating lib symbols ===="
  9. INCLUDES="${TCL_INCLUDES} ${SSL_INCLUDES}"
  10. mkdir -p src/.defs > /dev/null 2>&1
  11. TMPFILE=$(mktemp "/tmp/pre.XXXXXX")
  12. files=$(grep -l DLSYM_GLOBAL src/*.cc|grep -v "src/_")
  13. exportsFile="src/.defs/exports"
  14. for file in ${files}; do
  15. suffix=${file##*.}
  16. basename=${file%%.*}
  17. basename=${basename##*/}
  18. defsFile_wrappers="src/.defs/${basename}_defs.${suffix}"
  19. defsFile_pre="src/.defs/${basename}_pre.h"
  20. defsFile_post="src/.defs/${basename}_post.h"
  21. rm -f $defsFile_pre $defsFile_post $defsFile_wrappers > /dev/null 2>&1
  22. : > $defsFile_pre
  23. : > $defsFile_post
  24. : > $defsFile_wrappers
  25. done
  26. echo "{" > $exportsFile
  27. echo "bfd_exports_stub;" >> $exportsFile
  28. for file in ${files}; do
  29. suffix=${file##*.}
  30. basename=${file%%.*}
  31. basename=${basename##*/}
  32. dirname=${file%%/*}
  33. echo -n "Generating symbols for ${basename}... "
  34. defsFile_wrappers="src/.defs/${basename}_defs.${suffix}"
  35. defsFile_pre="src/.defs/${basename}_pre.h"
  36. defsFile_post="src/.defs/${basename}_post.h"
  37. echo "extern \"C\" {" > $defsFile_wrappers
  38. echo "extern \"C\" {" > $defsFile_post
  39. cd src
  40. $CXX $CXXFLAGS -E -I. -I.. -I../lib ${INCLUDES} -DHAVE_CONFIG_H -DGENERATE_DEFS ../${file} > $TMPFILE
  41. # Fix wrapped prototypes
  42. $SED -e :a -e N -e '$!ba' -e 's/,\n/,/g' $TMPFILE > $TMPFILE.sed
  43. mv $TMPFILE.sed $TMPFILE
  44. cd ..
  45. $SED -n -e 's/.*\(DLSYM_GLOBAL[^ (]*\)(.*, \([^)]*\).*/\2 \1/p' $TMPFILE | \
  46. sort -u | while read symbol dlsym; do
  47. # Check if the typedef is already defined ...
  48. typedef=$(grep "^typedef .*(\*${symbol}_t)" ${dirname}/${basename}.h)
  49. # ... if not, generate it
  50. if [ -z "$typedef" ]; then
  51. if ! grep -v "DLSYM" "${TMPFILE}" | grep -qw "${symbol}"; then
  52. echo "Unable to parse symbol ${symbol}. Is there a missing header?" >&2
  53. errors=1
  54. rm -f "${TMPFILE}"
  55. exit 1
  56. fi
  57. # Trim off any extern "C", trim out the variable names, cleanup whitespace issues
  58. typedef=$(grep -w "${symbol}" $TMPFILE |
  59. head -n 1 |
  60. $SED \
  61. -e 's/extern "C" *//' \
  62. -e "s/\(.*\) *${symbol} *(\(.*\)).*/typedef \1 (*${symbol}_t)(\2);/" \
  63. -e 's/[_0-9A-Za-z]*\(,\)/\1/g' \
  64. -e 's/[_0-9A-Za-z]*\();\)/\1/g' \
  65. -e 's/ */ /g' \
  66. -e 's/ \([,)]\)/\1/g' \
  67. -e 's/ *()/(void)/g' \
  68. )
  69. existing_typedef=0
  70. else
  71. existing_typedef=1
  72. fi
  73. if [ "${typedef%;}" = "${typedef}" ]; then
  74. echo "Error: Unable to generate typedef for: ${symbol}" >&2
  75. test -n "$typedef" && echo "$typedef" >&2
  76. continue
  77. fi
  78. #pipe typedef into generate_symbol.sh
  79. [ -z "$typedef" ] && continue
  80. if [ "${dlsym}" = "DLSYM_GLOBAL_FWDCOMPAT" ]; then
  81. echo "_${symbol};" >> $exportsFile
  82. fi
  83. echo "${symbol} ${existing_typedef} ${typedef}"
  84. done | src/generate_symbol.sh $defsFile_wrappers $defsFile_pre $defsFile_post
  85. echo "}" >> $defsFile_wrappers
  86. echo "}" >> $defsFile_post
  87. echo "done"
  88. done
  89. echo "};">> $exportsFile
  90. rm -f $TMPFILE