# 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:]))