xref: /aosp_15_r20/tools/netsim/scripts/build_tools.py (revision cf78ab8cffb8fc9207af348f23af247fb04370a6)
1 *cf78ab8cSAndroid Build Coastguard Worker#!/usr/bin/env python3
2 *cf78ab8cSAndroid Build Coastguard Worker#
3 *cf78ab8cSAndroid Build Coastguard Worker# Copyright 2023 - The Android Open Source Project
4 *cf78ab8cSAndroid Build Coastguard Worker#
5 *cf78ab8cSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the',  help="License");
6 *cf78ab8cSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
7 *cf78ab8cSAndroid Build Coastguard Worker# You may obtain a copy of the License at
8 *cf78ab8cSAndroid Build Coastguard Worker#
9 *cf78ab8cSAndroid Build Coastguard Worker#     http://www.apache.org/licenses/LICENSE-2.0
10 *cf78ab8cSAndroid Build Coastguard Worker#
11 *cf78ab8cSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
12 *cf78ab8cSAndroid Build Coastguard Worker# distributed under the License is distributed on an',  help="AS IS" BASIS,
13 *cf78ab8cSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *cf78ab8cSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
15 *cf78ab8cSAndroid Build Coastguard Worker# limitations under the License.
16 *cf78ab8cSAndroid Build Coastguard Workerfrom __future__ import absolute_import, division, print_function
17 *cf78ab8cSAndroid Build Coastguard Worker
18 *cf78ab8cSAndroid Build Coastguard Workerimport argparse
19 *cf78ab8cSAndroid Build Coastguard Workerimport logging
20 *cf78ab8cSAndroid Build Coastguard Workerimport os
21 *cf78ab8cSAndroid Build Coastguard Workerfrom pathlib import Path
22 *cf78ab8cSAndroid Build Coastguard Worker
23 *cf78ab8cSAndroid Build Coastguard Workerfrom environment import get_default_environment
24 *cf78ab8cSAndroid Build Coastguard Workerfrom server_config import ServerConfig
25 *cf78ab8cSAndroid Build Coastguard Workerfrom tasks import (
26 *cf78ab8cSAndroid Build Coastguard Worker    TASK_LIST,
27 *cf78ab8cSAndroid Build Coastguard Worker    get_tasks,
28 *cf78ab8cSAndroid Build Coastguard Worker    log_enabled_tasks,
29 *cf78ab8cSAndroid Build Coastguard Worker)
30 *cf78ab8cSAndroid Build Coastguard Workerfrom utils import (
31 *cf78ab8cSAndroid Build Coastguard Worker    AOSP_ROOT,
32 *cf78ab8cSAndroid Build Coastguard Worker    config_logging,
33 *cf78ab8cSAndroid Build Coastguard Worker    create_emulator_artifact_path,
34 *cf78ab8cSAndroid Build Coastguard Worker    default_target,
35 *cf78ab8cSAndroid Build Coastguard Worker    fetch_build_chaining_artifacts,
36 *cf78ab8cSAndroid Build Coastguard Worker    is_presubmit,
37 *cf78ab8cSAndroid Build Coastguard Worker    log_system_info,
38 *cf78ab8cSAndroid Build Coastguard Worker)
39 *cf78ab8cSAndroid Build Coastguard Worker
40 *cf78ab8cSAndroid Build Coastguard Worker
41 *cf78ab8cSAndroid Build Coastguard Workerdef main():
42 *cf78ab8cSAndroid Build Coastguard Worker  config_logging()
43 *cf78ab8cSAndroid Build Coastguard Worker  log_system_info()
44 *cf78ab8cSAndroid Build Coastguard Worker  create_emulator_artifact_path()
45 *cf78ab8cSAndroid Build Coastguard Worker
46 *cf78ab8cSAndroid Build Coastguard Worker  parser = argparse.ArgumentParser(
47 *cf78ab8cSAndroid Build Coastguard Worker      description=(
48 *cf78ab8cSAndroid Build Coastguard Worker          "Configures the android netsim cmake project so it can be build"
49 *cf78ab8cSAndroid Build Coastguard Worker      )
50 *cf78ab8cSAndroid Build Coastguard Worker  )
51 *cf78ab8cSAndroid Build Coastguard Worker  parser.add_argument(
52 *cf78ab8cSAndroid Build Coastguard Worker      "--out_dir",
53 *cf78ab8cSAndroid Build Coastguard Worker      type=str,
54 *cf78ab8cSAndroid Build Coastguard Worker      default="tools/netsim/objs/",
55 *cf78ab8cSAndroid Build Coastguard Worker      help="The output directory",
56 *cf78ab8cSAndroid Build Coastguard Worker  )
57 *cf78ab8cSAndroid Build Coastguard Worker  parser.add_argument(
58 *cf78ab8cSAndroid Build Coastguard Worker      "--dist_dir", type=str, default="dist/", help="The destination directory"
59 *cf78ab8cSAndroid Build Coastguard Worker  )
60 *cf78ab8cSAndroid Build Coastguard Worker  parser.add_argument(
61 *cf78ab8cSAndroid Build Coastguard Worker      "--build-id",
62 *cf78ab8cSAndroid Build Coastguard Worker      type=str,
63 *cf78ab8cSAndroid Build Coastguard Worker      default="",
64 *cf78ab8cSAndroid Build Coastguard Worker      dest="build_id",
65 *cf78ab8cSAndroid Build Coastguard Worker      help="The netsim build number",
66 *cf78ab8cSAndroid Build Coastguard Worker  )
67 *cf78ab8cSAndroid Build Coastguard Worker  parser.add_argument(
68 *cf78ab8cSAndroid Build Coastguard Worker      "--target",
69 *cf78ab8cSAndroid Build Coastguard Worker      type=str,
70 *cf78ab8cSAndroid Build Coastguard Worker      default=default_target(),
71 *cf78ab8cSAndroid Build Coastguard Worker      help="The build target, defaults to current os",
72 *cf78ab8cSAndroid Build Coastguard Worker  )
73 *cf78ab8cSAndroid Build Coastguard Worker  parser.add_argument(
74 *cf78ab8cSAndroid Build Coastguard Worker      "--enable_system_rust",
75 *cf78ab8cSAndroid Build Coastguard Worker      action="store_true",
76 *cf78ab8cSAndroid Build Coastguard Worker      help="Build the netsim with the System Rust on the host machine",
77 *cf78ab8cSAndroid Build Coastguard Worker  )
78 *cf78ab8cSAndroid Build Coastguard Worker  parser.add_argument(
79 *cf78ab8cSAndroid Build Coastguard Worker      "--with_debug", action="store_true", help="Build debug instead of release"
80 *cf78ab8cSAndroid Build Coastguard Worker  )
81 *cf78ab8cSAndroid Build Coastguard Worker  parser.add_argument(
82 *cf78ab8cSAndroid Build Coastguard Worker      "--buildbot", action="store_true", help="Invoked by Android buildbots"
83 *cf78ab8cSAndroid Build Coastguard Worker  )
84 *cf78ab8cSAndroid Build Coastguard Worker  parser.add_argument(
85 *cf78ab8cSAndroid Build Coastguard Worker      "--task",
86 *cf78ab8cSAndroid Build Coastguard Worker      nargs="+",
87 *cf78ab8cSAndroid Build Coastguard Worker      type=str.lower,
88 *cf78ab8cSAndroid Build Coastguard Worker      choices=[choice.lower() for choice in TASK_LIST],
89 *cf78ab8cSAndroid Build Coastguard Worker      help=(
90 *cf78ab8cSAndroid Build Coastguard Worker          "Tasks to perform (Configure, Compile, CompileInstall,"
91 *cf78ab8cSAndroid Build Coastguard Worker          " InstallEmulator, RunPyTest, LocalRunAll)"
92 *cf78ab8cSAndroid Build Coastguard Worker      ),
93 *cf78ab8cSAndroid Build Coastguard Worker  )
94 *cf78ab8cSAndroid Build Coastguard Worker  parser.add_argument(
95 *cf78ab8cSAndroid Build Coastguard Worker      "--config",
96 *cf78ab8cSAndroid Build Coastguard Worker      default="release",
97 *cf78ab8cSAndroid Build Coastguard Worker      choices=["debug", "release"],
98 *cf78ab8cSAndroid Build Coastguard Worker      help="Whether we are building a release or debug configuration.",
99 *cf78ab8cSAndroid Build Coastguard Worker  )
100 *cf78ab8cSAndroid Build Coastguard Worker  parser.add_argument(
101 *cf78ab8cSAndroid Build Coastguard Worker      "--emulator_target",
102 *cf78ab8cSAndroid Build Coastguard Worker      type=str,
103 *cf78ab8cSAndroid Build Coastguard Worker      default="emulator-linux_x64",
104 *cf78ab8cSAndroid Build Coastguard Worker      help=(
105 *cf78ab8cSAndroid Build Coastguard Worker          "The emulator build target to install for local case, defaults to"
106 *cf78ab8cSAndroid Build Coastguard Worker          " emulator-linux_x64"
107 *cf78ab8cSAndroid Build Coastguard Worker      ),
108 *cf78ab8cSAndroid Build Coastguard Worker  )
109 *cf78ab8cSAndroid Build Coastguard Worker  parser.add_argument(
110 *cf78ab8cSAndroid Build Coastguard Worker      "--local_emulator_dir",
111 *cf78ab8cSAndroid Build Coastguard Worker      type=str,
112 *cf78ab8cSAndroid Build Coastguard Worker      default="",
113 *cf78ab8cSAndroid Build Coastguard Worker      help=(
114 *cf78ab8cSAndroid Build Coastguard Worker          "For providing an emulator build artifact in a directory."
115 *cf78ab8cSAndroid Build Coastguard Worker          " This will install the emulator from local_emulator_dir instead of"
116 *cf78ab8cSAndroid Build Coastguard Worker          " fetching the artifacts"
117 *cf78ab8cSAndroid Build Coastguard Worker      ),
118 *cf78ab8cSAndroid Build Coastguard Worker  )
119 *cf78ab8cSAndroid Build Coastguard Worker  parser.add_argument(
120 *cf78ab8cSAndroid Build Coastguard Worker      "--pytest_input_dir",
121 *cf78ab8cSAndroid Build Coastguard Worker      type=str,
122 *cf78ab8cSAndroid Build Coastguard Worker      default="",
123 *cf78ab8cSAndroid Build Coastguard Worker      help=(
124 *cf78ab8cSAndroid Build Coastguard Worker          "For providing netsim & emulator binaries and libraries for pytest."
125 *cf78ab8cSAndroid Build Coastguard Worker          " This will allow pytest to be run on directory path specified on"
126 *cf78ab8cSAndroid Build Coastguard Worker          " pytest_input_dir"
127 *cf78ab8cSAndroid Build Coastguard Worker      ),
128 *cf78ab8cSAndroid Build Coastguard Worker  )
129 *cf78ab8cSAndroid Build Coastguard Worker
130 *cf78ab8cSAndroid Build Coastguard Worker  args = parser.parse_args()
131 *cf78ab8cSAndroid Build Coastguard Worker
132 *cf78ab8cSAndroid Build Coastguard Worker  presubmit = is_presubmit(args.build_id)
133 *cf78ab8cSAndroid Build Coastguard Worker
134 *cf78ab8cSAndroid Build Coastguard Worker  # The environment of build
135 *cf78ab8cSAndroid Build Coastguard Worker  env = get_default_environment(AOSP_ROOT)
136 *cf78ab8cSAndroid Build Coastguard Worker  if args.buildbot:
137 *cf78ab8cSAndroid Build Coastguard Worker    cfg = ServerConfig(presubmit, args)
138 *cf78ab8cSAndroid Build Coastguard Worker    env = cfg.get_env()
139 *cf78ab8cSAndroid Build Coastguard Worker
140 *cf78ab8cSAndroid Build Coastguard Worker  # Set Environment Variables
141 *cf78ab8cSAndroid Build Coastguard Worker  os.environ["GIT_DISCOVERY_ACROSS_FILESYSTEM"] = "1"
142 *cf78ab8cSAndroid Build Coastguard Worker  if not args.buildbot:
143 *cf78ab8cSAndroid Build Coastguard Worker    # Able to config C++ file in vscode.
144 *cf78ab8cSAndroid Build Coastguard Worker    os.environ["CMAKE_EXPORT_COMPILE_COMMANDS"] = "1"
145 *cf78ab8cSAndroid Build Coastguard Worker
146 *cf78ab8cSAndroid Build Coastguard Worker  # Provide absolute path for args.out_dir
147 *cf78ab8cSAndroid Build Coastguard Worker  if not os.path.isabs(args.out_dir):
148 *cf78ab8cSAndroid Build Coastguard Worker    args.out_dir = os.path.join(AOSP_ROOT, args.out_dir)
149 *cf78ab8cSAndroid Build Coastguard Worker
150 *cf78ab8cSAndroid Build Coastguard Worker  # Build preparation work for buildbot
151 *cf78ab8cSAndroid Build Coastguard Worker  if args.buildbot:
152 *cf78ab8cSAndroid Build Coastguard Worker    # Fetch Emulator Artifacts
153 *cf78ab8cSAndroid Build Coastguard Worker    fetch_build_chaining_artifacts(args.out_dir, presubmit)
154 *cf78ab8cSAndroid Build Coastguard Worker    # Set the out_dir to "out/objs"
155 *cf78ab8cSAndroid Build Coastguard Worker    args.out_dir = Path(args.out_dir) / "objs"
156 *cf78ab8cSAndroid Build Coastguard Worker
157 *cf78ab8cSAndroid Build Coastguard Worker  # Obtain tasks
158 *cf78ab8cSAndroid Build Coastguard Worker  tasks = get_tasks(args, env)
159 *cf78ab8cSAndroid Build Coastguard Worker
160 *cf78ab8cSAndroid Build Coastguard Worker  # Log enabled tasks
161 *cf78ab8cSAndroid Build Coastguard Worker  log_enabled_tasks(tasks)
162 *cf78ab8cSAndroid Build Coastguard Worker
163 *cf78ab8cSAndroid Build Coastguard Worker  # Turn on sccache?
164 *cf78ab8cSAndroid Build Coastguard Worker  # if args.buildbot and cfg.sccache:
165 *cf78ab8cSAndroid Build Coastguard Worker  #    launcher.append(f"-DOPTION_CCACHE=${cfg.sccache}")
166 *cf78ab8cSAndroid Build Coastguard Worker
167 *cf78ab8cSAndroid Build Coastguard Worker  # Configure
168 *cf78ab8cSAndroid Build Coastguard Worker  tasks.get("Configure").run()
169 *cf78ab8cSAndroid Build Coastguard Worker
170 *cf78ab8cSAndroid Build Coastguard Worker  # Build
171 *cf78ab8cSAndroid Build Coastguard Worker  tasks.get("Compile").run()
172 *cf78ab8cSAndroid Build Coastguard Worker
173 *cf78ab8cSAndroid Build Coastguard Worker  # Install
174 *cf78ab8cSAndroid Build Coastguard Worker  tasks.get("CompileInstall").run()
175 *cf78ab8cSAndroid Build Coastguard Worker
176 *cf78ab8cSAndroid Build Coastguard Worker  # Run Tests
177 *cf78ab8cSAndroid Build Coastguard Worker  tasks.get("RunTest").run()
178 *cf78ab8cSAndroid Build Coastguard Worker
179 *cf78ab8cSAndroid Build Coastguard Worker  # Zip results..
180 *cf78ab8cSAndroid Build Coastguard Worker  tasks.get("ZipArtifact").run()
181 *cf78ab8cSAndroid Build Coastguard Worker
182 *cf78ab8cSAndroid Build Coastguard Worker  # Install Emulator artifacts and Run PyTests
183 *cf78ab8cSAndroid Build Coastguard Worker  tasks.get("InstallEmulator").run()
184 *cf78ab8cSAndroid Build Coastguard Worker  tasks.get("RunPyTest").run()
185 *cf78ab8cSAndroid Build Coastguard Worker
186 *cf78ab8cSAndroid Build Coastguard Worker
187 *cf78ab8cSAndroid Build Coastguard Workerif __name__ == "__main__":
188 *cf78ab8cSAndroid Build Coastguard Worker  main()
189