Source code

Revision control

Copy as Markdown

Other Tools

# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
import argparse
import os
import subprocess
import sys
def parse_outputs(crate_output, dep_outputs, pass_l_flag):
env = {}
args = []
def parse_line(line):
if line.startswith("cargo:"):
return line[len("cargo:") :].split("=", 1)
def parse_file(f):
with open(f) as fh:
return [parse_line(line.rstrip()) for line in fh.readlines()]
for f in dep_outputs:
for entry in parse_file(f):
if not entry:
continue
key, value = entry
if key == "rustc-link-search":
args += ["-L", value]
elif key == "rustc-flags":
flags = value.split()
for flag, val in zip(flags[0::2], flags[1::2]):
if flag == "-l" and f == crate_output:
args += ["-l", val]
elif flag == "-L":
args += ["-L", val]
else:
raise Exception(
"Unknown flag passed through "
'"cargo:rustc-flags": "%s"' % flag
)
elif key == "rustc-link-lib" and f == crate_output:
args += ["-l", value]
elif key == "rustc-cfg" and f == crate_output:
args += ["--cfg", value]
elif key == "rustc-env" and f == crate_output:
env_key, env_value = value.split("=", 1)
env[env_key] = env_value
elif key == "rerun-if-changed":
pass
elif key == "rerun-if-env-changed":
pass
elif key == "warning":
pass
elif key:
# Todo: Distinguish between direct and transitive
# dependencies so we can pass metadata environment
# variables correctly.
pass
return env, args
def wrap_rustc(args):
parser = argparse.ArgumentParser()
parser.add_argument("--crate-out", nargs="?")
parser.add_argument("--deps-out", nargs="*")
parser.add_argument("--cwd")
parser.add_argument("--pass-l-flag", action="store_true")
parser.add_argument("--cmd", nargs=argparse.REMAINDER)
args = parser.parse_args(args)
new_env, new_args = parse_outputs(args.crate_out, args.deps_out, args.pass_l_flag)
os.environ.update(new_env)
return subprocess.Popen(args.cmd + new_args, cwd=args.cwd).wait()
if __name__ == "__main__":
sys.exit(wrap_rustc(sys.argv[1:]))