Add more features to the build system - Windows 32 compilation - Test system - Shared and static libraries Signed-off-by: Vicent Marti <tanoku@gmail.com>
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
diff --git a/waf b/waf
index ff85ad3..18b9aa3 100755
Binary files a/waf and b/waf differ
diff --git a/wscript b/wscript
index 0e514c8..0cc14d4 100644
--- a/wscript
+++ b/wscript
@@ -1,8 +1,14 @@
+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='TODO')
+ 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')
@@ -12,11 +18,19 @@ def configure(conf):
conf.env.sha1 = conf.options.sha1
-
def build(bld):
- import glob, sys
+ import sys
+
+ libs = { 'static' : 'cstlib', 'shared' : 'cshlib' }
- sources = glob.glob('src/*.c')
+ 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
@@ -48,23 +62,81 @@ def build(bld):
if not visibility:
flags.append('-fvisibility=hidden')
- sources = sources + glob.glob('src/%s/*.c' % os)
+ sources = sources + directory.ant_glob('src/%s/*.c' % os)
- bld.stlib(
+ bld(features='c ' + libs[bld.variant],
source=sources,
target='git2',
includes='src',
cflags=flags,
- defines=defines
+ defines=defines,
+ inst_to='${LIBDIR}'
)
- bld.shlib(
- source=sources,
- target='git2',
- includes='src',
- cflags=flags,
- defines=defines
- )
+ 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()
- bld.install_files('${PREFIX}/include/git', glob.glob('src/git/*.h'))
+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