xref: /aosp_15_r20/tools/netsim/testing/netsim-grpc/setup.py (revision cf78ab8cffb8fc9207af348f23af247fb04370a6)
1*cf78ab8cSAndroid Build Coastguard Worker"""Setup file for netsim-grpc.
2*cf78ab8cSAndroid Build Coastguard Worker
3*cf78ab8cSAndroid Build Coastguard WorkerUse setup.cfg to configure your project.
4*cf78ab8cSAndroid Build Coastguard Worker
5*cf78ab8cSAndroid Build Coastguard WorkerThis file was generated with PyScaffold 4.3.
6*cf78ab8cSAndroid Build Coastguard WorkerPyScaffold helps you to put up the scaffold of your new Python project.
7*cf78ab8cSAndroid Build Coastguard WorkerLearn more under: https://pyscaffold.org/
8*cf78ab8cSAndroid Build Coastguard Worker"""
9*cf78ab8cSAndroid Build Coastguard Worker
10*cf78ab8cSAndroid Build Coastguard Workerimport os
11*cf78ab8cSAndroid Build Coastguard Workerfrom os import path
12*cf78ab8cSAndroid Build Coastguard Workerimport subprocess
13*cf78ab8cSAndroid Build Coastguard Workerimport sys
14*cf78ab8cSAndroid Build Coastguard Worker
15*cf78ab8cSAndroid Build Coastguard Workerfrom setuptools import setup
16*cf78ab8cSAndroid Build Coastguard Workerfrom setuptools.command.build_py import build_py
17*cf78ab8cSAndroid Build Coastguard Worker
18*cf78ab8cSAndroid Build Coastguard Worker
19*cf78ab8cSAndroid Build Coastguard Workerclass ProtoBuild(build_py):
20*cf78ab8cSAndroid Build Coastguard Worker  """This command automatically compiles all netsim .proto files with `protoc` compiler
21*cf78ab8cSAndroid Build Coastguard Worker
22*cf78ab8cSAndroid Build Coastguard Worker  and places generated files under src/netsim_grpc/proto/
23*cf78ab8cSAndroid Build Coastguard Worker  """
24*cf78ab8cSAndroid Build Coastguard Worker
25*cf78ab8cSAndroid Build Coastguard Worker  def run(self):
26*cf78ab8cSAndroid Build Coastguard Worker    here = path.abspath(path.dirname(__file__))
27*cf78ab8cSAndroid Build Coastguard Worker    root_dir = path.dirname(path.dirname(here))
28*cf78ab8cSAndroid Build Coastguard Worker    aosp_dir = path.dirname(path.dirname(root_dir))
29*cf78ab8cSAndroid Build Coastguard Worker    proto_root_dir = path.join(root_dir, "proto")
30*cf78ab8cSAndroid Build Coastguard Worker    proto_dir = path.join(proto_root_dir, "netsim")
31*cf78ab8cSAndroid Build Coastguard Worker    rootcanal_proto_root_dir = path.join(
32*cf78ab8cSAndroid Build Coastguard Worker        aosp_dir,
33*cf78ab8cSAndroid Build Coastguard Worker        "packages",
34*cf78ab8cSAndroid Build Coastguard Worker        "modules",
35*cf78ab8cSAndroid Build Coastguard Worker        "Bluetooth",
36*cf78ab8cSAndroid Build Coastguard Worker        "tools",
37*cf78ab8cSAndroid Build Coastguard Worker        "rootcanal",
38*cf78ab8cSAndroid Build Coastguard Worker        "proto",
39*cf78ab8cSAndroid Build Coastguard Worker    )
40*cf78ab8cSAndroid Build Coastguard Worker    rootcanal_proto_dir = path.join(rootcanal_proto_root_dir, "rootcanal")
41*cf78ab8cSAndroid Build Coastguard Worker    out_dir = path.join(here, "src", "netsim_grpc", "proto")
42*cf78ab8cSAndroid Build Coastguard Worker
43*cf78ab8cSAndroid Build Coastguard Worker    # Rootcanal Protobufs
44*cf78ab8cSAndroid Build Coastguard Worker    for proto_file in filter(
45*cf78ab8cSAndroid Build Coastguard Worker        lambda x: x.endswith(".proto"), os.listdir(rootcanal_proto_dir)
46*cf78ab8cSAndroid Build Coastguard Worker    ):
47*cf78ab8cSAndroid Build Coastguard Worker      source = path.join(rootcanal_proto_dir, proto_file)
48*cf78ab8cSAndroid Build Coastguard Worker      output = path.join(out_dir, "rootcanal", proto_file).replace(
49*cf78ab8cSAndroid Build Coastguard Worker          ".proto", "_pb2.py"
50*cf78ab8cSAndroid Build Coastguard Worker      )
51*cf78ab8cSAndroid Build Coastguard Worker
52*cf78ab8cSAndroid Build Coastguard Worker      if not path.exists(output) or (
53*cf78ab8cSAndroid Build Coastguard Worker          path.getmtime(source) > path.getmtime(output)
54*cf78ab8cSAndroid Build Coastguard Worker      ):
55*cf78ab8cSAndroid Build Coastguard Worker        sys.stderr.write(f"Protobuf-compiling {source}\n")
56*cf78ab8cSAndroid Build Coastguard Worker
57*cf78ab8cSAndroid Build Coastguard Worker        subprocess.check_call([
58*cf78ab8cSAndroid Build Coastguard Worker            sys.executable,
59*cf78ab8cSAndroid Build Coastguard Worker            "-m",
60*cf78ab8cSAndroid Build Coastguard Worker            "grpc_tools.protoc",
61*cf78ab8cSAndroid Build Coastguard Worker            f"-I{proto_root_dir}",
62*cf78ab8cSAndroid Build Coastguard Worker            f"-I{rootcanal_proto_root_dir}",
63*cf78ab8cSAndroid Build Coastguard Worker            f"--python_out={out_dir}",
64*cf78ab8cSAndroid Build Coastguard Worker            f"--grpc_python_out={out_dir}",
65*cf78ab8cSAndroid Build Coastguard Worker            source,
66*cf78ab8cSAndroid Build Coastguard Worker        ])
67*cf78ab8cSAndroid Build Coastguard Worker
68*cf78ab8cSAndroid Build Coastguard Worker    # Netsim Protobufs
69*cf78ab8cSAndroid Build Coastguard Worker    for proto_file in filter(
70*cf78ab8cSAndroid Build Coastguard Worker        lambda x: x.endswith(".proto"), os.listdir(proto_dir)
71*cf78ab8cSAndroid Build Coastguard Worker    ):
72*cf78ab8cSAndroid Build Coastguard Worker      source = path.join(proto_dir, proto_file)
73*cf78ab8cSAndroid Build Coastguard Worker      output = path.join(out_dir, "netsim", proto_file).replace(
74*cf78ab8cSAndroid Build Coastguard Worker          ".proto", "_pb2.py"
75*cf78ab8cSAndroid Build Coastguard Worker      )
76*cf78ab8cSAndroid Build Coastguard Worker
77*cf78ab8cSAndroid Build Coastguard Worker      if not path.exists(output) or (
78*cf78ab8cSAndroid Build Coastguard Worker          path.getmtime(source) > path.getmtime(output)
79*cf78ab8cSAndroid Build Coastguard Worker      ):
80*cf78ab8cSAndroid Build Coastguard Worker        sys.stderr.write(f"Protobuf-compiling {source}\n")
81*cf78ab8cSAndroid Build Coastguard Worker
82*cf78ab8cSAndroid Build Coastguard Worker        subprocess.check_call([
83*cf78ab8cSAndroid Build Coastguard Worker            sys.executable,
84*cf78ab8cSAndroid Build Coastguard Worker            "-m",
85*cf78ab8cSAndroid Build Coastguard Worker            "grpc_tools.protoc",
86*cf78ab8cSAndroid Build Coastguard Worker            f"-I{proto_root_dir}",
87*cf78ab8cSAndroid Build Coastguard Worker            f"-I{rootcanal_proto_root_dir}",
88*cf78ab8cSAndroid Build Coastguard Worker            f"--python_out={out_dir}",
89*cf78ab8cSAndroid Build Coastguard Worker            f"--grpc_python_out={out_dir}",
90*cf78ab8cSAndroid Build Coastguard Worker            source,
91*cf78ab8cSAndroid Build Coastguard Worker        ])
92*cf78ab8cSAndroid Build Coastguard Worker
93*cf78ab8cSAndroid Build Coastguard Worker    super().run()
94*cf78ab8cSAndroid Build Coastguard Worker
95*cf78ab8cSAndroid Build Coastguard Worker
96*cf78ab8cSAndroid Build Coastguard Workerif __name__ == "__main__":
97*cf78ab8cSAndroid Build Coastguard Worker  try:
98*cf78ab8cSAndroid Build Coastguard Worker    setup(
99*cf78ab8cSAndroid Build Coastguard Worker        # use_scm_version={"version_scheme": "no-guess-dev", "root": "../../../"},
100*cf78ab8cSAndroid Build Coastguard Worker        cmdclass={"build_py": ProtoBuild},
101*cf78ab8cSAndroid Build Coastguard Worker    )
102*cf78ab8cSAndroid Build Coastguard Worker  except:  # noqa
103*cf78ab8cSAndroid Build Coastguard Worker    print(
104*cf78ab8cSAndroid Build Coastguard Worker        "\n\nAn error occurred while building the project, "
105*cf78ab8cSAndroid Build Coastguard Worker        "please ensure you have the most updated version of setuptools, "
106*cf78ab8cSAndroid Build Coastguard Worker        "setuptools_scm and wheel with:\n"
107*cf78ab8cSAndroid Build Coastguard Worker        "   pip install -U setuptools setuptools_scm wheel\n\n"
108*cf78ab8cSAndroid Build Coastguard Worker    )
109*cf78ab8cSAndroid Build Coastguard Worker    raise
110