blob: b1e7c0c30ef69dd83a7ebd7d5f1d09a746138c22 [file] [log] [blame]
#
#
from SCons.Environment import Environment
from os.path import join as pjoin
import aprconf
import re
import os
import traceback
_platforms = [
'aix',
'beos',
'netware',
'os2',
'os390',
'unix',
'win32'
]
_platform_dirs = [
'atomic',
'dso',
'file_io',
'helpers',
'locks',
'memory',
'misc',
'mmap',
'network_io',
'passwd',
'poll',
'random',
'shmem',
'strings',
'support',
'tables',
'threadproc',
'time',
'user'
]
_simple_dirs = [
'buckets',
'crypto',
'dbd',
'dbm',
'dbm/sdbm',
'encoding',
'hooks',
'memcache',
'tables',
'strings',
'strmatch',
'util-misc',
'uri',
'xlate',
'xml'
]
class APREnv(Environment):
def __init__(self, parent=None, args=None, **kw):
Environment.__init__(self, ENV=os.environ,
tools = ['default', 'subst'],
toolpath = [pjoin(os.getcwd(), 'build')],
**kw)
# See SCons/Platform/__init__.py for possible values
if self['PLATFORM'] in _platforms:
self['APR_PLATFORM'] = self['PLATFORM']
else:
self['APR_PLATFORM'] = 'unix'
# if no *.c files are found in the original APR_PLATFORM, we switch to
# using this fallback platform.
self['APR_FALLBACK_PLATFORM'] = 'unix'
self.AppendUnique(CPPPATH = ['include', 'include/private', 'include/arch/'+self['APR_PLATFORM']])
self.autoconf = aprconf.APRConfigure(self)
self.AppendUnique(LIBS = ['expat'])
def is_gcc(self):
# TOOD: This detection should be smarter, need look at SCons Internals
# for how it works/base it on the Tool selection.
return self['CC'] == 'gcc'
def core_lib_files(self):
rv = []
for d in _platform_dirs:
p = pjoin(d, self['APR_PLATFORM'], '*.c')
files = self.Glob(p)
if not files and self['APR_PLATFORM'] != self['APR_FALLBACK_PLATFORM']:
p = pjoin(d, self['APR_FALLBACK_PLATFORM'], '*.c')
files = self.Glob(p)
rv.extend(files)
for d in _simple_dirs:
p = pjoin(d, '*.c')
files = self.Glob(p)
rv.extend(files)
return rv
def APRVersion(self):
if not self.has_key('APR_VERSION'):
self['APR_VERSION'] = self.read_version('APR', '#include/apr_version.h')
return self['APR_VERSION']
def read_version(self, prefix, path):
version_re = re.compile("(.*)%s_(?P<id>MAJOR|MINOR|PATCH)_VERSION(\s+)(?P<num>\d)(.*)" % prefix)
versions = {}
fp = self.File(path).get_contents()
for line in fp.splitlines():
m = version_re.match(line)
if m:
versions[m.group('id')] = int(m.group('num'))
return (versions['MAJOR'], versions['MINOR'], versions['PATCH'])
def Filter(self, **kw):
for k in kw.keys():
self[k] = [x for x in self[k] if x is not kw[k]]
def APRHints(self):
# TOOD: port more from apr_hints.m4
if self['PLATFORM'] == 'darwin':
self.AppendUnique(CPPFLAGS=['-DDARWIN', '-DSIGPROCMASK_SETS_THREAD_MASK'])
def critical_value(self, f, value, *args):
rv = f(*args)
if rv != value:
traceback.print_stack()
print "Critial Test failed."
self.Exit(1)
return rv
def critical(self, f, *args):
rv = f(*args)
if not rv:
traceback.print_stack()
print "Critial Test failed."
self.Exit(1)
def APRAutoconf(self):
self.apr_config_h = 'include/arch/%s/apr_private.h' % (self['APR_PLATFORM'])
self.apu_config_h = 'include/private/apu_config.h'
subst = {}
if self.GetOption('clean') or self.GetOption('help'):
return self
# TODO Port header detection here etc
conf = self.Configure(custom_tests = {
'CheckFile':
self.autoconf.CheckFile,
'CheckTypesCompatible':
self.autoconf.CheckTypesCompatible,
'Check_apr_atomic_builtins':
self.autoconf.Check_apr_atomic_builtins,
'Check_apr_largefile64':
self.autoconf.Check_apr_largefile64,
'Check_apr_big_endian':
self.autoconf.Check_apr_big_endian,
'Check_apr_mmap_mapping_dev_zero':
self.autoconf.Check_apr_mmap_mapping_dev_zero,
'Check_apr_semaphores':
self.autoconf.Check_apr_semaphores,
'Check_apr_semun':
self.autoconf.Check_apr_semun,
'Check_apr_check_tcp_nodelay_inherited':
self.autoconf.Check_apr_check_tcp_nodelay_inherited,
'Check_apr_nonblock_inherited':
self.autoconf.Check_apr_nonblock_inherited,
'Check_apr_ebcdic':
self.autoconf.Check_apr_ebcdic,
'Check_apr_sctp':
self.autoconf.Check_apr_sctp,
},
config_h = self.apr_config_h)
# Do we have a working C Compiler?
self.critical(conf.CheckCC)
flag_headers = self.Split("""ByteOrder.h
conio.h
crypt.h
ctype.h
dir.h
dirent.h
dl.h
dlfcn.h
errno.h
fcntl.h
grp.h
io.h
limits.h
mach-o/dyld.h
malloc.h
memory.h
netdb.h
osreldate.h
poll.h
process.h
pwd.h
semaphore.h
signal.h
stdarg.h
stddef.h
stdio.h
stdlib.h
string.h
strings.h
sysapi.h
sysgtime.h
termios.h
time.h
tpfeq.h
tpfio.h
unistd.h
unix.h
windows.h
winsock2.h
arpa/inet.h
kernel/OS.h
net/errno.h
netinet/in.h
netinet/sctp.h
netinet/tcp.h
netinet/sctp_uio.h
sys/file.h
sys/ioctl.h
sys/mman.h
sys/param.h
sys/poll.h
sys/resource.h
sys/select.h
sys/sem.h
sys/sendfile.h
sys/signal.h
sys/socket.h
sys/sockio.h
sys/stat.h
sys/sysctl.h
sys/syslimits.h
sys/time.h
sys/types.h
sys/uio.h
sys/un.h
sys/wait.h
pthread.h
""")
for x in flag_headers:
s = x.replace('/', '_').replace('.', '').replace('-', '')
if conf.CheckCHeader(x):
subst['@%s@' % (s)] = 1
else:
subst['@%s@' % (s)] = 0
sizeof_char = conf.CheckTypeSize('char')
sizeof_int = self.critical_value(conf.CheckTypeSize, 4, 'int')
subst['@int_value@'] = 'int'
sizeof_long = conf.CheckTypeSize('long')
sizeof_short = self.critical_value(conf.CheckTypeSize, 2, 'short')
subst['@short_value@'] = 'short'
sizeof_long_long = conf.CheckTypeSize('long long')
sizeof_longlong = conf.CheckTypeSize('longlong')
sizeof_pid_t = conf.CheckTypeSize('pid_t', includes='#include <sys/types.h>')
sizeof_off_t = conf.CheckTypeSize('off_t', includes='#include <sys/types.h>')
sizeof_size_t = conf.CheckTypeSize('size_t', includes='#include <sys/types.h>')
sizeof_ssize_t = conf.CheckTypeSize('ssize_t', includes='#include <sys/types.h>')
subst['@voidp_size@'] = conf.CheckTypeSize('void*')
if sizeof_size_t:
subst['@size_t_value@'] = 'size_t'
subst['@size_t_fmt@'] = '#define APR_SIZE_T_FMT "lu"'
else:
subst['@size_t_value@'] = 'apr_int32_t'
subst['@size_t_fmt@'] = '#define APR_SIZE_T_FMT "u"'
if sizeof_ssize_t:
subst['@ssize_t_value@'] = 'ssize_t'
subst['@ssize_t_fmt@'] = '#define APR_SSIZE_T_FMT "ld"'
else:
subst['@ssize_t_value@'] = 'apr_int32_t'
subst['@ssize_t_fmt@'] = '#define APR_SSIZE_T_FMT "d"'
if conf.Check_apr_big_endian():
subst['@bigendian@'] = 1
else:
subst['@bigendian@'] = 0
# Now we need to find what apr_int64_t (sizeof == 8) will be.
# The first match is our preference.
if sizeof_int == 8:
subst['@int64_literal@'] = '#define APR_INT64_C(val) (val)'
subst['@uint64_literal@'] = '#define APR_UINT64_C(val) (val##U)'
subst['@int64_t_fmt@'] = '#define APR_INT64_T_FMT "d"'
subst['@uint64_t_fmt@'] = '#define APR_UINT64_T_FMT "u"'
subst['@uint64_t_hex_fmt@'] = '#define APR_UINT64_T_HEX_FMT "x"'
subst['@int64_value@'] = 'int'
subst['@long_value@'] = 'int'
subst['@int64_strfn=@'] = 'strtoi'
elif sizeof_long == 8:
subst['@int64_literal@'] = '#define APR_INT64_C(val) (val##L)'
subst['@uint64_literal@'] = '#define APR_UINT64_C(val) (val##UL)'
subst['@int64_t_fmt@'] = '#define APR_INT64_T_FMT "ld"'
subst['@uint64_t_fmt@'] = '#define APR_UINT64_T_FMT "lu"'
subst['@uint64_t_hex_fmt@'] = '#define APR_UINT64_T_HEX_FMT "lx"'
subst['@int64_value@'] = 'long'
subst['@long_value@'] = 'long'
subst['@int64_strfn=@'] = 'strtol'
elif sizeof_long_long == 8:
subst['@int64_literal@'] = '#define APR_INT64_C(val) (val##LL)'
subst['@uint64_literal@'] = '#define APR_UINT64_C(val) (val##ULL)'
# Linux, Solaris, FreeBSD all support ll with printf.
# BSD 4.4 originated 'q'. Solaris is more popular and
# doesn't support 'q'. Solaris wins. Exceptions can
# go to the OS-dependent section.
subst['@int64_t_fmt@'] = '#define APR_INT64_T_FMT "lld"'
subst['@uint64_t_fmt@'] = '#define APR_UINT64_T_FMT "llu"'
subst['@uint64_t_hex_fmt@'] = '#define APR_UINT64_T_HEX_FMT "llx"'
subst['@int64_value@'] = 'long long'
subst['@long_value@'] = 'long long'
subst['@int64_strfn=@'] = 'strtoll'
elif sizeof_longlong == 8:
subst['@int64_literal@'] = '#define APR_INT64_C(val) (val##LL)'
subst['@uint64_literal@'] = '#define APR_UINT64_C(val) (val##ULL)'
subst['@int64_t_fmt@'] = '#define APR_INT64_T_FMT "qd"'
subst['@uint64_t_fmt@'] = '#define APR_UINT64_T_FMT "qu"'
subst['@uint64_t_hex_fmt@'] = '#define APR_UINT64_T_HEX_FMT "qx"'
subst['@int64_value@'] = '__int64'
subst['@long_value@'] = '__int64'
subst['@int64_strfn=@'] = 'strtoll'
else:
print("could not detect a 64-bit integer type")
self.Exit(1)
if conf.CheckDeclaration('INT64_C', includes='#include <stdint.h>'):
subst['@int64_literal@'] = '#define APR_INT64_C(val) INT64_C(val)'
subst['@uint64_literal@'] = '#define APR_UINT64_C(val) UINT64_C(val)'
subst['@stdint@'] = 1
if sizeof_pid_t == sizeof_short:
subst['@pid_t_fmt@'] = '#define APR_PID_T_FMT "hd"'
elif sizeof_pid_t == sizeof_int:
subst['@pid_t_fmt@'] = '#define APR_PID_T_FMT "d"'
elif sizeof_pid_t == sizeof_long:
subst['@pid_t_fmt@'] = '#define APR_PID_T_FMT "ld"'
elif sizeof_pid_t == sizeof_long_long:
subst['@pid_t_fmt@'] = '#define APR_PID_T_FMT APR_INT64_T_FMT'
else:
subst['@pid_t_fmt@'] = '#error Can not determine the proper size for pid_t'
# TODO: Per OS changing of these
if conf.Check_apr_largefile64():
self.AppendUnique(CPPFLAGS = ['-D_LARGEFILE64_SOURCE'])
aprlfs=0
if self['lfs'] and sizeof_off_t == 4:
# Check whether the transitional LFS API is sufficient
aprlfs=1
for f in ['mmap64', 'sendfile64', 'sendfilev64', 'mkstemp64', 'readdir64_r']:
conf.CheckFunc(f)
elif sizeof_off_t == sizeof_size_t:
aprlfs=1
if aprlfs and sizeof_off_t == 4:
# LFS is go!
subst['@off_t_fmt@'] = '#define APR_OFF_T_FMT APR_INT64_T_FMT'
subst['@off_t_value@'] = 'off64_t'
subst['@off_t_strfn@'] = 'apr_strtoi64'
elif sizeof_off_t == 4 and sizeof_long == 4:
# Special case: off_t may change size with _FILE_OFFSET_BITS
# on 32-bit systems with LFS support. To avoid compatibility
# issues when other packages do define _FILE_OFFSET_BITS,
# hard-code apr_off_t to long.
subst['@off_t_fmt@'] = '#define APR_OFF_T_FMT "ld"'
subst['@off_t_value@'] = 'long'
subst['@off_t_strfn@'] = 'strtol'
elif sizeof_off_t != 0:
subst['@off_t_value@'] = 'off_t'
if sizeof_off_t == sizeof_long:
subst['@off_t_fmt@'] = '#define APR_OFF_T_FMT "ld"'
subst['@off_t_strfn@'] = 'strtol'
elif sizeof_off_t == sizeof_int:
subst['@off_t_fmt@'] = '#define APR_OFF_T_FMT "d"'
subst['@off_t_strfn@'] = 'strtoi'
elif sizeof_off_t == sizeof_long_long:
subst['@off_t_fmt@'] = '#define APR_OFF_T_FMT APR_INT64_T_FMT'
subst['@off_t_strfn@'] = 'apr_strtoi64'
else:
print("could not determine the size of off_t")
self.Exit(1)
else:
# Fallback on int
subst['@off_t_fmt@'] = '#define APR_OFF_T_FMT "d"'
subst['@off_t_value@'] = 'apr_int32_t'
subst['@off_t_strfn@'] = 'strtoi'
if conf.Check_apr_atomic_builtins():
conf.Define('HAVE_ATOMIC_BUILTINS', 1)
if not conf.CheckType('size_t', includes='#include <sys/types.h>'):
subst['@size_t_value@'] = 'apr_int32_t'
if not conf.CheckType('ssize_t', includes='#include <sys/types.h>'):
subst['@ssize_t_value@'] = 'apr_int32_t'
if not conf.CheckType('socklen_t', includes='#include <sys/socket.h>'):
subst['@socklen_t_value@'] = 'int'
else:
if self['PLATFORM'] == 'hpux' and sizeof_long == 8:
# 64-bit HP-UX requires 32-bit socklens in
# kernel, but user-space declarations say
# 64-bit (socklen_t == size_t == long).
# This will result in many compile warnings,
# but we're functionally busted otherwise.
subst['@socklen_t_value@'] = 'int'
else:
subst['@socklen_t_value@'] = 'socklen_t'
# Regardless of whether _LARGEFILE64_SOURCE is used, on 32-bit
# platforms _FILE_OFFSET_BITS will affect the size of ino_t and hence
# the build-time ABI may be different from the apparent ABI when using
# APR with another package which *does* define _FILE_OFFSET_BITS.
# (Exactly as per the case above with off_t where LFS is *not* used)
#
# To be safe, hard-code apr_ino_t as 'unsigned long' iff that is
# exactly the size of ino_t here; otherwise use ino_t as existing
# releases did. To be correct, apr_ino_t should have been made an
# ino64_t as apr_off_t is off64_t, but this can't be done now without
# breaking ABI.
subst['@ino_t_value@'] = 'ino_t'
if sizeof_long == 4 and conf.CheckTypesCompatible('ino_t', 'unsigned long', '#include <fts.h>'):
subst['@ino_t_value@'] = 'unsigned long'
# check for mmap functions
# store the results into mmap_results dictionary for use later
mmap_funcs = ['mmap', 'mmap', 'shm_open', 'shm_unlink', 'shm_get',
'shmat', 'shmdt', 'shmctl']
mmap_results = dict([[k, conf.CheckFunc(k)] for k in mmap_funcs])
# check for mmap mapping dev zero
if mmap_results['mmap'] and \
conf.CheckFile("/dev/zero") and \
conf.Check_apr_mmap_mapping_dev_zero():
subst['@havemmapzero@'] = 1
else:
subst['@havemmapzero@'] = 0
# check for locking mechanisms
if conf.Check_apr_semaphores():
subst['@hassysvser@'] = 1
else:
subst['@hassysvser@'] = 0
if conf.CheckDeclaration('F_SETLK', '#include <fcntl.h>'):
subst['@hasfcntlser@'] = 1
else:
subst['@hasfcntlser@'] = 0
if conf.CheckFunc('flock'):
subst['@hasflockser@'] = 1
else:
subst['@hasflockser@'] = 0
apr_tcp_nopush_flag="0"
if conf.CheckDeclaration('TCP_CORK', '#include <netinet/tcp.h>'):
subst['@have_corkable_tcp@'] = 1
apr_tcp_nopush_flag="TCP_CORK"
else:
subst['@have_corkable_tcp@'] = 0
if conf.CheckDeclaration('TCP_NOPUSH', '#include <netinet/tcp.h>'):
subst['@apr_tcp_nopush_flag@'] = 3
subst['@have_corkable_tcp@'] = 1
subst['@apr_tcp_nopush_flag@'] = apr_tcp_nopush_flag
if conf.CheckFunc('flock'):
subst['@hasflockser@'] = 1
else:
subst['@hasflockser@'] = 0
if conf.CheckFunc('getrlimit'):
subst['@have_getrlimit@'] = 1
else:
subst['@have_getrlimit@'] = 0
if conf.CheckFunc('setrlimit'):
subst['@have_setrlimit@'] = 1
else:
subst['@have_setrlimit@'] = 0
if conf.CheckType('struct in_addr', includes='#include <netinet/in.h>'):
subst['@have_in_addr@'] = 1
else:
subst['@have_in_addr@'] = 0
if conf.CheckType('struct sockaddr_storage', includes='#include <netinet/in.h>'):
subst['@have_sa_storage@'] = 1
else:
subst['@have_sa_storage@'] = 0
if conf.CheckType('struct rlimit', includes='#include <sys/resource.h>'):
subst['@struct_rlimit@'] = 1
else:
subst['@struct_rlimit@'] = 0
if conf.Check_apr_semun():
subst['@have_union_semun@'] = 1
else:
subst['@have_union_semun@'] = 0
check_functions = [
'inet_addr',
'inet_network',
'memmove',
'sigaction',
'sigsuspend',
'sigwait',
'strdup',
'stricmp',
'strcasecmp',
'strncasecmp',
'strnicmp',
'strstr',
'memchr',
'iovec',
'fork',
'mmap',
'uuid_create',
'uuid_generate',
'waitpid'
]
for func in check_functions:
if conf.CheckFunc(func):
subst['@have_%s@' % func] = 1
else:
subst['@have_%s@' % func] = 0
if self['PLATFORM'] in ['sunos']:
conf.Define("SIGWAIT_TAKES_ONE_ARG")
# Set Features
# TODO: Not done yet
subst['@sharedmem@'] = 1
subst['@threads@'] = 1
subst['@sendfile@'] = 0
subst['@mmap@'] = subst['@have_mmap@']
subst['@fork@'] = subst['@have_fork@']
subst['@rand@'] = 0
subst['@oc@'] = 0
subst['@aprdso@'] = 0
subst['@have_unicode_fs@'] = 0
subst['@have_proc_invoked@'] = 0
subst['@aprlfs@'] = 0
subst['@osuuid@'] = subst['@have_uuid_generate@'] or subst['@have_uuid_create@']
subst['@file_as_socket@'] = 1
# check for IPv6 (the user is allowed to disable this via commandline
# options
subst['@have_ipv6@'] = 0
if self['ipv6']:
if conf.CheckType('struct sockaddr_in6',
includes='#include <netinet/in.h>') and \
conf.CheckFunc('getaddrinfo') and \
conf.CheckFunc('getnameinfo'):
subst['@have_ipv6@'] = 1
if conf.CheckDeclaration('SO_ACCEPTFILTER', '#include <sys/socket.h>'):
subst['@acceptfilter@'] = 1
else:
subst['@acceptfilter@'] = 0
if conf.CheckDeclaration('IPPROTO_SCTP', '#include <netinet/in.h>') and \
conf.Check_apr_sctp():
subst['@have_sctp@'] = 1
else:
subst['@have_sctp@'] = 0
if conf.CheckDeclaration('SO_ACCEPTFILTER', '#include <sys/socket.h>'):
subst['@acceptfilter@'] = 1
else:
subst['@acceptfilter@'] = 0
if conf.Check_apr_check_tcp_nodelay_inherited():
subst['@tcp_nodelay_inherited@'] = 1
else:
subst['@tcp_nodelay_inherited@'] = 0
if conf.Check_apr_nonblock_inherited():
subst['@o_nonblock_inherited@'] = 1
else:
subst['@o_nonblock_inherited@'] = 0
if conf.Check_apr_ebcdic():
subst['@apr_charset_ebcdic@'] = 1
else:
subst['@apr_charset_ebcdic@'] = 0
if conf.CheckType('struct iovec', includes='#include <sys/types.h>\n#include <sys/uio.h>'):
subst['@have_iovec@'] = 1
else:
subst['@have_iovec@'] = 0
if conf.CheckType('struct sockaddr_un', includes='#include <sys/un.h>'):
subst['@have_sockaddr_un@'] = 1
else:
subst['@have_sockaddr_un@'] = 0
subst['@proc_mutex_is_global@'] = 0
if self['PLATFORM'] in ['os2', 'beos', 'win32', 'cygwin']:
subst['@proc_mutex_is_global@'] = 1
# note: the current APR use of shared mutex requires /dev/zero
if conf.CheckFile('/dev/zero') and \
conf.CheckDeclaration('PTHREAD_PROCESS_SHARED', includes='#include <pthread.h>') and \
conf.CheckFunc('pthread_mutexattr_setpshared'):
subst['@hasprocpthreadser@'] = 1
else:
subst['@hasprocpthreadser@'] = 0
subst['@havemmaptmp@'] = 0
subst['@havemmapshm@'] = 0
subst['@haveshmgetanon@'] = 0
subst['@haveshmget@'] = 0
subst['@havemmapanon@'] = 0
subst['@havebeosarea@'] = 0
subst['@usemmaptmp@'] = 0
subst['@usemmapshm@'] = 0
subst['@usemmapzero@'] = 0
subst['@useshmgetanon@'] = 0
subst['@useshmget@'] = 0
subst['@usemmapanon@'] = 0
subst['@usebeosarea@'] = 0
subst['@flockser@'] = 0
subst['@sysvser@'] = 0
subst['@posixser@'] = 0
subst['@fcntlser@'] = 0
subst['@procpthreadser@'] = 0
subst['@pthreadser@'] = 0
subst['@hasposixser@'] = 0
subst['@proclockglobal@'] = 0
if self['APR_PLATFORM'] in ['win32']:
subst['@eolstr@'] = "\\\\r\\\\n"
else:
subst['@eolstr@'] = "\\\\n"
subst['@shlibpath_var@'] = pjoin(self['prefix'], 'lib')
# APR Util things to fix:
subst['@apu_have_sdbm@'] = 1
subst['@apu_have_gdbm@'] = 0
subst['@apu_have_ndbm@'] = 0
subst['@apu_have_db@'] = 0
subst['@apu_use_sdbm@'] = 1
subst['@apu_use_ndbm@'] = 0
subst['@apu_use_gdbm@'] = 0
subst['@apu_use_db@'] = 0
subst['@apu_db_version@'] = 0
subst['@apu_have_pgsql@'] = 0
subst['@apu_have_mysql@'] = 0
subst['@apu_have_sqlite3@'] = 0
subst['@apu_have_sqlite2@'] = 0
subst['@apu_have_oracle@'] = 0
subst['@apu_have_odbc@'] = 0
subst['@apu_have_crypto@'] = 0
subst['@apu_have_openssl@'] = 0
subst['@apu_have_nss@'] = 0
subst['@have_iconv@'] = 0
self.SubstFile('include/apr.h', 'include/apr.h.in', SUBST_DICT = subst)
self.SubstFile('include/apu.h', 'include/apu.h.in', SUBST_DICT = subst)
self.SubstFile('include/apu_want.h', 'include/apu_want.h.in', SUBST_DICT = subst)
self.SubstFile('include/private/apu_select_dbm.h', 'include/private/apu_select_dbm.h.in', SUBST_DICT = subst)
if hasattr(conf, "config_h_text"):
conf.Define("APR_OFF_T_STRFN", subst['@off_t_strfn@'])
conf.config_h_text = conf.config_h_text + '#include "arch/apr_private_common.h"\n'
return conf.Finish()