summaryrefslogtreecommitdiff
path: root/build_extra/rust/run.py
blob: 7c6bea08afaa489241a6373f975d3e06ab358bf9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/usr/bin/env python
# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.

# This file just executes its arguments, except that it allows overriding
# environment variables using command-line arguments.

import subprocess
import sys
import os
import re

args = []
env = os.environ.copy()

if sys.platform == 'win32':
    # On Windows, when gn is setting up the build toolchain, it produces a set
    # of environment variables that are required to invoke the right build
    # toolchain. We need to load those environment variables here too in order
    # for rustc to be able to successfully invoke the linker tool.
    # The file is in 'windows environment block' format, which contains
    # multiple 'key=value' pairs, separated by '\0' bytes, and terminated by
    # two '\0' bytes at the end.
    gn_env_pairs = open("environment.x64").read()[:-2].split('\0')
    gn_env = dict([pair.split('=', 1) for pair in gn_env_pairs])
    env.update(gn_env)

# This is for src/msg.rs to know where to find msg_generated.rs.
# When building with Cargo this variable is set by build.rs.
env["GN_OUT_DIR"] = os.path.abspath(".")
assert os.path.isdir(env["GN_OUT_DIR"])

# Environment variables can be specified on the command line using
# '--env=variable=value' flags. These flags are not passed through to rustc.
# This is useful to set env vars that are normally automatically set by Cargo,
# e.g. CARGO_PKG_NAME, CARGO_PKG_VERSION, OUT_DIR, etc.
for arg in sys.argv[1:]:
    match = re.search('--env=([^=]+)=(.*)', arg)
    if match:
        key, value = match.groups()
        if key == "OUT_DIR":
            # OUT_DIR needs to contain an absolute path.
            value = os.path.abspath(value)
        env[key] = value
    else:
        args.append(arg)

sys.exit(subprocess.call(args, env=env))