generate_defs.sh 3.3 KB

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