فهرست منبع

* Fix symbol generating files changing between builds when it shouldn't have been

Bryan Drewery 14 سال پیش
والد
کامیت
0b1aca6676
2فایلهای تغییر یافته به همراه26 افزوده شده و 12 حذف شده
  1. 9 6
      src/generate_defs.sh
  2. 17 6
      src/generate_symbol.sh

+ 9 - 6
src/generate_defs.sh

@@ -1,5 +1,8 @@
 #! /bin/sh
 
+### Export LC_ALL=C sort(1) stays consistent
+export LC_ALL=C
+
 if [ -z "$SED" -o -z "$CXX" ]; then
   echo "This must be ran by configure" >&2
   exit 1
@@ -25,7 +28,7 @@ for file in $(grep -l DLSYM_GLOBAL src/*.c|grep -v "src/_"); do
 
   echo "extern \"C\" {" > $defsFile_wrappers
   echo "extern \"C\" {" > $defsFile_post
-  touch $defsFile_pre
+
   cd src >/dev/null 2>&1
   $CXX -E -I. -I.. -I../lib ${INCLUDES} -DHAVE_CONFIG_H ../${file} > $TMPFILE 2> /dev/null
   # Fix wrapped prototypes
@@ -35,15 +38,15 @@ for file in $(grep -l DLSYM_GLOBAL src/*.c|grep -v "src/_"); do
   cd .. >/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
     # 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=$(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')
-      echo "$typedef" >> $defsFile_post
+      existing_typedef=0
+    else
+      existing_typedef=1
     fi
 
     if [ "${typedef%;}" = "${typedef}" ]; then
@@ -53,8 +56,8 @@ for file in $(grep -l DLSYM_GLOBAL src/*.c|grep -v "src/_"); do
     fi
 
     #pipe typedef into generate_symbol.sh
-    test -n "$typedef" && echo "$typedef"
-  done | src/generate_symbol.sh >> $defsFile_wrappers 2>> $defsFile_post
+    test -n "$typedef" && echo "${symbol} ${existing_typedef} ${typedef}"
+  done | src/generate_symbol.sh $defsFile_wrappers $defsFile_pre $defsFile_post
 
   echo "}" >> $defsFile_wrappers
   echo "}" >> $defsFile_post

+ 17 - 6
src/generate_symbol.sh

@@ -1,12 +1,21 @@
 #! /bin/sh
 
+defsFile_wrappers="$1"
+defsFile_pre="$2"
+defsFile_post="$3"
+
 # X="typedef int (*Tcl_Eval_t)(Tcl_Interp*, const char*);"
 
-while read line; do
-  returntype=$(echo "$line" | sed -e 's/typedef \([^(]*\) (\*\([^ ]*\)_t)(\(.*\));/\1/')
-  name=$(echo "$line" | sed -e 's/typedef \([^(]*\) (\*\([^ ]*\)_t)(\(.*\));/\2/')
-  params=$(echo "$line" | sed -e 's/typedef \([^(]*\) (\*\([^ ]*\)_t)(\(.*\));/\3/')
+while read symbol existing_typedef typedef; do
+  echo "#define ${symbol} ORIGINAL_SYMBOL_${symbol}" >> $defsFile_pre
+  echo "#undef ${symbol}" >> $defsFile_post
+  test $existing_typedef -eq 0 && echo "$typedef" >> $defsFile_post
+
+  returntype=$(echo "$typedef" | sed -e 's/typedef \([^(]*\) (\*\([^ ]*\)_t)(\(.*\));/\1/')
+  name=$(echo "$typedef" | sed -e 's/typedef \([^(]*\) (\*\([^ ]*\)_t)(\(.*\));/\2/')
+  params=$(echo "$typedef" | sed -e 's/typedef \([^(]*\) (\*\([^ ]*\)_t)(\(.*\));/\3/')
 
+  SAVE_IFS=$IFS
   IFS=,
 
   params_full=""
@@ -35,11 +44,13 @@ while read line; do
     i=$((i + 1))
   done
 
-  cat << EOF
+  cat >> $defsFile_wrappers << EOF
 $returntype $name ($params_full) {
   return DLSYM_VAR($name)($param_names);
 }
 EOF
 
-  echo "$returntype $name ($params_full);" >&2
+  echo "$returntype $name ($params_full);" >> $defsFile_post
+
+  IFS=$SAVE_IFS
 done