##
##  Makefile.apxs -- Build procedure for mod_fcgid Apache module
##
##  Do not use this target; build from the mod_fcgid dir root
##
 
# top_builddir and top_srcdir are misnomers, because build/*.mk scripts
# expect each of them to be the parent of the build directory, and fail
# to trust the installbuilddir.
exp_installbuilddir=$(shell $(APXS) -q exp_installbuilddir)
top_srcdir=$(installbuilddir)/..
top_builddir=$(installbuilddir)/..

fcgid_builddir=.
fcgid_srcdir=.
builddir=.
srcdir=.

SUBDIRS = modules/fcgid
CLEAN_SUBDIRS = 

TARGETS         = 
INSTALL_TARGETS = install-manual 
## no such targets yet; install-conf install-include
DISTCLEAN_TARGETS  = config.apxs.log modules/fcgid/fcgid_config.h
EXTRACLEAN_TARGETS = 

include $(exp_installbuilddir)/rules.mk

x-local-distclean:
	rm -rf docs/manual/build docs/manual/style

# Dang nabbit, these are stripped!  Reconstitute them;
rel_libexecdir=`echo $(exp_libexecdir) | sed -e "s#^$(prefix)/##;"`
rel_sysconfdir=`echo $(exp_sysconfdir) | sed -e "s#^$(prefix)/##;"`
rel_logfiledir=`echo $(exp_logfiledir) | sed -e "s#^$(prefix)/##;"`
httpd_conffile=$(exp_sysconfdir)/$(progname).conf

install-conf:
	@echo Installing configuration files
	@$(MKINSTALLDIRS) $(exp_sysconfdir) $(exp_sysconfdir)/extra \
		$(exp_sysconfdir)/original $(exp_sysconfdir)/original/extra
	@cd $(fcgid_srcdir)/docs/conf; \
	for j in $(fcgid_srcdir)/docs/conf; do \
	    cd $$j ; \
	    for i in extra/httpd-fcgid.conf; do \
	    	if test -f $$i; then \
	    	    sed -e '/^\#@@LoadFcgidModules@@/d;' \
			-e 's#@exp_runtimedir@#$(exp_runtimedir)#;' \
	    		-e 's#@exp_sysconfdir@#$(exp_sysconfdir)#;' \
	    		-e 's#@rel_sysconfdir@#$(rel_sysconfdir)#;' \
	    		-e 's#@rel_logfiledir@#$(rel_logfiledir)#;' \
	    		< $$i > $(exp_sysconfdir)/original/$$i; \
	    	    chmod 0644 $(exp_sysconfdir)/original/$$i; \
	    	    if test ! -f $(exp_sysconfdir)/$$i; then \
	    		cp $(exp_sysconfdir)/original/$$i \
			    $(exp_sysconfdir)/$$i; \
	    		chmod 0644 $(exp_sysconfdir)/$$i; \
	    	    fi; \
	    	fi; \
	    done ; \
	done
	@awk -f $(fcgid_srcdir)/build/addloadexample.awk \
		-v MODULE=fcgid -v DSO=.so -v LIBPATH=$(rel_libexecdir) \
		-v EXAMPLECONF=$(rel_sysconfdir)/extra/httpd-fcgid.conf \
		$(DESTDIR)$(httpd_conffile) > $(DESTDIR)$(httpd_conffile).new && \
	  ( mv $(DESTDIR)$(httpd_conffile) $(DESTDIR)$(httpd_conffile).bak && \
	    mv $(DESTDIR)$(httpd_conffile).new $(DESTDIR)$(httpd_conffile) );

svnroot=http://svn.apache.org/repos/asf/httpd
manualdir=$(fcgid_srcdir)/docs/manual

# Note; by default,  make generate-docs  rebuilds the local pages
# To regenerate the installed pages (after using make install to
# drop in the fcgid content), simply
#
#   make manualdir=/path/to/manual generate-docs
#
generate-docs:
	@if test ! -d $(manualdir)/build; then \
	  cd $(manualdir); \
	  svn export $(svnroot)/docs-build/trunk build; \
	fi
	@if test ! -d $(manualdir)/style; then \
	  cd $(manualdir); \
	  svn export $(svnroot)/httpd/trunk/docs/manual/style; \
	fi
	cd $(manualdir)/build; \
	  ./build.sh all

generate-dox:
	cd $(fcgid_srcdir); \
	  doxygen $(fcgid_srcdir)/docs/doxygen-fcgid.conf

install-manual:
	@echo Installing online manual
	@test -d $(DESTDIR)$(exp_manualdir) \
          || $(MKINSTALLDIRS) $(DESTDIR)$(exp_manualdir)
	@if test "x$(RSYNC)" != "x" && test -x $(RSYNC) ; then \
	  $(RSYNC) --exclude .svn -rlpt --numeric-ids \
		$(fcgid_srcdir)/docs/manual/ $(DESTDIR)$(exp_manualdir)/; \
	else \
	  cp -rp $(fcgid_srcdir)/docs/manual/* $(DESTDIR)$(exp_manualdir)/ && \
	  find $(DESTDIR)$(exp_manualdir) -name ".svn" -type d -print \
	    | xargs rm -rf 2>/dev/null || true; \
	fi

install-include:
	@echo Installing header files
	@$(MKINSTALLDIRS) $(DESTDIR)$(exp_includedir) && \
	  cp $(fcgid_srcdir)/include/mod_fcgid.h $(DESTDIR)$(exp_includedir)/ && \
	  chmod 0644 $(DESTDIR)$(exp_includedir)/mod_fcgid.h

.PHONY: generate-dox generate-docs
