فهرست منبع

* Generate typedefs from headers if available

Bryan Drewery 14 سال پیش
والد
کامیت
3c7ceafe51
1فایلهای تغییر یافته به همراه35 افزوده شده و 4 حذف شده
  1. 35 4
      src/generate_defs.sh

+ 35 - 4
src/generate_defs.sh

@@ -1,26 +1,57 @@
 #! /bin/bash
 
+CXX=g++
+INCLUDES=/usr/include/tcl8.5
 echo "Generating lib symbols"
 
 mkdir -p src/.defs > /dev/null 2>&1
-
+TMPFILE=$(mktemp "/tmp/pre.XXXXXX")
 for file in $(grep -l DLSYM_GLOBAL src/*.c|grep -v "src/_"); do
   defsFile_wrappers="src/.defs/$(basename $file .c)_defs.c"
   defsFile_pre="src/.defs/$(basename $file .c)_pre.h"
   defsFile_post="src/.defs/$(basename $file .c)_post.h"
 
-  rm -f $defsFile_pre $defsFile_post > /dev/null 2>&1
+  rm -f $defsFile_pre $defsFile_post $defsFile_wrappers > /dev/null 2>&1
+  touch $defsFile_pre $defsFile_post $defsFile_wrappers
+done
+
+for file in $(grep -l DLSYM_GLOBAL src/*.c|grep -v "src/_"); do
+  defsFile_wrappers="src/.defs/$(basename $file .c)_defs.c"
+  defsFile_pre="src/.defs/$(basename $file .c)_pre.h"
+  defsFile_post="src/.defs/$(basename $file .c)_post.h"
 
   echo "extern \"C\" {" > $defsFile_wrappers
   echo "extern \"C\" {" > $defsFile_post
+  touch $defsFile_pre
+  pushd src >/dev/null 2>&1
+  $CXX -E -I. -I.. -I../lib -I${INCLUDES} -DHAVE_CONFIG_H ../${file} > $TMPFILE
+  # Fix wrapped prototypes
+  perl -p -i -e 's/,\n/,/' $TMPFILE
+  popd >/dev/null 2>&1
 
   for symbol in $(sed -n -e 's/.*DLSYM_GLOBAL(.*, \([^)]*\).*/\1/p' $file|sort -u); do
     echo "#define ${symbol} ORIGINAL_SYMBOL_${symbol}" >> $defsFile_pre
     echo "#undef ${symbol}" >> $defsFile_post
-    grep "^typedef .*(\*${symbol}_t)" $(dirname $file)/$(basename $file .c).h | src/generate_symbol.sh >> $defsFile_wrappers 2>> $defsFile_post
+    # Check if the typedef is already defined ...
+    typedef=$(grep "^typedef .*(\*${symbol}_t)" $(dirname $file)/$(basename $file .c).h)
+    # ... if not, generate it
+    if [ -z "$typedef" ]; then
+      # Trim off any extern "C", trim out the variable names, cleanup whitespace issues
+      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')
+      echo "$typedef" >> $defsFile_post
+    fi
+
+    if [ "${typedef%;}" = "${typedef}" ]; then
+      echo "Error: Unable to generate typedef for: ${symbol}" >&2
+      echo "$typedef"
+      exit 1
+    fi
+
+    #pipe typedef into generate_symbol.sh
+    echo "$typedef" | src/generate_symbol.sh >> $defsFile_wrappers 2>> $defsFile_post
   done
 
   echo "}" >> $defsFile_wrappers
   echo "}" >> $defsFile_post
 done
-
+rm -f $TMPFILE