Procházet zdrojové kódy

improvements in building dependent libraries for Windows

In preparation for additional libraries being downloaded/compiled, a helper
function download_tarball was added and the downloading/extraction process
was made more robust in the build script.
Ashish Kulkarni před 11 roky
rodič
revize
3c0caee72e
1 změnil soubory, kde provedl 34 přidání a 21 odebrání
  1. 34 21
      scripts/build.py

+ 34 - 21
scripts/build.py

@@ -293,7 +293,7 @@ def shell(cmd):
 def get_output(*cmd):
     try:
         return subprocess.check_output(cmd, stderr=subprocess.STDOUT).strip()
-    except subprocess.CalledProcessError:
+    except:
         return None
 
 def rmdir(path):
@@ -330,15 +330,15 @@ def qt_config(key, *opts):
             output.remove(arg[1+arg.index(':'):])
     return ' '.join(output)
 
-def download_file(url, dir, sha1):
+def download_file(url, sha1, dir):
     name = url.split('/')[-1]
     loc  = os.path.join(dir, name)
     if os.path.exists(loc):
         hash = hashlib.sha1(open(loc, 'rb').read()).hexdigest()
-        if hash != sha1:
-            error('Checksum mismatch for %s' % name)
-            os.remove(loc)
-        return loc
+        if hash == sha1:
+            return loc
+        os.remove(loc)
+        print 'Checksum mismatch for %s, re-downloading.' % name
     def hook(cnt, bs, total):
         pct = int(cnt*bs*100/total)
         sys.stdout.write("\rDownloading: %s [%d%%]" % (name, pct))
@@ -348,12 +348,26 @@ def download_file(url, dir, sha1):
     sys.stdout.flush()
     hash = hashlib.sha1(open(loc, 'rb').read()).hexdigest()
     if hash != sha1:
-        error('Checksum mismatch for %s' % name)
         os.remove(loc)
+        error('Checksum mismatch for %s, aborting.' % name)
     sys.stdout.write("\rDownloaded: %s [checksum OK]\n" % name)
     sys.stdout.flush()
     return loc
 
+def download_tarball(url, sha1, dir, name):
+    loc = download_file(url, sha1, dir)
+    tar = tarfile.open(loc)
+    sub = tar.getnames()[0]
+    if '/' in sub:
+        sub = sub[:sub.index('/')]
+    src = os.path.join(dir, sub)
+    tgt = os.path.join(dir, name)
+    rmdir(src)
+    tar.extractall(dir)
+    rmdir(tgt)
+    os.rename(src, tgt)
+    return tgt
+
 def build_openssl(config, basedir):
     cfg = None
     for key in OPENSSL['build']:
@@ -363,10 +377,8 @@ def build_openssl(config, basedir):
     if not cfg:
         return
 
-    dstdir   = os.path.join(basedir, config, 'openssl')
-    location = download_file(OPENSSL['url'], basedir, OPENSSL['sha1'])
-    relname  = os.path.basename(location)[:os.path.basename(location).index('.tar')]
-    srcdir   = os.path.join(basedir, relname)
+    dstdir = os.path.join(basedir, config, 'winlibs')
+    srcdir = download_tarball(OPENSSL['url'], OPENSSL['sha1'], basedir, os.path.join(config, 'openssl'))
 
     def is_compiled():
         compiled = exists(os.path.join(dstdir, 'include', 'openssl', 'ssl.h'))
@@ -375,16 +387,16 @@ def build_openssl(config, basedir):
         return compiled
 
     if not is_compiled():
-        rmdir(srcdir)
-        tarfile.open(location).extractall(basedir)
         os.chdir(srcdir)
         opts = OPENSSL['build'][cfg]
         shell('perl Configure --openssldir=%s %s' % (dstdir, opts['configure']))
         for cmd in opts['build']:
             shell(cmd)
+        os.chdir(dstdir)
         if not is_compiled():
             error("Unable to compile OpenSSL for your system, aborting.")
 
+    rmdir(srcdir)
     return OPENSSL['build'][cfg]['os_libs']
 
 def check_running_on_debian():
@@ -563,14 +575,14 @@ def build_msvc_common(config, basedir):
     version, simple_version = get_version(basedir)
     ssl_libs = build_openssl(config, basedir)
 
-    ssldir = os.path.join(basedir, config, 'openssl')
+    libdir = os.path.join(basedir, config, 'winlibs')
     qtdir  = os.path.join(basedir, config, 'qt')
     mkdir_p(qtdir)
 
     configure_args = qt_config('msvc',
-        '-I %s\\include' % ssldir,
-        '-L %s\\lib' % ssldir,
-        'OPENSSL_LIBS="-L%s -lssleay32 -llibeay32 %s"' % (ssldir.replace('\\', '\\\\'), ssl_libs))
+        '-I %s\\include' % libdir,
+        '-L %s\\lib' % libdir,
+        'OPENSSL_LIBS="-L%s -lssleay32 -llibeay32 %s"' % (libdir.replace('\\', '\\\\'), ssl_libs))
 
     os.chdir(qtdir)
     if not exists('is_configured'):
@@ -617,16 +629,16 @@ def build_mingw64_cross(config, basedir):
     version, simple_version = get_version(basedir)
     ssl_libs = build_openssl(config, basedir)
 
-    ssldir = os.path.join(basedir, config, 'openssl')
+    libdir = os.path.join(basedir, config, 'winlibs')
     qtdir  = os.path.join(basedir, config, 'qt')
 
     configure_args = qt_config('mingw-w64-cross',
         '--prefix=%s'   % qtdir,
-        '-I %s/include' % ssldir,
-        '-L %s/lib'     % ssldir,
+        '-I %s/include' % libdir,
+        '-L %s/lib'     % libdir,
         '-device-option CROSS_COMPILE=%s-' % MINGW_W64_PREFIX[rchop(config, '-dbg')])
 
-    os.environ['OPENSSL_LIBS'] = '-lssl -lcrypto -L %s/lib %s' % (ssldir, ssl_libs)
+    os.environ['OPENSSL_LIBS'] = '-lssl -lcrypto -L %s/lib %s' % (libdir, ssl_libs)
 
     mkdir_p(qtdir)
     os.chdir(qtdir)
@@ -866,6 +878,7 @@ def main():
     if '-clean' in sys.argv[2:]:
         rmdir(os.path.join(basedir, config))
 
+    mkdir_p(os.path.join(basedir, config))
     globals()['check_%s' % BUILDERS[config]](final_config)
     globals()['build_%s' % BUILDERS[config]](final_config, os.path.realpath(basedir))