From 92474b5f516227ad1b5b0256674b4a99c23568df Mon Sep 17 00:00:00 2001 From: Dane Springmeyer Date: Wed, 29 Oct 2014 14:54:13 -0400 Subject: create and install libmbgl.a with bundled libuv --- gyp/mbgl-core.gypi | 25 ++++++++++++++++++ gyp/merge_static_libs.py | 66 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100755 gyp/merge_static_libs.py (limited to 'gyp') diff --git a/gyp/mbgl-core.gypi b/gyp/mbgl-core.gypi index a9c10f111a..d6a9dd8fbc 100644 --- a/gyp/mbgl-core.gypi +++ b/gyp/mbgl-core.gypi @@ -72,6 +72,31 @@ }] ] } + }, + { + 'target_name': 'mbgl-standalone', + 'type': 'none', + 'variables': { + 'core_lib':'<(PRODUCT_DIR)/libmbgl-core.a', + 'standalone_lib':'<(PRODUCT_DIR)/libmbgl.a' + }, + 'actions': [ + { + 'action_name': 'build standalone core lib', + 'inputs': [ + '<(core_lib)' + ], + 'outputs': [ + '<(standalone_lib)' + ], + 'action': [ + './gyp/merge_static_libs.py', + '<(standalone_lib)', + '<@(uv_static_libs)', + '<(core_lib)' + ], + } + ] } ] } diff --git a/gyp/merge_static_libs.py b/gyp/merge_static_libs.py new file mode 100755 index 0000000000..842be18c84 --- /dev/null +++ b/gyp/merge_static_libs.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python +# Copyright (c) 2012 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import os +import shutil +import subprocess +import sys +import tempfile + +def _Usage(): + print 'Usage: merge_static_libs OUTPUT_LIB INPUT_LIB [INPUT_LIB]*' + sys.exit(1) + +def MergeLibs(in_libs, out_lib): + """ Merges multiple static libraries into one. + + in_libs: list of paths to static libraries to be merged + out_lib: path to the static library which will be created from in_libs + """ + if os.name == 'posix': + tempdir = tempfile.mkdtemp() + abs_in_libs = [] + for in_lib in in_libs: + abs_in_libs.append(os.path.abspath(in_lib)) + curdir = os.getcwd() + os.chdir(tempdir) + objects = [] + ar = os.environ.get('AR', 'ar') + for in_lib in abs_in_libs: + proc = subprocess.Popen([ar, '-t', in_lib], stdout=subprocess.PIPE) + proc.wait() + obj_str = proc.communicate()[0] + current_objects = obj_str.rstrip().split('\n') + proc = subprocess.Popen([ar, '-x', in_lib], stdout=subprocess.PIPE, + stderr=subprocess.STDOUT) + proc.wait() + if proc.poll() == 0: + # The static library is non-thin, and we extracted objects + for object in current_objects: + objects.append(os.path.abspath(object)) + elif 'thin archive' in proc.communicate()[0]: + # The static library is thin, so it contains the paths to its objects + for object in current_objects: + objects.append(object) + else: + raise Exception('Failed to extract objects from %s.' % in_lib) + os.chdir(curdir) + if not subprocess.call([ar, '-crs', out_lib] + objects) == 0: + raise Exception('Failed to add object files to %s' % out_lib) + shutil.rmtree(tempdir) + elif os.name == 'nt': + subprocess.call(['lib', '/OUT:%s' % out_lib] + in_libs) + else: + raise Exception('Error: Your platform is not supported') + +def Main(): + if len(sys.argv) < 3: + _Usage() + out_lib = sys.argv[1] + in_libs = sys.argv[2:] + MergeLibs(in_libs, out_lib) + +if '__main__' == __name__: + sys.exit(Main()) -- cgit v1.2.1