tevent: add scripts to extract library symbols (exports file) from headers
authorMichael Adam <obnox@samba.org>
Fri, 28 Aug 2009 13:01:17 +0000 (15:01 +0200)
committerMichael Adam <obnox@samba.org>
Fri, 11 Sep 2009 13:31:23 +0000 (15:31 +0200)
Michael

lib/tevent/script/mksyms.awk [new file with mode: 0644]
lib/tevent/script/mksyms.sh [new file with mode: 0755]

diff --git a/lib/tevent/script/mksyms.awk b/lib/tevent/script/mksyms.awk
new file mode 100644 (file)
index 0000000..a30bea4
--- /dev/null
@@ -0,0 +1,76 @@
+#
+# mksyms.awk
+#
+# Extract symbols to export from C-header files.
+# output in version-script format for linking shared libraries.
+#
+# Copyright (C) 2008 Micheal Adam <obnox@samba.org>
+#
+BEGIN {
+       inheader=0;
+       current_file="";
+       print "#"
+       print "# This file is automatically generated with \"make symbols\". DO NOT EDIT "
+       print "#"
+       print "{"
+       print "\tglobal:"
+}
+
+END {
+       print""
+       print "\tlocal: *;"
+       print "};"
+}
+
+{
+       if (FILENAME!=current_file) {
+               print "\t\t# The following definitions come from",FILENAME
+               current_file=FILENAME
+       }
+       if (inheader) {
+               if (match($0,"[)][ \t]*[;][ \t]*$")) {
+                       inheader = 0;
+               }
+               next;
+       }
+}
+
+/^static/ || /^[ \t]*typedef/ || !/^[a-zA-Z\_]/ {
+       next;
+}
+
+/^extern[ \t]+[^()]+[;][ \t]*$/ {
+       gsub(/[^ \t]+[ \t]+/, "");
+       sub(/[;][ \t]*$/, "");
+       printf "\t\t%s;\n", $0;
+       next;
+}
+
+# look for function headers:
+{
+       gotstart = 0;
+       if ($0 ~ /^[A-Za-z_][A-Za-z0-9_]+/) {
+       gotstart = 1;
+       }
+       if(!gotstart) {
+               next;
+       }
+}
+
+/[_A-Za-z0-9]+[ \t]*[(].*[)][ \t]*;[ \t]*$/ {
+       sub(/[(].*$/, "");
+       gsub(/[^ \t]+[ \t]+/, "");
+       gsub(/^[*]/, "");
+       printf "\t\t%s;\n",$0;
+       next;
+}
+
+/[_A-Za-z0-9]+[ \t]*[(]/ {
+       inheader=1;
+       sub(/[(].*$/, "");
+       gsub(/[^ \t]+[ \t]+/, "");
+       gsub(/^[*]/, "");
+       printf "\t\t%s;\n",$0;
+       next;
+}
+
diff --git a/lib/tevent/script/mksyms.sh b/lib/tevent/script/mksyms.sh
new file mode 100755 (executable)
index 0000000..714d55a
--- /dev/null
@@ -0,0 +1,45 @@
+#! /bin/sh
+
+#
+# mksyms.sh
+#
+# Extract symbols to export from C-header files.
+# output in version-script format for linking shared libraries.
+#
+# This is the shell wrapper for the mksyms.awk core script.
+#
+# Copyright (C) 2008 Micheal Adam <obnox@samba.org>
+#
+
+LANG=C; export LANG
+LC_ALL=C; export LC_ALL
+LC_COLLATE=C; export LC_COLLATE
+
+if [ $# -lt 2 ]
+then
+  echo "Usage: $0 awk output_file header_files"
+  exit 1
+fi
+
+awk="$1"
+shift
+
+symsfile="$1"
+shift
+symsfile_tmp="$symsfile.$$.tmp~"
+
+proto_src="`echo $@ | tr ' ' '\n' | sort | uniq `"
+
+echo creating $symsfile
+
+mkdir -p `dirname $symsfile`
+
+${awk} -f `dirname $0`/mksyms.awk $proto_src > $symsfile_tmp
+
+if cmp -s $symsfile $symsfile_tmp 2>/dev/null
+then
+  echo "$symsfile unchanged"
+  rm $symsfile_tmp
+else
+  mv $symsfile_tmp $symsfile
+fi