pcs 97/08/10 06:29:08
Modified: src Configure Log: Source re-org: new style Configure Revision Changes Path 1.127 +272 -119 apachen/src/Configure Index: Configure =================================================================== RCS file: /export/home/cvs/apachen/src/Configure,v retrieving revision 1.126 retrieving revision 1.127 diff -u -r1.126 -r1.127 --- Configure 1997/08/09 00:55:52 1.126 +++ Configure 1997/08/10 13:29:06 1.127 @@ -22,6 +22,8 @@ ## file=Configuration tmpfile=htconf.$$ +tmpfile2=$tmpfile.2 +tmpfile3=$tmpfile.3 makefile_tmpl=Makefile.tmpl #################################################################### @@ -77,6 +79,7 @@ # we bail out # if egrep -v '^%?Module[ ]+[A-Za-z0-9_]+[ ]+[^ ]+$' $tmpfile \ + | egrep -v '^%?AddModule[ ]+[^ ]+$' \ | grep -v = > /dev/null then echo "Syntax error --- The configuration file is used only to" @@ -94,39 +97,6 @@ if [ -f modules.c ] ; then mv modules.c modules.c.bak; fi #################################################################### -# Start building the modules.c file from what was included -# in Configuration -#### -sed -e 's/_module//' $tmpfile | awk >modules.c '\ - BEGIN { modules[n++] = "core" ; pmodules[pn++] = "core"} \ - /^Module/ { modules[n++] = $2 ; pmodules[pn++] = $2 } \ - /^%Module/ { pmodules[pn++] = $2 } \ - END { print "/* modules.c --- automatically generated by Apache"; \ - print " * configuration script. DO NOT HAND EDIT!!!!!"; \ - print " */"; \ - print ""; \ - print "#include \"httpd.h\""; \ - print "#include \"http_config.h\""; \ - print ""; \ - for (i = 0; i < pn; ++i) { \ - printf ("extern module %s_module;\n", pmodules[i]); \ - } \ - print ""; \ - print "module *prelinked_modules[] = {"; \ - for (i = 0; i < n; ++i) { \ - printf " &%s_module,\n", modules[i]; \ - } \ - print " NULL"; \ - print "};"; \ - print "module *preloaded_modules[] = {"; \ - for (i = 0; i < pn; ++i) { \ - printf " &%s_module,\n", pmodules[i]; \ - } \ - print " NULL"; \ - print "};"; \ - }' - -#################################################################### # Start creating the Makefile. We add some comments and # then fold in the modules that were included in Configuration # @@ -137,17 +107,6 @@ echo "# is re-run" >> Makefile echo "#" >> Makefile -awk >>Makefile <$tmpfile '\ - /^Module/ { modules[n++] = $3 } \ - /^%Module/ { modules[n++] = $3 } \ - END { print "MODULES=\\"; \ - for (i = 0; i < n; ++i) { \ - if (i < n-1) printf (" %s \\\n", modules[i]); \ - else printf (" %s\n", modules[i]); \ - } \ - print "" \ - }' - #################################################################### # Now we create a stub file, called Makefile.config, which # just includes those assignments (eg: CC=gcc) in Configuration @@ -197,6 +156,9 @@ PLAT=`./helpers/GuessOS` +SHELL="/bin/sh" +OSDIR="os/unix" + case "$PLAT" in *MPE/iX*) OS='MPE/iX' @@ -538,6 +500,7 @@ #################################################################### # Show user what OS we came up with # +SRCDIR=`pwd` echo " + configured for $OS platform" #################################################################### @@ -642,61 +605,11 @@ #################################################################### # Now we do some general checks and some intelligent Configuration # control. -# -# First, we adjust as needed depending on which modules are -# being used. -# - -# -# Are they using the status monitor module? If so, check -# for STATUS rule and add if needed. -# -STAT_MOD="mod_status" -if grep "$STAT_MOD" Makefile > /dev/null; then - if [ "$RULE_STATUS" = "yes" ]; then - CFLAGS="$CFLAGS -DSTATUS" - fi -fi - -# -# Now HS's POSIX regex implementation if needed/wanted -# -if [ "$RULE_WANTHSREGEX" = "yes" ]; then - REGLIB="regex/libregex.a" - INCLUDES="$INCLUDES -Iregex" -fi - -# -# Now SOCKS4. -# NOTE: We assume that if they are using SOCKS4, then they've -# adjusted EXTRA_LIBS and/or EXTRA_LDFLAGS as required, -# otherwise we assume "-L/usr/local/lib -lsocks" -# -if [ "$RULE_SOCKS4" = "yes" ]; then - # Set flag and check Makefile for -lsocks line - CFLAGS="$CFLAGS -Dconnect=Rconnect -Dselect=Rselect" - CFLAGS="$CFLAGS -Dgethostbyname=Rgethostbyname" - if grep "EXTRA_" Makefile | grep "\-lsocks" > /dev/null; then : ; - else - LIBS="$LIBS -L/usr/local/lib -lsocks" - fi - if [ "$OS" = "Solaris 2" ]; then - LIBS="$LIBS -lresolv" - fi -fi #################################################################### # Continue building Makefile.config. We can add all flags with # the exception of LIBS at this point # -echo "CFLAGS1=$CFLAGS">> Makefile.config -echo "INCLUDES1=$INCLUDES">> Makefile.config -echo "LDFLAGS1=$LDFLAGS">> Makefile.config -echo "BROKEN_BPRINTF_FLAGS=$OSBPRINTF">> Makefile.config -echo "REGLIB=$REGLIB">> Makefile.config -echo "RANLIB=$RANLIB">> Makefile.config -echo "SHELL=$SHELL">> Makefile.config - #################################################################### # Use TestCompile to see if $(CC) is ANSI and as a "final" sanity # check @@ -751,20 +664,216 @@ esac # -# Are they using dbm/db auth? If so, add DBM/DB library. +# Now HS's POSIX regex implementation if needed/wanted # -if grep mod_auth_dbm Makefile > /dev/null; then - LIBS="$LIBS $DBM_LIB" - if [ "X$DBM_LIB" != "X" ]; then - echo " + using $DBM_LIB for mod_auth_dbm" - fi +if [ "$RULE_WANTHSREGEX" = "yes" ]; then + REGLIB="regex/libregex.a" + INCLUDES="$INCLUDES -I${SRCDIR}/regex" fi -if grep mod_auth_db Makefile > /dev/null; then - LIBS="$LIBS $DB_LIB" - if [ "X$DB_LIB" != "X" ]; then - echo " + using $DB_LIB for mod_auth_db" + +# +# Now SOCKS4. +# NOTE: We assume that if they are using SOCKS4, then they've +# adjusted EXTRA_LIBS and/or EXTRA_LDFLAGS as required, +# otherwise we assume "-L/usr/local/lib -lsocks" +# +if [ "$RULE_SOCKS4" = "yes" ]; then + # Set flag and check Makefile for -lsocks line + CFLAGS="$CFLAGS -Dconnect=Rconnect -Dselect=Rselect" + CFLAGS="$CFLAGS -Dgethostbyname=Rgethostbyname" + if grep "EXTRA_" Makefile | grep "\-lsocks" > /dev/null; then : ; + else + LIBS="$LIBS -L/usr/local/lib -lsocks" + fi + if [ "$OS" = "Solaris 2" ]; then + LIBS="$LIBS -lresolv" fi fi + +# +# Find out what modules we want and try and configure things for them +# Module lines can look like this: +# +# Module name_module some/path/mod_name[.[oa]] +# AddModule some/path/mod_name[.[oa]] +# +# In both cases, the some/path can either be an arbitrary path (including +# an absolue path), or a path like "modules/DIR", in which case we _might_ +# auto-generate a Makefile in modules/DIR (see later). +# +# The first case is the original style, where we give the module's +# name as well as it's binary file location - either a .o or .a. +# +# The second format is new, and means we do not repeat the module +# name, which is already part of the module source or definition. +# The way we find the module name (and other optional information about +# the module) is like this: +# +# 1 If extension is not given or is .c, assume .o was given and goto 3 +# 2 If extension if .module, go to D1 +# 3 If extension is .o, look for a corresponding .c file and if +# found, go to C1 +# 4 If no .c file was found, look for a .module file (Apache module +# definition file). If found, go to D1 +# 5 Assume module name is the "name" part of "mod_name", as in +# name_module. +# +# If a C file is found: +# +# C1 Look for module name given by an MODULE: line (e.g. MODULE: name_module) +# If found assume module contains a definition, and go to D1 +# C2 If not found, look for a module name given on the declaration of the +# module structure (e.g. module name_module). +# C3 If neither given, go to 4 above. +# +# If a definition file is found, or a .c file includes a module definition: +# +# D1 Get the module name from the MODULE: name= line +# D2 Get other module options (libraries etc). To be done later. +# + +# For now, we will convert the AddModule lines into Module format +# lines, so the rest of Configure can do its stuff without too much +# additional hackery. It would be nice to reduce the number of times +# we have to awk the $tmpfile, though. + +# MODFILES contains a list of module filenames (could be .c, .o, .a +# or .module files) from AddModule lines only +# MODDIRS contains a list of subdirectories under 'modules' which +# contain modules we want to build from both AddModule and Module +# lines + +MODFILES=`awk <$tmpfile '$1 == "AddModule" { printf "%s ", $2 }'` +MODDIRS=`awk < $tmpfile '\ + ($1 == "Module" && $3 ~ /^modules\//) { \ + split ($3, pp, "/"); \ + if (! SEEN[pp[2]]) { printf "%s ", pp[2]; SEEN[pp[2]] = 1; } \ + } \ + ($1 == "AddModule" && $2 ~ /^modules\//) { \ + split ($2, pp, "/"); \ + if (! SEEN[pp[2]]) { printf "%s ", pp[2]; SEEN[pp[2]] = 1; } \ + } \ +'` + +# +# Now autoconfigure each of the modules specified by AddModule. +# Use tmpfile2 for the module definition file, and tmpfile3 for the +# shell commands to be executed for this module. +# + +for modfile in $MODFILES ; do +# echo Trying to find $modfile + rm -f $tmpfile2 $tmpfile3 + modname= + + ext=`echo $modfile | sed 's/^.*\.//'` + modbase=`echo $modfile | sed 's/\.[^.]*$//'` + if [ x$ext = x$modfile ]; then ext=o; modbase=$modfile; modfile=$modbase.o; fi + if [ x$ext = x ] ; then ext=o; modbase=$modfile; fi + + # modbase is the path+filename without extension, ext is the + # extension given, or if none, o +# echo bas=$modbase ext=$ext + + if [ -r $modbase.module ] ; then + cat $modbase.module > $tmpfile2 + elif [ -e $modbase.c ] ; then + # Guess module structure name in case there is not + # module definition in this file + modname=`grep '^module .*;' $modbase.c | head -1 |\ + sed 's/^module.*[ ][ ]*//' | \ + sed 's/[ ]*;[ ]*$//'` + # Get any module definition part + if fgrep "MODULE-DEFINITION-" $modbase.c > /dev/null; then + cat $modbase.c | \ + sed '1,/MODULE-DEFINITION-START/d;/MODULE-DEFINITION-END/,$d' \ + > $tmpfile2 + fi + fi + if [ -r $tmpfile2 ] ; then + # Read a module definition from .module or .c + modname=`fgrep "Name:" $tmpfile2 | sed 's/^.*Name:[ ]*//'` + cat $tmpfile2 | sed '1,/ConfigStart/d;/ConfigEnd/,$d' > \ + $tmpfile3 + . $tmpfile3 + rm -f $tmpfile2 $tmpfile3 + ext=o + fi + if [ -z "$modname" ] ; then + modname=`echo $modbase | sed 's/^.*\///' | \ + sed 's/^mod_//' | sed 's/^lib//' | sed 's/$/_module/'` + fi + echo "Adding Module $modname $modbase.$ext" + echo "Module $modname $modbase.$ext" >>$tmpfile +done + +# $tmpfile now contains Module lines for all the modules we want + +# create modules.c + +sed -e 's/_module//' $tmpfile | awk >modules.c '\ + BEGIN { modules[n++] = "core" ; pmodules[pn++] = "core"} \ + /^Module/ { modules[n++] = $2 ; pmodules[pn++] = $2 } \ + /^%Module/ { pmodules[pn++] = $2 } \ + END { print "/* modules.c --- automatically generated by Apache"; \ + print " * configuration script. DO NOT HAND EDIT!!!!!"; \ + print " */"; \ + print ""; \ + print "#include \"httpd.h\""; \ + print "#include \"http_config.h\""; \ + print ""; \ + for (i = 0; i < pn; ++i) { \ + printf ("extern module %s_module;\n", pmodules[i]); \ + } \ + print ""; \ + print "module *prelinked_modules[] = {"; \ + for (i = 0; i < n; ++i) { \ + printf " &%s_module,\n", modules[i]; \ + } \ + print " NULL"; \ + print "};"; \ + print "module *preloaded_modules[] = {"; \ + for (i = 0; i < pn; ++i) { \ + printf " &%s_module,\n", pmodules[i]; \ + } \ + print " NULL"; \ + print "};"; \ + }' + +# Add the module targets to the Makefile + +awk >>Makefile <$tmpfile '\ + /^Module/ { modules[n++] = $3 } \ + /^%Module/ { modules[n++] = $3 } \ + END { print "MODULES=\\"; \ + for (i = 0; i < n; ++i) { \ + if (i < n-1) printf (" %s \\\n", modules[i]); \ + else printf (" %s\n", modules[i]); \ + } \ + print "" \ + }' + +#################################################################### +# Continue building Makefile.config. We can add all flags with +# the exception of LIBS at this point +# +echo >> Makefile +if [ "x$CC" != "x" ]; then + echo "CC=$CC" >> Makefile.config +fi +if [ "x$OPTIM" != "x" ]; then + echo "OPTIM=$OPTIM" >> Makefile.config +fi +echo "CFLAGS1=$CFLAGS">> Makefile.config +echo "INCLUDES1=$INCLUDES -I${SRCDIR}/core">> Makefile.config +echo "LIBS1=$LIBS">> Makefile.config +echo "LDFLAGS1=$LDFLAGS">> Makefile.config +echo "BROKEN_BPRINTF_FLAGS=$OSBPRINTF">> Makefile.config +echo "REGLIB=$REGLIB">> Makefile.config +echo "RANLIB=$RANLIB">> Makefile.config +echo "SHELL=$SHELL">> Makefile.config +echo "OSOBJ=${SRCDIR}/$OSDIR/os.o">> Makefile.config +echo "OSDIR=${SRCDIR}/$OSDIR">> Makefile.config #################################################################### # NOW we finish Makefile.config @@ -773,6 +882,8 @@ echo >> Makefile.config echo "#### End of Configure created section ####">> Makefile.config +cp $OSDIR/os.h core/os.h + #################################################################### # Now (finish) creating the makefiles # @@ -782,11 +893,16 @@ sed -e "s#@@Configuration@@#$file#" "$makefile_tmpl" >>Makefile awk >>Makefile <$tmpfile \ '($1 == "Module" && $3 ~ /modules\//) { printf "%s: modules/last-built ; @cat /dev/null\n\n", $3, $3}' -cat Makefile.config ../support/Makefile.tmpl > ../support/Makefile # -# ./modules/Makefile +# directories to create makefiles in # +MAKEDIRS="support core $OSDIR" +for dir in $MAKEDIRS ; do + echo Creating Makefile in $dir + cat Makefile.config $dir/Makefile.tmpl > $dir/Makefile +done + cat << EOF > modules/Makefile # # Simple Makefile for modules in src/modules. @@ -804,17 +920,14 @@ echo "INCLUDES2=$INCLUDES2">> modules/Makefile echo "MOD_CFLAGS=\$(INCLUDES2) \$(AUX_CFLAGS)">> modules/Makefile -awk >> modules/Makefile < $tmpfile '\ - BEGIN {printf "MODULES="} \ - ($1 == "Module" && $3 ~ /modules\//) {split ($3, pp, "/"); printf "%s ", pp[2]} \ - END {printf "\n"}' - -awk >> modules/Makefile < $tmpfile '\ - BEGIN {printf "CLEANERS="} \ - ($1 == "Module" && $3 ~ /modules\//) {split ($3, pp, "/"); printf "%s_clean ", pp[2]} \ - END {printf "\n"}' +CLEANERS="" +for i in $MODDIRS ; do + CLEANERS="$CLEANERS${i}_clean " +done cat << EOF >> modules/Makefile +MODULES=$MODDIRS +CLEANERS=$CLEANERS default: \$(MODULES) @echo "Done building module subdirectories" @@ -822,14 +935,54 @@ clean: \$(CLEANERS) @echo "Done cleaning module subdirectories" -placeholder \$(MODULES): ForceMe +\$(MODULES): ForceMe (cd \$@; \$(MAKE) CC='\$(CC)' AUX_CFLAGS='\$(MOD_CFLAGS)' RANLIB='\$(RANLIB)') ForceMe: EOF -awk >>modules/Makefile <$tmpfile \ - '($1 == "Module" && $3 ~ /modules\//) { split ($3, pp, "/"); \ - printf "%s_clean:\n\t(cd %s; $(MAKE) clean)\n\n", pp[2], pp[2]}' +( +for i in $MODDIRS ; do + echo "${i}_clean:" + echo " (cd ${i}; \$(MAKE) clean)" + echo "" +done +) >> modules/Makefile + +for moddir in $MODDIRS ; do + if [ ! -e modules/$moddir/Makefile.tmpl ] ; then + continue + fi + echo "Creating Makefile in modules/$moddir" + + cat Makefile.config > modules/$moddir/Makefile + awk >> modules/$moddir/Makefile < $tmpfile '\ + BEGIN { printf "OBJS=" }\ + ($1 == "Module" && $3 ~ /^modules\/'$moddir'\//) { \ + split ($3, pp, "/"); \ + printf "%s ", pp[3]; \ + } \ + END {printf "\n"}' + + cat << 'EOF' >> modules/$moddir/Makefile +CFLAGS=$(OPTIM) $(CFLAGS1) $(EXTRA_CFLAGS) +LIBS=$(EXTRA_LIBS) $(LIBS1) +INCLUDES=$(INCLUDES1) $(EXTRA_INCLUDES) +LDFLAGS=$(LDFLAGS1) $(EXTRA_LDFLAGS) +INCDIR=../../core + +all: $(OBJS) + +.c.o: + $(CC) -c $(INCLUDES) $(CFLAGS) $(SPACER) $< + +clean: + rm -f $(OBJS) + +EOF +cat >> modules/$moddir/Makefile < modules/$moddir/Makefile.tmpl + +done +