Blame SConstruct

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')