diff options
author | thakis@chromium.org <thakis@chromium.org> | 2014-08-25 17:53:17 +0000 |
---|---|---|
committer | thakis@chromium.org <thakis@chromium.org> | 2014-08-25 17:53:17 +0000 |
commit | 43a3b907eb20bd59c28c6e315b3d9e348ab57ac7 (patch) | |
tree | eff1092e2952fa638d8d01c0a7f3c547012213a2 | |
parent | fa401a9913d33cfa9a2d1a57511e32076a3cccbb (diff) | |
download | gyp-43a3b907eb20bd59c28c6e315b3d9e348ab57ac7.tar.gz |
android: Support host multilib builds.
The Android build system now supports multilib 32/64-bit host builds as
well as target builds, and Chromium needs to make use of this to
properly support compiling V8 for host. Introduce a GYP_HOST_VAR_PREFIX
variable that works equivalently to GYP_VAR_PREFIX and use it in all the
places where the first/second host architecture must be selected, and
also introduce GYP_HOST_MULTILIB to enable the top level makefile to
specify whether it wants 32-bit or 64-bit host binaries.
BUG=chromium:358141
Review URL: https://codereview.chromium.org/301373002
Patch from Torne <torne@chromium.org>!
git-svn-id: http://gyp.googlecode.com/svn/trunk@1970 78cadc50-ecff-11dd-a971-7dbc132099af
-rw-r--r-- | pylib/gyp/generator/android.py | 19 | ||||
-rw-r--r-- | test/android/32or64.c | 13 | ||||
-rwxr-xr-x | test/android/gyptest-host-multilib.py | 32 | ||||
-rw-r--r-- | test/android/host_32or64.gyp | 38 | ||||
-rw-r--r-- | test/android/writefile.c | 18 |
5 files changed, 113 insertions, 7 deletions
diff --git a/pylib/gyp/generator/android.py b/pylib/gyp/generator/android.py index 5d8c74e2..d7aa9029 100644 --- a/pylib/gyp/generator/android.py +++ b/pylib/gyp/generator/android.py @@ -188,6 +188,7 @@ class AndroidMkWriter(object): self.WriteLn('LOCAL_MODULE_TAGS := optional') if self.toolset == 'host': self.WriteLn('LOCAL_IS_HOST_MODULE := true') + self.WriteLn('LOCAL_MULTILIB := $(GYP_HOST_MULTILIB)') else: self.WriteLn('LOCAL_MODULE_TARGET_ARCH := ' '$(TARGET_$(GYP_VAR_PREFIX)ARCH)') @@ -195,7 +196,7 @@ class AndroidMkWriter(object): # Grab output directories; needed for Actions and Rules. if self.toolset == 'host': self.WriteLn('gyp_intermediate_dir := ' - '$(call local-intermediates-dir)') + '$(call local-intermediates-dir,,$(GYP_HOST_VAR_PREFIX))') else: self.WriteLn('gyp_intermediate_dir := ' '$(call local-intermediates-dir,,$(GYP_VAR_PREFIX))') @@ -694,14 +695,15 @@ class AndroidMkWriter(object): path = '$(gyp_shared_intermediate_dir)' elif self.type == 'shared_library': if self.toolset == 'host': - path = '$(HOST_OUT_INTERMEDIATE_LIBRARIES)' + path = '$($(GYP_HOST_VAR_PREFIX)HOST_OUT_INTERMEDIATE_LIBRARIES)' else: path = '$($(GYP_VAR_PREFIX)TARGET_OUT_INTERMEDIATE_LIBRARIES)' else: # Other targets just get built into their intermediate dir. if self.toolset == 'host': - path = '$(call intermediates-dir-for,%s,%s,true)' % (self.android_class, - self.android_module) + path = ('$(call intermediates-dir-for,%s,%s,true,,' + '$(GYP_HOST_VAR_PREFIX))' % (self.android_class, + self.android_module)) else: path = ('$(call intermediates-dir-for,%s,%s,,,$(GYP_VAR_PREFIX))' % (self.android_class, self.android_module)) @@ -887,6 +889,8 @@ class AndroidMkWriter(object): self.WriteLn('LOCAL_UNINSTALLABLE_MODULE := true') if self.toolset == 'target': self.WriteLn('LOCAL_2ND_ARCH_VAR_PREFIX := $(GYP_VAR_PREFIX)') + else: + self.WriteLn('LOCAL_2ND_ARCH_VAR_PREFIX := $(GYP_HOST_VAR_PREFIX)') self.WriteLn() self.WriteLn('include $(BUILD_SYSTEM)/base_rules.mk') self.WriteLn() @@ -894,9 +898,8 @@ class AndroidMkWriter(object): self.WriteLn('\t$(hide) echo "Gyp timestamp: $@"') self.WriteLn('\t$(hide) mkdir -p $(dir $@)') self.WriteLn('\t$(hide) touch $@') - if self.toolset == 'target': - self.WriteLn() - self.WriteLn('LOCAL_2ND_ARCH_VAR_PREFIX :=') + self.WriteLn() + self.WriteLn('LOCAL_2ND_ARCH_VAR_PREFIX :=') def WriteList(self, value_list, variable=None, prefix='', @@ -1080,6 +1083,8 @@ def GenerateOutput(target_list, target_dicts, data, params): root_makefile.write('GYP_CONFIGURATION ?= %s\n' % default_configuration) root_makefile.write('GYP_VAR_PREFIX ?=\n') + root_makefile.write('GYP_HOST_VAR_PREFIX ?=\n') + root_makefile.write('GYP_HOST_MULTILIB ?=\n') # Write out the sorted list of includes. root_makefile.write('\n') diff --git a/test/android/32or64.c b/test/android/32or64.c new file mode 100644 index 00000000..3ea81692 --- /dev/null +++ b/test/android/32or64.c @@ -0,0 +1,13 @@ +/* Copyright (c) 2014 Google Inc. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +const char* getString() +{ +#ifdef __LP64__ + return "Hello, 64-bit world!\n"; +#else + return "Hello, 32-bit world!\n"; +#endif +} diff --git a/test/android/gyptest-host-multilib.py b/test/android/gyptest-host-multilib.py new file mode 100755 index 00000000..4fb79195 --- /dev/null +++ b/test/android/gyptest-host-multilib.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python + +# Copyright (c) 2014 Google Inc. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +""" +Verifies that it's possible to build host targets correctly in a multilib +configuration, explicitly forcing either 32 or 64 bit. +""" + +import TestGyp + +test = TestGyp.TestGyp(formats=['android']) + +test.run_gyp('host_32or64.gyp') + +# Force building as 32-bit +test.build('host_32or64.gyp', 'generate_output', + arguments=['GYP_HOST_VAR_PREFIX=$(HOST_2ND_ARCH_VAR_PREFIX)', + 'GYP_HOST_MULTILIB=32']) + +test.built_file_must_match('host_32or64.output', 'Hello, 32-bit world!\n') + +# Force building as 64-bit +test.build('host_32or64.gyp', 'generate_output', + arguments=['GYP_HOST_VAR_PREFIX=', + 'GYP_HOST_MULTILIB=64']) + +test.built_file_must_match('host_32or64.output', 'Hello, 64-bit world!\n') + +test.pass_test() diff --git a/test/android/host_32or64.gyp b/test/android/host_32or64.gyp new file mode 100644 index 00000000..e8ca79f5 --- /dev/null +++ b/test/android/host_32or64.gyp @@ -0,0 +1,38 @@ +# Copyright (c) 2014 Google Inc. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +{ + 'targets': [ + { + 'target_name': 'lib32or64', + 'type': 'static_library', + 'toolsets': [ 'host' ], + 'sources': [ + '32or64.c', + ], + }, + { + 'target_name': 'host_32or64', + 'type': 'executable', + 'toolsets': [ 'host' ], + 'dependencies': [ 'lib32or64#host' ], + 'sources': [ + 'writefile.c', + ], + }, + { + 'target_name': 'generate_output', + 'type': 'none', + 'dependencies': [ 'host_32or64#host' ], + 'actions': [ + { + 'action_name': 'generate', + 'inputs': [ '<(PRODUCT_DIR)/host_32or64' ], + 'outputs': [ '<(PRODUCT_DIR)/host_32or64.output' ], + 'action': [ '<@(_inputs)', '<@(_outputs)' ], + } + ], + }, + ], +} diff --git a/test/android/writefile.c b/test/android/writefile.c new file mode 100644 index 00000000..3f5960f8 --- /dev/null +++ b/test/android/writefile.c @@ -0,0 +1,18 @@ +/* Copyright (c) 2014 Google Inc. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include <stdio.h> + +extern const char* getString(void); + +int main(int argc, char* argv[]) +{ + if (argc < 2) return 2; + FILE* f = fopen(argv[1], "w"); + if (f == NULL) return 1; + fprintf(f, "%s", getString()); + fclose(f); + return 0; +} |