1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- #!/usr/bin/env python3
- # A wrapper for rust-lld that removes certain arguments inserted by rustc that
- # we'd like to override
- import sys
- import subprocess
- import re
- from os import path
- def main():
- args = sys.argv[1:]
- strip_debug = "--v86-strip-debug" in args
- # filter out args inserted by rustc
- TO_REMOVE = {
- "--export-table",
- "--stack-first",
- "--strip-debug",
- "--v86-strip-debug",
- }
- args = list(filter(lambda arg: arg not in TO_REMOVE, args))
- if strip_debug:
- args += ["--strip-debug"]
- lld = find_rust_lld()
- result = subprocess.run([lld] + args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
- print(result.stderr, file=sys.stderr)
- print(result.stdout)
- result.check_returncode()
- def find_host_triplet():
- rustc = subprocess.run(["rustc", "--version", "--verbose"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
- rustc.check_returncode()
- rustc_details = rustc.stdout.decode("utf8")
- host = re.search(r"host: (.*)", rustc_details)
- if host is None:
- raise ValueError("unexpected rustc output")
- return host.group(1)
- def find_rust_lld():
- try:
- which = subprocess.run(["rustup", "which", "rustc"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
- except FileNotFoundError:
- return "lld"
- which.check_returncode()
- rustc_path = which.stdout.decode("utf8").strip()
- assert path.basename(rustc_path) == "rustc"
- bin_path = path.dirname(rustc_path)
- triplet = find_host_triplet()
- rust_lld_path = path.join(bin_path, "../lib/rustlib", triplet, "bin/rust-lld")
- assert path.isfile(rust_lld_path)
- return rust_lld_path
- main()
|