Fix compilation in Win32 Currently, libgit2 compiles and passes all tests under MinGW, and compiles but fails the test suite on MSVC 2010. 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 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
diff --git a/wscript b/wscript
index 3925ec9..6e82e0e 100644
--- a/wscript
+++ b/wscript
@@ -2,8 +2,10 @@ from waflib.Context import Context
from waflib.Build import BuildContext, CleanContext, \
InstallContext, UninstallContext
-CFLAGS = ["-g", "-O2", "-Wall", "-Wextra"]
-ALL_LIBS = ['z', 'crypto']
+CFLAGS_UNIX = ["-g", "-O2", "-Wall", "-Wextra"]
+CFLAGS_WIN32 = ['/TC', '/W4', '/RTC1', '/Zi', '/nologo']
+
+ALL_LIBS = ['z', 'crypto', 'pthread']
def options(opt):
opt.load('compiler_c')
@@ -15,8 +17,26 @@ def configure(conf):
# default configuration for C programs
conf.load('compiler_c')
+ zlib_name = 'z'
+
+ conf.env.CFLAGS = CFLAGS_UNIX
+
+ if conf.env.DEST_OS == 'win32':
+ conf.env.PLATFORM = 'win32'
+
+ if conf.env.CC_NAME == 'msvc':
+ conf.env.CFLAGS = CFLAGS_WIN32
+ conf.env.DEFINES += ['WIN32', '_DEBUG', '_LIB']
+ zlib_name = 'zdll'
+
+ elif conf.env.CC_NAME == 'gcc':
+ conf.check(features='c cprogram', lib='pthread', uselib_store='pthread')
+
+ else:
+ conf.env.PLATFORM = 'unix'
+
# check for Z lib
- conf.check(features='c cprogram', lib='z', uselib_store='z')
+ conf.check(features='c cprogram', lib=zlib_name, uselib_store='z')
if conf.options.sha1 not in ['openssl', 'ppc', 'builtin']:
ctx.fatal('Invalid SHA1 option')
@@ -24,6 +44,10 @@ def configure(conf):
# check for libcrypto (openssl) if we are using its SHA1 functions
if conf.options.sha1 == 'openssl':
conf.check_cfg(package='libcrypto', args=['--cflags', '--libs'], uselib_store='crypto')
+ conf.env.DEFINES += ['OPENSSL_SHA1']
+
+ elif conf.options.sha1 == 'ppc':
+ conf.env.DEFINES += ['PPC_SHA1']
conf.env.sha1 = conf.options.sha1
@@ -48,70 +72,21 @@ def build(bld):
Options.commands = [bld.cmd + '-shared', bld.cmd + '-static'] + Options.commands
def build_library(bld, lib_str):
- import sys
-
directory = bld.path
- #------------------------------
- # Default values
- #------------------------------
-
sources = directory.ant_glob('src/*.c')
- flags = CFLAGS
- defines = []
- visibility = True
- os = 'unix'
-
-
- #------------------------------
- # OS-dependant configuration
- #------------------------------
-
- # Windows 32 (MSVC) platform configuration
- if sys.platform == 'win32':
- # windows configuration
- flags = flags + ['-TC', '-W4', '-RTC1', '-Zi']
- defines = defines = ['WIN32', '_DEBUG', '_LIB']
- visibility = False
- os = 'win32'
-
- # Windows 32 Cygwin configuration
- # (assume a POSIX-compilant system)
- elif sys.platform == 'cygwin':
- visibility = False
-
- # Windows 32 MinGW configuration (TODO)
- elif sys.platform == 'mingw':
- pass
# Compile platform-dependant code
# E.g. src/unix/*.c
# src/win32/*.c
- sources = sources + directory.ant_glob('src/%s/*.c' % os)
+ sources = sources + directory.ant_glob('src/%s/*.c' % bld.env.PLATFORM)
- # Disable visibility on W32 platform
- if not visibility:
- flags.append('-fvisibility=hidden')
-
-
- #------------------------------
- # SHA1 Methods Source
- #------------------------------
-
- # OpenSSL library
- if bld.env.sha1 == "openssl":
- defines.append('OPENSSL_SHA1')
-
- # builtin PPC methods
- elif bld.env.sha1 == "ppc":
- defines.append('PPC_SHA1')
+ # SHA1 methods source
+ if bld.env.sha1 == "ppc":
sources.append('src/ppc/sha1.c')
-
- # default builtins
else:
sources.append('src/block-sha1/sha1.c')
-
#------------------------------
# Build the main library
#------------------------------
@@ -121,16 +96,12 @@ def build_library(bld, lib_str):
source=sources,
target='git2',
includes='src',
- cflags=flags,
- defines=defines,
install_path='${LIBDIR}',
- use=ALL_LIBS # link with all the libs we know (z, openssl);
- # this is ignored for static builds
- # and for libraries which have been disabled
+ use=ALL_LIBS #if lib_str == 'cshlib' else []
)
# On Unix systems, build the Pkg-config entry file
- if os == 'unix':
+ if bld.env.PLATFORM == 'unix':
bld(rule="""sed -e 's#@prefix@#$(prefix)#' -e 's#@libdir@#$(libdir)#' < ${SRC} > ${TGT}""",
source='libgit2.pc.in',
target='libgit2.pc',
@@ -171,7 +142,7 @@ def build_tests(bld):
includes=['src', 'tests'],
defines=['TEST_TOC="%s.toc"' % test_name],
stlib=['git2'], # link with the git2 static lib we've just compiled'
- stlibpath=directory.find_node('build/static/').abspath(),
+ stlibpath=[directory.find_node('build/static/').abspath(), directory.abspath()],
use=['test_helper'] + ALL_LIBS # link with all the libs we know
# libraries which are not enabled won't link
)
@@ -191,17 +162,22 @@ class _run_tests(Context):
fun = 'run_tests'
def run_tests(ctx):
- test_folder = ctx.path.make_node('tests/tmp/')
+ import shutil
- for test in ctx.path.ant_glob('build/tests/t????-*'):
- test_folder.delete()
- test_folder.mkdir()
+ failed = False
+ test_folder = ctx.path.make_node('tests/tmp/')
+ test_folder.mkdir()
+ test_glob = 'build/tests/t????-*'
+ for test in ctx.path.ant_glob(test_glob, excl='build/tests/*.manifest'):
if ctx.exec_command(test.abspath(), cwd=test_folder.abspath()) != 0:
- ctx.fatal('Test run failed')
+ failed = True
break
- test_folder.delete()
+ shutil.rmtree(test_folder.abspath())
+
+ if failed:
+ ctx.fatal('Test run failed')
CONTEXTS = {