# ====================================================================
# Copyright (c) 1995-1997 The Apache Group.  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. All advertising materials mentioning features or use of this
#    software must display the following acknowledgment:
#    "This product includes software developed by the Apache Group
#    for use in the Apache HTTP server project (http://www.apache.org/)."
#
# 4. The names "Apache Server" and "Apache Group" must not be used to
#    endorse or promote products derived from this software without
#    prior written permission.
#
# 5. Redistributions of any form whatsoever must retain the following
#    acknowledgment:
#    "This product includes software developed by the Apache Group
#    for use in the Apache HTTP server project (http://www.apache.org/)."
#
# THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``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 GROUP 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 Group and was originally based
# on public domain software written at the National Center for
# Supercomputing Applications, University of Illinois, Urbana-Champaign.
# For more information on the Apache Group and the Apache HTTP server
# project, please see <http://www.apache.org/>.
# 
# Makefile for the Apache mod_perl library
# 
# $Id$
#

#__ORIGINAL__


INCLUDES=$(INCLUDES1) $(INCLUDES0) $(INCLUDES_DEPTH2) $(EXTRA_INCLUDES)

SHELL = /bin/sh

LIB=libperl.a

#on/off switches for Perl API hooks
#comment out to enable callbacks at a certain stage in the request
PERL_DISPATCH = -DNO_PERL_DISPATCH
PERL_CHILD_INIT = -DNO_PERL_CHILD_INIT
PERL_CHILD_EXIT = -DNO_PERL_CHILD_EXIT
PERL_RESTART = -DNO_PERL_RESTART
PERL_POST_READ_REQUEST = -DNO_PERL_POST_READ_REQUEST
PERL_TRANS   = -DNO_PERL_TRANS
PERL_HEADER_PARSER = -DNO_PERL_HEADER_PARSER
PERL_ACCESS  = -DNO_PERL_ACCESS
PERL_AUTHEN  = -DNO_PERL_AUTHEN
PERL_AUTHZ   = -DNO_PERL_AUTHZ
PERL_TYPE    = -DNO_PERL_TYPE 
PERL_FIXUP   = -DNO_PERL_FIXUP 
PERL_LOG     = -DNO_PERL_LOG 
PERL_INIT    = -DNO_PERL_INIT
PERL_CLEANUP = -DNO_PERL_CLEANUP

PERL_STACKED_HANDLERS = -DNO_PERL_STACKED_HANDLERS
PERL_SECTIONS         = -DNO_PERL_SECTIONS
PERL_METHOD_HANDLERS  = -DNO_PERL_METHOD_HANDLERS
PERL_DIRECTIVE_HANDLERS  = -DNO_PERL_DIRECTIVE_HANDLERS
PERL_SSI = -DNO_PERL_SSI

PERL_HOOKS =   $(PERL_DISPATCH) $(PERL_CHILD_INIT) $(PERL_CHILD_EXIT) \
 $(PERL_POST_READ_REQUEST) $(PERL_TRANS) $(PERL_HEADER_PARSER) \
 $(PERL_ACCESS) $(PERL_AUTHEN) $(PERL_AUTHZ) \
 $(PERL_TYPE) $(PERL_FIXUP) $(PERL_LOG) \
 $(PERL_INIT) $(PERL_CLEANUP) $(PERL_RESTART) \
 $(PERL_STACKED_HANDLERS) $(PERL_SECTIONS) $(PERL_METHOD_HANDLERS) \
 $(PERL_SSI) $(PERL_DIRECTIVE_HANDLERS)

#STATIC_SRC = Apache.c Constants.c
#STATIC_EXTS = Apache Apache::Constants

#TRACE = -DPERL_TRACE
#SSL_COMMON_INC = -I../../../ssl/include -I/usr/local/ssl/include
#APACHE_SSL = 
PERL=/usr/bin/perl
PERL_STATIC_EXTS =
PRIVLIB=`$(PERL) -MConfig -e 'print $$Config{privlibexp}'`
EXTUTILS_EMBED = $(PERL) -MExtUtils::Embed
#CONFIG_PM=-MConfig
CONFIG_PM='-MApache::ExtUtils=%Config'
PERL_CFG_CCFLAGS = `$(PERL) $(CONFIG_PM) -e 'print $$Config{ccflags}'`
PERL_CFG_ARCHLIB = `$(PERL) -MConfig -e 'print $$Config{archlibexp}'`

PERL_CCFLAGS = -I$(PERL_CFG_ARCHLIB)/CORE $(PERL_CFG_CCFLAGS) $(PERL_HOOKS) $(TRACE)

.SUFFIXES: .xs .c .o

XS_INIT = `$(EXTUTILS_EMBED) -e xsinit -- -std $(PERL_STATIC_EXTS) $(STATIC_EXTS)`

CC=`$(PERL) -MConfig -e 'print $$Config{cc}'`

# AUX_CFLAGS comes from higher level Makefile
CFLAGS=-I. -I$(INCDIR) -I$(INCDIR)/regex -I$(INCDIR)/../$(OSDIR) $(AUX_CFLAGS) \
	$(APACHE_SSL) $(PERL_CCFLAGS) \
	-DMOD_PERL_VERSION=\"$(MOD_PERL_VERSION)\" \
	$(INCLUDES)

all:	$(LIB)

perlxsi.c:
	$(XS_INIT) 

.xs.c:
	$(PERL) $(PRIVLIB)/ExtUtils/xsubpp -nolinenumbers -typemap $(PRIVLIB)/ExtUtils/typemap $*.xs > $@

PERLSRC=mod_perl_opmask.c mod_perl.c perlxsi.c perl_config.c perl_util.c perlio.c $(STATIC_SRC)

OBJS=$(PERLSRC:.c=.o)

.c.a:
	$(MAKE) $(CFLAGS) $<

$(LIB):	$(OBJS)
	rm -f $@
	ar crv $@ $(OBJS)
	$(RANLIB) $@

# dependencies
$(OBJS): mod_perl.h $(INCDIR)/httpd.h $(INCDIR)/http_config.h 
mod_perl.o: $(PERLSRC)

# various forms of cleanup
tidy:
	rm -f *.out

clean:	tidy
	rm -f *.o $(LIB) perlxsi.c Apache.c Constants.c









