# ====================================================================
# The Apache Software License, Version 1.1
#
# Copyright (c) 2000-2001 The Apache Software Foundation.  All rights
# reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in
#    the documentation and/or other materials provided with the
#    distribution.
#
# 3. The end-user documentation included with the redistribution,
#    if any, must include the following acknowledgment:
#       "This product includes software developed by the
#        Apache Software Foundation (http://www.apache.org/)."
#    Alternately, this acknowledgment may appear in the software itself,
#    if and wherever such third-party acknowledgments normally appear.
#
# 4. The names "Apache" and "Apache Software Foundation" must
#    not be used to endorse or promote products derived from this
#    software without prior written permission. For written
#    permission, please contact apache@apache.org.
#
# 5. Products derived from this software may not be called "Apache",
#    nor may "Apache" appear in their name, without prior written
#    permission of the Apache Software Foundation.
#
# THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
# ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
# ====================================================================
#
# This software consists of voluntary contributions made by many
# individuals on behalf of the Apache Software Foundation.  For more
# information on the Apache Software Foundation, please see
# <http://www.apache.org/>.
#

#
# rules.mk: standard rules for APRICONV
#

#
# Configuration variables
#
top_builddir=@top_builddir@
APR_SOURCE_DIR=@APR_SOURCE_DIR@

CC=@CC@
AWK=@AWK@
LIBTOOL=@LIBTOOL@

CFLAGS=@CFLAGS@
LIBS=@LIBS@
LDFLAGS=@LDFLAGS@

RM=@RM@
SHELL=@SHELL@

### make LTFLAGS somewhat variable?
LTFLAGS = --silent

#
# Basic macro setup
#
COMPILE      = $(CC) $(CFLAGS)
LT_COMPILE   = $(LIBTOOL) --mode=compile $(LTFLAGS) $(COMPILE) -c $< && touch $@

LINK         = $(LIBTOOL) --mode=link $(LTFLAGS) $(COMPILE) $(LDFLAGS) -o $@

SH_LIBTOOL = $(SHELL) $(top_builddir)/shlibtool --silent
SH_COMPILE = $(SH_LIBTOOL) --mode=compile $(COMPILE) -c $< && touch $@
SH_LINK  = $(SH_LIBTOOL) --mode=link $(COMPILE) $(LTFLAGS) $(LDFLAGS) $(NOTEST_LDFLAGS) -o $@
# To be arranged...
libexecdir = /usr/local/lib

MKEXPORT     = $(AWK) -f $(APR_SOURCE_DIR)/build/make_export.awk
SCANDOC      = $(APR_SOURCE_DIR)/build/scandoc.pl

#
# Standard build rules
#
all: all-recursive
depend: depend-recursive
clean: clean-recursive
distclean: distclean-recursive
extraclean: extraclean-recursive

install: all-recursive


all-recursive depend-recursive clean-recursive distclean-recursive \
  extraclean-recursive:
	@otarget=`echo $@ | sed s/-recursive//`; \
	list='$(SUBDIRS)'; \
	ttarget=`echo $otarget | sed s/.*clean.*/clean/`; \
	if test x"$ttarget" = "xclean"; then \
	    list='$(SUBDIRS) $(CLEAN_SUBDIRS)'; \
	fi; \
	for i in $$list; do \
	    if test -d "$$i"; then \
		target="$$otarget"; \
		echo "Making $$target in $$i"; \
		if test "$$i" = "."; then \
		    made_local=yes; \
		    target="local-$$target"; \
		fi; \
		(cd $$i && $(MAKE) $$target) || exit 1; \
	    fi; \
	done; \
        if test "$$otarget" = "all" && test -z "$(TARGETS)"; then \
	    made_local=n/a; \
	fi; \
	if test -z "$$made_local"; then \
	    $(MAKE) "local-$$otarget" || exit 1; \
	fi

local-clean:
	$(RM) -f *.o *.lo *.a *.la *.so *.slo $(CLEAN_TARGETS) $(PROGRAMS)
	$(RM) -rf .libs

local-distclean: local-clean
	$(RM) -f Makefile $(DISTCLEAN_TARGETS)

local-extraclean: local-distclean
	@if test -n "$(EXTRACLEAN_TARGETS)"; then \
	    echo $(RM) -f $(EXTRACLEAN_TARGETS) ; \
	    $(RM) -f $(EXTRACLEAN_TARGETS) ; \
	fi

local-all: $(TARGETS)

local-depend:
### need something here


#
# Implicit rules for creating outputs from input files
#
.SUFFIXES:
.SUFFIXES: .c .lo .o .la .slo

.c.o:
	$(COMPILE) -c $<

.c.lo:
	$(LT_COMPILE)

.c.slo:
	$(SH_COMPILE)

.c.la:
	$(MAKE) $*.slo
	$(SH_LINK) -rpath $(libexecdir) -module -avoid-version  $*.lo

.PHONY: all depend clean distclean extraclean install \
	all-recursive depend-recursive clean-recursive distclean-recursive \
	extraclean-recursive
	local-all local-depend local-clean local-distclean local-extraclean
