Commit f4fd9696 authored by Ryan Bloom's avatar Ryan Bloom
Browse files

Improve the exports generating awk script. In the past, we had

work around problems in the awk script by avoiding some #if and
#ifdefs.  This has bitten us many times in generating the exports.c
file.  This improvement allows corrects the header file parsing.

Submitted by:	Sander Striker <striker@apache.org>


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@89647 13f79535-47bb-0310-9956-ffa450edef68
parent d27ba679
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
Changes with Apache 2.0.22-dev

  *) Improve the exports generating awk script.  In the past, we had
     work around problems in the awk script by avoiding some #if and
     #ifdefs.  This has bitten us many times in generating the exports.c
     file.  This improvement allows corrects the header file parsing.
     [Sander Striker <striker@apache.org>]

Changes with Apache 2.0.21

  *) Introduce connection sub-pools into ab.  Truncating the lifetime

build/make_exports.awk

0 → 100644
+120 −0
Original line number Diff line number Diff line

BEGIN {
    printf("/*\n")
    printf(" * THIS FILE WAS AUTOGENERATED BY make_exports.awk\n")
    printf(" *\n")
    printf(" * This is an ugly hack that needs to be here, so\n")
    printf(" * that libtool will link all of the APR functions\n")
    printf(" * into server regardless of whether the base server\n")
    printf(" * uses them.\n")
    printf(" */\n")
    printf("\n")
    printf("#define CORE_PRIVATE\n")
    printf("\n")
    
    for (i = 1; i < ARGC; i++) {
        file = ARGV[i]
        sub("([^/]*[/])*", "", file)
        printf("#include \"%s\"\n", file)
    }

    printf("\n")
    printf("const void *ap_ugly_hack = NULL;\n")
    printf("\n")
    
    TYPE_NORMAL = 0
    TYPE_HEADER = 1

    stackptr = 0
}

function push(line) {
    stack[stackptr] = line
    stackptr++
}

function do_output() {
    printf("/*\n")
    printf(" * %s\n", FILENAME)
    printf(" */\n")
    
    for (i = 0; i < stackptr; i++) {
        printf("%s\n", stack[i])
    }
    
    stackptr = 0

    printf("\n");
}

function enter_scope(type) {
    scope++
    scope_type[scope] = type
    scope_stack[scope] = stackptr
    delete scope_used[scope]
}

function leave_scope() {
    used = scope_used[scope]
   
    if (!used)
        stackptr = scope_stack[scope]

    scope--
    if (used) {
        scope_used[scope] = 1
        
        if (!scope)
            do_output()
    }
}

function add_symbol(symbol) {
    idx = index(symbol, "#")

    if (!idx) {
        push("const void *ap_hack_" symbol " = (const void *)" symbol ";")
        scope_used[scope] = 1
    }
}

/^[ \t]*AP[RU]?_DECLARE[^(]*[(][^)]*[)]([^ ]* )*[^(]+[(]/  { 
    sub("[ \t]*AP[RU]?_DECLARE[^(]*[(][^)]*[)]", "");
    sub("[(].*", "");
    sub("^[ \t]+", "");
    sub("([^ ]* ^([ \t]*[(]))*", "");

    add_symbol($0)
    next
}

/^#[ \t]*if(ndef| !defined[(])([^_]*_)*H/ {
    enter_scope(TYPE_HEADER)
    next
}

/^#[ \t]*if([n]?def)? / {
    enter_scope(TYPE_NORMAL)
    push($0)
    next
}

/^#[ \t]*endif/ {
    if (scope_type[scope] == TYPE_NORMAL)
        push($0)
        
    leave_scope()
    next
}

/^#[ \t]*else/ {
    push($0)
    next
}

/^#[ \t]*elif/ {
    push($0)
    next
}

+6 −23
Original line number Diff line number Diff line
@@ -17,8 +17,7 @@ LTLIBRARY_SOURCES = \
        util_filter.c exports.c buildmark.c scoreboard.c \
	error_bucket.c protocol.c core.c request.c

TARGETS = delete-exports $(LTLIBRARY_NAME) $(CORE_IMPLIB_FILE) export_vars.h \
	httpd.exp
TARGETS = $(LTLIBRARY_NAME) $(CORE_IMPLIB_FILE) export_vars.h httpd.exp

include $(top_srcdir)/build/rules.mk
include $(top_srcdir)/build/library.mk
@@ -32,28 +31,12 @@ test_char.h: gen_test_char

util.lo: test_char.h

EXPORT_FILES = $(top_builddir)/srclib/apr/apr.exports \
	$(top_builddir)/srclib/apr-util/aprutil.exports \
	$(TARGET_EXPORTS)

delete-exports:
	@if test -f $(TARGET_EXPORTS); then \
		    headers="`find $(top_srcdir)/include/*.h -newer $(TARGET_EXPORTS)`" ; \
		    if test -n "$$headers"; then \
		        echo Found newer headers. Will rebuild $(TARGET_EXPORTS). ; \
		        echo rm -f $(TARGET_EXPORTS) ; \
		        rm -f $(TARGET_EXPORTS) ; \
		    fi \
	fi


$(TARGET_EXPORTS):
	$(AWK) -f $(top_srcdir)/srclib/apr/build/make_export.awk \
		$(top_srcdir)/include/*.h \
		$(top_srcdir)/os/$(OS_DIR)/*.h > $@
EXPORT_FILES = $(top_srcdir)/include/*.h \
       $(top_srcdir)/srclib/apr/include/*.h \
       $(top_srcdir)/srclib/apr-util/include/*.h

exports.c: $(EXPORT_FILES)
	(cat $(EXPORT_FILES) | $(top_srcdir)/build/buildexports.sh $(top_srcdir)) > $@
	$(AWK) -f $(top_srcdir)/build/make_exports.awk $(EXPORT_FILES) > $@

export_vars.h:
	$(AWK) -f $(top_srcdir)/build/make_var_export.awk \