Skip to content

Improve startup time of bootstrap #111562

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
May 26, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
93 changes: 44 additions & 49 deletions src/bootstrap/bootstrap.py
Original file line number Diff line number Diff line change
Expand Up @@ -226,16 +226,13 @@ def format_build_time(duration):

def default_build_triple(verbose):
"""Build triple as in LLVM"""
# If the user already has a host build triple with an existing `rustc`
# install, use their preference. This fixes most issues with Windows builds
# being detected as GNU instead of MSVC.
# If we're on Windows and have an existing `rustc` toolchain, use `rustc --version --verbose`
# to find our host target triple. This fixes an issue with Windows builds being detected
# as GNU instead of MSVC.
# Otherwise, detect it via `uname`
default_encoding = sys.getdefaultencoding()

if sys.platform == 'darwin':
if verbose:
print("not using rustc detection as it is unreliable on macOS", file=sys.stderr)
print("falling back to auto-detect", file=sys.stderr)
else:
if platform_is_win32():
try:
version = subprocess.check_output(["rustc", "--version", "--verbose"],
stderr=subprocess.DEVNULL)
Expand All @@ -253,19 +250,17 @@ def default_build_triple(verbose):
print("falling back to auto-detect", file=sys.stderr)

required = not platform_is_win32()
ostype = require(["uname", "-s"], exit=required)
cputype = require(['uname', '-m'], exit=required)
uname = require(["uname", "-smp"], exit=required)

# If we do not have `uname`, assume Windows.
if ostype is None or cputype is None:
if uname is None:
return 'x86_64-pc-windows-msvc'

ostype = ostype.decode(default_encoding)
cputype = cputype.decode(default_encoding)
kernel, cputype, processor = uname.decode(default_encoding).split()

# The goal here is to come up with the same triple as LLVM would,
# at least for the subset of platforms we're willing to target.
ostype_mapper = {
kerneltype_mapper = {
'Darwin': 'apple-darwin',
'DragonFly': 'unknown-dragonfly',
'FreeBSD': 'unknown-freebsd',
Expand All @@ -275,17 +270,18 @@ def default_build_triple(verbose):
}

# Consider the direct transformation first and then the special cases
if ostype in ostype_mapper:
ostype = ostype_mapper[ostype]
elif ostype == 'Linux':
os_from_sp = subprocess.check_output(
['uname', '-o']).strip().decode(default_encoding)
if os_from_sp == 'Android':
ostype = 'linux-android'
if kernel in kerneltype_mapper:
kernel = kerneltype_mapper[kernel]
elif kernel == 'Linux':
# Apple doesn't support `-o` so this can't be used in the combined
# uname invocation above
ostype = require(["uname", "-o"], exit=required).decode(default_encoding)
if ostype == 'Android':
kernel = 'linux-android'
else:
ostype = 'unknown-linux-gnu'
elif ostype == 'SunOS':
ostype = 'pc-solaris'
kernel = 'unknown-linux-gnu'
elif kernel == 'SunOS':
kernel = 'pc-solaris'
# On Solaris, uname -m will return a machine classification instead
# of a cpu type, so uname -p is recommended instead. However, the
# output from that option is too generic for our purposes (it will
Expand All @@ -294,34 +290,34 @@ def default_build_triple(verbose):
cputype = require(['isainfo', '-k']).decode(default_encoding)
# sparc cpus have sun as a target vendor
if 'sparc' in cputype:
ostype = 'sun-solaris'
elif ostype.startswith('MINGW'):
kernel = 'sun-solaris'
elif kernel.startswith('MINGW'):
# msys' `uname` does not print gcc configuration, but prints msys
# configuration. so we cannot believe `uname -m`:
# msys1 is always i686 and msys2 is always x86_64.
# instead, msys defines $MSYSTEM which is MINGW32 on i686 and
# MINGW64 on x86_64.
ostype = 'pc-windows-gnu'
kernel = 'pc-windows-gnu'
cputype = 'i686'
if os.environ.get('MSYSTEM') == 'MINGW64':
cputype = 'x86_64'
elif ostype.startswith('MSYS'):
ostype = 'pc-windows-gnu'
elif ostype.startswith('CYGWIN_NT'):
elif kernel.startswith('MSYS'):
kernel = 'pc-windows-gnu'
elif kernel.startswith('CYGWIN_NT'):
cputype = 'i686'
if ostype.endswith('WOW64'):
if kernel.endswith('WOW64'):
cputype = 'x86_64'
ostype = 'pc-windows-gnu'
elif sys.platform == 'win32':
kernel = 'pc-windows-gnu'
elif platform_is_win32():
# Some Windows platforms might have a `uname` command that returns a
# non-standard string (e.g. gnuwin32 tools returns `windows32`). In
# these cases, fall back to using sys.platform.
return 'x86_64-pc-windows-msvc'
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this seems pretty sketchy, it should probably be -gnu here. but I don't want to make logic changes in the middle of a refactor, it's fine to land as-is.

else:
err = "unknown OS type: {}".format(ostype)
err = "unknown OS type: {}".format(kernel)
sys.exit(err)

if cputype in ['powerpc', 'riscv'] and ostype == 'unknown-freebsd':
if cputype in ['powerpc', 'riscv'] and kernel == 'unknown-freebsd':
cputype = subprocess.check_output(
['uname', '-p']).strip().decode(default_encoding)
cputype_mapper = {
Expand Down Expand Up @@ -354,24 +350,23 @@ def default_build_triple(verbose):
cputype = cputype_mapper[cputype]
elif cputype in {'xscale', 'arm'}:
cputype = 'arm'
if ostype == 'linux-android':
ostype = 'linux-androideabi'
elif ostype == 'unknown-freebsd':
cputype = subprocess.check_output(
['uname', '-p']).strip().decode(default_encoding)
ostype = 'unknown-freebsd'
if kernel == 'linux-android':
kernel = 'linux-androideabi'
elif kernel == 'unknown-freebsd':
cputype = processor
kernel = 'unknown-freebsd'
elif cputype == 'armv6l':
cputype = 'arm'
if ostype == 'linux-android':
ostype = 'linux-androideabi'
if kernel == 'linux-android':
kernel = 'linux-androideabi'
else:
ostype += 'eabihf'
kernel += 'eabihf'
elif cputype in {'armv7l', 'armv8l'}:
cputype = 'armv7'
if ostype == 'linux-android':
ostype = 'linux-androideabi'
if kernel == 'linux-android':
kernel = 'linux-androideabi'
else:
ostype += 'eabihf'
kernel += 'eabihf'
elif cputype == 'mips':
if sys.byteorder == 'big':
cputype = 'mips'
Expand All @@ -387,14 +382,14 @@ def default_build_triple(verbose):
else:
raise ValueError('unknown byteorder: {}'.format(sys.byteorder))
# only the n64 ABI is supported, indicate it
ostype += 'abi64'
kernel += 'abi64'
elif cputype == 'sparc' or cputype == 'sparcv9' or cputype == 'sparc64':
pass
else:
err = "unknown cpu type: {}".format(cputype)
sys.exit(err)

return "{}-{}".format(cputype, ostype)
return "{}-{}".format(cputype, kernel)


@contextlib.contextmanager
Expand Down