generate_defs.sh 2.2 KB

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