X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fnative_client%2Ftoolchain_build%2Ftoolchain_build.py;h=125198974c3b7431e681829f2fd7d535b0e1660a;hb=ff3e2503a20db9193d323c1d19c38c68004dec4a;hp=352252bd1c50eeeeb04981d2bb57ffa7b61f69eb;hpb=d1e23c6ec4202b125fc446349b2230d4cd978d86;p=platform%2Fframework%2Fweb%2Fcrosswalk.git diff --git a/src/native_client/toolchain_build/toolchain_build.py b/src/native_client/toolchain_build/toolchain_build.py index 352252b..1251989 100755 --- a/src/native_client/toolchain_build/toolchain_build.py +++ b/src/native_client/toolchain_build/toolchain_build.py @@ -17,27 +17,64 @@ import sys import command import gsd_storage import toolchain_main +import repo_tools SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) NACL_DIR = os.path.dirname(SCRIPT_DIR) +# See command.GenerateGitPatches for the schema of entries in this dict. +# Additionally, each may contain a 'repo' key whose value is the name +# to use in place of the package name when calling GitUrl (below). GIT_REVISIONS = { - 'binutils': '38dbda270a4248ab5b7facc012b9c8d8527f6fb2', - 'gcc': '145a627d95b98f54915d037dddbcbb0f7b283494', - 'newlib': 'cc9ce45891a45ecfbc671f4a6f1b06ba60a55ad9', + 'binutils': { + 'rev': '38dbda270a4248ab5b7facc012b9c8d8527f6fb2', + 'upstream-branch': 'upstream/binutils-2_24-branch', + 'upstream-name': 'binutils-2.24', + # This is tag binutils-2_24, but Gerrit won't let us push + # non-annotated tags, and the upstream tag is not annotated. + 'upstream-base': '237df3fa4a1d939e6fd1af0c3e5029a25a137310', + }, + 'gcc': { + 'rev': '145a627d95b98f54915d037dddbcbb0f7b283494', + 'upstream-branch': 'upstream/gcc-4_8-branch', + 'upstream-name': 'gcc-4.8.2', + # Upstream tag gcc-4_8_2-release: + 'upstream-base': '9bcca88e24e64d4e23636aafa3404088b13bcb0e', + }, + 'newlib': { + 'rev': 'a9ae3c60b36dea3d8a10e18b1b6db952d21268c2', + 'upstream-branch': 'upstream/master', + 'upstream-name': 'newlib-2.0.0', + # Upstream tag newlib_2_0_0: + 'upstream-base': 'c3fc84e062cacc2b3e13c1f6b9151d0cc85392ba', + }, + 'gdb': { + 'rev': '41afdf9d511d95073c4403c838d8ccba582d8eed', + 'repo': 'binutils', + 'upstream-branch': 'upstream/gdb-7.7-branch', + 'upstream-name': 'gdb-7.7', + # Upstream tag gdb-7.7-release: + 'upstream-base': 'fe284cd86ba9761655a9281fef470d364e27eb85', + }, } TAR_FILES = { 'gmp': command.path.join('gmp', 'gmp-5.1.3.tar.bz2'), 'mpfr': command.path.join('mpfr', 'mpfr-3.1.2.tar.bz2'), 'mpc': command.path.join('mpc', 'mpc-1.0.2.tar.gz'), - 'isl': command.path.join('cloog', 'isl-0.12.1.tar.bz2'), + 'isl': command.path.join('cloog', 'isl-0.12.2.tar.bz2'), 'cloog': command.path.join('cloog', 'cloog-0.18.1.tar.gz'), + 'expat': command.path.join('expat', 'expat-2.0.1.tar.gz'), } GIT_BASE_URL = 'https://chromium.googlesource.com/native_client' +def GitUrl(package): + repo = GIT_REVISIONS[package].get('repo', package) + return '%s/nacl-%s.git' % (GIT_BASE_URL, repo) + + def CollectSources(): sources = {} @@ -59,14 +96,23 @@ def CollectSources(): ], } - for package in GIT_REVISIONS: + patch_packages = [] + patch_commands = [] + for package, info in GIT_REVISIONS.iteritems(): sources[package] = { 'type': 'source', - 'commands': [ - command.SyncGitRepo('%s/nacl-%s.git' % (GIT_BASE_URL, package), - '%(output)s', GIT_REVISIONS[package]) - ] + 'commands': [command.SyncGitRepo(GitUrl(package), '%(output)s', + info['rev'])], } + patch_packages.append(package) + patch_commands.append( + command.GenerateGitPatches('%(' + package + ')s/.git', info)) + + sources['patches'] = { + 'type': 'build', + 'dependencies': patch_packages, + 'commands': patch_commands, + } # The gcc_libs component gets the whole GCC source tree. sources['gcc_libs'] = sources['gcc'] @@ -122,16 +168,32 @@ def CollectSources(): return sources +# Canonical tuples we use for hosts. +WINDOWS_HOST_TUPLE = 'i686-w64-mingw32' +MAC_HOST_TUPLE = 'x86_64-apple-darwin' +ARM_HOST_TUPLE = 'arm-linux-gnueabihf' +LINUX_X86_32_TUPLE = 'i686-linux' +LINUX_X86_64_TUPLE = 'x86_64-linux' + # Map of native host tuple to extra tuples that it cross-builds for. EXTRA_HOSTS_MAP = { - 'i686-linux': [ - 'arm-linux-gnueabihf', - # TODO(mcgrathr): Enable this if the binaries are proven to - # actually work, and bots get needed mingw* packages installed. - #'i686-w64-mingw32', + LINUX_X86_64_TUPLE: [ + LINUX_X86_32_TUPLE, + ARM_HOST_TUPLE, + WINDOWS_HOST_TUPLE, ], } +# Map of native host tuple to host tuples that are "native enough". +# For these hosts, we will do a native-style build even though it's +# not the native tuple, just passing some extra compiler flags. +NATIVE_ENOUGH_MAP = { + LINUX_X86_64_TUPLE: { + LINUX_X86_32_TUPLE: ['-m32'], + }, + } + + # The list of targets to build toolchains for. TARGET_LIST = ['arm', 'i686'] @@ -161,17 +223,18 @@ REMOVE_INFO_DIR = command.Remove(command.path.join('%(output)s', def ConfigureHostArch(host): configure_args = [] - native, extra_cc_args = NativeTuple() - is_cross = host != native + is_cross = CrossCompiling(host) if is_cross: extra_cc_args = [] configure_args.append('--host=' + host) - elif extra_cc_args: - # The host we've chosen is "native enough", such as x86-32 on x86-64. - # But it's not what config.guess will yield, so we need to supply - # a --build switch to ensure things build correctly. - configure_args.append('--build=' + host) + else: + extra_cc_args = NATIVE_ENOUGH_MAP.get(NATIVE_TUPLE, {}).get(host, []) + if extra_cc_args: + # The host we've chosen is "native enough", such as x86-32 on x86-64. + # But it's not what config.guess will yield, so we need to supply + # a --build switch to ensure things build correctly. + configure_args.append('--build=' + host) extra_cxx_args = list(extra_cc_args) if fnmatch.fnmatch(host, '*-linux*'): @@ -244,8 +307,7 @@ def MakeCommand(host, extra_args=[]): # Return the 'make check' command to run. # When cross-compiling, don't try to run test suites. def MakeCheckCommand(host): - native, _ = NativeTuple() - if host != native: + if CrossCompiling(host): return ['true'] return MAKE_CHECK_CMD @@ -467,6 +529,22 @@ def HostGccLibs(host): '%(output)s', 'lib', 'pkgconfig')), ], }, + H('expat'): { + 'type': 'build', + 'dependencies': ['expat'], + 'commands': [ + command.Command(ConfigureCommand('expat') + + ConfigureHostLib(host)), + command.Command(MakeCommand(host)), + command.Command(MakeCheckCommand(host)), + command.Command(MAKE_DESTDIR_CMD + [ + # expat does not support the install-strip target. + 'installlib', + 'INSTALL=%(expat)s/conftools/install-sh -c -s', + 'INSTALL_DATA=%(expat)s/conftools/install-sh -c -m 644', + ]), + ], + }, } return host_gcc_libs @@ -485,11 +563,10 @@ def ConfigureCommand(source_component): # When doing a Canadian cross, we need native-hosted cross components # to do the GCC build. def GccDeps(host, target): - native, _ = NativeTuple() components = ['binutils_' + target] - if host != native: + if CrossCompiling(host): components.append('gcc_' + target) - host = native + host = NATIVE_TUPLE return [ForHost(component, host) for component in components] @@ -501,7 +578,6 @@ def GccCommand(host, target, cmd): def ConfigureGccCommand(source_component, host, target, extra_args=[]): - target_cflagstr = ' '.join(CommonTargetCflags(target)) return GccCommand( host, target, @@ -521,8 +597,6 @@ def ConfigureGccCommand(source_component, host, target, extra_args=[]): '--with-linker-hash-style=gnu', '--enable-linker-build-id', '--enable-languages=c,c++,lto', - 'CFLAGS_FOR_TARGET=' + target_cflagstr, - 'CXXFLAGS_FOR_TARGET=' + target_cflagstr, ] + extra_args) @@ -603,18 +677,45 @@ def HostTools(host, target): # Note we include COPYING.RUNTIME here and not with gcc_libs. ] + InstallDocFiles('gcc', ['COPYING3', 'COPYING.RUNTIME']), }, - } - return tools + # GDB can support all the targets in one host tool. + H('gdb'): { + 'type': 'build', + 'dependencies': ['gdb', H('expat')], + 'commands': [ + command.Command( + ConfigureCommand('gdb') + + ConfigureHostTool(host) + [ + '--target=x86_64-nacl', + '--enable-targets=arm-none-eabi-nacl', + '--with-expat', + 'CPPFLAGS=-I%(abs_' + H('expat') + ')s/include', + 'LDFLAGS=-L%(abs_' + H('expat') + ')s/lib', + ] + + (['--without-python'] if HostIsWindows(host) else []) + + # TODO(mcgrathr): The default -Werror only breaks because + # the OSX default compiler is an old front-end that does + # not understand all the GCC options. Maybe switch to + # using clang (system or Chromium-supplied) on Mac. + (['--disable-werror'] if HostIsMac(host) else [])), + command.Command(MakeCommand(host) + ['all-gdb']), + command.Command(MAKE_DESTDIR_CMD + [ + '-C', 'gdb', 'install-strip', + ]), + REMOVE_INFO_DIR, + ] + InstallDocFiles('gdb', [ + 'COPYING3', + command.path.join('gdb', 'NEWS'), + ]), + }, + } -# configure defaults to -g -O2 but passing an explicit option overrides that. -# So we have to list -g -O2 explicitly since we need to add -mtp=soft. -def CommonTargetCflags(target): - options = ['-g', '-O2'] - if target == 'arm': - options.append('-mtp=soft') - return options + # TODO(mcgrathr): The ARM cross environment does not supply a termcap + # library, so it cannot build GDB. + if host.startswith('arm') and CrossCompiling(host): + del tools[H('gdb')] + return tools def TargetCommands(host, target, command_list): # First we have to copy the host tools into a common directory. @@ -654,7 +755,6 @@ def TargetLibs(host, target): '--enable-newlib-io-c99-formats', '--enable-newlib-mb', 'CFLAGS=-O2', - 'CFLAGS_FOR_TARGET=' + ' '.join(CommonTargetCflags(target)), 'INSTALL_DATA=' + newlib_install_data, ] @@ -726,23 +826,39 @@ def NativeTuple(): if sys.platform.startswith('linux'): machine = platform.machine().lower() if machine.startswith('arm'): - return ('arm-linux-gnueabihf', []) + # TODO(mcgrathr): How to distinguish gnueabi vs gnueabihf? + return ARM_HOST_TUPLE + if fnmatch.fnmatch(machine, 'i?86*'): + return LINUX_X86_32_TUPLE if any(fnmatch.fnmatch(machine, pattern) for pattern in - ['x86_64*', 'amd64*', 'x64*', 'i?86*']): - # We build the tools for x86-32 hosts so they will run on either x86-32 - # or x86-64 hosts (with the right compatibility libraries installed). - # So for an x86-64 host, we call x86-32 the "native" machine. - return ('i686-linux', ['-m32']) + ['x86_64*', 'amd64*', 'x64*']): + return LINUX_X86_64_TUPLE raise Exception('Machine %s not recognized' % machine) elif sys.platform.startswith('win'): - return ('i686-w64-mingw32', []) + return WINDOWS_HOST_TUPLE elif sys.platform.startswith('darwin'): - return ('x86_64-apple-darwin', []) + return MAC_HOST_TUPLE raise Exception('Platform %s not recognized' % sys.platform) +# Compute it once. +NATIVE_TUPLE = NativeTuple() + + +# For our purposes, "cross-compiling" means not literally that we are +# targetting a host that does not match NATIVE_TUPLE, but that we are +# targetting a host whose binaries we cannot run locally. So x86-32 +# on x86-64 does not count as cross-compiling. See NATIVE_ENOUGH_MAP, above. +def CrossCompiling(host): + return (host != NATIVE_TUPLE and + host not in NATIVE_ENOUGH_MAP.get(NATIVE_TUPLE, {})) + def HostIsWindows(host): - return host == 'i686-w64-mingw32' + return host == WINDOWS_HOST_TUPLE + + +def HostIsMac(host): + return host == MAC_HOST_TUPLE # We build target libraries only on Linux for two reasons: @@ -754,7 +870,7 @@ def HostIsWindows(host): # official builder bot. That will serve as a test of the host tools # on the other host platforms. def BuildTargetLibsOn(host): - return host == 'i686-linux' + return host == LINUX_X86_64_TUPLE def CollectPackagesForHost(host, targets): @@ -769,10 +885,9 @@ def CollectPackagesForHost(host, targets): def CollectPackages(targets): packages = CollectSources() - native, _ = NativeTuple() - packages.update(CollectPackagesForHost(native, targets)) + packages.update(CollectPackagesForHost(NATIVE_TUPLE, targets)) - for host in EXTRA_HOSTS_MAP.get(native, []): + for host in EXTRA_HOSTS_MAP.get(NATIVE_TUPLE, []): packages.update(CollectPackagesForHost(host, targets)) return packages