You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by Jim Jagielski <ji...@jaguNET.com> on 1997/09/01 16:33:50 UTC

Re: [STATUS] 1.3b1 Thu Aug 28 18:36:36 EDT 1997

+1

Paul Sutton wrote:
> 
> On Sat, 30 Aug 1997, Jim Jagielski wrote:
> > Paul Sutton wrote:
> > > There's been no feedback on the patch I posted recently, so I'm assuming
> > > it isn't going to be part of 1.3.
> > 
> > Could you repost? I'd like to take a look (I must have missed it)
> 
> Ok.
> 
> ----
> 
> >From paul@ukweb.com Sat Aug 30 14:42:20 1997
> Date: Sun, 24 Aug 1997 13:21:46 +0100 (BST)
> From: Paul Sutton <pa...@ukweb.com>
> Reply-To: new-httpd@apache.org
> To: new-httpd@hyperreal.org
> Subject: Make libraries; fix dependencies
> 
> Here is an updated version of my patch to fix the dependencies between the
> top level (src) Makefile and the object files in the sub dirs (core, os/*,
> modules/*). Currently src/Makefile knows the names of all the object files
> in core, os/* and modules/standard and makes httpd dependent on them.
> Doing a "make httpd" builds the object file *in the src directory*, which
> is wrong. 
> 
> This patch fixes this by building core, os/* and modules/standard object
> files into a library. src/Makefile only knows about the library files, and
> doesn't care about the individual object files. To rebuild the libraries
> when the object files change src/Makefile always does a make in os/*, core
> and modules/standard. (For modules/standard, read "any modules/* directory
> where Configure auto-creates a makefile). 
> 
> The advantages of this patch are
> 
>  (a) src/Makefile does not need to repeat information that only
>      sub-directory makefiles should know, such as object file names
>  (b) doing "make httpd" now works
>  (c) the os specific directory (os/unix) can contain multiple object
>      files since src/Makefile does not need to know about them
>  (d) it is now easier to add additional subdirectories if necessary
>      by adding them to the SUBDIRS macro
>  (e) we can add additional recursive targets such as depend, distclean
>      etc with rules such as "depend distclean clean :: ...."
> 
> The disadvantages are
> 
>  (a) ordering of the .a files on the link line may be important
>  (b) httpd always gets relinked on doing a make at the top level
> 
> I think this is a useful clean up, fixes some problems with the current
> makefile, and reduces redundant information between src/Makefile and the
> lower level makefiles, so I give it +1. 
> 
> //pcs
> 
> Index: Configure
> ===================================================================
> RCS file: /export/home/cvs/apachen/src/Configure,v
> retrieving revision 1.138
> diff -u -r1.138 Configure
> --- Configure	1997/08/23 04:00:19	1.138
> +++ Configure	1997/08/24 12:09:27
> @@ -815,19 +815,46 @@
>  	 print "};"; \
>     }'
>  
> -# Add the module targets to the Makefile
> +# figure out which module dir require use to autocreate a Makefile.
> +# for these dirs we must not list the object files from the AddModule
> +# lines individually since the auto-generated Makefile will create
> +# a library called libMODDIR.a for it (MODDIR is the module dir
> +# name). We create two variable here:
> +#
> +#   AUTODIRS   Space separated list of module directories, relative to
> +#              src
> +#   AUTOLIBS   Space separated list of auto-generated library files
> +
> +for moddir in $MODDIRS 
> +do
> +	if [ -f modules/$moddir/Makefile.tmpl ] ; then
> +		AUTODIRS="$AUTODIRS modules/$moddir"
> +		AUTOLIBS="$AUTOLIBS modules/$moddir/lib$moddir.a"
> +	fi
> +done
>  
> -awk >>Makefile <$tmpfile '\
> +# Add the module targets to the Makefile. Do not add inidividual object
> +# targets for auto-generated directories.
> +awk -v AUTODIRS="$AUTODIRS" >>Makefile <$tmpfile '\
> +   BEGIN { split ( AUTODIRS, tmp, / /); \
> +		for ( key in tmp ) { autodirs[tmp[key]] = 1; } } \
>     /^Module/ { modules[n++] = $3 } \
>     /^%Module/ { modules[n++] = $3 } \
> -   END { print "MODULES=\\"; \
> +   END { print "MODULES=\\";  \
>  	 for (i = 0; i < n; ++i) { \
> -	     if (i < n-1) printf ("  %s \\\n", modules[i]); \
> -	     else printf ("  %s\n", modules[i]); \
> +	     split ( modules[i], pp, /\//); \
> +	     dir = pp[1] "/" pp[2] ; \
> +	     if ( dir in autodirs ) { continue; }\
> +	     else printf ("  %s\\\n", modules[i]); \
>  	 } \
> -	 print "" \
>         }'
>  
> +# Now add the auto-generated library targets
> +for lib in $AUTOLIBS; do
> +	echo "  $lib \\" >> Makefile
> +done
> +echo >> Makefile
> +
>  ####################################################################
>  # Continue building Makefile.config.
>  #
> @@ -930,39 +957,43 @@
>  done
>  ) >> modules/Makefile
>  
> -for moddir in $MODDIRS ; do
> -	if [ ! -f modules/$moddir/Makefile.tmpl ] ; then
> -		continue
> -	fi
> -	echo "Creating Makefile in modules/$moddir"
> +for moddir in $AUTODIRS ; do
> +	echo "Creating Makefile in $moddir"
>  
> -	cat Makefile.config > modules/$moddir/Makefile
> -	awk >> modules/$moddir/Makefile < $tmpfile '\
> +	cat Makefile.config > $moddir/Makefile
> +	basedir=`echo $moddir | sed 's|^[^/]*/||g'`
> +	awk >> $moddir/Makefile < $tmpfile '\
>  	    BEGIN { printf "OBJS=" }\
> -	    ($1 == "Module" && $3 ~ /^modules\/'$moddir'\//) { \
> +	    ($1 == "Module" && $3 ~ /^modules\/'$basedir'\//) { \
>  		split ($3, pp, "/"); \
>  		printf "%s ", pp[3]; \
>  	    	} \
>  	   END {printf "\n"}'
>  
> -	cat << 'EOF' >> modules/$moddir/Makefile
> +	echo "LIB=lib$basedir.a" >> $moddir/Makefile
> +	cat << 'EOF' >> $moddir/Makefile
>  CFLAGS=$(OPTIM) $(CFLAGS1) $(EXTRA_CFLAGS)
>  LIBS=$(EXTRA_LIBS) $(LIBS1)
>  INCLUDES=$(INCLUDES1) $(EXTRA_INCLUDES)
>  LDFLAGS=$(LDFLAGS1) $(EXTRA_LDFLAGS)
>  INCDIR=../../main
>  
> -all:	$(OBJS)
> +all:	$(LIB)
> +
> +$(LIB): $(OBJS)
> +	rm -f $@
> +	ar crv $@ $(OBJS)
> +	$(RANLIB) $@
>  
>  .c.o:
>  	$(CC) -c $(INCLUDES) $(CFLAGS) $(SPACER) $<
>  
>  clean:
> -	rm -f $(OBJS)
> +	rm -f $(OBJS) $(LIB)
>  
>  $(OBJS): Makefile
>  EOF
> -cat >> modules/$moddir/Makefile < modules/$moddir/Makefile.tmpl
> +cat >> $moddir/Makefile < $moddir/Makefile.tmpl
>  
>  done
>  
> Index: Makefile.tmpl
> ===================================================================
> RCS file: /export/home/cvs/apachen/src/Makefile.tmpl,v
> retrieving revision 1.59
> diff -u -r1.59 Makefile.tmpl
> --- Makefile.tmpl	1997/08/24 02:51:33	1.59
> +++ Makefile.tmpl	1997/08/24 12:09:28
> @@ -9,20 +9,17 @@
>  LDFLAGS=$(LDFLAGS1) $(EXTRA_LDFLAGS)
>  
>  OBJS= \
> -  main/alloc.o main/http_main.o main/http_core.o \
> -  main/http_config.o main/http_request.o main/http_log.o \
> -  main/http_protocol.o main/rfc1413.o main/util.o \
> -  main/util_script.o main/buff.o main/md5c.o \
> -  main/util_md5.o main/explain.o main/http_bprintf.o \
> -  main/util_date.o main/util_snprintf.o main/fnmatch.o \
>    modules.o \
> -  $(OSOBJ) \
> -  $(MODULES)
> +  $(MODULES) \
> +  $(OSDIR)/libos.a \
> +  main/libmain.a
> +
> +SUBDIRS=main $(OSDIR) modules
>  
>  .c.o:
>  	$(CC) -c $(INCLUDES) $(CFLAGS) $(SPACER) $<
>  
> -all: @@Configuration@@ os-dir core-dir modules/last-built httpd 
> +all: @@Configuration@@ httpd
>  
>  @@Configuration@@: Configuration.tmpl
>  	@echo "@@Configuration@@ older than Configuration.tmpl, or doesn't exist."
> @@ -31,36 +28,30 @@
>  	@echo "If not, you will at least have to touch @@Configuration@@."
>  	@false
>  
> -httpd: $(REGLIB) $(OBJS)
> +httpd: $(REGLIB) modules.o subdirs
>  	rm -f buildmark.c
>  	echo 'const char SERVER_BUILT[] = "'`/bin/date`'";' > buildmark.c
>  	$(CC) -c buildmark.c
>  	$(CC) $(LDFLAGS)  -o httpd buildmark.o $(OBJS) $(REGLIB) $(LIBS)
>  
> -regex/libregex.a:
> -	(cd regex; $(MAKE) lib CC='$(CC)' AUX_CFLAGS='$(CFLAGS)' RANLIB='$(RANLIB)')
> +subdirs:
> +	for i in $(SUBDIRS); do \
> +		( cd $$i; $(MAKE) CC='$(CC)' AUX_CFLAGS='$(CFLAGS)' RANLIB='$(RANLIB)') \
> +	done
>  
> -modules/last-built:
> -	(cd modules; \
> -	$(MAKE) CC='$(CC)' AUX_CFLAGS='$(CFLAGS)' RANLIB='$(RANLIB)')
> +$(REGLIB):
> +	(cd regex; $(MAKE) lib CC='$(CC)' AUX_CFLAGS='$(CFLAGS)' RANLIB='$(RANLIB)')
>  
>  support: support-dir
>  
>  support-dir:
>  	cd support; $(MAKE) CC='$(CC)' AUX_CFLAGS='$(CFLAGS)' RANLIB='$(RANLIB)'
>  
> -core-dir:
> -	cd main; $(MAKE) CC='$(CC)' AUX_CFLAGS='$(CFLAGS)' RANLIB='$(RANLIB)'
> -
> -os-dir:	
> -	cd $(OSDIR); $(MAKE) CC='$(CC)' AUX_CFLAGS='$(CFLAGS)' RANLIB='$(RANLIB)'
> -
>  clean:
>  	rm -f httpd *.o $(OBJS) 
> -	cd main; $(MAKE) clean
> -	cd regex; $(MAKE) clean
> -	cd modules; $(MAKE) clean
> -	cd support; $(MAKE) clean
> +	for i in $(SUBDIRS) regex; do \
> +		( cd $$i; $(MAKE) $@ ) \
> +	done
>  
>  dist.tar: 
>  	# Assure a semi-sensible configuration going out...
> Index: main/Makefile.tmpl
> ===================================================================
> RCS file: /export/home/cvs/apachen/src/main/Makefile.tmpl,v
> retrieving revision 1.2
> diff -u -r1.2 Makefile.tmpl
> --- Makefile.tmpl	1997/08/13 09:28:46	1.2
> +++ Makefile.tmpl	1997/08/24 12:09:29
> @@ -16,10 +16,17 @@
>  .c.o:
>  	$(CC) -c $(INCLUDES) $(CFLAGS) $(SPACER) $<
>  
> -all: $(OBJS)
> +LIB=	libmain.a
> +
> +all: $(LIB)
> +
> +$(LIB): $(OBJS)
> +	rm -f $@
> +	ar crv $@ $(OBJS)
> +	$(RANLIB) $@
>  
>  clean:
> -	rm -f $(OBJS) 
> +	rm -f $(OBJS) $(LIB)
>  
>  # Work around broken compilers
>  http_bprintf.o: http_bprintf.c
> Index: os/unix/Makefile.tmpl
> ===================================================================
> RCS file: /export/home/cvs/apachen/src/os/unix/Makefile.tmpl,v
> retrieving revision 1.2
> diff -u -r1.2 Makefile.tmpl
> --- Makefile.tmpl	1997/08/23 22:25:26	1.2
> +++ Makefile.tmpl	1997/08/24 12:09:30
> @@ -6,13 +6,22 @@
>  
>  OBJS=	os.o
>  
> -all:	$(OBJS)
> +LIB=	libos.a
> +
> +all: $(LIB) 
> +
> +$(LIB): $(OBJS)
> +	rm -f $@
> +	ar crv $@ $(OBJS)
> +	$(RANLIB) $@
>  
>  .c.o:
>  	$(CC) -c $(INCLUDES) $(CFLAGS) $(SPACER) $<
>  
>  clean:
>  	rm -f $(OBJS)
> +
> +$(OBJS): Makefile
>  
>  # DO NOT REMOVE
>  os.o:	os.c
> 
> 
> 


-- 
====================================================================
      Jim Jagielski            |       jaguNET Access Services
     jim@jaguNET.com           |       http://www.jaguNET.com/
            "Look at me! I'm wearing a cardboard belt!"