| Index: native_client_sdk/src/build_tools/sdk_tools/set_nacl_env.py
|
| diff --git a/native_client_sdk/src/build_tools/sdk_tools/set_nacl_env.py b/native_client_sdk/src/build_tools/sdk_tools/set_nacl_env.py
|
| deleted file mode 100755
|
| index c2aaf695af212923e5f539a7be3cbb40c70712af..0000000000000000000000000000000000000000
|
| --- a/native_client_sdk/src/build_tools/sdk_tools/set_nacl_env.py
|
| +++ /dev/null
|
| @@ -1,492 +0,0 @@
|
| -#!/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.
|
| -
|
| -''' A tool to setup the NaCl build env and invoke a command such as make '''
|
| -
|
| -__author__ = 'gwink@google.com (Georges Winkenbach)'
|
| -
|
| -import optparse
|
| -import os
|
| -import subprocess
|
| -import sys
|
| -
|
| -# The default sdk platform to use if the user doesn't specify one.
|
| -__DEFAULT_SDK_PLATFORM = 'pepper_15'
|
| -
|
| -# Usage info.
|
| -__GLOBAL_HELP = '''%prog options [command]
|
| -
|
| -set-nacl-env is a utility that sets up the environment required to build
|
| -NaCl modules and invokes an optional command in a shell. If no command
|
| -is specified, set-nacl-env spawns a new shell instead. Optionally, the user
|
| -can request that the settings are printed to stdout.
|
| -'''
|
| -
|
| -# Map the string stored in |sys.platform| into a toolchain host specifier.
|
| -__PLATFORM_TO_HOST_MAP = {
|
| - 'win32': 'windows',
|
| - 'cygwin': 'windows',
|
| - 'linux2': 'linux',
|
| - 'darwin': 'mac',
|
| - }
|
| -
|
| -# Map key triplet of (host, arch, variant) keys to the corresponding subdir in
|
| -# the toolchain path. For instance (mac, x86-32, newlib) maps to mac_x86_newlib.
|
| -# Note to NaCl eng.: this map is duplicated in nack_utils.py; you must keep them
|
| -# synched.
|
| -__HOST_TO_TOOLCHAIN_MAP = {
|
| - 'mac': { # Host arch variant
|
| - 'x86-32': {
|
| - 'newlib': 'mac_x86_newlib', # Mac x86-32 newlib
|
| - 'glibc' : 'mac_x86'}, # Mac x86-32 glibc
|
| - 'x86-64': {
|
| - 'newlib': 'mac_x86_newlib', # Mac x86-64 newlib
|
| - 'glibc' : 'mac_x86'}, # Mac x86-64 glibc
|
| - },
|
| - 'windows': {
|
| - 'x86-32': {
|
| - 'newlib': 'win_x86_newlib', # Windows x86-32 newlib
|
| - 'glibc' : 'win_x86'}, # Windows x86-32 glibc
|
| - 'x86-64': {
|
| - 'newlib': 'win_x86_newlib', # Windows x86-64 newlib
|
| - 'glibc' : 'win_x86'}, # Windows x86-64 glibc
|
| - },
|
| - 'linux': {
|
| - 'x86-32': {
|
| - 'newlib': 'linux_x86_newlib', # Windows x86-32 newlib
|
| - 'glibc' : 'linux_x86'}, # Windows x86-32 glibc
|
| - 'x86-64': {
|
| - 'newlib': 'linux_x86_newlib', # Windows x86-64 newlib
|
| - 'glibc' : 'linux_x86'}, # Windows x86-64 glibc
|
| - },
|
| - }
|
| -
|
| -# Map architecture specification to the corresponding tool-name prefix.
|
| -# @private
|
| -__VALID_ARCH_SPECS = {
|
| - 'x86-32': 'i686',
|
| - 'x86-64': 'x86_64',
|
| - }
|
| -
|
| -# Valid lib variants.
|
| -__VALID_VARIANT = ['glibc', 'newlib']
|
| -
|
| -# Lists of env keys for build tools. Note: Each matching value is actually a
|
| -# format template with fields for 'prefix' such as 'i686-nacl-' and 'extras'
|
| -# such as ' -m64'.
|
| -__BUILD_TOOLS = {
|
| - 'CC': '{prefix}gcc{extras}',
|
| - 'CXX': '{prefix}g++{extras}',
|
| - 'AR': '{prefix}ar{extras}',
|
| - 'LINK': '{prefix}g++{extras}',
|
| - 'STRIP': '{prefix}strip',
|
| - 'RANLIB': '{prefix}ranlib',
|
| - }
|
| -
|
| -# List of env keys for build options with corresponding settings that are
|
| -# common to all build configurations.
|
| -__BUILD_OPTIONS = {
|
| - 'CFLAGS': ['-std=gnu99', '-Wall', '-Wswitch-enum', '-g'],
|
| - 'CXXFLAGS': ['-std=gnu++98', '-Wswitch-enum', '-g', '-pthread'],
|
| - 'CPPFLAGS': ['-D_GNU_SOURCE=1', '-D__STDC_FORMAT_MACROS=1'],
|
| - 'LDFLAGS': [],
|
| - }
|
| -
|
| -# All the build-flags env keys in one list.
|
| -__ALL_ENV_KEYS = __BUILD_TOOLS.keys() + __BUILD_OPTIONS.keys()
|
| -
|
| -# Map build types to the corresponding build flags.
|
| -__BUILD_TYPES = {
|
| - 'debug': ['-O0'],
|
| - 'release': ['-O3'],
|
| - }
|
| -
|
| -
|
| -def FormatOptionList(option_list, prefix='', separator=' '):
|
| - ''' Format a list of build-option items into a string.
|
| -
|
| - Format a list of build-option items into a string suitable for output.
|
| -
|
| - Args:
|
| - prefix: a prefix string to prepend to each list item. For instance,
|
| - prefix='-D' with item='__DEBUG' generates '-D__DEBUG'.
|
| - separator: a separator string to insert between items.
|
| -
|
| - Returns:
|
| - A formatted string. An empty string if list is empty.
|
| - '''
|
| - return separator.join([prefix + item for item in option_list])
|
| -
|
| -
|
| -def GetNaclSdkRoot():
|
| - ''' Produce a string with the full path to the NaCl SDK root.
|
| -
|
| - The path to nacl-sdk root is derived from one of two sources. First, if
|
| - NACL_SDK_ROOT is defined in env it is assumed to contain the desired sdk
|
| - root. That makes it possible for this tool to run from any location. If
|
| - NACL_SDK_ROOT is not defined or is empty, the sdk root is taken as the
|
| - parent directory to this script's file. This works well when this script
|
| - is ran from the sdk_tools directory in the standard SDK installation.
|
| -
|
| - Returns:
|
| - A string with the path to the NaCl SDK root.
|
| - '''
|
| - if 'NACL_SDK_ROOT' in os.environ:
|
| - return os.environ['NACL_SDK_ROOT']
|
| - else:
|
| - SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
|
| - SRC_DIR = os.path.dirname(os.path.dirname(os.path.dirname(SCRIPT_DIR)))
|
| - return os.path.join(SRC_DIR, 'native_client')
|
| -
|
| -
|
| -def GetToolchainPath(options):
|
| - ''' Build the path to the toolchain directory.
|
| -
|
| - Given the host, sdk-root directory, sdk platform, architecture and library
|
| - variant, this function builds the path to the toolchain directory.
|
| -
|
| - Examples:
|
| - For
|
| - sdk_root == 'c:/cool_code/nacl_sdk'
|
| - arch == 'x86-32'
|
| - lib variant == 'newlib'
|
| - nacl platform = 'pepper_17'
|
| - host == 'mac'
|
| - this function returns :
|
| - toolchain_path == /cool_code/nacl_sdk/pepper_17/toolchain/mac_x86_newlib
|
| -
|
| - Args:
|
| - options: the options instances containing attributes options.host,
|
| - options.arch, options.lib_variant, options.sdk_root and
|
| - options.sdk_platform.
|
| -
|
| - Returns:
|
| - A string containing the absolute path to the base directory for the
|
| - toolchain.
|
| - '''
|
| - host = options.host
|
| - arch = options.arch
|
| - variant = options.lib_variant
|
| - toolchain_dir = __HOST_TO_TOOLCHAIN_MAP[host][arch][variant]
|
| - base_dir = os.path.abspath(options.sdk_root)
|
| - return os.path.join(base_dir, options.sdk_platform, 'toolchain',
|
| - toolchain_dir)
|
| -
|
| -
|
| -def ConfigureBaseEnv(merge):
|
| - ''' Configure and return a new env instance with the essential options.
|
| -
|
| - Create and return a new env instance with the base configuration. That env
|
| - contains at least an empty entry for each key defined in __ALL_ENV_KEYS.
|
| - However, if merge is True, a copy of the current os.environ is used to seed
|
| - env.
|
| -
|
| - Argument:
|
| - merge: True ==> merge build configuration with os.environ..
|
| -
|
| - Returns:
|
| - A base env map.
|
| - '''
|
| - env = {}
|
| - if merge:
|
| - for key, value in os.environ.items():
|
| - env[key] = [value]
|
| - # Ensure that every env key has a default definition.
|
| - for key in __ALL_ENV_KEYS:
|
| - env.setdefault(key, [])
|
| - return env
|
| -
|
| -
|
| -def SetBuildTools(env, tool_bin_path, tool_prefix, extras_flags=''):
|
| - ''' Configure the build tools build flags in env.
|
| -
|
| - Given the absolute path to the toolchain's bin directory, tool_prefix and
|
| - optional extra_flags build flags, set the entries for the build tools
|
| - in env. For instance, using the sample path from GetToolchainPath above and
|
| - tool_prefix = 'i686-nacl-' we would get
|
| -
|
| - env['CC'] =
|
| - '/cool_code/nacl_sdk/pepper_17/toolchain/mac_x86_newlib/bin/i686-nacl-gcc'
|
| -
|
| - Args:
|
| - env: the env map to setup.
|
| - tool_bin_path: the absolute path to the toolchain's bin directory.
|
| - tool_prefix: a string with the tool's prefix, such as 'i686-nacl-'.
|
| - extra_flags: optional extra flags, such as ' -m64'.
|
| - '''
|
| - for key, val in __BUILD_TOOLS.iteritems():
|
| - tool_name = val.format(prefix=tool_prefix, extras=extras_flags)
|
| - env[key] = os.path.join(tool_bin_path, tool_name)
|
| -
|
| -
|
| -def SetRuntimeTools(env, tool_runtime_path):
|
| - ''' Setup the runtime tools in env.
|
| -
|
| - Given an absolute path to the toolchain's runtime directory, setup the
|
| - entries for the runtime tools in env.
|
| -
|
| - Args:
|
| - env: the env map to setup.
|
| - tool_runtime_path: the absolute path to the toolchain's runtime directory.
|
| - '''
|
| - env['NACL_IRT_CORE32'] = os.path.join(tool_runtime_path,
|
| - 'irt_core_x86_32.nexe')
|
| - env['NACL_IRT_CORE64'] = os.path.join(tool_runtime_path,
|
| - 'irt_core_x86_64.nexe')
|
| -
|
| -
|
| -def SetCommonBuildOptions(env, options):
|
| - ''' Set the common build options, such as CFLAGS.
|
| -
|
| - Set the build options, such as CFLAGS that are common to all build
|
| - configurations, given the built type.
|
| -
|
| - Args:
|
| - env: the env map to set.
|
| - build_type: one of 'debug' or 'release'.
|
| - '''
|
| - # Set the build flags from __BUILD_OPTIONS.
|
| - for key, val in __BUILD_OPTIONS.iteritems():
|
| - env[key].extend(val)
|
| - # Add the build-type specific flags.
|
| - env['CFLAGS'].extend(__BUILD_TYPES[options.build_type])
|
| - env['CXXFLAGS'].extend(__BUILD_TYPES[options.build_type])
|
| - if not options.no_ppapi:
|
| - env['LDFLAGS'].extend(['-lppapi'])
|
| -
|
| -
|
| -def SetupX86Env(options):
|
| - ''' Generate a new env map for X86 builds.
|
| -
|
| - Generate and return a new env map for x86-NN architecture. The NN bit
|
| - size is derived from options.arch.
|
| -
|
| - Argument:
|
| - options: the cmd-line options.
|
| -
|
| - Returns:
|
| - A new env map with the build configuration flags set.
|
| - '''
|
| - env = ConfigureBaseEnv(options.merge)
|
| -
|
| - # Where to find tools and libraries within the toolchain directory.
|
| - tool_bin_path = os.path.join(options.toolchain_path, 'bin')
|
| - tool_runtime_path = os.path.join(options.toolchain_path, 'runtime')
|
| -
|
| - # Store the bin paths into env. This isn't really part of the build
|
| - # environment. But it's nice to have there for reference.
|
| - env['NACL_TOOL_BIN_PATH'] = tool_bin_path
|
| - env['NACL_TOOL_RUNTIME_PATH'] = tool_runtime_path
|
| -
|
| - if options.arch == 'x86-32':
|
| - SetBuildTools(env, tool_bin_path, 'i686-nacl-', extras_flags=' -m32')
|
| - else:
|
| - assert(options.arch == 'x86-64')
|
| - SetBuildTools(env, tool_bin_path, 'x86_64-nacl-', extras_flags=' -m64')
|
| - SetRuntimeTools(env, tool_runtime_path)
|
| - SetCommonBuildOptions(env, options)
|
| - return env
|
| -
|
| -
|
| -def dump(options, env, template):
|
| - ''' Dump the build settings in env to stdout.
|
| -
|
| - Args:
|
| - options: the cmd-line options, used to output the target buid configuartion.
|
| - env: the env map with the build flags.
|
| - template: a fiormatting template used to format options output. It must
|
| - contain format fields 'option' and 'value'.
|
| - '''
|
| - if options.pretty_print:
|
| - print '\nConfiguration:'
|
| - print '-------------'
|
| - print ' Host = %s' % options.host
|
| - print ' NaCl SDK root = %s' % options.sdk_root
|
| - print ' SDK platform = %s' % options.sdk_platform
|
| - print ' Target architecture = %s' % options.arch
|
| - print ' Lib variant = %s' % options.lib_variant
|
| -
|
| - if options.pretty_print:
|
| - print '\nNaCl toolchain paths:'
|
| - print '-------------------------'
|
| - print ' toolchain = %s' % options.toolchain_path
|
| - print ' toolchain bin = %s' % env['NACL_TOOL_BIN_PATH']
|
| - print ' toolchain runtime = %s' % env['NACL_TOOL_RUNTIME_PATH']
|
| -
|
| - if options.pretty_print:
|
| - print '\nBuild tools:'
|
| - print '-----------'
|
| - print template.format(option='CC', value=env['CC'])
|
| - print template.format(option='CXX', value=env['CXX'])
|
| - print template.format(option='AR', value=env['AR'])
|
| - print template.format(option='LINK', value=env['LINK'])
|
| - print template.format(option='STRIP', value=env['STRIP'])
|
| - print template.format(option='RANLIB', value=env['RANLIB'])
|
| -
|
| - if options.pretty_print:
|
| - print '\nBuild settings:'
|
| - print '--------------'
|
| - print template.format(option='CFLAGS',
|
| - value=FormatOptionList(option_list=env['CFLAGS']))
|
| - print template.format(option='CXXFLAGS',
|
| - value=FormatOptionList(option_list=env['CXXFLAGS']))
|
| - print template.format(option='LDFLAGS',
|
| - value=FormatOptionList(option_list=env['LDFLAGS']))
|
| - print template.format(option='CPPFLAGS',
|
| - value=FormatOptionList(option_list=env['CPPFLAGS']))
|
| - if options.pretty_print:
|
| - print '\nRuntime tools:'
|
| - print '-------------'
|
| - print template.format(option='NACL_IRT_CORE32', value=env['NACL_IRT_CORE32'])
|
| - print template.format(option='NACL_IRT_CORE64', value=env['NACL_IRT_CORE64'])
|
| - print ''
|
| -
|
| -
|
| -def NormalizeEnv(env):
|
| - ''' Returns a copy of env normalized.
|
| -
|
| - Internally, this script uses lists to keep track of build settings in env.
|
| - This function converts these list to space-separated strings of items,
|
| - suitable for use as a subprocess env.
|
| -
|
| - Argument:
|
| - env: env map that must be normalized.
|
| -
|
| - Returns:
|
| - A copy of env with lists converted to strings.
|
| - '''
|
| - norm_env = {}
|
| - for key, value in env.iteritems():
|
| - if isinstance(value, list):
|
| - norm_env[key] = ' '.join(value)
|
| - else:
|
| - norm_env[key] = value
|
| - return norm_env
|
| -
|
| -
|
| -def RunCommandOrShell(cmd_list, env):
|
| - ''' Run the command in cmd_list or a shell if cmd_list is empty.
|
| -
|
| - Run the command in cmd_list using a normalized copy of env. For instance,
|
| - cmd_list might contain the items ['make', 'application'], which would
|
| - cause command 'make application' to run in the current directory. If cmd_list
|
| - is empty, this function will spawn a new sbushell instead.
|
| -
|
| - Args:
|
| - cmd_list: the command list to run.
|
| - env: the environment to use.
|
| - '''
|
| - # If cmd_list is empty, set it up to spawn a shell instead. If cmd_list
|
| - # isn't empty, it will run in the current shell (for security and so that the
|
| - # user can see the output).
|
| - new_shell = False
|
| - if cmd_list:
|
| - # Normalize cmd_list by building a list of individual arguments.
|
| - new_cmd_list = []
|
| - for item in cmd_list:
|
| - new_cmd_list += item.split()
|
| - cmd_list = new_cmd_list
|
| - else:
|
| - # Build a shell command.
|
| - new_shell = True
|
| - if sys.platform == 'win32':
|
| - cmd_list = ['cmd']
|
| - else:
|
| - cmd_list = ['/bin/bash', '-s']
|
| - return subprocess.call(cmd_list, env=NormalizeEnv(env), shell=new_shell)
|
| -
|
| -
|
| -def GenerateBuildSettings(options, args):
|
| - ''' Generate the build settings and dump them or invoke a command.
|
| -
|
| - Given the cmd-line options and remaining cmd-line arguments, generate the
|
| - required build settings and either dump them to stdout or invoke a shell
|
| - command.
|
| -
|
| - Args:
|
| - options: cmd-line options.
|
| - args: unconsumed cmd-line arguments.
|
| -
|
| - Returns:
|
| - 0 in case of success or a command result code otherwise.
|
| - '''
|
| - # A few generated options, which we store in options for convenience.
|
| - options.host = __PLATFORM_TO_HOST_MAP[sys.platform]
|
| - options.sdk_root = GetNaclSdkRoot()
|
| - options.toolchain_path = GetToolchainPath(options)
|
| -
|
| - env = SetupX86Env(options)
|
| - if options.dump:
|
| - dump(options, env, template=options.format_template)
|
| - return 0
|
| - else:
|
| - return RunCommandOrShell(args, env)
|
| -
|
| -
|
| -def main(argv):
|
| - ''' Do main stuff, mainly.
|
| - '''
|
| - parser = optparse.OptionParser(usage=__GLOBAL_HELP)
|
| - parser.add_option(
|
| - '-a', '--arch', dest='arch',
|
| - choices=['x86-32', 'x86-64'],
|
| - default='x86-64',
|
| - help='The target architecture; one of x86-32 or x86-64. '
|
| - '[default = %default.]')
|
| - parser.add_option(
|
| - '-A', '--no_ppapi', dest='no_ppapi',
|
| - default=False,
|
| - action='store_true',
|
| - help='Do not add -lppapi to the link settings.')
|
| - parser.add_option(
|
| - '-d', '--dump', dest='dump',
|
| - default=False,
|
| - action='store_true',
|
| - help='Dump the build settings to stdout')
|
| - parser.add_option(
|
| - '-D', '--pretty_print', dest='pretty_print',
|
| - default=False,
|
| - action='store_true',
|
| - help='Print section headers when dumping to stdout')
|
| - parser.add_option(
|
| - '-f', '--format_template', dest='format_template',
|
| - default=' {option}={value}',
|
| - help="The formatting template used to output (option, value) pairs."
|
| - "[default='%default.']")
|
| - parser.add_option(
|
| - '-n', '--no_merge', dest='merge',
|
| - default=True,
|
| - action='store_false',
|
| - help='Do not merge the build options with current environment. By default'
|
| - ' %prog merges the build flags with the current environment vars.'
|
| - ' This option turns that off.')
|
| - parser.add_option(
|
| - '-p', '--platform', dest='sdk_platform',
|
| - default=__DEFAULT_SDK_PLATFORM,
|
| - help='The SDK platform to use; e.g. pepper_16. [default = %default.]')
|
| - parser.add_option(
|
| - '-t', '--build_type', dest='build_type',
|
| - choices=__BUILD_TYPES.keys(),
|
| - default='debug',
|
| - help='The desired build type; one of debug or release.'
|
| - ' [default = %default.]')
|
| - parser.add_option(
|
| - '-v', '--variant', dest='lib_variant',
|
| - choices=['glibc', 'newlib'], default='newlib',
|
| - help='The lib variant to use; one of glibc or newlib. '
|
| - '[default = %default.]')
|
| -
|
| - (options, args) = parser.parse_args(argv)
|
| -
|
| - # Verify that we're running on a supported host.
|
| - if sys.platform not in __PLATFORM_TO_HOST_MAP:
|
| - sys.stderr.write('Platform %s is not supported.' % sys.platform)
|
| - return 1
|
| -
|
| - return GenerateBuildSettings(options, args)
|
| -
|
| -
|
| -if __name__ == '__main__':
|
| - sys.exit(main(sys.argv[1:]))
|
|
|