From b09b3ac8f88d7b89501193efca3615518218d6f1 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Thu, 14 Feb 2008 14:15:07 +0100 Subject: Create symbols to export in libtdb dynamically from tdb.h. This adds a general mechanism to create version-scripts for linking shared libraries from one or several header files, similar to mkproto.sh/awk. Michael (This used to be commit 65817703c49a7410f4f0c8b46494ede6169d9fa6) --- source3/Makefile.in | 14 +++++++-- source3/exports/libtdb.syms | 4 --- source3/script/mksyms.awk | 76 +++++++++++++++++++++++++++++++++++++++++++++ source3/script/mksyms.sh | 45 +++++++++++++++++++++++++++ 4 files changed, 132 insertions(+), 7 deletions(-) delete mode 100644 source3/exports/libtdb.syms create mode 100644 source3/script/mksyms.awk create mode 100755 source3/script/mksyms.sh (limited to 'source3') diff --git a/source3/Makefile.in b/source3/Makefile.in index 9b210cc9e7..0e2e22ca86 100644 --- a/source3/Makefile.in +++ b/source3/Makefile.in @@ -148,6 +148,8 @@ LIBTALLOC=$(LIBTALLOC_STATIC_TARGET) @LIBTALLOC_SHARED@ LIBTDB_SHARED_TARGET=@LIBTDB_SHARED_TARGET@ LIBTDB_STATIC_TARGET=@LIBTDB_STATIC_TARGET@ LIBTDB=$(LIBTDB_STATIC_TARGET) @LIBTDB_SHARED@ +LIBTDB_SYMS=exports/libtdb.syms +LIBTDB_HEADERS=@tdbdir@/include/tdb.h LIBSMBCLIENT=bin/libsmbclient.a @LIBSMBCLIENT_SHARED@ LIBSMBSHAREMODES=bin/libsmbsharemodes.a @LIBSMBSHAREMODES_SHARED@ @@ -1471,7 +1473,12 @@ $(LIBTALLOC_STATIC_TARGET): $(BINARY_PREREQS) $(LIBTALLOC_OBJ0) @echo Linking non-shared library $@ @-$(AR) -rc $@ $(LIBTALLOC_OBJ0) -$(LIBTDB_SHARED_TARGET): $(BINARY_PREREQS) $(LIBTDB_OBJ) +MKSYMS_SH = $(srcdir)/script/mksyms.sh + +$(LIBTDB_SYMS): $(LIBTDB_HEADERS) + @$(MKSYMS_SH) $(AWK) $@ $(LIBTDB_HEADERS) + +$(LIBTDB_SHARED_TARGET): $(BINARY_PREREQS) $(LIBTDB_OBJ) $(LIBTDB_SYMS) @echo Linking shared library $@ @$(SHLD_DSO) $(LIBTDB_OBJ) \ @SONAMEFLAG@`basename $@`.$(SONAME_VER) @@ -1998,7 +2005,7 @@ installlibtdb: installdirs libtdb -$(INSTALLLIBCMD_SH) $(LIBTDB_SHARED_TARGET) $(DESTDIR)$(LIBDIR) -$(INSTALLLIBCMD_A) $(LIBTDB_STATIC_TARGET) $(DESTDIR)$(LIBDIR) @$(SHELL) $(srcdir)/script/installdirs.sh $(INSTALLPERMS_BIN) $(DESTDIR) ${prefix}/include - -$(INSTALLCMD) -m $(INSTALLPERMS_DATA) @tdbdir@/include/tdb.h $(DESTDIR)${prefix}/include + -$(INSTALLCMD) -m $(INSTALLPERMS_DATA) $(LIBTDB_HEADERS) $(DESTDIR)${prefix}/include installlibsmbsharemodes: installdirs libsmbsharemodes @$(SHELL) $(srcdir)/script/installdirs.sh $(INSTALLPERMS_BIN) $(DESTDIR) $(LIBDIR) @@ -2132,7 +2139,8 @@ clean: delheaders $(LIBTALLOC) $(LIBSMBCLIENT) $(LIBADDNS) \ $(LIBSMBSHAREMODES) $(EVERYTHING_PROGS) $(LIBNETAPI) \ bin/libwbclient.so.0 bin/timelimit \ - .headers.stamp */src/*.o proto_exists + .headers.stamp */src/*.o proto_exists \ + $(LIBTDB_SYMS) -rm -rf t_dir # Making this target will just make sure that the prototype files diff --git a/source3/exports/libtdb.syms b/source3/exports/libtdb.syms deleted file mode 100644 index 5d24771a1a..0000000000 --- a/source3/exports/libtdb.syms +++ /dev/null @@ -1,4 +0,0 @@ -{ - global: tdb_*; - local: *; -}; diff --git a/source3/script/mksyms.awk b/source3/script/mksyms.awk new file mode 100644 index 0000000000..a30bea4d34 --- /dev/null +++ b/source3/script/mksyms.awk @@ -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 +# +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/source3/script/mksyms.sh b/source3/script/mksyms.sh new file mode 100755 index 0000000000..637ec5027c --- /dev/null +++ b/source3/script/mksyms.sh @@ -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 warpper for the mksyms.awk core script. +# +# Copyright (C) 2008 Micheal Adam +# + +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 script/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 -- cgit