Hash :
b2898c45
Author :
Date :
2010-11-21T02:59:53
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
from waflib.Context import Context
from waflib.Build import BuildContext, CleanContext, \
InstallContext, UninstallContext
CFLAGS = ["-g", "-O2", "-Wall", "-Wextra"]
def options(opt):
opt.load('compiler_c')
opt.add_option('--sha1', action='store', default='builtin',
help="Use the builtin SHA1 routines (--sha1=builtin), the\
PPC optimized version (--sha1=ppc) or the SHA1 functions from OpenSSH (--sha1=openssh)")
def configure(conf):
conf.load('compiler_c')
if conf.options.sha1 not in ['openssh', 'ppc', 'builtin']:
ctx.fatal('Invalid SHA1 option')
conf.env.sha1 = conf.options.sha1
def build(bld):
import sys
libs = { 'static' : 'cstlib', 'shared' : 'cshlib' }
if bld.variant not in libs:
from waflib import Options
Options.commands = [bld.cmd + '-shared', bld.cmd + '-static'] + Options.commands
return
directory = bld.path
sources = directory.ant_glob('src/*.c')
flags = CFLAGS
defines = []
visibility = True
os = 'unix'
if sys.platform == 'win32':
# windows configuration
flags = flags + ['-TC', '-W4', '-RTC1', '-Zi']
defines = defines = ['WIN32', '_DEBUG', '_LIB']
visibility = False
os = 'win32'
elif sys.platform == 'cygwin':
visibility = False
elif sys.platform == 'mingw': # TODO
pass
if bld.env.sha1 == "openssh":
defines.append('OPENSSL_SHA1')
elif bld.env.sha1 == "ppc":
defines.append('PPC_SHA1')
sources.append('src/ppc/sha1.c')
else:
sources.append('src/block-sha1/sha1.c')
if not visibility:
flags.append('-fvisibility=hidden')
sources = sources + directory.ant_glob('src/%s/*.c' % os)
bld(features='c ' + libs[bld.variant],
source=sources,
target='git2',
includes='src',
cflags=flags,
defines=defines,
inst_to='${LIBDIR}'
)
bld.install_files('${PREFIX}/include/git', directory.ant_glob('src/git/*.h'))
if os == "unix":
bld.install_files('${PREFIX}/lib/pkgconfig', 'libgit2.pc')
class _test(BuildContext):
cmd = 'test'
fun = 'test'
def test(bld):
from waflib import Options
Options.commands = ['build-static', 'build-tests', 'run-tests'] + Options.commands
class _build_tests(BuildContext):
cmd = 'build-tests'
fun = 'build_tests'
variant = 'tests'
def build_tests(bld):
import os
directory = bld.path
bld.objects(source=['tests/test_helpers.c', 'tests/test_lib.c'], includes=['src', 'tests'], target='test_helper')
for test_file in directory.ant_glob('tests/t????-*.c'):
test_name, _ = os.path.splitext(os.path.basename(test_file.abspath()))
test_toc_file = directory.make_node('tests/%s.toc' % test_name)
if bld.cmd == 'clean':
test_toc_file.delete()
else:
test_toc = bld.cmd_and_log(['grep', 'BEGIN_TEST', test_file.abspath()], quiet=True)
test_toc_file.write(test_toc)
bld.program(
source=[test_file, 'tests/test_main.c'],
target=test_name,
includes=['src', 'tests'],
defines=['TEST_TOC="%s.toc"' % test_name],
stlib=['git2', 'z'],
stlibpath=[directory.abspath(), 'build'],
use='test_helper')
class _run_tests(Context):
cmd = 'run-tests'
fun = 'run_tests'
def run_tests(ctx):
test_folder = ctx.path.make_node('tests/tmp/')
for test in ctx.path.ant_glob('build/tests/t????-*'):
test_folder.delete()
test_folder.mkdir()
if ctx.exec_command(test.abspath(), cwd=test_folder.abspath()) != 0:
ctx.fatal('Test run failed')
break
test_folder.delete()
for var in ('static', 'shared'):
for ctx in (BuildContext, CleanContext, InstallContext, UninstallContext):
name = ctx.__name__.replace('Context', '').lower()
class _genclass(ctx):
cmd = name + '-' + var
variant = var