1253893Speter# -*- python -*-
2253893Speter#
3362181Sdim# ====================================================================
4362181Sdim#    Licensed to the Apache Software Foundation (ASF) under one
5362181Sdim#    or more contributor license agreements.  See the NOTICE file
6362181Sdim#    distributed with this work for additional information
7362181Sdim#    regarding copyright ownership.  The ASF licenses this file
8362181Sdim#    to you under the Apache License, Version 2.0 (the
9362181Sdim#    "License"); you may not use this file except in compliance
10362181Sdim#    with the License.  You may obtain a copy of the License at
11362181Sdim# 
12362181Sdim#      http://www.apache.org/licenses/LICENSE-2.0
13362181Sdim# 
14362181Sdim#    Unless required by applicable law or agreed to in writing,
15362181Sdim#    software distributed under the License is distributed on an
16362181Sdim#    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17362181Sdim#    KIND, either express or implied.  See the License for the
18362181Sdim#    specific language governing permissions and limitations
19362181Sdim#    under the License.
20362181Sdim# ====================================================================
21253893Speter#
22253893Speter
23253893Speterimport sys
24253893Speterimport os
25253893Speterimport re
26253893Speter
27262324SpeterEnsureSConsVersion(2,3,0)
28262324Speter
29253893SpeterHEADER_FILES = ['serf.h',
30253893Speter                'serf_bucket_types.h',
31253893Speter                'serf_bucket_util.h',
32253893Speter                ]
33253893Speter
34253893Speter# where we save the configuration variables
35253893SpeterSAVED_CONFIG = '.saved_config'
36253893Speter
37253893Speter# Variable class that does no validation on the input
38253893Speterdef _converter(val):
39253893Speter    """
40253893Speter    """
41253893Speter    if val == 'none':
42253893Speter      val = []
43253893Speter    else:
44262324Speter      val = val.split(' ')
45253893Speter    return val
46253893Speter
47253893Speterdef RawListVariable(key, help, default):
48253893Speter    """
49253893Speter    The input parameters describe a 'raw string list' option. This class
50262324Speter    accepts a space-separated string and converts it to a list.
51253893Speter    """
52253893Speter    return (key, '%s' % (help), default, None, lambda val: _converter(val))
53253893Speter
54262324Speter# Custom path validator, creates directory when a specified option is set.
55262324Speter# To be used to ensure a PREFIX directory is only created when installing.
56262324Speterdef createPathIsDirCreateWithTarget(target):
57262324Speter  def my_validator(key, val, env):
58262324Speter    build_targets = (map(str, BUILD_TARGETS))
59262324Speter    if target in build_targets:
60262324Speter      return PathVariable.PathIsDirCreate(key, val, env)
61262324Speter    else:
62262324Speter      return PathVariable.PathAccept(key, val, env)
63262324Speter  return my_validator
64262324Speter
65253893Speter# default directories
66253893Speterif sys.platform == 'win32':
67262324Speter  default_incdir='..'
68253893Speter  default_libdir='..'
69253893Speter  default_prefix='Debug'
70253893Speterelse:
71262324Speter  default_incdir='/usr'
72262324Speter  default_libdir='$PREFIX/lib'
73253893Speter  default_prefix='/usr/local'
74253893Speter
75253893Speteropts = Variables(files=[SAVED_CONFIG])
76253893Speteropts.AddVariables(
77253893Speter  PathVariable('PREFIX',
78253893Speter               'Directory to install under',
79253893Speter               default_prefix,
80262324Speter               createPathIsDirCreateWithTarget('install')),
81262324Speter  PathVariable('LIBDIR',
82262324Speter               'Directory to install architecture dependent libraries under',
83262324Speter               default_libdir,
84262324Speter               createPathIsDirCreateWithTarget('install')),
85253893Speter  PathVariable('APR',
86253893Speter               "Path to apr-1-config, or to APR's install area",
87262324Speter               default_incdir,
88253893Speter               PathVariable.PathAccept),
89253893Speter  PathVariable('APU',
90253893Speter               "Path to apu-1-config, or to APR's install area",
91262324Speter               default_incdir,
92253893Speter               PathVariable.PathAccept),
93253893Speter  PathVariable('OPENSSL',
94253893Speter               "Path to OpenSSL's install area",
95262324Speter               default_incdir,
96253893Speter               PathVariable.PathIsDir),
97253893Speter  PathVariable('ZLIB',
98253893Speter               "Path to zlib's install area",
99262324Speter               default_incdir,
100253893Speter               PathVariable.PathIsDir),
101253893Speter  PathVariable('GSSAPI',
102253893Speter               "Path to GSSAPI's install area",
103253893Speter               None,
104253893Speter               None),
105253893Speter  BoolVariable('DEBUG',
106253893Speter               "Enable debugging info and strict compile warnings",
107253893Speter               False),
108253893Speter  BoolVariable('APR_STATIC',
109253893Speter               "Enable using a static compiled APR",
110253893Speter               False),
111253893Speter  RawListVariable('CC', "Command name or path of the C compiler", None),
112262324Speter  RawListVariable('CFLAGS', "Extra flags for the C compiler (space-separated)",
113253893Speter                  None),
114253893Speter  RawListVariable('LIBS', "Extra libraries passed to the linker, "
115262324Speter                  "e.g. \"-l<library1> -l<library2>\" (space separated)", None),
116262324Speter  RawListVariable('LINKFLAGS', "Extra flags for the linker (space-separated)",
117253893Speter                  None),
118253893Speter  RawListVariable('CPPFLAGS', "Extra flags for the C preprocessor "
119262324Speter                  "(space separated)", None), 
120253893Speter  )
121253893Speter
122253893Speterif sys.platform == 'win32':
123253893Speter  opts.AddVariables(
124253893Speter    # By default SCons builds for the host platform on Windows, when using
125253893Speter    # a supported compiler (E.g. VS2010/VS2012). Allow overriding
126253893Speter
127253893Speter    # Note that Scons 1.3 only supports this on Windows and only when
128253893Speter    # constructing Environment(). Later changes to TARGET_ARCH are ignored
129253893Speter    EnumVariable('TARGET_ARCH',
130253893Speter                 "Platform to build for (x86|x64|win32|x86_64)",
131253893Speter                 'x86',
132253893Speter                 allowed_values=('x86', 'x86_64', 'ia64'),
133253893Speter                 map={'X86'  : 'x86',
134253893Speter                      'win32': 'x86',
135253893Speter                      'Win32': 'x86',
136253893Speter                      'x64'  : 'x86_64',
137253893Speter                      'X64'  : 'x86_64'
138253893Speter                     }),
139253893Speter
140253893Speter    EnumVariable('MSVC_VERSION',
141253893Speter                 "Visual C++ to use for building (E.g. 11.0, 9.0)",
142253893Speter                 None,
143362181Sdim                 allowed_values=('14.0', '12.0',
144362181Sdim                                 '11.0', '10.0', '9.0', '8.0', '6.0')
145253893Speter                ),
146253893Speter
147253893Speter    # We always documented that we handle an install layout, but in fact we
148253893Speter    # hardcoded source layouts. Allow disabling this behavior.
149253893Speter    # ### Fix default?
150253893Speter    BoolVariable('SOURCE_LAYOUT',
151253893Speter                 "Assume a source layout instead of install layout",
152253893Speter                 True),
153253893Speter    )
154253893Speter
155253893Speterenv = Environment(variables=opts,
156253893Speter                  tools=('default', 'textfile',),
157253893Speter                  CPPPATH=['.', ],
158253893Speter                  )
159253893Speter
160253893Speterenv.Append(BUILDERS = {
161253893Speter    'GenDef' : 
162253893Speter      Builder(action = sys.executable + ' build/gen_def.py $SOURCES > $TARGET',
163253893Speter              suffix='.def', src_suffix='.h')
164253893Speter  })
165253893Speter
166253893Spetermatch = re.search('SERF_MAJOR_VERSION ([0-9]+).*'
167253893Speter                  'SERF_MINOR_VERSION ([0-9]+).*'
168253893Speter                  'SERF_PATCH_VERSION ([0-9]+)',
169253893Speter                  env.File('serf.h').get_contents(),
170253893Speter                  re.DOTALL)
171253893SpeterMAJOR, MINOR, PATCH = [int(x) for x in match.groups()]
172253893Speterenv.Append(MAJOR=str(MAJOR))
173262324Speterenv.Append(MINOR=str(MINOR))
174262324Speterenv.Append(PATCH=str(PATCH))
175253893Speter
176253893Speter# Calling external programs is okay if we're not cleaning or printing help.
177253893Speter# (cleaning: no sense in fetching information; help: we may not know where
178253893Speter# they are)
179253893SpeterCALLOUT_OKAY = not (env.GetOption('clean') or env.GetOption('help'))
180253893Speter
181253893Speter
182253893Speter# HANDLING OF OPTION VARIABLES
183253893Speter
184253893Speterunknown = opts.UnknownVariables()
185253893Speterif unknown:
186362181Sdim  print 'Warning: Used unknown variables:', ', '.join(unknown.keys())
187253893Speter
188253893Speterapr = str(env['APR'])
189253893Speterapu = str(env['APU'])
190253893Speterzlib = str(env['ZLIB'])
191253893Spetergssapi = env.get('GSSAPI', None)
192253893Speter
193253893Speterif gssapi and os.path.isdir(gssapi):
194253893Speter  krb5_config = os.path.join(gssapi, 'bin', 'krb5-config')
195253893Speter  if os.path.isfile(krb5_config):
196253893Speter    gssapi = krb5_config
197253893Speter    env['GSSAPI'] = krb5_config
198253893Speter
199253893Speterdebug = env.get('DEBUG', None)
200253893Speteraprstatic = env.get('APR_STATIC', None)
201253893Speter
202253893SpeterHelp(opts.GenerateHelpText(env))
203253893Speteropts.Save(SAVED_CONFIG, env)
204253893Speter
205253893Speter
206253893Speter# PLATFORM-SPECIFIC BUILD TWEAKS
207253893Speter
208253893Speterthisdir = os.getcwd()
209262324Speterlibdir = '$LIBDIR'
210253893Speterincdir = '$PREFIX/include/serf-$MAJOR'
211253893Speter
212262324Speter# This version string is used in the dynamic library name, and for Mac OS X also
213262324Speter# for the current_version and compatibility_version options in the .dylib
214262324Speter#
215262324Speter# Unfortunately we can't set the .dylib compatibility_version option separately
216262324Speter# from current_version, so don't use the PATCH level to avoid that build and
217262324Speter# runtime patch levels have to be identical.
218362181Sdimif sys.platform != 'sunos5':
219362181Sdim  env['SHLIBVERSION'] = '%d.%d.%d' % (MAJOR, MINOR, 0)
220262324Speter
221262324SpeterLIBNAME = 'libserf-%d' % (MAJOR,)
222253893Speterif sys.platform != 'win32':
223253893Speter  LIBNAMESTATIC = LIBNAME
224253893Speterelse:
225253893Speter  LIBNAMESTATIC = 'serf-${MAJOR}'
226253893Speter
227253893Speterenv.Append(RPATH=libdir,
228253893Speter           PDB='${TARGET.filebase}.pdb')
229253893Speter
230253893Speterif sys.platform == 'darwin':
231253893Speter#  linkflags.append('-Wl,-install_name,@executable_path/%s.dylib' % (LIBNAME,))
232362181Sdim  env.Append(LINKFLAGS=['-Wl,-install_name,%s/%s.dylib' % (thisdir, LIBNAME,)])
233253893Speter
234253893Speterif sys.platform != 'win32':
235362181Sdim  def CheckGnuCC(context):
236362181Sdim    src = '''
237362181Sdim    #ifndef __GNUC__
238362181Sdim    oh noes!
239362181Sdim    #endif
240362181Sdim    '''
241362181Sdim    context.Message('Checking for GNU-compatible C compiler...')
242362181Sdim    result = context.TryCompile(src, '.c')
243362181Sdim    context.Result(result)
244362181Sdim    return result
245253893Speter
246362181Sdim  conf = Configure(env, custom_tests = dict(CheckGnuCC=CheckGnuCC))
247362181Sdim  have_gcc = conf.CheckGnuCC()
248362181Sdim  env = conf.Finish()
249362181Sdim
250362181Sdim  if have_gcc:
251362181Sdim    env.Append(CFLAGS=['-std=c89'])
252262324Speter    env.Append(CCFLAGS=['-Wdeclaration-after-statement',
253262324Speter                        '-Wmissing-prototypes',
254262324Speter                        '-Wall'])
255253893Speter
256253893Speter  if debug:
257362181Sdim    env.Append(CCFLAGS=['-g'])
258253893Speter    env.Append(CPPDEFINES=['DEBUG', '_DEBUG'])
259253893Speter  else:
260362181Sdim    env.Append(CCFLAGS=['-O2'])
261362181Sdim    env.Append(CPPDEFINES=['NDEBUG'])
262253893Speter
263253893Speter  ### works for Mac OS. probably needs to change
264253893Speter  env.Append(LIBS=['ssl', 'crypto', 'z', ])
265253893Speter
266253893Speter  if sys.platform == 'sunos5':
267362181Sdim    env.Append(LIBS=['m'])
268362181Sdim    env.Append(PLATFORM='posix')
269253893Speterelse:
270253893Speter  # Warning level 4, no unused argument warnings
271253893Speter  env.Append(CCFLAGS=['/W4', '/wd4100'])
272253893Speter
273253893Speter  # Choose runtime and optimization
274253893Speter  if debug:
275253893Speter    # Disable optimizations for debugging, use debug DLL runtime
276253893Speter    env.Append(CCFLAGS=['/Od', '/MDd'])
277253893Speter    env.Append(CPPDEFINES=['DEBUG', '_DEBUG'])
278253893Speter  else:
279253893Speter    # Optimize for speed, use DLL runtime
280253893Speter    env.Append(CCFLAGS=['/O2', '/MD'])
281362181Sdim    env.Append(CPPDEFINES=['NDEBUG'])
282362181Sdim    env.Append(LINKFLAGS=['/RELEASE'])
283253893Speter
284253893Speter# PLAN THE BUILD
285253893SpeterSHARED_SOURCES = []
286253893Speterif sys.platform == 'win32':
287253893Speter  env.GenDef(['serf.h','serf_bucket_types.h', 'serf_bucket_util.h'])
288253893Speter  SHARED_SOURCES.append(['serf.def'])
289253893Speter
290253893SpeterSOURCES = Glob('*.c') + Glob('buckets/*.c') + Glob('auth/*.c')
291253893Speter
292253893Speterlib_static = env.StaticLibrary(LIBNAMESTATIC, SOURCES)
293253893Speterlib_shared = env.SharedLibrary(LIBNAME, SOURCES + SHARED_SOURCES)
294253893Speter
295253893Speterif aprstatic:
296253893Speter  env.Append(CPPDEFINES=['APR_DECLARE_STATIC', 'APU_DECLARE_STATIC'])
297253893Speter
298253893Speterif sys.platform == 'win32':
299253893Speter  env.Append(LIBS=['user32.lib', 'advapi32.lib', 'gdi32.lib', 'ws2_32.lib',
300253893Speter                   'crypt32.lib', 'mswsock.lib', 'rpcrt4.lib', 'secur32.lib'])
301253893Speter
302253893Speter  # Get apr/apu information into our build
303253893Speter  env.Append(CPPDEFINES=['WIN32','WIN32_LEAN_AND_MEAN','NOUSER',
304253893Speter                         'NOGDI', 'NONLS','NOCRYPT'])
305253893Speter
306253893Speter  if env.get('TARGET_ARCH', None) == 'x86_64':
307253893Speter    env.Append(CPPDEFINES=['WIN64'])
308253893Speter
309253893Speter  if aprstatic:
310253893Speter    apr_libs='apr-1.lib'
311253893Speter    apu_libs='aprutil-1.lib'
312362181Sdim    env.Append(LIBS=['shell32.lib', 'xml.lib'])
313253893Speter  else:
314253893Speter    apr_libs='libapr-1.lib'
315253893Speter    apu_libs='libaprutil-1.lib'
316253893Speter
317253893Speter  env.Append(LIBS=[apr_libs, apu_libs])
318253893Speter  if not env.get('SOURCE_LAYOUT', None):
319253893Speter    env.Append(LIBPATH=['$APR/lib', '$APU/lib'],
320253893Speter               CPPPATH=['$APR/include/apr-1', '$APU/include/apr-1'])
321253893Speter  elif aprstatic:
322253893Speter    env.Append(LIBPATH=['$APR/LibR','$APU/LibR'],
323253893Speter               CPPPATH=['$APR/include', '$APU/include'])
324253893Speter  else:
325253893Speter    env.Append(LIBPATH=['$APR/Release','$APU/Release'],
326253893Speter               CPPPATH=['$APR/include', '$APU/include'])
327253893Speter
328253893Speter  # zlib
329362181Sdim  env.Append(LIBS=['zlib.lib'])
330253893Speter  if not env.get('SOURCE_LAYOUT', None):
331362181Sdim    env.Append(CPPPATH=['$ZLIB/include'],
332362181Sdim               LIBPATH=['$ZLIB/lib'])
333253893Speter  else:
334362181Sdim    env.Append(CPPPATH=['$ZLIB'],
335362181Sdim               LIBPATH=['$ZLIB'])
336253893Speter
337253893Speter  # openssl
338253893Speter  env.Append(LIBS=['libeay32.lib', 'ssleay32.lib'])
339253893Speter  if not env.get('SOURCE_LAYOUT', None):
340362181Sdim    env.Append(CPPPATH=['$OPENSSL/include/openssl'],
341362181Sdim               LIBPATH=['$OPENSSL/lib'])
342253893Speter  elif 0: # opensslstatic:
343362181Sdim    env.Append(CPPPATH=['$OPENSSL/inc32'],
344362181Sdim               LIBPATH=['$OPENSSL/out32'])
345253893Speter  else:
346362181Sdim    env.Append(CPPPATH=['$OPENSSL/inc32'],
347362181Sdim               LIBPATH=['$OPENSSL/out32dll'])
348253893Speterelse:
349253893Speter  if os.path.isdir(apr):
350253893Speter    apr = os.path.join(apr, 'bin', 'apr-1-config')
351253893Speter    env['APR'] = apr
352253893Speter  if os.path.isdir(apu):
353253893Speter    apu = os.path.join(apu, 'bin', 'apu-1-config')
354253893Speter    env['APU'] = apu
355253893Speter
356253893Speter  ### we should use --cc, but that is giving some scons error about an implict
357253893Speter  ### dependency upon gcc. probably ParseConfig doesn't know what to do with
358253893Speter  ### the apr-1-config output
359253893Speter  if CALLOUT_OKAY:
360253893Speter    env.ParseConfig('$APR --cflags --cppflags --ldflags --includes'
361253893Speter                    ' --link-ld --libs')
362253893Speter    env.ParseConfig('$APU --ldflags --includes --link-ld --libs')
363253893Speter
364253893Speter  ### there is probably a better way to run/capture output.
365253893Speter  ### env.ParseConfig() may be handy for getting this stuff into the build
366253893Speter  if CALLOUT_OKAY:
367253893Speter    apr_libs = os.popen(env.subst('$APR --link-libtool --libs')).read().strip()
368253893Speter    apu_libs = os.popen(env.subst('$APU --link-libtool --libs')).read().strip()
369253893Speter  else:
370253893Speter    apr_libs = ''
371253893Speter    apu_libs = ''
372253893Speter
373362181Sdim  env.Append(CPPPATH=['$OPENSSL/include'])
374362181Sdim  env.Append(LIBPATH=['$OPENSSL/lib'])
375253893Speter
376253893Speter
377253893Speter# If build with gssapi, get its information and define SERF_HAVE_GSSAPI
378253893Speterif gssapi and CALLOUT_OKAY:
379262324Speter    env.ParseConfig('$GSSAPI --cflags gssapi')
380262324Speter    def parse_libs(env, cmd, unique=1):
381262324Speter        env['GSSAPI_LIBS'] = cmd.strip()
382262324Speter        return env.MergeFlags(cmd, unique)
383262324Speter    env.ParseConfig('$GSSAPI --libs gssapi', parse_libs)
384362181Sdim    env.Append(CPPDEFINES=['SERF_HAVE_GSSAPI'])
385253893Speterif sys.platform == 'win32':
386253893Speter  env.Append(CPPDEFINES=['SERF_HAVE_SSPI'])
387253893Speter
388262324Speter# On some systems, the -R values that APR describes never make it into actual
389253893Speter# RPATH flags. We'll manually map all directories in LIBPATH into new
390253893Speter# flags to set RPATH values.
391262324Speterfor d in env['LIBPATH']:
392262324Speter  env.Append(RPATH=':'+d)
393253893Speter
394253893Speter# Set up the construction of serf-*.pc
395253893Speterpkgconfig = env.Textfile('serf-%d.pc' % (MAJOR,),
396253893Speter                         env.File('build/serf.pc.in'),
397253893Speter                         SUBST_DICT = {
398253893Speter                           '@MAJOR@': str(MAJOR),
399253893Speter                           '@PREFIX@': '$PREFIX',
400262324Speter                           '@LIBDIR@': '$LIBDIR',
401253893Speter                           '@INCLUDE_SUBDIR@': 'serf-%d' % (MAJOR,),
402253893Speter                           '@VERSION@': '%d.%d.%d' % (MAJOR, MINOR, PATCH),
403262324Speter                           '@LIBS@': '%s %s %s -lz' % (apu_libs, apr_libs,
404262324Speter                                                       env.get('GSSAPI_LIBS', '')),
405253893Speter                           })
406253893Speter
407253893Speterenv.Default(lib_static, lib_shared, pkgconfig)
408253893Speter
409253893Speterif CALLOUT_OKAY:
410253893Speter  conf = Configure(env)
411253893Speter
412253893Speter  ### some configuration stuffs
413253893Speter
414253893Speter  env = conf.Finish()
415253893Speter
416253893Speter
417253893Speter# INSTALLATION STUFF
418253893Speter
419253893Speterinstall_static = env.Install(libdir, lib_static)
420262324Speterinstall_shared = env.InstallVersionedLib(libdir, lib_shared)
421253893Speter
422253893Speterif sys.platform == 'darwin':
423262324Speter  # Change the shared library install name (id) to its final name and location.
424262324Speter  # Notes:
425262324Speter  # If --install-sandbox=<path> is specified, install_shared_path will point
426262324Speter  # to a path in the sandbox. We can't use that path because the sandbox is
427262324Speter  # only a temporary location. The id should be the final target path.
428262324Speter  # Also, we shouldn't use the complete version number for id, as that'll
429262324Speter  # make applications depend on the exact major.minor.patch version of serf.
430262324Speter
431253893Speter  install_shared_path = install_shared[0].abspath
432262324Speter  target_install_shared_path = os.path.join(libdir, '%s.dylib' % LIBNAME)
433253893Speter  env.AddPostAction(install_shared, ('install_name_tool -id %s %s'
434262324Speter                                     % (target_install_shared_path,
435253893Speter                                        install_shared_path)))
436253893Speter
437253893Speterenv.Alias('install-lib', [install_static, install_shared,
438253893Speter                          ])
439253893Speterenv.Alias('install-inc', env.Install(incdir, HEADER_FILES))
440253893Speterenv.Alias('install-pc', env.Install(os.path.join(libdir, 'pkgconfig'),
441253893Speter                                    pkgconfig))
442253893Speterenv.Alias('install', ['install-lib', 'install-inc', 'install-pc', ])
443253893Speter
444253893Speter
445253893Speter# TESTS
446253893Speter### make move to a separate scons file in the test/ subdir?
447253893Speter
448253893Spetertenv = env.Clone()
449253893Speter
450362181Sdim# MockHTTP requires C99 standard, so use it for the test suite.
451362181Sdimcflags = tenv['CFLAGS']
452362181Sdimtenv.Replace(CFLAGS = [f.replace('-std=c89', '-std=c99') for f in cflags])
453362181Sdim
454362181Sdimtenv.Append(CPPDEFINES=['MOCKHTTP_OPENSSL'])
455362181Sdim
456253893SpeterTEST_PROGRAMS = [ 'serf_get', 'serf_response', 'serf_request', 'serf_spider',
457253893Speter                  'test_all', 'serf_bwtp' ]
458253893Speterif sys.platform == 'win32':
459253893Speter  TEST_EXES = [ os.path.join('test', '%s.exe' % (prog)) for prog in TEST_PROGRAMS ]
460253893Speterelse:
461253893Speter  TEST_EXES = [ os.path.join('test', '%s' % (prog)) for prog in TEST_PROGRAMS ]
462253893Speter
463253893Speter# Find the (dynamic) library in this directory
464253893Spetertenv.Replace(RPATH=thisdir)
465253893Spetertenv.Prepend(LIBS=[LIBNAMESTATIC, ],
466253893Speter             LIBPATH=[thisdir, ])
467253893Speter
468362181Sdimcheck_script = env.File('build/check.py').rstr()
469362181Sdimtest_dir = env.File('test/test_all.c').rfile().get_dir()
470362181Sdimsrc_dir = env.File('serf.h').rfile().get_dir()
471362181Sdimtest_app = ("%s %s %s %s") % (sys.executable, check_script, test_dir, 'test')
472362181Sdim
473362181Sdim# Set the library search path for the test programs
474362181Sdimtest_env = {'PATH' : os.environ['PATH'],
475362181Sdim            'srcdir' : src_dir}
476362181Sdimif sys.platform != 'win32':
477362181Sdim  test_env['LD_LIBRARY_PATH'] = ':'.join(tenv.get('LIBPATH', []))
478362181Sdimenv.AlwaysBuild(env.Alias('check', TEST_EXES, test_app, ENV=test_env))
479362181Sdim
480253893Spetertestall_files = [
481253893Speter        'test/test_all.c',
482253893Speter        'test/CuTest.c',
483253893Speter        'test/test_util.c',
484253893Speter        'test/test_context.c',
485253893Speter        'test/test_buckets.c',
486253893Speter        'test/test_auth.c',
487253893Speter        'test/mock_buckets.c',
488253893Speter        'test/test_ssl.c',
489253893Speter        'test/server/test_server.c',
490253893Speter        'test/server/test_sslserver.c',
491253893Speter        ]
492253893Speter
493253893Speterfor proggie in TEST_EXES:
494253893Speter  if 'test_all' in proggie:
495253893Speter    tenv.Program(proggie, testall_files )
496253893Speter  else:
497253893Speter    tenv.Program(target = proggie, source = [proggie.replace('.exe','') + '.c'])
498253893Speter
499253893Speter
500253893Speter# HANDLE CLEANING
501253893Speter
502253893Speterif env.GetOption('clean'):
503253893Speter  # When we're cleaning, we want the dependency tree to include "everything"
504253893Speter  # that could be built. Thus, include all of the tests.
505253893Speter  env.Default('check')
506