generate_defs.sh 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #! /bin/sh
  2. if [ -z "$SED" -o -z "$CXX" ]; then
  3. echo "This must be ran by configure" >&2
  4. exit 1
  5. fi
  6. echo "Generating lib symbols"
  7. INCLUDES="${TCL_INCLUDES} ${SSL_INCLUDES}"
  8. mkdir -p src/.defs > /dev/null 2>&1
  9. TMPFILE=$(mktemp "/tmp/pre.XXXXXX")
  10. for file in $(grep -l DLSYM_GLOBAL src/*.c|grep -v "src/_"); do
  11. defsFile_wrappers="src/.defs/$(basename $file .c)_defs.c"
  12. defsFile_pre="src/.defs/$(basename $file .c)_pre.h"
  13. defsFile_post="src/.defs/$(basename $file .c)_post.h"
  14. rm -f $defsFile_pre $defsFile_post $defsFile_wrappers > /dev/null 2>&1
  15. touch $defsFile_pre $defsFile_post $defsFile_wrappers
  16. done
  17. for file in $(grep -l DLSYM_GLOBAL src/*.c|grep -v "src/_"); do
  18. defsFile_wrappers="src/.defs/$(basename $file .c)_defs.c"
  19. defsFile_pre="src/.defs/$(basename $file .c)_pre.h"
  20. defsFile_post="src/.defs/$(basename $file .c)_post.h"
  21. echo "extern \"C\" {" > $defsFile_wrappers
  22. echo "extern \"C\" {" > $defsFile_post
  23. touch $defsFile_pre
  24. cd src >/dev/null 2>&1
  25. $CXX -E -I. -I.. -I../lib ${INCLUDES} -DHAVE_CONFIG_H ../${file} > $TMPFILE 2> /dev/null
  26. # Fix wrapped prototypes
  27. $SED -e :a -e N -e '$!ba' -e 's/,\n/,/g' $TMPFILE > $TMPFILE.sed
  28. mv $TMPFILE.sed $TMPFILE
  29. cd .. >/dev/null 2>&1
  30. for symbol in $($SED -n -e 's/.*DLSYM_GLOBAL(.*, \([^)]*\).*/\1/p' $file|sort -u); do
  31. echo "#define ${symbol} ORIGINAL_SYMBOL_${symbol}" >> $defsFile_pre
  32. echo "#undef ${symbol}" >> $defsFile_post
  33. # Check if the typedef is already defined ...
  34. typedef=$(grep "^typedef .*(\*${symbol}_t)" $(dirname $file)/$(basename $file .c).h)
  35. # ... if not, generate it
  36. if [ -z "$typedef" ]; then
  37. # Trim off any extern "C", trim out the variable names, cleanup whitespace issues
  38. 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')
  39. echo "$typedef" >> $defsFile_post
  40. fi
  41. if [ "${typedef%;}" = "${typedef}" ]; then
  42. echo "Error: Unable to generate typedef for: ${symbol}" >&2
  43. test -n "$typedef" && echo "$typedef" >&2
  44. continue
  45. fi
  46. #pipe typedef into generate_symbol.sh
  47. test -n "$typedef" && echo "$typedef"
  48. done | src/generate_symbol.sh >> $defsFile_wrappers 2>> $defsFile_post
  49. echo "}" >> $defsFile_wrappers
  50. echo "}" >> $defsFile_post
  51. done
  52. rm -f $TMPFILE