xref: /aosp_15_r20/build/soong/python/scripts/stub_template_host.txt (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker#!/usr/bin/env '%interpreter%'
2*333d2b36SAndroid Build Coastguard Worker
3*333d2b36SAndroid Build Coastguard Workerimport os
4*333d2b36SAndroid Build Coastguard Workerimport tempfile
5*333d2b36SAndroid Build Coastguard Workerimport shutil
6*333d2b36SAndroid Build Coastguard Workerimport signal
7*333d2b36SAndroid Build Coastguard Workerimport sys
8*333d2b36SAndroid Build Coastguard Workerimport subprocess
9*333d2b36SAndroid Build Coastguard Workerimport zipfile
10*333d2b36SAndroid Build Coastguard Worker
11*333d2b36SAndroid Build Coastguard WorkerPYTHON_BINARY = '%interpreter%'
12*333d2b36SAndroid Build Coastguard WorkerMAIN_FILE = '%main%'
13*333d2b36SAndroid Build Coastguard WorkerPYTHON_PATH = 'PYTHONPATH'
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Worker# Don't imply 'import site' on initialization
16*333d2b36SAndroid Build Coastguard WorkerPYTHON_ARG = '-S'
17*333d2b36SAndroid Build Coastguard Worker
18*333d2b36SAndroid Build Coastguard Workerdef Main():
19*333d2b36SAndroid Build Coastguard Worker  args = sys.argv[1:]
20*333d2b36SAndroid Build Coastguard Worker
21*333d2b36SAndroid Build Coastguard Worker  runfiles_path = tempfile.mkdtemp(prefix="Soong.python_")
22*333d2b36SAndroid Build Coastguard Worker  try:
23*333d2b36SAndroid Build Coastguard Worker    zf = zipfile.ZipFile(os.path.dirname(__file__))
24*333d2b36SAndroid Build Coastguard Worker    zf.extractall(runfiles_path)
25*333d2b36SAndroid Build Coastguard Worker    zf.close()
26*333d2b36SAndroid Build Coastguard Worker
27*333d2b36SAndroid Build Coastguard Worker    new_python_path = runfiles_path
28*333d2b36SAndroid Build Coastguard Worker    old_python_path = os.environ.get(PYTHON_PATH)
29*333d2b36SAndroid Build Coastguard Worker
30*333d2b36SAndroid Build Coastguard Worker    if old_python_path:
31*333d2b36SAndroid Build Coastguard Worker      os.environ.update({PYTHON_PATH: new_python_path + ":" + old_python_path})
32*333d2b36SAndroid Build Coastguard Worker    else:
33*333d2b36SAndroid Build Coastguard Worker      os.environ.update({PYTHON_PATH: new_python_path})
34*333d2b36SAndroid Build Coastguard Worker
35*333d2b36SAndroid Build Coastguard Worker    # Now look for main python source file.
36*333d2b36SAndroid Build Coastguard Worker    main_filepath = os.path.join(runfiles_path, MAIN_FILE)
37*333d2b36SAndroid Build Coastguard Worker    assert os.path.exists(main_filepath), \
38*333d2b36SAndroid Build Coastguard Worker           'Cannot exec() %r: file not found.' % main_filepath
39*333d2b36SAndroid Build Coastguard Worker    assert os.access(main_filepath, os.R_OK), \
40*333d2b36SAndroid Build Coastguard Worker           'Cannot exec() %r: file not readable.' % main_filepath
41*333d2b36SAndroid Build Coastguard Worker
42*333d2b36SAndroid Build Coastguard Worker    args = [PYTHON_BINARY, PYTHON_ARG, main_filepath] + args
43*333d2b36SAndroid Build Coastguard Worker
44*333d2b36SAndroid Build Coastguard Worker    sys.stdout.flush()
45*333d2b36SAndroid Build Coastguard Worker    # close_fds=False so that you can run binaries with files provided on the command line:
46*333d2b36SAndroid Build Coastguard Worker    # my_python_app --file <(echo foo)
47*333d2b36SAndroid Build Coastguard Worker    p = subprocess.Popen(args, close_fds=False)
48*333d2b36SAndroid Build Coastguard Worker
49*333d2b36SAndroid Build Coastguard Worker    def handler(sig, frame):
50*333d2b36SAndroid Build Coastguard Worker      p.send_signal(sig)
51*333d2b36SAndroid Build Coastguard Worker
52*333d2b36SAndroid Build Coastguard Worker    # Redirect SIGINT and SIGTERM to subprocess
53*333d2b36SAndroid Build Coastguard Worker    signal.signal(signal.SIGINT, handler)
54*333d2b36SAndroid Build Coastguard Worker    signal.signal(signal.SIGTERM, handler)
55*333d2b36SAndroid Build Coastguard Worker
56*333d2b36SAndroid Build Coastguard Worker    p.wait()
57*333d2b36SAndroid Build Coastguard Worker
58*333d2b36SAndroid Build Coastguard Worker    sys.exit(p.returncode)
59*333d2b36SAndroid Build Coastguard Worker  finally:
60*333d2b36SAndroid Build Coastguard Worker    shutil.rmtree(runfiles_path, ignore_errors=True)
61*333d2b36SAndroid Build Coastguard Worker
62*333d2b36SAndroid Build Coastguard Workerif __name__ == '__main__':
63*333d2b36SAndroid Build Coastguard Worker  Main()
64