| Index: native_client_sdk/src/build_tools/build_sdk.py
|
| diff --git a/native_client_sdk/src/build_tools/build_sdk.py b/native_client_sdk/src/build_tools/build_sdk.py
|
| index ce1f49ea6fa76cddc300f5ab51562cbdfde34584..e32f9f75bbed23d2504c0af1aa4a13296d1d5c70 100755
|
| --- a/native_client_sdk/src/build_tools/build_sdk.py
|
| +++ b/native_client_sdk/src/build_tools/build_sdk.py
|
| @@ -56,7 +56,7 @@ NACL_TOOLCHAINTARS_DIR = os.path.join(NACL_TOOLCHAIN_DIR, '.tars')
|
| CYGTAR = os.path.join(BUILD_DIR, 'cygtar.py')
|
| PKGVER = os.path.join(BUILD_DIR, 'package_version', 'package_version.py')
|
|
|
| -GYPBUILD_DIR = 'gypbuild'
|
| +GNBUILD_DIR = 'gnbuild'
|
|
|
| options = None
|
|
|
| @@ -100,40 +100,22 @@ def GetToolchainNaClInclude(pepperdir, tcname, arch=None):
|
| buildbot_common.ErrorExit('Unknown architecture: %s' % arch)
|
|
|
|
|
| -def GetConfigDir(arch):
|
| - if arch.endswith('x64') and getos.GetPlatform() == 'win':
|
| - return 'Release_x64'
|
| - else:
|
| - return 'Release'
|
| -
|
| -
|
| def GetNinjaOutDir(arch):
|
| - return os.path.join(OUT_DIR, GYPBUILD_DIR + '-' + arch, GetConfigDir(arch))
|
| + return os.path.join(OUT_DIR, GNBUILD_DIR + '-' + arch)
|
|
|
|
|
| -def GetGypBuiltLib(tcname, arch):
|
| - if arch == 'ia32':
|
| - lib_suffix = '32'
|
| - elif arch == 'x64':
|
| - lib_suffix = '64'
|
| - elif arch == 'arm':
|
| - lib_suffix = 'arm'
|
| +def GetGnBuiltLib(tc, arch):
|
| + if 'glibc' in tc:
|
| + out_dir = 'glibc_%s' % arch
|
| + elif arch == 'pnacl':
|
| + out_dir = 'newlib_pnacl'
|
| else:
|
| - lib_suffix = ''
|
| -
|
| - tcdir = 'tc_' + GetToolchainLibc(tcname)
|
| -
|
| - if tcname == 'pnacl':
|
| - if arch is None:
|
| - lib_suffix = ''
|
| - tcdir = 'tc_pnacl_newlib'
|
| - arch = 'x64'
|
| -
|
| - return os.path.join(GetNinjaOutDir(arch), 'gen', tcdir, 'lib' + lib_suffix)
|
| + out_dir = 'clang_newlib_%s' % arch
|
| + return os.path.join(GetNinjaOutDir('x64'), out_dir)
|
|
|
|
|
| def GetToolchainNaClLib(tcname, tcpath, arch):
|
| - if arch == 'ia32':
|
| + if arch == 'x86':
|
| return os.path.join(tcpath, 'x86_64-nacl', 'lib32')
|
| elif arch == 'x64':
|
| return os.path.join(tcpath, 'x86_64-nacl', 'lib')
|
| @@ -143,15 +125,18 @@ def GetToolchainNaClLib(tcname, tcpath, arch):
|
| return os.path.join(tcpath, 'le32-nacl', 'lib')
|
|
|
|
|
| -
|
| def GetOutputToolchainLib(pepperdir, tcname, arch):
|
| tcpath = os.path.join(pepperdir, 'toolchain', GetToolchainDirName(tcname))
|
| return GetToolchainNaClLib(tcname, tcpath, arch)
|
|
|
|
|
| def GetPNaClTranslatorLib(tcpath, arch):
|
| - if arch not in ['arm', 'x86-32', 'x86-64']:
|
| + if arch not in ['arm', 'x86', 'x64']:
|
| buildbot_common.ErrorExit('Unknown architecture %s.' % arch)
|
| + if arch == 'x86':
|
| + arch = 'x86-32'
|
| + elif arch == 'x64':
|
| + arch = 'x86-64'
|
| return os.path.join(tcpath, 'translator', arch, 'lib')
|
|
|
|
|
| @@ -331,211 +316,142 @@ def InstallNaClHeaders(tc_dst_inc, tcname):
|
| InstallFiles(SRC_DIR, tc_dst_inc, NACL_HEADER_MAP[GetToolchainLibc(tcname)])
|
|
|
|
|
| -def MakeNinjaRelPath(path):
|
| - return os.path.join(os.path.relpath(OUT_DIR, SRC_DIR), path)
|
| -
|
| -
|
| -TOOLCHAIN_LIBS = {
|
| - 'newlib' : [
|
| - 'libppapi.a',
|
| - 'libppapi_stub.a',
|
| - ],
|
| - 'glibc': [
|
| - 'libppapi.a',
|
| - 'libppapi.so',
|
| - 'libppapi_stub.a',
|
| - ]
|
| -}
|
| -
|
| -
|
| -def GypNinjaInstall(pepperdir, toolchains):
|
| - tools_files_32 = [
|
| +def GnNinjaInstall(pepperdir, toolchains):
|
| + tools_files_x86 = [
|
| ['sel_ldr', 'sel_ldr_x86_32'],
|
| - ['irt_core_newlib_x32.nexe', 'irt_core_x86_32.nexe'],
|
| - ['irt_core_newlib_x64.nexe', 'irt_core_x86_64.nexe'],
|
| ]
|
| - arm_files = [
|
| - ['elf_loader_newlib_arm.nexe', 'elf_loader_arm.nexe'],
|
| + tools_files_x64 = [
|
| + ['sel_ldr', 'sel_ldr_x86_64'],
|
| + ['ncval_new', 'ncval'],
|
| + ['clang_newlib_arm/elf_loader.nexe', 'elf_loader_arm.nexe'],
|
| + ['irt_x86/irt_core.nexe', 'irt_core_x86_32.nexe'],
|
| + ['irt_x64/irt_core.nexe', 'irt_core_x86_64.nexe'],
|
| ]
|
| -
|
| - tools_files_64 = []
|
| + tools_files_arm = []
|
|
|
| platform = getos.GetPlatform()
|
|
|
| # TODO(binji): dump_syms doesn't currently build on Windows. See
|
| # http://crbug.com/245456
|
| if platform != 'win':
|
| - tools_files_64 += [
|
| + tools_files_x64 += [
|
| ['dump_syms', 'dump_syms'],
|
| ['minidump_dump', 'minidump_dump'],
|
| ['minidump_stackwalk', 'minidump_stackwalk']
|
| ]
|
|
|
| - tools_files_64.append(['sel_ldr', 'sel_ldr_x86_64'])
|
| - tools_files_64.append(['ncval_new', 'ncval'])
|
|
|
| if platform == 'linux':
|
| - tools_files_32.append(['nacl_helper_bootstrap',
|
| - 'nacl_helper_bootstrap_x86_32'])
|
| - tools_files_64.append(['nacl_helper_bootstrap',
|
| - 'nacl_helper_bootstrap_x86_64'])
|
| - tools_files_32.append(['nonsfi_loader_newlib_x32_nonsfi.nexe',
|
| - 'nonsfi_loader_x86_32'])
|
| + tools_files_x86 += [['nonsfi_loader', 'nonsfi_loader_x86_32'],
|
| + ['nacl_helper_bootstrap',
|
| + 'nacl_helper_bootstrap_x86_32']]
|
| + tools_files_x64 += [['nacl_helper_bootstrap',
|
| + 'nacl_helper_bootstrap_x86_64']]
|
| +
|
| +
|
| + # Add ARM trusted binaries (linux only)
|
| + if not options.no_arm_trusted:
|
| + tools_files_x64 += [
|
| + ['irt_arm/irt_core.nexe', 'irt_core_arm.nexe'],
|
| + ]
|
| + tools_files_arm += [
|
| + ['nacl_helper_bootstrap', 'nacl_helper_bootstrap_arm'],
|
| + ['nonsfi_loader', 'nonsfi_loader_arm'],
|
| + ['sel_ldr', 'sel_ldr_arm']
|
| + ]
|
|
|
| tools_dir = os.path.join(pepperdir, 'tools')
|
| buildbot_common.MakeDir(tools_dir)
|
|
|
| # Add .exe extensions to all windows tools
|
| - for pair in tools_files_32 + tools_files_64:
|
| - if platform == 'win' and not pair[0].endswith('.nexe'):
|
| + for pair in tools_files_x86 + tools_files_x64:
|
| + if platform == 'win' and not os.path.splitext(pair[0])[1]:
|
| pair[0] += '.exe'
|
| pair[1] += '.exe'
|
|
|
| - # Add ARM binaries
|
| - if platform == 'linux' and not options.no_arm_trusted:
|
| - arm_files += [
|
| - ['irt_core_newlib_arm.nexe', 'irt_core_arm.nexe'],
|
| - ['nacl_helper_bootstrap', 'nacl_helper_bootstrap_arm'],
|
| - ['nonsfi_loader_newlib_arm_nonsfi.nexe', 'nonsfi_loader_arm'],
|
| - ['sel_ldr', 'sel_ldr_arm']
|
| - ]
|
| -
|
| - InstallFiles(GetNinjaOutDir('x64'), tools_dir, tools_files_64)
|
| - InstallFiles(GetNinjaOutDir('ia32'), tools_dir, tools_files_32)
|
| - InstallFiles(GetNinjaOutDir('arm'), tools_dir, arm_files)
|
| + InstallFiles(GetNinjaOutDir('x64'), tools_dir, tools_files_x64)
|
| + InstallFiles(GetNinjaOutDir('x86'), tools_dir, tools_files_x86)
|
| + if platform == 'linux':
|
| + InstallFiles(GetNinjaOutDir('arm'), tools_dir, tools_files_arm)
|
|
|
| + stub_dir = os.path.join(SRC_DIR, 'ppapi/native_client/src/untrusted/irt_stub')
|
| for tc in toolchains:
|
| if tc in ('host', 'clang-newlib'):
|
| continue
|
| elif tc == 'pnacl':
|
| - xarches = (None, 'ia32', 'x64', 'arm')
|
| + xarches = ('pnacl', 'x86', 'x64', 'arm')
|
| elif tc in ('x86_glibc'):
|
| - xarches = ('ia32', 'x64')
|
| + xarches = ('x86', 'x64')
|
| elif tc == 'arm_glibc':
|
| xarches = ('arm',)
|
| else:
|
| raise AssertionError('unexpected toolchain value: %s' % tc)
|
|
|
| for xarch in xarches:
|
| - src_dir = GetGypBuiltLib(tc, xarch)
|
| + src_dir = GetGnBuiltLib(tc, xarch)
|
| + src_dir = os.path.join(src_dir, 'obj', 'ppapi', 'native_client', 'src',
|
| + 'untrusted', 'irt_stub')
|
| dst_dir = GetOutputToolchainLib(pepperdir, tc, xarch)
|
| - libc = GetToolchainLibc(tc)
|
| - InstallFiles(src_dir, dst_dir, TOOLCHAIN_LIBS[libc])
|
| -
|
| -
|
| -def GypNinjaBuild_NaCl(rel_out_dir):
|
| - gyp_py = os.path.join(NACL_DIR, 'build', 'gyp_nacl')
|
| - nacl_core_sdk_gyp = os.path.join(NACL_DIR, 'build', 'nacl_core_sdk.gyp')
|
| - all_gyp = os.path.join(NACL_DIR, 'build', 'all.gyp')
|
| -
|
| - out_dir_32 = MakeNinjaRelPath(rel_out_dir + '-ia32')
|
| - out_dir_64 = MakeNinjaRelPath(rel_out_dir + '-x64')
|
| - out_dir_arm = MakeNinjaRelPath(rel_out_dir + '-arm')
|
| -
|
| - GypNinjaBuild('ia32', gyp_py, nacl_core_sdk_gyp, 'nacl_core_sdk', out_dir_32)
|
| - GypNinjaBuild('x64', gyp_py, nacl_core_sdk_gyp, 'nacl_core_sdk', out_dir_64)
|
| - GypNinjaBuild('arm', gyp_py, nacl_core_sdk_gyp, 'nacl_core_sdk', out_dir_arm)
|
| - GypNinjaBuild('x64', gyp_py, all_gyp, 'ncval_new', out_dir_64)
|
| -
|
| -
|
| -def GypNinjaBuild_Breakpad(rel_out_dir):
|
| - # TODO(binji): dump_syms doesn't currently build on Windows. See
|
| - # http://crbug.com/245456
|
| - if getos.GetPlatform() == 'win':
|
| - return
|
| -
|
| - gyp_py = os.path.join(SRC_DIR, 'build', 'gyp_chromium')
|
| - out_dir = MakeNinjaRelPath(rel_out_dir)
|
| - gyp_file = os.path.join(SRC_DIR, 'breakpad', 'breakpad.gyp')
|
| - build_list = ['dump_syms', 'minidump_dump', 'minidump_stackwalk']
|
| - GypNinjaBuild('x64', gyp_py, gyp_file, build_list, out_dir)
|
| + InstallFiles(src_dir, dst_dir, ['libppapi_stub.a'])
|
| + InstallFiles(stub_dir, dst_dir, ['libppapi.a'])
|
| + if 'glibc' in tc:
|
| + InstallFiles(stub_dir, dst_dir, ['libppapi.so'])
|
|
|
|
|
| -def GypNinjaBuild_PPAPI(arch, rel_out_dir):
|
| - gyp_py = os.path.join(SRC_DIR, 'build', 'gyp_chromium')
|
| - out_dir = MakeNinjaRelPath(rel_out_dir)
|
| - gyp_file = os.path.join(SRC_DIR, 'ppapi', 'native_client',
|
| - 'native_client.gyp')
|
| - GypNinjaBuild(arch, gyp_py, gyp_file, 'ppapi_lib', out_dir)
|
| +def GnNinjaBuildAll(rel_out_dir):
|
| + def MakeNinjaRelPath(suffix):
|
| + return os.path.join(os.path.relpath(OUT_DIR, SRC_DIR), rel_out_dir + suffix)
|
|
|
| + GnNinjaBuild('x64', MakeNinjaRelPath('-x64'),
|
| + ['nacl_sdk_untrusted=true'])
|
| + GnNinjaBuild('x86', MakeNinjaRelPath('-x86'))
|
|
|
| -def GypNinjaBuild_Pnacl(arch, rel_out_dir):
|
| - # TODO(binji): This will build the pnacl_irt_shim twice; once as part of the
|
| - # Chromium build, and once here. When we move more of the SDK build process
|
| - # to gyp, we can remove this.
|
| - gyp_py = os.path.join(SRC_DIR, 'build', 'gyp_chromium')
|
| + platform = getos.GetPlatform()
|
| + if platform == 'linux':
|
| + GnNinjaBuild('arm', MakeNinjaRelPath('-arm'))
|
|
|
| - out_dir = MakeNinjaRelPath(rel_out_dir)
|
| - gyp_file = os.path.join(SRC_DIR, 'ppapi', 'native_client', 'src',
|
| - 'untrusted', 'pnacl_irt_shim', 'pnacl_irt_shim.gyp')
|
| - GypNinjaBuild(arch, gyp_py, gyp_file, 'aot', out_dir)
|
|
|
| +def GnNinjaBuild(arch, out_dir, extra_gn_args=None):
|
| + gn_args = ['is_debug=false']
|
| + if extra_gn_args is not None:
|
| + gn_args += extra_gn_args
|
| + platform = getos.GetPlatform()
|
| + if platform == 'mac':
|
| + if options.mac_sdk:
|
| + gn_args.append('mac_sdk_min="%s"' % options.mac_sdk)
|
| + # Without this the target_cpu='arm' build complains about missing code
|
| + # signing identity
|
| + gn_args.append('use_ios_simulator=true')
|
|
|
| -def GypNinjaBuild(arch, gyp_py_script, gyp_file, targets, out_dir):
|
| - gyp_env = dict(os.environ)
|
| - gyp_defines = []
|
| - if options.mac_sdk:
|
| - gyp_defines.append('mac_sdk=%s' % options.mac_sdk)
|
| + gn_exe = 'gn'
|
| + if platform == 'win':
|
| + gn_exe += '.bat'
|
|
|
| if arch is not None:
|
| - gyp_defines.append('target_arch=%s' % arch)
|
| + gn_args.append('target_cpu="%s"' % arch)
|
| if arch == 'arm':
|
| - gyp_env['GYP_CROSSCOMPILE'] = '1'
|
| if options.no_arm_trusted:
|
| - gyp_defines.append('disable_cross_trusted=1')
|
| -
|
| - gyp_env['GYP_DEFINES'] = ' '.join(gyp_defines)
|
| - # We can't use windows path separators in GYP_GENERATOR_FLAGS since
|
| - # gyp uses shlex to parse them and treats '\' as an escape char.
|
| - gyp_env['GYP_GENERATOR_FLAGS'] = 'output_dir=%s' % out_dir.replace('\\', '/')
|
| -
|
| - # Print relevant environment variables
|
| - for key, value in gyp_env.iteritems():
|
| - if key.startswith('GYP') or key in ('CC',):
|
| - print ' %s="%s"' % (key, value)
|
| -
|
| - buildbot_common.Run(
|
| - [sys.executable, gyp_py_script, gyp_file, '--depth=.'],
|
| - cwd=SRC_DIR,
|
| - env=gyp_env)
|
| + gn_args.append('enable_cross_trusted=false')
|
|
|
| - NinjaBuild(targets, out_dir, arch)
|
| + gn_args = ' '.join(gn_args)
|
| + buildbot_common.Run([gn_exe, 'gen', '--args=%s' % gn_args, out_dir],
|
| + cwd=SRC_DIR)
|
|
|
| -
|
| -def NinjaBuild(targets, out_dir, arch):
|
| - if type(targets) is not list:
|
| - targets = [targets]
|
| - out_config_dir = os.path.join(out_dir, GetConfigDir(arch))
|
| - buildbot_common.Run(['ninja', '-C', out_config_dir] + targets, cwd=SRC_DIR)
|
| + buildbot_common.Run(['ninja', '-C', out_dir, 'nacl_core_sdk'], cwd=SRC_DIR)
|
|
|
|
|
| def BuildStepBuildToolchains(pepperdir, toolchains, build, clean):
|
| buildbot_common.BuildStep('SDK Items')
|
|
|
| if clean:
|
| - for dirname in glob.glob(os.path.join(OUT_DIR, GYPBUILD_DIR + '*')):
|
| + for dirname in glob.glob(os.path.join(OUT_DIR, GNBUILD_DIR + '*')):
|
| buildbot_common.RemoveDir(dirname)
|
| build = True
|
|
|
| if build:
|
| - GypNinjaBuild_NaCl(GYPBUILD_DIR)
|
| - GypNinjaBuild_Breakpad(GYPBUILD_DIR + '-x64')
|
| -
|
| - if 'x86_glibc' in toolchains or 'pnacl' in toolchains:
|
| - GypNinjaBuild_PPAPI('ia32', GYPBUILD_DIR + '-ia32')
|
| - GypNinjaBuild_PPAPI('x64', GYPBUILD_DIR + '-x64')
|
| -
|
| - if 'arm_glibc' in toolchains or 'pnacl' in toolchains:
|
| - GypNinjaBuild_PPAPI('arm', GYPBUILD_DIR + '-arm')
|
| + GnNinjaBuildAll(GNBUILD_DIR)
|
|
|
| - if 'pnacl' in toolchains:
|
| - # NOTE: For ia32, gyp builds both x86-32 and x86-64 by default.
|
| - for arch in ('ia32', 'arm'):
|
| - # Fill in the latest native pnacl shim library from the chrome build.
|
| - build_dir = GYPBUILD_DIR + '-pnacl-' + arch
|
| - GypNinjaBuild_Pnacl(arch, build_dir)
|
| -
|
| - GypNinjaInstall(pepperdir, toolchains)
|
| + GnNinjaInstall(pepperdir, toolchains)
|
|
|
| for toolchain in toolchains:
|
| if toolchain not in ('host', 'clang-newlib'):
|
| @@ -544,30 +460,21 @@ def BuildStepBuildToolchains(pepperdir, toolchains, build, clean):
|
|
|
|
|
| if 'pnacl' in toolchains:
|
| - # NOTE: For ia32, gyp builds both x86-32 and x86-64 by default.
|
| - for arch in ('ia32', 'arm'):
|
| - # Fill in the latest native pnacl shim library from the chrome build.
|
| - build_dir = GYPBUILD_DIR + '-pnacl-' + arch
|
| - if arch == 'ia32':
|
| - nacl_arches = ['x86-32', 'x86-64']
|
| - elif arch == 'arm':
|
| - nacl_arches = ['arm']
|
| - else:
|
| - buildbot_common.ErrorExit('Unknown architecture: %s' % arch)
|
| - for nacl_arch in nacl_arches:
|
| - release_build_dir = os.path.join(OUT_DIR, build_dir, 'Release',
|
| - 'gen', 'tc_pnacl_translate',
|
| - 'lib-' + nacl_arch)
|
| -
|
| - pnacldir = GetToolchainDir(pepperdir, 'pnacl')
|
| - pnacl_translator_lib_dir = GetPNaClTranslatorLib(pnacldir, nacl_arch)
|
| - if not os.path.isdir(pnacl_translator_lib_dir):
|
| - buildbot_common.ErrorExit('Expected %s directory to exist.' %
|
| - pnacl_translator_lib_dir)
|
| -
|
| - buildbot_common.CopyFile(
|
| - os.path.join(release_build_dir, 'libpnacl_irt_shim.a'),
|
| - pnacl_translator_lib_dir)
|
| + # NOTE: gn build all untrusted code in the x86 build
|
| + build_dir = GetNinjaOutDir('x64')
|
| + nacl_arches = ['x86', 'x64', 'arm']
|
| + for nacl_arch in nacl_arches:
|
| + shim_file = os.path.join(build_dir, 'clang_newlib_' + nacl_arch, 'obj',
|
| + 'ppapi', 'native_client', 'src', 'untrusted',
|
| + 'pnacl_irt_shim', 'libpnacl_irt_shim.a')
|
| +
|
| + pnacldir = GetToolchainDir(pepperdir, 'pnacl')
|
| + pnacl_translator_lib_dir = GetPNaClTranslatorLib(pnacldir, nacl_arch)
|
| + if not os.path.isdir(pnacl_translator_lib_dir):
|
| + buildbot_common.ErrorExit('Expected %s directory to exist.' %
|
| + pnacl_translator_lib_dir)
|
| +
|
| + buildbot_common.CopyFile(shim_file, pnacl_translator_lib_dir)
|
|
|
| InstallNaClHeaders(GetToolchainNaClInclude(pepperdir, 'pnacl', 'x86'),
|
| 'pnacl')
|
| @@ -813,7 +720,7 @@ def main(args):
|
| parser.add_argument('--skip-toolchain', help='Skip toolchain untar',
|
| action='store_true')
|
| parser.add_argument('--no-clean', dest='clean', action='store_false',
|
| - help="Don't clean gypbuild directories")
|
| + help="Don't clean gn build directories")
|
| parser.add_argument('--mac-sdk',
|
| help='Set the mac-sdk (e.g. 10.6) to use when building with ninja.')
|
| parser.add_argument('--no-arm-trusted', action='store_true',
|
|
|