Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(296)

Unified Diff: toolchain_build/toolchain_build_pnacl.py

Issue 1458713003: Fix PNaCl toolchain build on Mac (Closed) Base URL: svn://svn.chromium.org/native_client/trunk/src/native_client
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: toolchain_build/toolchain_build_pnacl.py
diff --git a/toolchain_build/toolchain_build_pnacl.py b/toolchain_build/toolchain_build_pnacl.py
index 2b2a6d11d2eed3ca2dce4f4ac98d1a63121a5e53..ce1536b653e79013621d014240941c914f08b658 100755
--- a/toolchain_build/toolchain_build_pnacl.py
+++ b/toolchain_build/toolchain_build_pnacl.py
@@ -16,6 +16,7 @@ import fnmatch
import logging
import os
import shutil
+import subprocess
import sys
import zipfile
@@ -93,6 +94,11 @@ CHROME_CLANG = os.path.join(os.path.dirname(NACL_DIR), 'third_party',
'llvm-build', 'Release+Asserts', 'bin', 'clang')
CHROME_CLANGXX = CHROME_CLANG + '++'
+# Required SDK version and target version for Mac builds.
+# See MAC_SDK_FLAGS, below.
+MAC_SDK_MIN = '10.10'
+MAC_DEPLOYMENT_TARGET = '10.6'
+
# Redirectors are small shims acting like sym links with optional arguments.
# For mac/linux we simply use a shell script which create small redirector
# shell scripts. For windows we compile an executable which redirects to
@@ -150,6 +156,24 @@ def ProgramPath(program):
return None
+# Determine the extra compiler flags necessary for Mac. Do this once at
+# top level, rather than every time in CompilersForHost, because running
+# the external script is costly.
+def MacSdkFlags():
+ if not pynacl.platform.IsMac():
+ return []
+ mac_sdk_sysroot, mac_sdk_version = subprocess.check_output([
+ sys.executable,
+ os.path.join(os.path.dirname(NACL_DIR), 'build', 'mac', 'find_sdk.py'),
+ '--print_sdk_path',
+ MAC_SDK_MIN,
+ ]).splitlines()
+ return ['-isysroot', mac_sdk_sysroot,
+ '-mmacosx-version-min=' + MAC_DEPLOYMENT_TARGET]
+
+MAC_SDK_FLAGS = MacSdkFlags()
+
+
def InputsForCommands(commands):
"""Returns a dict of extra 'inputs' items for command names.
Each command name that is an absolute path gets an item named for
@@ -229,22 +253,25 @@ def HostArchToolFlags(host, extra_cflags, opts):
"""Return the appropriate CFLAGS, CXXFLAGS, and LDFLAGS based on host
and opts. Does not attempt to determine flags that are attached
to CC and CXX directly.
+
+ Returns the tuple (flags, deps) where 'flags' is a dictionary mapping
+ 'CFLAGS' et al to a list of arguments, and 'deps' is a list of extra
+ dependencies for a component using these flags.
"""
extra_cc_flags = list(extra_cflags)
result = { 'LDFLAGS' : [],
'CFLAGS' : [],
'CXXFLAGS' : []}
+ deps = []
if TripleIsWindows(host):
result['LDFLAGS'] += ['-L%(abs_libdl)s', '-ldl']
result['CFLAGS'] += ['-isystem','%(abs_libdl)s']
result['CXXFLAGS'] += ['-isystem', '%(abs_libdl)s']
+ deps.append('libdl')
else:
if TripleIsLinux(host) and not TripleIsX8664(host):
# Chrome clang defaults to 64-bit builds, even when run on 32-bit Linux.
extra_cc_flags += ['-m32']
- elif TripleIsMac(host):
- # This is required for building with recent libc++ against OSX 10.6
- extra_cc_flags += ['-U__STRICT_ANSI__']
if opts.gcc or host == 'le32-nacl':
result['CFLAGS'] += extra_cc_flags
result['CXXFLAGS'] += extra_cc_flags
@@ -256,7 +283,8 @@ def HostArchToolFlags(host, extra_cflags, opts):
'-stdlib=libc++',
'-I%(' + FlavoredName('abs_libcxx', host, opts) + ')s/include/c++/v1'] +
extra_cc_flags)
- return result
+ deps.append(FlavoredName('libcxx', host, opts))
+ return result, deps
def ConfigureHostArchFlags(host, extra_cflags, options, extra_configure=None,
@@ -264,8 +292,9 @@ def ConfigureHostArchFlags(host, extra_cflags, options, extra_configure=None,
"""Return flags passed to LLVM and binutils configure for compilers and
compile flags.
- Returns the tuple (flags, inputs) where 'flags' is a list of arguments to
- configure and 'inputs' is a dict of extra inputs to be hashed.
+ Returns the tuple (flags, inputs, deps) where 'flags' is a list of
+ arguments to configure, 'inputs' is a dict of extra inputs to be hashed,
+ and 'deps' is a list of extra dependencies for a component using these flags.
"""
configure_args = []
extra_cc_args = []
@@ -314,12 +343,17 @@ def ConfigureHostArchFlags(host, extra_cflags, options, extra_configure=None,
else:
cc_list = [cc]
cxx_list = [cxx]
+
+ if TripleIsMac(host):
+ cc_list += MAC_SDK_FLAGS
+ cxx_list += MAC_SDK_FLAGS
+
configure_args.append('CC=' + ' '.join(cc_list + extra_cc_args))
configure_args.append('CXX=' + ' '.join(cxx_list + extra_cxx_args))
configure_args.append('AR=' + ar)
configure_args.append('RANLIB=' + ranlib)
- tool_flags = HostArchToolFlags(host, extra_cflags, options)
+ tool_flags, tool_deps = HostArchToolFlags(host, extra_cflags, options)
configure_args.extend(
['CFLAGS=' + ' '.join(tool_flags['CFLAGS']),
'CXXFLAGS=' + ' '.join(tool_flags['CXXFLAGS']),
@@ -333,7 +367,7 @@ def ConfigureHostArchFlags(host, extra_cflags, options, extra_configure=None,
if is_cross:
# LLVM's linux->mingw cross build needs this
configure_args.append('CC_FOR_BUILD=gcc')
- return configure_args, InputsForCommands(hashables)
+ return configure_args, InputsForCommands(hashables), tool_deps
def LibCxxHostArchFlags(host):
@@ -345,14 +379,19 @@ def LibCxxHostArchFlags(host):
# Chrome clang defaults to 64-bit builds, even when run on 32-bit Linux
cmake_flags.extend(['-DCMAKE_C_FLAGS=-m32',
'-DCMAKE_CXX_FLAGS=-m32'])
+ elif TripleIsMac(host):
+ sdk_flags = ' '.join(MAC_SDK_FLAGS)
+ cmake_flags.extend(['-DCMAKE_C_FLAGS=' + sdk_flags,
+ '-DCMAKE_CXX_FLAGS=' + sdk_flags])
return cmake_flags, InputsForCommands(hashables)
def CmakeHostArchFlags(host, options):
"""Set flags passed to LLVM cmake for compilers and compile flags.
- Returns the tuple (flags, inputs) where 'flags' is a list of arguments to
- cmake and 'inputs' is a dict of extra inputs to be hashed.
+ Returns the tuple (flags, inputs, deps) where 'flags' is a list of
+ arguments to cmake, 'inputs' is a dict of extra inputs to be hashed,
+ and 'deps' is a list of extra dependencies for a component using these flags.
"""
cmake_flags = []
if options.afl_fuzz_dir:
@@ -370,23 +409,44 @@ def CmakeHostArchFlags(host, options):
# msan-enabled compiler_rt, leaving references to __msan_allocated_memory
# undefined.
cmake_flags.append('-DHAVE_SANITIZER_MSAN_INTERFACE_H=FALSE')
- tool_flags = HostArchToolFlags(host, [], options)
- cmake_flags.extend(['-DCMAKE_C_FLAGS=' + ' '.join(tool_flags['CFLAGS'])])
- cmake_flags.extend(['-DCMAKE_CXX_FLAGS=' + ' '.join(tool_flags['CXXFLAGS'])])
+ tool_flags, tool_deps = HostArchToolFlags(host, [], options)
+ cflags = tool_flags['CFLAGS']
+ cxxflags = tool_flags['CXXFLAGS']
+ if TripleIsMac(host):
+ cflags = MAC_SDK_FLAGS + cflags
+ cxxflags = MAC_SDK_FLAGS + cxxflags
+ cmake_flags.append('-DCMAKE_C_FLAGS=' + ' '.join(cflags))
+ cmake_flags.append('-DCMAKE_CXX_FLAGS=' + ' '.join(cxxflags))
for linker_type in ['EXE', 'SHARED', 'MODULE']:
cmake_flags.extend([('-DCMAKE_%s_LINKER_FLAGS=' % linker_type) +
' '.join(tool_flags['LDFLAGS'])])
- return cmake_flags, InputsForCommands(hashables)
+ return cmake_flags, InputsForCommands(hashables), tool_deps
-def ConfigureBinutilsCommon():
- return ['--with-pkgversion=' + PACKAGE_NAME,
- '--with-bugurl=' + BUG_URL,
- '--without-zlib',
- '--prefix=',
- '--disable-silent-rules',
- '--enable-deterministic-archives',
- ]
+def ConfigureBinutilsCommon(host, options, is_pnacl):
+ # Binutils still has some warnings when building with clang
+ if not options.gcc:
+ warning_flags = ['-Wno-extended-offsetof', '-Wno-absolute-value',
+ '-Wno-unused-function', '-Wno-unused-const-variable',
+ '-Wno-unneeded-internal-declaration',
+ '-Wno-unused-private-field', '-Wno-format-security']
+ else:
+ warning_flags = ['-Wno-unused-function', '-Wno-unused-value']
+
+ host_arch_flags, inputs, deps = ConfigureHostArchFlags(
+ host, warning_flags, options,
+ options.binutils_pnacl_extra_configure if is_pnacl else None)
+
+ flags = [
+ '--with-pkgversion=' + PACKAGE_NAME,
+ '--with-bugurl=' + BUG_URL,
+ '--without-zlib',
+ '--prefix=',
+ '--disable-silent-rules',
+ '--enable-deterministic-archives',
+ ] + host_arch_flags
+
+ return flags, inputs, deps
def LLVMConfigureAssertionsFlags(options):
if options.enable_llvm_assertions:
@@ -622,15 +682,6 @@ def HostTools(host, options):
binutils_do_werror = False
extra_gold_deps = [H('llvm')]
- # Binutils still has some warnings when building with clang
- if not options.gcc:
- warning_flags = ['-Wno-extended-offsetof', '-Wno-absolute-value',
- '-Wno-unused-function', '-Wno-unused-const-variable',
- '-Wno-unneeded-internal-declaration',
- '-Wno-unused-private-field', '-Wno-format-security']
- else:
- warning_flags = ['-Wno-unused-function', '-Wno-unused-value']
-
# The binutils git checkout includes all the directories in the
# upstream binutils-gdb.git repository, but some of these
# directories are not included in a binutils release tarball. The
@@ -651,22 +702,22 @@ def HostTools(host, options):
dummy_makefile, command.path.join(dir, 'Makefile')))
return commands
- binutils_host_arch_flags, binutils_inputs = ConfigureHostArchFlags(
- host, warning_flags, options, options.binutils_pnacl_extra_configure)
- binutils_inputs.update({'macros': os.path.join(
- NACL_DIR, 'pnacl', 'support', 'clang_direct', 'nacl-arm-macros.s')})
+ binutils_flags, binutils_inputs, binutils_deps = ConfigureBinutilsCommon(
+ host, options, True)
+ binutils_inputs['macros'] = os.path.join(
+ NACL_DIR, 'pnacl', 'support', 'clang_direct', 'nacl-arm-macros.s')
tools = {
# The binutils_pnacl package is used both for bitcode linking (gold) and
# for its conventional use with arm-nacl-clang.
H('binutils_pnacl'): {
- 'dependencies': ['binutils_pnacl_src'] + extra_gold_deps,
+ 'dependencies': (['binutils_pnacl_src'] +
+ extra_gold_deps + binutils_deps),
'type': 'build',
'inputs' : binutils_inputs,
'commands': [
command.SkipForIncrementalCommand([
'sh',
- '%(binutils_pnacl_src)s/configure'] +
- ConfigureBinutilsCommon() + binutils_host_arch_flags +
+ '%(binutils_pnacl_src)s/configure'] + binutils_flags +
[
'--enable-gold=yes',
'--enable-plugins',
@@ -746,17 +797,18 @@ def HostTools(host, options):
# Older CMake ignore CMAKE_*_LINKER_FLAGS during config step.
# https://public.kitware.com/Bug/view.php?id=14066
# The workaround is to set LDFLAGS in the environment.
- llvm_cmake_config_env = {'LDFLAGS': ' '.join(
- HostArchToolFlags(host, [], options)['LDFLAGS'])}
+ tool_flags, tool_deps = HostArchToolFlags(host, [], options)
+ llvm_cmake_config_env = {'LDFLAGS': ' '.join(tool_flags['LDFLAGS'])}
llvm_cmake_config_env.update(AflFuzzEnvMap(host, options))
- llvm_host_arch_flags, llvm_inputs = CmakeHostArchFlags(host, options)
- llvm_inputs.update({'test_xfails': os.path.join(NACL_DIR,
- 'pnacl', 'scripts')})
+ llvm_host_arch_flags, llvm_inputs, llvm_deps = CmakeHostArchFlags(
+ host, options)
+ llvm_deps = list(set(tool_deps + llvm_deps))
+ llvm_inputs['test_xfails'] = os.path.join(NACL_DIR, 'pnacl', 'scripts')
llvm_cmake = {
H('llvm'): {
'dependencies': ['clang_src', 'llvm_src', 'binutils_pnacl_src',
- 'subzero_src'],
+ 'subzero_src'] + llvm_deps,
'inputs': llvm_inputs,
'type': 'build',
'commands': [
@@ -798,14 +850,14 @@ def HostTools(host, options):
command.Remove(*[os.path.join('%(output)s', 'lib', f) for f
in '*.a', '*Hello.*', 'BugpointPasses.*']),
]
- llvm_host_arch_flags, llvm_inputs = ConfigureHostArchFlags(
+ llvm_host_arch_flags, llvm_inputs, llvm_deps = ConfigureHostArchFlags(
host, [], options, use_afl_fuzz=options.afl_fuzz_dir)
llvm_inputs.update({'test_xfails': os.path.join(NACL_DIR,
'pnacl', 'scripts')})
llvm_autoconf = {
H('llvm'): {
'dependencies': ['clang_src', 'llvm_src', 'binutils_pnacl_src',
- 'subzero_src'],
+ 'subzero_src'] + llvm_deps,
'inputs': llvm_inputs,
'type': 'build',
'commands': [
@@ -863,12 +915,6 @@ def HostTools(host, options):
tools.update(llvm_cmake)
else:
tools.update(llvm_autoconf)
- if TripleIsWindows(host):
- tools[H('binutils_pnacl')]['dependencies'].append('libdl')
- tools[H('llvm')]['dependencies'].append('libdl')
- elif not options.gcc and host != 'le32-nacl':
- tools[H('binutils_pnacl')]['dependencies'].append(H('libcxx'))
- tools[H('llvm')]['dependencies'].append(H('libcxx'))
return tools
@@ -977,17 +1023,22 @@ def HostToolsDirectToNacl(host, options):
args])
for tool, args in TOOL_X64_I686_REDIRECTS]
+ binutils_flags, binutils_inputs, binutils_deps = ConfigureBinutilsCommon(
+ host, options, False)
+ redirect_inputs.update(binutils_inputs)
tools.update({
H('binutils_x86'): {
'type': 'build',
- 'dependencies': ['binutils_x86_src'] + redirect_deps,
+ 'dependencies': ['binutils_x86_src'] + redirect_deps + binutils_deps,
'inputs': redirect_inputs,
'commands': [
command.SkipForIncrementalCommand(
- ['sh', '%(binutils_x86_src)s/configure'] +
- ConfigureBinutilsCommon() +
+ ['sh', '%(binutils_x86_src)s/configure'] + binutils_flags +
['--target=x86_64-nacl',
- '--enable-gold',
+ # TODO(mcgrathr): Enable gold if we rebase to 2.25.
+ # The 2.24 gold sources are not compatible with the libc++
+ # version we use to build.
+ '--disable-gold',
'--enable-targets=x86_64-nacl,i686-nacl',
'--disable-werror']),
command.Command(MakeCommand(host)),
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698