diff --git a/ios/clean_env.py b/ios/clean_env.py new file mode 100755 index 000000000..548e2b92e --- /dev/null +++ b/ios/clean_env.py @@ -0,0 +1,77 @@ +#!/usr/bin/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 sys + +def Main(argv): + """This is like 'env -i', but it uses a whitelist of env variables to allow + through to the command being run. It attempts to strip off Xcode-added + values from PATH. + """ + # Note: An attempt was made to do something like: env -i bash -lc '[command]' + # but that fails to set the things set by login (USER, etc.), so instead + # the only approach that seems to work is to have a whitelist. + env_key_whitelist = ( + 'HOME', + 'LOGNAME', + # 'PATH' added below (but filtered). + 'PWD', + 'SHELL', + 'TEMP', + 'TMPDIR', + 'USER' + ) + + # Need something to run. + # TODO(lliabraa): Make this output a usage string and exit (here and below). + assert(len(argv) > 0) + + add_to_path = []; + first_entry = argv[0]; + if first_entry.startswith('ADD_TO_PATH='): + argv = argv[1:]; + add_to_path = first_entry.replace('ADD_TO_PATH=', '', 1).split(':') + + # Still need something to run. + assert(len(argv) > 0) + + clean_env = {} + + # Pull over the whitelisted keys. + for key in env_key_whitelist: + val = os.environ.get(key, None) + if not val is None: + clean_env[key] = val + + # Collect the developer dir as set via Xcode, defaulting it. + dev_prefix = os.environ.get('DEVELOPER_DIR', '/Developer/') + if dev_prefix[-1:] != '/': + dev_prefix += '/' + + # Now pull in PATH, but remove anything Xcode might have added. + initial_path = os.environ.get('PATH', '') + filtered_chunks = \ + [x for x in initial_path.split(':') if not x.startswith(dev_prefix)] + if filtered_chunks: + clean_env['PATH'] = ':'.join(add_to_path + filtered_chunks) + + # Add any KEY=VALUE args before the command to the cleaned environment. + args = argv[:] + while '=' in args[0]: + (key, val) = args[0].split('=', 1) + clean_env[key] = val + args = args[1:] + + # Still need something to run. + assert(len(args) > 0) + + # Off it goes... + os.execvpe(args[0], args, clean_env) + # Should never get here, so return a distinctive, non-zero status code. + return 66 + +if __name__ == '__main__': + sys.exit(Main(sys.argv[1:])) diff --git a/ios/mac_build.gypi b/ios/mac_build.gypi new file mode 100644 index 000000000..9a739182b --- /dev/null +++ b/ios/mac_build.gypi @@ -0,0 +1,79 @@ +# 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. + +# Xcode throws an error if an iOS target depends on a Mac OS X target. So +# any place a utility program needs to be build and run, an action is +# used to run ninja as script to work around this. +# Example: +# { +# 'target_name': 'foo', +# 'type': 'none', +# 'variables': { +# # The name of a directory used for ninja. This cannot be shared with +# # another mac build. +# 'ninja_output_dir': 'ninja-foo', +# # The list of all the gyp files that contain the targets to run. +# 're_run_targets': [ +# 'foo.gyp', +# ], +# }, +# 'includes': ['path_to/mac_build.gypi'], +# 'actions': [ +# { +# 'action_name': 'compile foo', +# 'inputs': [], +# 'outputs': [], +# 'action': [ +# '<@(ninja_cmd)', +# # All the targets to build. +# 'foo1', +# 'foo2', +# ], +# }, +# ], +# } +{ + 'variables': { + # Convenience variable pointing to the ninja product directory. + 'ninja_product_dir': + '<(DEPTH)/xcodebuild/<(ninja_output_dir)/<(CONFIGURATION_NAME)', + + # Common ninja command line flags. + 'ninja_cmd': [ + # Bounce through clean_env to clean up the environment so things + # set by the iOS build don't pollute the Mac build. + '<(DEPTH)/build/ios/clean_env.py', + # ninja must be found in the PATH. + 'ADD_TO_PATH=