Build linux binaries against sid sysroot Additionally, this requires building against libstdc++ because there's no libc++ in the sysroot and we aren't currently set up to build libc++ locally. Because this has broken ChromeOS, use libstdc++ for now and resolve libc++ build later, if necessary. Unfortunately this doesn't seem to have changed the readelf -d output, but hopefully it will help CrOS? I'm not sure. Before: [(0c5d936b...)] scottmg@around:/work/gn$ readelf -d out/gn Dynamic section at offset 0x222270 contains 31 entries: Tag Type Name/Value 0x0000000000000001 (NEEDED) Shared library: [libc.so.6] 0x0000000000000001 (NEEDED) Shared library: [ld-linux-x86-64.so.2] 0x0000000000000001 (NEEDED) Shared library: [libgcc_s.so.1] 0x0000000000000001 (NEEDED) Shared library: [libm.so.6] 0x0000000000000001 (NEEDED) Shared library: [libpthread.so.0] 0x0000000000000001 (NEEDED) Shared library: [librt.so.1] 0x0000000000000001 (NEEDED) Shared library: [libatomic.so.1] After: [linux-sysroot] scottmg@around:/work/gn$ readelf -d out/gn Dynamic section at offset 0x25cc68 contains 31 entries: Tag Type Name/Value 0x0000000000000001 (NEEDED) Shared library: [libc.so.6] 0x0000000000000001 (NEEDED) Shared library: [ld-linux-x86-64.so.2] 0x0000000000000001 (NEEDED) Shared library: [libgcc_s.so.1] 0x0000000000000001 (NEEDED) Shared library: [libm.so.6] 0x0000000000000001 (NEEDED) Shared library: [libpthread.so.0] 0x0000000000000001 (NEEDED) Shared library: [librt.so.1] 0x0000000000000001 (NEEDED) Shared library: [libatomic.so.1] ... Bug: chromium:855791 Change-Id: I1fd8574cdfa5fd856e0fb27d734d15135a00b99a Reviewed-on: https://gn-review.googlesource.com/1900 Reviewed-by: Dirk Pranke <dpranke@chromium.org> Commit-Queue: Scott Graham <scottmg@chromium.org>
diff --git a/.gitignore b/.gitignore index 4c20aff..455d57f 100644 --- a/.gitignore +++ b/.gitignore
@@ -39,6 +39,7 @@ .gdb_history .gdbinit .landmines +.linux-sysroot/ .metadata .project .pydevproject
diff --git a/build/gen.py b/build/gen.py index a0796fb..483d3f0 100755 --- a/build/gen.py +++ b/build/gen.py
@@ -7,7 +7,6 @@ import contextlib import errno -import logging import optparse import os import platform @@ -15,6 +14,7 @@ import subprocess import sys import tempfile +import urllib2 SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) REPO_ROOT = os.path.dirname(SCRIPT_DIR) @@ -30,22 +30,64 @@ parser = optparse.OptionParser(description=sys.modules[__name__].__doc__) parser.add_option('-d', '--debug', action='store_true', help='Do a debug build. Defaults to release build.') - parser.add_option('-v', '--verbose', action='store_true', - help='Log more details') options, args = parser.parse_args(argv) if args: parser.error('Unrecognized command line arguments: %s.' % ', '.join(args)) - logging.basicConfig(level=logging.DEBUG if options.verbose else logging.ERROR) + linux_sysroot = UpdateLinuxSysroot() if is_linux else None out_dir = os.path.join(REPO_ROOT, 'out') if not os.path.isdir(out_dir): os.makedirs(out_dir) - write_gn_ninja(os.path.join(out_dir, 'build.ninja'), options) + write_gn_ninja(os.path.join(out_dir, 'build.ninja'), options, linux_sysroot) return 0 +def UpdateLinuxSysroot(): + # Sysroot revision from: + # https://cs.chromium.org/chromium/src/build/linux/sysroot_scripts/sysroots.json + server = 'https://commondatastorage.googleapis.com' + path = 'chrome-linux-sysroot/toolchain' + revision = '1015a998c2adf188813cca60b558b0ea1a0b6ced' + filename = 'debian_sid_amd64_sysroot.tar.xz' + + url = '%s/%s/%s/%s' % (server, path, revision, filename) + + sysroot = os.path.join(SCRIPT_DIR, os.pardir, '.linux-sysroot') + + stamp = os.path.join(sysroot, '.stamp') + if os.path.exists(stamp): + with open(stamp) as s: + if s.read() == url: + return sysroot + + print 'Installing Debian root image from %s' % url + + if os.path.isdir(sysroot): + shutil.rmtree(sysroot) + os.mkdir(sysroot) + tarball = os.path.join(sysroot, filename) + print 'Downloading %s' % url + + for _ in range(3): + response = urllib2.urlopen(url) + with open(tarball, 'wb') as f: + f.write(response.read()) + break + else: + raise Exception('Failed to download %s' % url) + + subprocess.check_call(['tar', 'xf', tarball, '-C', sysroot]) + + os.remove(tarball) + + with open(stamp, 'w') as s: + s.write(url) + + return sysroot + + def write_generic_ninja(path, static_libraries, executables, cc, cxx, ar, ld, options, cflags=[], cflags_cc=[], ldflags=[], libflags=[], @@ -149,7 +191,7 @@ os.path.relpath(template_filename, os.path.dirname(path)) + '\n') -def write_gn_ninja(path, options): +def write_gn_ninja(path, options, linux_sysroot): if is_win: cc = os.environ.get('CC', 'cl.exe') cxx = os.environ.get('CXX', 'cl.exe') @@ -185,6 +227,18 @@ '-fno-rtti', ]) cflags_cc.extend(['-std=c++14', '-Wno-c++11-narrowing']) + + if is_linux: + # Use the sid sysroot that UpdateLinuxSysroot() downloads. We need to + # force the used of libstdc++ for now because libc++ is not in that + # sysroot and we don't currently have a local build of that. We should + # probably resolve this and (re-)add a way to build against libc++. + cflags.extend(['--sysroot=' + linux_sysroot, + '-stdlib=libstdc++']) + ldflags.extend(['--sysroot=' + linux_sysroot, + '-rtlib=libgcc', + '-static-libstdc++', + '-stdlib=libstdc++']) elif is_win: if not options.debug: cflags.extend(['/Ox', '/DNDEBUG', '/GL'])