|
Packit |
3adb1e |
# -*- python -*-
|
|
Packit |
3adb1e |
#
|
|
Packit |
3adb1e |
# ====================================================================
|
|
Packit |
3adb1e |
# Licensed to the Apache Software Foundation (ASF) under one
|
|
Packit |
3adb1e |
# or more contributor license agreements. See the NOTICE file
|
|
Packit |
3adb1e |
# distributed with this work for additional information
|
|
Packit |
3adb1e |
# regarding copyright ownership. The ASF licenses this file
|
|
Packit |
3adb1e |
# to you under the Apache License, Version 2.0 (the
|
|
Packit |
3adb1e |
# "License"); you may not use this file except in compliance
|
|
Packit |
3adb1e |
# with the License. You may obtain a copy of the License at
|
|
Packit |
3adb1e |
#
|
|
Packit |
3adb1e |
# http://www.apache.org/licenses/LICENSE-2.0
|
|
Packit |
3adb1e |
#
|
|
Packit |
3adb1e |
# Unless required by applicable law or agreed to in writing,
|
|
Packit |
3adb1e |
# software distributed under the License is distributed on an
|
|
Packit |
3adb1e |
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
Packit |
3adb1e |
# KIND, either express or implied. See the License for the
|
|
Packit |
3adb1e |
# specific language governing permissions and limitations
|
|
Packit |
3adb1e |
# under the License.
|
|
Packit |
3adb1e |
# ====================================================================
|
|
Packit |
3adb1e |
#
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
import sys
|
|
Packit |
3adb1e |
import os
|
|
Packit |
3adb1e |
import re
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
EnsureSConsVersion(2,3,0)
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
HEADER_FILES = ['serf.h',
|
|
Packit |
3adb1e |
'serf_bucket_types.h',
|
|
Packit |
3adb1e |
'serf_bucket_util.h',
|
|
Packit |
3adb1e |
]
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
# where we save the configuration variables
|
|
Packit |
3adb1e |
SAVED_CONFIG = '.saved_config'
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
# Variable class that does no validation on the input
|
|
Packit |
3adb1e |
def _converter(val):
|
|
Packit |
3adb1e |
"""
|
|
Packit |
3adb1e |
"""
|
|
Packit |
3adb1e |
if val == 'none':
|
|
Packit |
3adb1e |
val = []
|
|
Packit |
3adb1e |
else:
|
|
Packit |
3adb1e |
val = val.split(' ')
|
|
Packit |
3adb1e |
return val
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
def RawListVariable(key, help, default):
|
|
Packit |
3adb1e |
"""
|
|
Packit |
3adb1e |
The input parameters describe a 'raw string list' option. This class
|
|
Packit |
3adb1e |
accepts a space-separated string and converts it to a list.
|
|
Packit |
3adb1e |
"""
|
|
Packit |
3adb1e |
return (key, '%s' % (help), default, None, lambda val: _converter(val))
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
# Custom path validator, creates directory when a specified option is set.
|
|
Packit |
3adb1e |
# To be used to ensure a PREFIX directory is only created when installing.
|
|
Packit |
3adb1e |
def createPathIsDirCreateWithTarget(target):
|
|
Packit |
3adb1e |
def my_validator(key, val, env):
|
|
Packit |
3adb1e |
build_targets = (map(str, BUILD_TARGETS))
|
|
Packit |
3adb1e |
if target in build_targets:
|
|
Packit |
3adb1e |
return PathVariable.PathIsDirCreate(key, val, env)
|
|
Packit |
3adb1e |
else:
|
|
Packit |
3adb1e |
return PathVariable.PathAccept(key, val, env)
|
|
Packit |
3adb1e |
return my_validator
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
# default directories
|
|
Packit |
3adb1e |
if sys.platform == 'win32':
|
|
Packit |
3adb1e |
default_incdir='..'
|
|
Packit |
3adb1e |
default_libdir='..'
|
|
Packit |
3adb1e |
default_prefix='Debug'
|
|
Packit |
3adb1e |
else:
|
|
Packit |
3adb1e |
default_incdir='/usr'
|
|
Packit |
3adb1e |
default_libdir='$PREFIX/lib'
|
|
Packit |
3adb1e |
default_prefix='/usr/local'
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
opts = Variables(files=[SAVED_CONFIG])
|
|
Packit |
3adb1e |
opts.AddVariables(
|
|
Packit |
3adb1e |
PathVariable('PREFIX',
|
|
Packit |
3adb1e |
'Directory to install under',
|
|
Packit |
3adb1e |
default_prefix,
|
|
Packit |
3adb1e |
createPathIsDirCreateWithTarget('install')),
|
|
Packit |
3adb1e |
PathVariable('LIBDIR',
|
|
Packit |
3adb1e |
'Directory to install architecture dependent libraries under',
|
|
Packit |
3adb1e |
default_libdir,
|
|
Packit |
3adb1e |
createPathIsDirCreateWithTarget('install')),
|
|
Packit |
3adb1e |
PathVariable('APR',
|
|
Packit |
3adb1e |
"Path to apr-1-config, or to APR's install area",
|
|
Packit |
3adb1e |
default_incdir,
|
|
Packit |
3adb1e |
PathVariable.PathAccept),
|
|
Packit |
3adb1e |
PathVariable('APU',
|
|
Packit |
3adb1e |
"Path to apu-1-config, or to APR's install area",
|
|
Packit |
3adb1e |
default_incdir,
|
|
Packit |
3adb1e |
PathVariable.PathAccept),
|
|
Packit |
3adb1e |
PathVariable('OPENSSL',
|
|
Packit |
3adb1e |
"Path to OpenSSL's install area",
|
|
Packit |
3adb1e |
default_incdir,
|
|
Packit |
3adb1e |
PathVariable.PathIsDir),
|
|
Packit |
3adb1e |
PathVariable('ZLIB',
|
|
Packit |
3adb1e |
"Path to zlib's install area",
|
|
Packit |
3adb1e |
default_incdir,
|
|
Packit |
3adb1e |
PathVariable.PathIsDir),
|
|
Packit |
3adb1e |
PathVariable('GSSAPI',
|
|
Packit |
3adb1e |
"Path to GSSAPI's install area",
|
|
Packit |
3adb1e |
None,
|
|
Packit |
3adb1e |
None),
|
|
Packit |
3adb1e |
BoolVariable('DEBUG',
|
|
Packit |
3adb1e |
"Enable debugging info and strict compile warnings",
|
|
Packit |
3adb1e |
False),
|
|
Packit |
3adb1e |
BoolVariable('APR_STATIC',
|
|
Packit |
3adb1e |
"Enable using a static compiled APR",
|
|
Packit |
3adb1e |
False),
|
|
Packit |
3adb1e |
RawListVariable('CC', "Command name or path of the C compiler", None),
|
|
Packit |
3adb1e |
RawListVariable('CFLAGS', "Extra flags for the C compiler (space-separated)",
|
|
Packit |
3adb1e |
None),
|
|
Packit |
3adb1e |
RawListVariable('LIBS', "Extra libraries passed to the linker, "
|
|
Packit |
3adb1e |
"e.g. \"-l<library1> -l<library2>\" (space separated)", None),
|
|
Packit |
3adb1e |
RawListVariable('LINKFLAGS', "Extra flags for the linker (space-separated)",
|
|
Packit |
3adb1e |
None),
|
|
Packit |
3adb1e |
RawListVariable('CPPFLAGS', "Extra flags for the C preprocessor "
|
|
Packit |
3adb1e |
"(space separated)", None),
|
|
Packit |
3adb1e |
)
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
if sys.platform == 'win32':
|
|
Packit |
3adb1e |
opts.AddVariables(
|
|
Packit |
3adb1e |
# By default SCons builds for the host platform on Windows, when using
|
|
Packit |
3adb1e |
# a supported compiler (E.g. VS2010/VS2012). Allow overriding
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
# Note that Scons 1.3 only supports this on Windows and only when
|
|
Packit |
3adb1e |
# constructing Environment(). Later changes to TARGET_ARCH are ignored
|
|
Packit |
3adb1e |
EnumVariable('TARGET_ARCH',
|
|
Packit |
3adb1e |
"Platform to build for (x86|x64|win32|x86_64)",
|
|
Packit |
3adb1e |
'x86',
|
|
Packit |
3adb1e |
allowed_values=('x86', 'x86_64', 'ia64'),
|
|
Packit |
3adb1e |
map={'X86' : 'x86',
|
|
Packit |
3adb1e |
'win32': 'x86',
|
|
Packit |
3adb1e |
'Win32': 'x86',
|
|
Packit |
3adb1e |
'x64' : 'x86_64',
|
|
Packit |
3adb1e |
'X64' : 'x86_64'
|
|
Packit |
3adb1e |
}),
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
EnumVariable('MSVC_VERSION',
|
|
Packit |
3adb1e |
"Visual C++ to use for building (E.g. 11.0, 9.0)",
|
|
Packit |
3adb1e |
None,
|
|
Packit |
3adb1e |
allowed_values=('14.0', '12.0',
|
|
Packit |
3adb1e |
'11.0', '10.0', '9.0', '8.0', '6.0')
|
|
Packit |
3adb1e |
),
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
# We always documented that we handle an install layout, but in fact we
|
|
Packit |
3adb1e |
# hardcoded source layouts. Allow disabling this behavior.
|
|
Packit |
3adb1e |
# ### Fix default?
|
|
Packit |
3adb1e |
BoolVariable('SOURCE_LAYOUT',
|
|
Packit |
3adb1e |
"Assume a source layout instead of install layout",
|
|
Packit |
3adb1e |
True),
|
|
Packit |
3adb1e |
)
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
env = Environment(variables=opts,
|
|
Packit |
3adb1e |
tools=('default', 'textfile',),
|
|
Packit |
3adb1e |
CPPPATH=['.', ],
|
|
Packit |
3adb1e |
)
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
env.Append(BUILDERS = {
|
|
Packit |
3adb1e |
'GenDef' :
|
|
Packit |
3adb1e |
Builder(action = sys.executable + ' build/gen_def.py $SOURCES > $TARGET',
|
|
Packit |
3adb1e |
suffix='.def', src_suffix='.h')
|
|
Packit |
3adb1e |
})
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
match = re.search('SERF_MAJOR_VERSION ([0-9]+).*'
|
|
Packit |
3adb1e |
'SERF_MINOR_VERSION ([0-9]+).*'
|
|
Packit |
3adb1e |
'SERF_PATCH_VERSION ([0-9]+)',
|
|
Packit |
3adb1e |
env.File('serf.h').get_contents(),
|
|
Packit |
3adb1e |
re.DOTALL)
|
|
Packit |
3adb1e |
MAJOR, MINOR, PATCH = [int(x) for x in match.groups()]
|
|
Packit |
3adb1e |
env.Append(MAJOR=str(MAJOR))
|
|
Packit |
3adb1e |
env.Append(MINOR=str(MINOR))
|
|
Packit |
3adb1e |
env.Append(PATCH=str(PATCH))
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
# Calling external programs is okay if we're not cleaning or printing help.
|
|
Packit |
3adb1e |
# (cleaning: no sense in fetching information; help: we may not know where
|
|
Packit |
3adb1e |
# they are)
|
|
Packit |
3adb1e |
CALLOUT_OKAY = not (env.GetOption('clean') or env.GetOption('help'))
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
# HANDLING OF OPTION VARIABLES
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
unknown = opts.UnknownVariables()
|
|
Packit |
3adb1e |
if unknown:
|
|
Packit |
3adb1e |
print 'Warning: Used unknown variables:', ', '.join(unknown.keys())
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
apr = str(env['APR'])
|
|
Packit |
3adb1e |
apu = str(env['APU'])
|
|
Packit |
3adb1e |
zlib = str(env['ZLIB'])
|
|
Packit |
3adb1e |
gssapi = env.get('GSSAPI', None)
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
if gssapi and os.path.isdir(gssapi):
|
|
Packit |
3adb1e |
krb5_config = os.path.join(gssapi, 'bin', 'krb5-config')
|
|
Packit |
3adb1e |
if os.path.isfile(krb5_config):
|
|
Packit |
3adb1e |
gssapi = krb5_config
|
|
Packit |
3adb1e |
env['GSSAPI'] = krb5_config
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
debug = env.get('DEBUG', None)
|
|
Packit |
3adb1e |
aprstatic = env.get('APR_STATIC', None)
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
Help(opts.GenerateHelpText(env))
|
|
Packit |
3adb1e |
opts.Save(SAVED_CONFIG, env)
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
# PLATFORM-SPECIFIC BUILD TWEAKS
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
thisdir = os.getcwd()
|
|
Packit |
3adb1e |
libdir = '$LIBDIR'
|
|
Packit |
3adb1e |
incdir = '$PREFIX/include/serf-$MAJOR'
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
# This version string is used in the dynamic library name, and for Mac OS X also
|
|
Packit |
3adb1e |
# for the current_version and compatibility_version options in the .dylib
|
|
Packit |
3adb1e |
#
|
|
Packit |
3adb1e |
# Unfortunately we can't set the .dylib compatibility_version option separately
|
|
Packit |
3adb1e |
# from current_version, so don't use the PATCH level to avoid that build and
|
|
Packit |
3adb1e |
# runtime patch levels have to be identical.
|
|
Packit |
3adb1e |
if sys.platform != 'sunos5':
|
|
Packit |
3adb1e |
env['SHLIBVERSION'] = '%d.%d.%d' % (MAJOR, MINOR, 0)
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
LIBNAME = 'libserf-%d' % (MAJOR,)
|
|
Packit |
3adb1e |
if sys.platform != 'win32':
|
|
Packit |
3adb1e |
LIBNAMESTATIC = LIBNAME
|
|
Packit |
3adb1e |
else:
|
|
Packit |
3adb1e |
LIBNAMESTATIC = 'serf-${MAJOR}'
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
if sys.platform == 'darwin':
|
|
Packit |
3adb1e |
# linkflags.append('-Wl,-install_name,@executable_path/%s.dylib' % (LIBNAME,))
|
|
Packit |
3adb1e |
env.Append(LINKFLAGS=['-Wl,-install_name,%s/%s.dylib' % (thisdir, LIBNAME,)])
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
if sys.platform != 'win32':
|
|
Packit |
3adb1e |
def CheckGnuCC(context):
|
|
Packit |
3adb1e |
src = '''
|
|
Packit |
3adb1e |
#ifndef __GNUC__
|
|
Packit |
3adb1e |
oh noes!
|
|
Packit |
3adb1e |
#endif
|
|
Packit |
3adb1e |
'''
|
|
Packit |
3adb1e |
context.Message('Checking for GNU-compatible C compiler...')
|
|
Packit |
3adb1e |
result = context.TryCompile(src, '.c')
|
|
Packit |
3adb1e |
context.Result(result)
|
|
Packit |
3adb1e |
return result
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
conf = Configure(env, custom_tests = dict(CheckGnuCC=CheckGnuCC))
|
|
Packit |
3adb1e |
have_gcc = conf.CheckGnuCC()
|
|
Packit |
3adb1e |
env = conf.Finish()
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
if have_gcc:
|
|
Packit |
3adb1e |
env.Append(CFLAGS=['-std=c89'])
|
|
Packit |
3adb1e |
env.Append(CCFLAGS=['-Wdeclaration-after-statement',
|
|
Packit |
3adb1e |
'-Wmissing-prototypes',
|
|
Packit |
3adb1e |
'-Wall'])
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
if debug:
|
|
Packit |
3adb1e |
env.Append(CCFLAGS=['-g'])
|
|
Packit |
3adb1e |
env.Append(CPPDEFINES=['DEBUG', '_DEBUG'])
|
|
Packit |
3adb1e |
else:
|
|
Packit |
3adb1e |
env.Append(CCFLAGS=['-O2'])
|
|
Packit |
3adb1e |
env.Append(CPPDEFINES=['NDEBUG'])
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
### works for Mac OS. probably needs to change
|
|
Packit |
3adb1e |
env.Append(LIBS=['ssl', 'crypto', 'z', ])
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
if sys.platform == 'sunos5':
|
|
Packit |
3adb1e |
env.Append(LIBS=['m'])
|
|
Packit |
3adb1e |
env.Append(PLATFORM='posix')
|
|
Packit |
3adb1e |
else:
|
|
Packit |
3adb1e |
# Warning level 4, no unused argument warnings
|
|
Packit |
3adb1e |
env.Append(CCFLAGS=['/W4', '/wd4100'])
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
# Choose runtime and optimization
|
|
Packit |
3adb1e |
if debug:
|
|
Packit |
3adb1e |
# Disable optimizations for debugging, use debug DLL runtime
|
|
Packit |
3adb1e |
env.Append(CCFLAGS=['/Od', '/MDd'])
|
|
Packit |
3adb1e |
env.Append(CPPDEFINES=['DEBUG', '_DEBUG'])
|
|
Packit |
3adb1e |
else:
|
|
Packit |
3adb1e |
# Optimize for speed, use DLL runtime
|
|
Packit |
3adb1e |
env.Append(CCFLAGS=['/O2', '/MD'])
|
|
Packit |
3adb1e |
env.Append(CPPDEFINES=['NDEBUG'])
|
|
Packit |
3adb1e |
env.Append(LINKFLAGS=['/RELEASE'])
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
# PLAN THE BUILD
|
|
Packit |
3adb1e |
SHARED_SOURCES = []
|
|
Packit |
3adb1e |
if sys.platform == 'win32':
|
|
Packit |
3adb1e |
env.GenDef(['serf.h','serf_bucket_types.h', 'serf_bucket_util.h'])
|
|
Packit |
3adb1e |
SHARED_SOURCES.append(['serf.def'])
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
SOURCES = Glob('*.c') + Glob('buckets/*.c') + Glob('auth/*.c')
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
lib_static = env.StaticLibrary(LIBNAMESTATIC, SOURCES)
|
|
Packit |
3adb1e |
lib_shared = env.SharedLibrary(LIBNAME, SOURCES + SHARED_SOURCES)
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
if aprstatic:
|
|
Packit |
3adb1e |
env.Append(CPPDEFINES=['APR_DECLARE_STATIC', 'APU_DECLARE_STATIC'])
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
if sys.platform == 'win32':
|
|
Packit |
3adb1e |
env.Append(LIBS=['user32.lib', 'advapi32.lib', 'gdi32.lib', 'ws2_32.lib',
|
|
Packit |
3adb1e |
'crypt32.lib', 'mswsock.lib', 'rpcrt4.lib', 'secur32.lib'])
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
# Get apr/apu information into our build
|
|
Packit |
3adb1e |
env.Append(CPPDEFINES=['WIN32','WIN32_LEAN_AND_MEAN','NOUSER',
|
|
Packit |
3adb1e |
'NOGDI', 'NONLS','NOCRYPT'])
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
if env.get('TARGET_ARCH', None) == 'x86_64':
|
|
Packit |
3adb1e |
env.Append(CPPDEFINES=['WIN64'])
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
if aprstatic:
|
|
Packit |
3adb1e |
apr_libs='apr-1.lib'
|
|
Packit |
3adb1e |
apu_libs='aprutil-1.lib'
|
|
Packit |
3adb1e |
env.Append(LIBS=['shell32.lib', 'xml.lib'])
|
|
Packit |
3adb1e |
else:
|
|
Packit |
3adb1e |
apr_libs='libapr-1.lib'
|
|
Packit |
3adb1e |
apu_libs='libaprutil-1.lib'
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
env.Append(LIBS=[apr_libs, apu_libs])
|
|
Packit |
3adb1e |
if not env.get('SOURCE_LAYOUT', None):
|
|
Packit |
3adb1e |
env.Append(LIBPATH=['$APR/lib', '$APU/lib'],
|
|
Packit |
3adb1e |
CPPPATH=['$APR/include/apr-1', '$APU/include/apr-1'])
|
|
Packit |
3adb1e |
elif aprstatic:
|
|
Packit |
3adb1e |
env.Append(LIBPATH=['$APR/LibR','$APU/LibR'],
|
|
Packit |
3adb1e |
CPPPATH=['$APR/include', '$APU/include'])
|
|
Packit |
3adb1e |
else:
|
|
Packit |
3adb1e |
env.Append(LIBPATH=['$APR/Release','$APU/Release'],
|
|
Packit |
3adb1e |
CPPPATH=['$APR/include', '$APU/include'])
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
# zlib
|
|
Packit |
3adb1e |
env.Append(LIBS=['zlib.lib'])
|
|
Packit |
3adb1e |
if not env.get('SOURCE_LAYOUT', None):
|
|
Packit |
3adb1e |
env.Append(CPPPATH=['$ZLIB/include'],
|
|
Packit |
3adb1e |
LIBPATH=['$ZLIB/lib'])
|
|
Packit |
3adb1e |
else:
|
|
Packit |
3adb1e |
env.Append(CPPPATH=['$ZLIB'],
|
|
Packit |
3adb1e |
LIBPATH=['$ZLIB'])
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
# openssl
|
|
Packit |
3adb1e |
env.Append(LIBS=['libeay32.lib', 'ssleay32.lib'])
|
|
Packit |
3adb1e |
if not env.get('SOURCE_LAYOUT', None):
|
|
Packit |
3adb1e |
env.Append(CPPPATH=['$OPENSSL/include/openssl'],
|
|
Packit |
3adb1e |
LIBPATH=['$OPENSSL/lib'])
|
|
Packit |
3adb1e |
elif 0: # opensslstatic:
|
|
Packit |
3adb1e |
env.Append(CPPPATH=['$OPENSSL/inc32'],
|
|
Packit |
3adb1e |
LIBPATH=['$OPENSSL/out32'])
|
|
Packit |
3adb1e |
else:
|
|
Packit |
3adb1e |
env.Append(CPPPATH=['$OPENSSL/inc32'],
|
|
Packit |
3adb1e |
LIBPATH=['$OPENSSL/out32dll'])
|
|
Packit |
3adb1e |
else:
|
|
Packit |
3adb1e |
if os.path.isdir(apr):
|
|
Packit |
3adb1e |
apr = os.path.join(apr, 'bin', 'apr-1-config')
|
|
Packit |
3adb1e |
env['APR'] = apr
|
|
Packit |
3adb1e |
if os.path.isdir(apu):
|
|
Packit |
3adb1e |
apu = os.path.join(apu, 'bin', 'apu-1-config')
|
|
Packit |
3adb1e |
env['APU'] = apu
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
### we should use --cc, but that is giving some scons error about an implict
|
|
Packit |
3adb1e |
### dependency upon gcc. probably ParseConfig doesn't know what to do with
|
|
Packit |
3adb1e |
### the apr-1-config output
|
|
Packit |
3adb1e |
if CALLOUT_OKAY:
|
|
Packit |
3adb1e |
env.ParseConfig('$APR --cflags --cppflags --ldflags --includes'
|
|
Packit |
3adb1e |
' --link-ld --libs')
|
|
Packit |
3adb1e |
env.ParseConfig('$APU --ldflags --includes --link-ld --libs')
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
### there is probably a better way to run/capture output.
|
|
Packit |
3adb1e |
### env.ParseConfig() may be handy for getting this stuff into the build
|
|
Packit |
3adb1e |
if CALLOUT_OKAY:
|
|
Packit |
3adb1e |
apr_libs = os.popen(env.subst('$APR --link-libtool --libs')).read().strip()
|
|
Packit |
3adb1e |
apu_libs = os.popen(env.subst('$APU --link-libtool --libs')).read().strip()
|
|
Packit |
3adb1e |
else:
|
|
Packit |
3adb1e |
apr_libs = ''
|
|
Packit |
3adb1e |
apu_libs = ''
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
env.Append(CPPPATH=['$OPENSSL/include'])
|
|
Packit |
3adb1e |
env.Append(LIBPATH=['$OPENSSL/lib'])
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
# If build with gssapi, get its information and define SERF_HAVE_GSSAPI
|
|
Packit |
3adb1e |
if gssapi and CALLOUT_OKAY:
|
|
Packit |
3adb1e |
env.ParseConfig('$GSSAPI --cflags gssapi')
|
|
Packit |
3adb1e |
def parse_libs(env, cmd, unique=1):
|
|
Packit |
3adb1e |
env['GSSAPI_LIBS'] = cmd.strip()
|
|
Packit |
3adb1e |
return env.MergeFlags(cmd, unique)
|
|
Packit |
3adb1e |
env.ParseConfig('$GSSAPI --libs gssapi', parse_libs)
|
|
Packit |
3adb1e |
env.Append(CPPDEFINES=['SERF_HAVE_GSSAPI'])
|
|
Packit |
3adb1e |
if sys.platform == 'win32':
|
|
Packit |
3adb1e |
env.Append(CPPDEFINES=['SERF_HAVE_SSPI'])
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
# Set up the construction of serf-*.pc
|
|
Packit |
3adb1e |
pkgconfig = env.Textfile('serf-%d.pc' % (MAJOR,),
|
|
Packit |
3adb1e |
env.File('build/serf.pc.in'),
|
|
Packit |
3adb1e |
SUBST_DICT = {
|
|
Packit |
3adb1e |
'@MAJOR@': str(MAJOR),
|
|
Packit |
3adb1e |
'@PREFIX@': '$PREFIX',
|
|
Packit |
3adb1e |
'@LIBDIR@': '$LIBDIR',
|
|
Packit |
3adb1e |
'@INCLUDE_SUBDIR@': 'serf-%d' % (MAJOR,),
|
|
Packit |
3adb1e |
'@VERSION@': '%d.%d.%d' % (MAJOR, MINOR, PATCH),
|
|
Packit |
3adb1e |
'@LIBS@': '%s %s %s -lz' % (apu_libs, apr_libs,
|
|
Packit |
3adb1e |
env.get('GSSAPI_LIBS', '')),
|
|
Packit |
3adb1e |
})
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
env.Default(lib_static, lib_shared, pkgconfig)
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
if CALLOUT_OKAY:
|
|
Packit |
3adb1e |
conf = Configure(env)
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
### some configuration stuffs
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
env = conf.Finish()
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
# INSTALLATION STUFF
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
install_static = env.Install(libdir, lib_static)
|
|
Packit |
3adb1e |
install_shared = env.InstallVersionedLib(libdir, lib_shared)
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
if sys.platform == 'darwin':
|
|
Packit |
3adb1e |
# Change the shared library install name (id) to its final name and location.
|
|
Packit |
3adb1e |
# Notes:
|
|
Packit |
3adb1e |
# If --install-sandbox=<path> is specified, install_shared_path will point
|
|
Packit |
3adb1e |
# to a path in the sandbox. We can't use that path because the sandbox is
|
|
Packit |
3adb1e |
# only a temporary location. The id should be the final target path.
|
|
Packit |
3adb1e |
# Also, we shouldn't use the complete version number for id, as that'll
|
|
Packit |
3adb1e |
# make applications depend on the exact major.minor.patch version of serf.
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
install_shared_path = install_shared[0].abspath
|
|
Packit |
3adb1e |
target_install_shared_path = os.path.join(libdir, '%s.dylib' % LIBNAME)
|
|
Packit |
3adb1e |
env.AddPostAction(install_shared, ('install_name_tool -id %s %s'
|
|
Packit |
3adb1e |
% (target_install_shared_path,
|
|
Packit |
3adb1e |
install_shared_path)))
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
env.Alias('install-lib', [install_static, install_shared,
|
|
Packit |
3adb1e |
])
|
|
Packit |
3adb1e |
env.Alias('install-inc', env.Install(incdir, HEADER_FILES))
|
|
Packit |
3adb1e |
env.Alias('install-pc', env.Install(os.path.join(libdir, 'pkgconfig'),
|
|
Packit |
3adb1e |
pkgconfig))
|
|
Packit |
3adb1e |
env.Alias('install', ['install-lib', 'install-inc', 'install-pc', ])
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
# TESTS
|
|
Packit |
3adb1e |
### make move to a separate scons file in the test/ subdir?
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
tenv = env.Clone()
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
# MockHTTP requires C99 standard, so use it for the test suite.
|
|
Packit |
3adb1e |
cflags = tenv['CFLAGS']
|
|
Packit |
3adb1e |
tenv.Replace(CFLAGS = [f.replace('-std=c89', '-std=c99') for f in cflags])
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
tenv.Append(CPPDEFINES=['MOCKHTTP_OPENSSL'])
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
TEST_PROGRAMS = [ 'serf_get', 'serf_response', 'serf_request', 'serf_spider',
|
|
Packit |
3adb1e |
'test_all', 'serf_bwtp' ]
|
|
Packit |
3adb1e |
if sys.platform == 'win32':
|
|
Packit |
3adb1e |
TEST_EXES = [ os.path.join('test', '%s.exe' % (prog)) for prog in TEST_PROGRAMS ]
|
|
Packit |
3adb1e |
else:
|
|
Packit |
3adb1e |
TEST_EXES = [ os.path.join('test', '%s' % (prog)) for prog in TEST_PROGRAMS ]
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
# Find the (dynamic) library in this directory
|
|
Packit |
3adb1e |
tenv.Prepend(LIBS=[LIBNAMESTATIC, ],
|
|
Packit |
3adb1e |
LIBPATH=[thisdir, ])
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
check_script = env.File('build/check.py').rstr()
|
|
Packit |
3adb1e |
test_dir = env.File('test/test_all.c').rfile().get_dir()
|
|
Packit |
3adb1e |
src_dir = env.File('serf.h').rfile().get_dir()
|
|
Packit |
3adb1e |
test_app = ("%s %s %s %s") % (sys.executable, check_script, test_dir, 'test')
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
# Set the library search path for the test programs
|
|
Packit |
3adb1e |
test_env = {'PATH' : os.environ['PATH'],
|
|
Packit |
3adb1e |
'srcdir' : src_dir}
|
|
Packit |
3adb1e |
if sys.platform != 'win32':
|
|
Packit |
3adb1e |
test_env['LD_LIBRARY_PATH'] = ':'.join(tenv.get('LIBPATH', []))
|
|
Packit |
3adb1e |
env.AlwaysBuild(env.Alias('check', TEST_EXES, test_app, ENV=test_env))
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
testall_files = [
|
|
Packit |
3adb1e |
'test/test_all.c',
|
|
Packit |
3adb1e |
'test/CuTest.c',
|
|
Packit |
3adb1e |
'test/test_util.c',
|
|
Packit |
3adb1e |
'test/test_context.c',
|
|
Packit |
3adb1e |
'test/test_buckets.c',
|
|
Packit |
3adb1e |
'test/test_auth.c',
|
|
Packit |
3adb1e |
'test/mock_buckets.c',
|
|
Packit |
3adb1e |
'test/test_ssl.c',
|
|
Packit |
3adb1e |
'test/server/test_server.c',
|
|
Packit |
3adb1e |
'test/server/test_sslserver.c',
|
|
Packit |
3adb1e |
]
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
for proggie in TEST_EXES:
|
|
Packit |
3adb1e |
if 'test_all' in proggie:
|
|
Packit |
3adb1e |
tenv.Program(proggie, testall_files )
|
|
Packit |
3adb1e |
else:
|
|
Packit |
3adb1e |
tenv.Program(target = proggie, source = [proggie.replace('.exe','') + '.c'])
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
# HANDLE CLEANING
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
if env.GetOption('clean'):
|
|
Packit |
3adb1e |
# When we're cleaning, we want the dependency tree to include "everything"
|
|
Packit |
3adb1e |
# that could be built. Thus, include all of the tests.
|
|
Packit |
3adb1e |
env.Default('check')
|