aboutsummaryrefslogtreecommitdiffstats
path: root/mach
blob: 7d8fe738d365f37d67cf840a44c29881a73065de (plain) (blame)
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
48
49
50
51
52
#!/bin/sh
# 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 https://mozilla.org/MPL/2.0/.

# The beginning of this script is both valid shell and valid python, such that
# the script starts with the shell and is reexecuted with `uv run`. This
# ensures that the Python provided by the virtual environment (in the .venv
# directory) is used. If the virtual environment does not exist, `uv run` will
# still use the correct version of Python given in `.python-version` and
# python/mach_bootstrap.py will provision a new environment that will be used
# for the subsequent runs.
''':' && {
    MACH_DIR=$(dirname "$0");
    run_in_nix_if_needed() {
        if { [ -f /etc/NIXOS ] || [ -n "${MACH_USE_NIX}" ]; } && [ -z "${IN_NIX_SHELL}" ]; then
            EXTRA_NIX_ARGS=${SERVO_ANDROID_BUILD:+'--arg buildAndroid true'}

            # `nix-shell` needs the whole command passed as a single argument, so the arguments need
            # to be shell-quoted. Rotate through the arguments, replacing them with quoted versions.
            for arg in "$@"; do
                set -- "$@" "$(printf \%q "$1")"
                shift
            done

            echo "NOTE: Entering nix-shell ${MACH_DIR}/shell.nix"
            exec nix-shell "${MACH_DIR}/shell.nix" $EXTRA_NIX_ARGS --run "$*"
        else
            exec "$@"
        fi
    }

    run_in_nix_if_needed uv run python ${MACH_DIR}/mach "$@"
}
'''

import os
import sys

def main(args):
    topdir = os.path.abspath(os.path.dirname(sys.argv[0]))
    sys.path.insert(0, os.path.join(topdir, "python"))
    import mach_bootstrap
    if len(sys.argv) > 1 and sys.argv[1] == "bootstrap":
        sys.exit(mach_bootstrap.bootstrap_command_only(topdir))
    else:
        mach = mach_bootstrap.bootstrap(topdir)
        sys.exit(mach.run(sys.argv[1:]))


if __name__ == '__main__':
    main(sys.argv)