xref: /aosp_15_r20/external/perfetto/tools/install-build-deps (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker#!/usr/bin/env python3
2*6dbdd20aSAndroid Build Coastguard Worker# Copyright (C) 2017 The Android Open Source Project
3*6dbdd20aSAndroid Build Coastguard Worker#
4*6dbdd20aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
5*6dbdd20aSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
6*6dbdd20aSAndroid Build Coastguard Worker# You may obtain a copy of the License at
7*6dbdd20aSAndroid Build Coastguard Worker#
8*6dbdd20aSAndroid Build Coastguard Worker#      http://www.apache.org/licenses/LICENSE-2.0
9*6dbdd20aSAndroid Build Coastguard Worker#
10*6dbdd20aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
11*6dbdd20aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
12*6dbdd20aSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6dbdd20aSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
14*6dbdd20aSAndroid Build Coastguard Worker# limitations under the License.
15*6dbdd20aSAndroid Build Coastguard Worker
16*6dbdd20aSAndroid Build Coastguard Workerimport argparse
17*6dbdd20aSAndroid Build Coastguard Workerimport dataclasses as dc
18*6dbdd20aSAndroid Build Coastguard Workerimport hashlib
19*6dbdd20aSAndroid Build Coastguard Workerimport logging
20*6dbdd20aSAndroid Build Coastguard Workerimport os
21*6dbdd20aSAndroid Build Coastguard Workerimport shutil
22*6dbdd20aSAndroid Build Coastguard Workerimport subprocess
23*6dbdd20aSAndroid Build Coastguard Workerimport stat
24*6dbdd20aSAndroid Build Coastguard Workerimport sys
25*6dbdd20aSAndroid Build Coastguard Workerimport tempfile
26*6dbdd20aSAndroid Build Coastguard Workerimport time
27*6dbdd20aSAndroid Build Coastguard Workerimport zipfile
28*6dbdd20aSAndroid Build Coastguard Workerimport bz2
29*6dbdd20aSAndroid Build Coastguard Worker
30*6dbdd20aSAndroid Build Coastguard Workerfrom collections import namedtuple
31*6dbdd20aSAndroid Build Coastguard Workerfrom platform import system, machine
32*6dbdd20aSAndroid Build Coastguard Worker
33*6dbdd20aSAndroid Build Coastguard Worker
34*6dbdd20aSAndroid Build Coastguard Worker# The format for the deps below is the following:
35*6dbdd20aSAndroid Build Coastguard Worker# (target_folder, source_url, sha1, target_os, target_arch)
36*6dbdd20aSAndroid Build Coastguard Worker# |source_url| can be either a git repo or a http url.
37*6dbdd20aSAndroid Build Coastguard Worker# If a git repo, |checksum| is the SHA1 committish that will be checked out.
38*6dbdd20aSAndroid Build Coastguard Worker# If a http url, |checksum| is the SHA256 of the downloaded file.
39*6dbdd20aSAndroid Build Coastguard Worker# If the url is a .zip, .tgz, or .tbz2 file it will be automatically deflated under
40*6dbdd20aSAndroid Build Coastguard Worker# |target_folder|, taking care of stripping the root folder if it's a single
41*6dbdd20aSAndroid Build Coastguard Worker# root (to avoid ending up with buildtools/protobuf/protobuf-1.2.3/... and have
42*6dbdd20aSAndroid Build Coastguard Worker# instead just buildtools/protobuf).
43*6dbdd20aSAndroid Build Coastguard Worker# |target_os| is either 'darwin', 'linux', 'windows' or 'all'
44*6dbdd20aSAndroid Build Coastguard Worker# |target_arch| is either 'x64', 'arm64' or 'all'
45*6dbdd20aSAndroid Build Coastguard Worker# in both cases the dep only applies on matching platforms
46*6dbdd20aSAndroid Build Coastguard Worker# |target_arch| can be 'all' when 'target_os' is not 'all' for example in the
47*6dbdd20aSAndroid Build Coastguard Worker# case of MacOS universal binaries.
48*6dbdd20aSAndroid Build Coastguard Worker@dc.dataclass
49*6dbdd20aSAndroid Build Coastguard Workerclass Dependency:
50*6dbdd20aSAndroid Build Coastguard Worker  target_folder: str
51*6dbdd20aSAndroid Build Coastguard Worker  source_url: str
52*6dbdd20aSAndroid Build Coastguard Worker  checksum: str
53*6dbdd20aSAndroid Build Coastguard Worker  target_os: str
54*6dbdd20aSAndroid Build Coastguard Worker  target_arch: str
55*6dbdd20aSAndroid Build Coastguard Worker  submodules: bool = False
56*6dbdd20aSAndroid Build Coastguard Worker
57*6dbdd20aSAndroid Build Coastguard Worker
58*6dbdd20aSAndroid Build Coastguard Worker# This is to remove old directories when build tools get {re,}moved. This is to
59*6dbdd20aSAndroid Build Coastguard Worker# avoid accidentally referring to stale dir in custom user scripts.
60*6dbdd20aSAndroid Build Coastguard WorkerCLEANUP_OLD_DIRS = [
61*6dbdd20aSAndroid Build Coastguard Worker    'buildtools/nodejs',  # Moved to buildtools/{mac,linux64}/nodejs
62*6dbdd20aSAndroid Build Coastguard Worker    'buildtools/emsdk',  # Moved to buildtools/{mac,linux64}/emsdk
63*6dbdd20aSAndroid Build Coastguard Worker    'buildtools/test_data',  # Moved to test/data by r.android.com/1539381 .
64*6dbdd20aSAndroid Build Coastguard Worker    'buildtools/d8',  # Removed by r.android.com/1424334 .
65*6dbdd20aSAndroid Build Coastguard Worker
66*6dbdd20aSAndroid Build Coastguard Worker    # Build tools moved to third_party/ by r.android.com/2327602 .
67*6dbdd20aSAndroid Build Coastguard Worker    'buildtools/mac/clang-format',
68*6dbdd20aSAndroid Build Coastguard Worker    'buildtools/mac/gn',
69*6dbdd20aSAndroid Build Coastguard Worker    'buildtools/mac/ninja',
70*6dbdd20aSAndroid Build Coastguard Worker    'buildtools/linux64/clang-format',
71*6dbdd20aSAndroid Build Coastguard Worker    'buildtools/linux64/gn',
72*6dbdd20aSAndroid Build Coastguard Worker    'buildtools/linux64/ninja',
73*6dbdd20aSAndroid Build Coastguard Worker    'buildtools/win/clang-format.exe',
74*6dbdd20aSAndroid Build Coastguard Worker    'buildtools/win/gn.exe',
75*6dbdd20aSAndroid Build Coastguard Worker    'buildtools/win/ninja.exe',
76*6dbdd20aSAndroid Build Coastguard Worker]
77*6dbdd20aSAndroid Build Coastguard Worker
78*6dbdd20aSAndroid Build Coastguard Worker# Dependencies required to build code on the host or when targeting desktop OS.
79*6dbdd20aSAndroid Build Coastguard WorkerBUILD_DEPS_TOOLCHAIN_HOST = [
80*6dbdd20aSAndroid Build Coastguard Worker    # GN. From https://chrome-infra-packages.appspot.com/dl/gn/gn/.
81*6dbdd20aSAndroid Build Coastguard Worker    # git_revision:0725d7827575b239594fbc8fd5192873a1d62f44 .
82*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
83*6dbdd20aSAndroid Build Coastguard Worker        'third_party/gn/gn',
84*6dbdd20aSAndroid Build Coastguard Worker        'https://storage.googleapis.com/perfetto/gn-mac-1968-0725d782',
85*6dbdd20aSAndroid Build Coastguard Worker        '9ced623a664560bba38bbadb9b91158ca4186358c847e17ab7d982b351373c2e',
86*6dbdd20aSAndroid Build Coastguard Worker        'darwin', 'x64'),
87*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
88*6dbdd20aSAndroid Build Coastguard Worker        'third_party/gn/gn',
89*6dbdd20aSAndroid Build Coastguard Worker        'https://storage.googleapis.com/perfetto/gn-mac-arm64-1968-0725d782',
90*6dbdd20aSAndroid Build Coastguard Worker        'd22336b5210b4dad5e36e8c28ce81187f491822cf4d8fd0a257b30d6bee3fd3f',
91*6dbdd20aSAndroid Build Coastguard Worker        'darwin', 'arm64'),
92*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
93*6dbdd20aSAndroid Build Coastguard Worker        'third_party/gn/gn',
94*6dbdd20aSAndroid Build Coastguard Worker        'https://storage.googleapis.com/perfetto/gn-linux64-1968-0725d782',
95*6dbdd20aSAndroid Build Coastguard Worker        'f706aaa0676e3e22f5fc9ca482295d7caee8535d1869f99efa2358177b64f5cd',
96*6dbdd20aSAndroid Build Coastguard Worker        'linux', 'x64'),
97*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
98*6dbdd20aSAndroid Build Coastguard Worker        'third_party/gn/gn',
99*6dbdd20aSAndroid Build Coastguard Worker        'https://storage.googleapis.com/perfetto/gn-linux-arm64-1968-0725d782',
100*6dbdd20aSAndroid Build Coastguard Worker        'c2a372cd4f911028d8bc351fbf24835c9b1194fcc92beadf6c5a2b3addae973c',
101*6dbdd20aSAndroid Build Coastguard Worker        'linux', 'arm64'),
102*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
103*6dbdd20aSAndroid Build Coastguard Worker        'third_party/gn/gn.exe',
104*6dbdd20aSAndroid Build Coastguard Worker        'https://storage.googleapis.com/perfetto/gn-win-1968-0725d782',
105*6dbdd20aSAndroid Build Coastguard Worker        '001f777f023c7a6959c778fb3a6b6cfc63f6baef953410ecdeaec350fb12285b',
106*6dbdd20aSAndroid Build Coastguard Worker        'windows', 'x64'),
107*6dbdd20aSAndroid Build Coastguard Worker
108*6dbdd20aSAndroid Build Coastguard Worker    # clang-format
109*6dbdd20aSAndroid Build Coastguard Worker    # From
110*6dbdd20aSAndroid Build Coastguard Worker    # https://chromium.googlesource.com/chromium/src/buildtools/+/refs/heads/master/mac/clang-format.arm64.sha1
111*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
112*6dbdd20aSAndroid Build Coastguard Worker        'third_party/clang-format/clang-format',
113*6dbdd20aSAndroid Build Coastguard Worker        'https://storage.googleapis.com/chromium-clang-format/5553d7a3d912b7d49381ad68c9a56740601a57a0',
114*6dbdd20aSAndroid Build Coastguard Worker        'e077990b2ea6807f6abc71b4cf1e487719d7e40574baddd2b51187fdcc8db803',
115*6dbdd20aSAndroid Build Coastguard Worker        'darwin', 'arm64'),
116*6dbdd20aSAndroid Build Coastguard Worker    # From
117*6dbdd20aSAndroid Build Coastguard Worker    # https://chromium.googlesource.com/chromium/src/buildtools/+/refs/heads/master/mac/clang-format.x64.sha1
118*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
119*6dbdd20aSAndroid Build Coastguard Worker        'third_party/clang-format/clang-format',
120*6dbdd20aSAndroid Build Coastguard Worker        'https://storage.googleapis.com/chromium-clang-format/87d69aeff220c916b85b5d6d162fa5668aa9d64f',
121*6dbdd20aSAndroid Build Coastguard Worker        '71179a8788a009cfd589636d50f0eb9f95f58b0cfda4351430bed7c0a48c080b',
122*6dbdd20aSAndroid Build Coastguard Worker        'darwin', 'x64'),
123*6dbdd20aSAndroid Build Coastguard Worker    # From https://chromium.googlesource.com/chromium/src/buildtools/+/refs/heads/master/linux64/clang-format.sha1
124*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
125*6dbdd20aSAndroid Build Coastguard Worker        'third_party/clang-format/clang-format',
126*6dbdd20aSAndroid Build Coastguard Worker        'https://storage.googleapis.com/chromium-clang-format/1facab3101fc6da6b9467543f27f0622b966bc19',
127*6dbdd20aSAndroid Build Coastguard Worker        '5e459118d8ac825452e9e1f2717e4de5a36399dc6cc6aec7ec483ad27a0c927e',
128*6dbdd20aSAndroid Build Coastguard Worker        'linux', 'x64'),
129*6dbdd20aSAndroid Build Coastguard Worker    # From https://chromium.googlesource.com/chromium/src/buildtools/+/refs/heads/master/win/clang-format.exe.sha1
130*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
131*6dbdd20aSAndroid Build Coastguard Worker        'third_party/clang-format/clang-format.exe',
132*6dbdd20aSAndroid Build Coastguard Worker        'https://storage.googleapis.com/chromium-clang-format/2e569921b9884daf157021d6ae9e21991cd6cf81',
133*6dbdd20aSAndroid Build Coastguard Worker        '2227376ada89ea832995b832222b722a27c4d5d8d59e9c4d7842877f99a1e30d',
134*6dbdd20aSAndroid Build Coastguard Worker        'windows', 'x64'),
135*6dbdd20aSAndroid Build Coastguard Worker
136*6dbdd20aSAndroid Build Coastguard Worker    # Keep the SHA1 in sync with |clang_format_rev| in chromium //buildtools/DEPS.
137*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
138*6dbdd20aSAndroid Build Coastguard Worker        'buildtools/clang_format/script',
139*6dbdd20aSAndroid Build Coastguard Worker        'https://chromium.googlesource.com/external/github.com/llvm/llvm-project/clang/tools/clang-format.git',
140*6dbdd20aSAndroid Build Coastguard Worker        'f97059df7f8b205064625cdb5f97b56668a125ef', 'all', 'all'),
141*6dbdd20aSAndroid Build Coastguard Worker
142*6dbdd20aSAndroid Build Coastguard Worker    # Ninja
143*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
144*6dbdd20aSAndroid Build Coastguard Worker        'third_party/ninja/ninja',
145*6dbdd20aSAndroid Build Coastguard Worker        'https://storage.googleapis.com/perfetto/ninja-mac-x64_and_arm64-182',
146*6dbdd20aSAndroid Build Coastguard Worker        '36e8b7aaa06911e1334feb664dd731a1cd69a15eb916a231a3d10ff65fca2c73',
147*6dbdd20aSAndroid Build Coastguard Worker        'darwin', 'all'),
148*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
149*6dbdd20aSAndroid Build Coastguard Worker        'third_party/ninja/ninja',
150*6dbdd20aSAndroid Build Coastguard Worker        'https://storage.googleapis.com/perfetto/ninja-linux64-182',
151*6dbdd20aSAndroid Build Coastguard Worker        '54ac6a01362190aaabf4cf276f9c8982cdf11b225438940fdde3339be0f2ecdc',
152*6dbdd20aSAndroid Build Coastguard Worker        'linux', 'x64'),
153*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
154*6dbdd20aSAndroid Build Coastguard Worker        'third_party/ninja/ninja.exe',
155*6dbdd20aSAndroid Build Coastguard Worker        'https://storage.googleapis.com/perfetto/ninja-win-182',
156*6dbdd20aSAndroid Build Coastguard Worker        '09ced0fcd1a4dec7d1b798a2cf9ce5d20e5d2fbc2337343827f192ce47d0f491',
157*6dbdd20aSAndroid Build Coastguard Worker        'windows', 'x64'),
158*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
159*6dbdd20aSAndroid Build Coastguard Worker        'third_party/ninja/ninja',
160*6dbdd20aSAndroid Build Coastguard Worker        'https://storage.googleapis.com/perfetto/ninja-linux-arm64-1111',
161*6dbdd20aSAndroid Build Coastguard Worker        '05031a734ec4310a51b2cfe9f0096b26fce25ab4ff19e5b51abe6371de066cc5',
162*6dbdd20aSAndroid Build Coastguard Worker        'linux', 'arm64'),
163*6dbdd20aSAndroid Build Coastguard Worker
164*6dbdd20aSAndroid Build Coastguard Worker    # Keep the revision in sync with Chrome's PACKAGE_VERSION in
165*6dbdd20aSAndroid Build Coastguard Worker    # tools/clang/scripts/update.py.
166*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
167*6dbdd20aSAndroid Build Coastguard Worker        'buildtools/linux64/clang.tgz',
168*6dbdd20aSAndroid Build Coastguard Worker        'https://commondatastorage.googleapis.com/chromium-browser-clang/Linux_x64/clang-llvmorg-19-init-2941-ga0b3dbaf-22.tgz',
169*6dbdd20aSAndroid Build Coastguard Worker        '6741cc1083f935795330b6e04617ac891a7b5d2b5647b664c5b0fccc354adb43',
170*6dbdd20aSAndroid Build Coastguard Worker        'linux', 'x64'),
171*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
172*6dbdd20aSAndroid Build Coastguard Worker        'buildtools/win/clang.tgz',
173*6dbdd20aSAndroid Build Coastguard Worker        'https://commondatastorage.googleapis.com/chromium-browser-clang/Win/clang-llvmorg-19-init-2941-ga0b3dbaf-22.tgz',
174*6dbdd20aSAndroid Build Coastguard Worker        'f627080ed53d4c156f089323e04fa3690c8bb459110b62cd1952b0e1f0755987',
175*6dbdd20aSAndroid Build Coastguard Worker        'windows', 'x64'),
176*6dbdd20aSAndroid Build Coastguard Worker]
177*6dbdd20aSAndroid Build Coastguard Worker
178*6dbdd20aSAndroid Build Coastguard WorkerBUILD_DEPS_HOST = [
179*6dbdd20aSAndroid Build Coastguard Worker    # Keep in sync with Android's //external/googletest/METADATA.
180*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
181*6dbdd20aSAndroid Build Coastguard Worker        'buildtools/googletest',
182*6dbdd20aSAndroid Build Coastguard Worker        'https://android.googlesource.com/platform/external/googletest.git',
183*6dbdd20aSAndroid Build Coastguard Worker        '609281088cfefc76f9d0ce82e1ff6c30cc3591e5', 'all', 'all'),
184*6dbdd20aSAndroid Build Coastguard Worker
185*6dbdd20aSAndroid Build Coastguard Worker    # Keep in sync with Chromium's //third_party/protobuf.
186*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
187*6dbdd20aSAndroid Build Coastguard Worker        'buildtools/protobuf',
188*6dbdd20aSAndroid Build Coastguard Worker        # If you revert the below version back to an earlier version of
189*6dbdd20aSAndroid Build Coastguard Worker        # protobuf, make sure to revert the changes to
190*6dbdd20aSAndroid Build Coastguard Worker        # //gn/standalone/protoc.py as well.
191*6dbdd20aSAndroid Build Coastguard Worker        #
192*6dbdd20aSAndroid Build Coastguard Worker        # This comment can be removed with protobuf is next upreved.
193*6dbdd20aSAndroid Build Coastguard Worker        'https://chromium.googlesource.com/external/github.com/protocolbuffers/protobuf.git',
194*6dbdd20aSAndroid Build Coastguard Worker        'f0dc78d7e6e331b8c6bb2d5283e06aa26883ca7c',  # refs/tags/v21.12
195*6dbdd20aSAndroid Build Coastguard Worker        'all',
196*6dbdd20aSAndroid Build Coastguard Worker        'all'),
197*6dbdd20aSAndroid Build Coastguard Worker
198*6dbdd20aSAndroid Build Coastguard Worker    # libc++, libc++abi and libunwind for Linux where we need to rebuild the C++
199*6dbdd20aSAndroid Build Coastguard Worker    # lib from sources. Keep the SHA1s in sync with Chrome's src/buildtools/DEPS.
200*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
201*6dbdd20aSAndroid Build Coastguard Worker        'buildtools/libcxx',
202*6dbdd20aSAndroid Build Coastguard Worker        'https://chromium.googlesource.com/external/github.com/llvm/llvm-project/libcxx.git',
203*6dbdd20aSAndroid Build Coastguard Worker        '852bc6746f45add53fec19f3a29280e69e358d44', 'all', 'all'),
204*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
205*6dbdd20aSAndroid Build Coastguard Worker        'buildtools/libcxxabi',
206*6dbdd20aSAndroid Build Coastguard Worker        'https://chromium.googlesource.com/external/github.com/llvm/llvm-project/libcxxabi.git',
207*6dbdd20aSAndroid Build Coastguard Worker        'a37a3aa431f132b02a58656f13984d51098330a2', 'all', 'all'),
208*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
209*6dbdd20aSAndroid Build Coastguard Worker        'buildtools/libunwind',
210*6dbdd20aSAndroid Build Coastguard Worker        'https://chromium.googlesource.com/external/github.com/llvm/llvm-project/libunwind.git',
211*6dbdd20aSAndroid Build Coastguard Worker        '419b03c0b8f20d6da9ddcb0d661a94a97cdd7dad', 'all', 'all'),
212*6dbdd20aSAndroid Build Coastguard Worker
213*6dbdd20aSAndroid Build Coastguard Worker    # Keep in sync with chromium DEPS.
214*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
215*6dbdd20aSAndroid Build Coastguard Worker        'buildtools/libfuzzer',
216*6dbdd20aSAndroid Build Coastguard Worker        'https://chromium.googlesource.com/chromium/llvm-project/compiler-rt/lib/fuzzer.git',
217*6dbdd20aSAndroid Build Coastguard Worker        'debe7d2d1982e540fbd6bd78604bf001753f9e74', 'linux', 'all'),
218*6dbdd20aSAndroid Build Coastguard Worker
219*6dbdd20aSAndroid Build Coastguard Worker    # Benchmarking tool.
220*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
221*6dbdd20aSAndroid Build Coastguard Worker        'buildtools/benchmark',
222*6dbdd20aSAndroid Build Coastguard Worker        'https://chromium.googlesource.com/external/github.com/google/benchmark.git',
223*6dbdd20aSAndroid Build Coastguard Worker        'e991355c02b93fe17713efe04cbc2e278e00fdbd', 'all', 'all'),
224*6dbdd20aSAndroid Build Coastguard Worker
225*6dbdd20aSAndroid Build Coastguard Worker    # Libbacktrace, for stacktraces in Linux/Android debug builds.
226*6dbdd20aSAndroid Build Coastguard Worker    # From https://github.com/ianlancetaylor/libbacktrace/archive/177940370e4a6b2509e92a0aaa9749184e64af43.zip
227*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
228*6dbdd20aSAndroid Build Coastguard Worker        'buildtools/libbacktrace.zip',
229*6dbdd20aSAndroid Build Coastguard Worker        'https://storage.googleapis.com/perfetto/libbacktrace-14818b7783eeb9a56c3f0fca78cefd3143f8c5f6.zip',
230*6dbdd20aSAndroid Build Coastguard Worker        '0d09295938155aa84d9a6049f63df8cd2def3a28302b3550ea3ead9100b3d086',
231*6dbdd20aSAndroid Build Coastguard Worker        'all', 'all'),
232*6dbdd20aSAndroid Build Coastguard Worker
233*6dbdd20aSAndroid Build Coastguard Worker    # Sqlite for the trace processing library.
234*6dbdd20aSAndroid Build Coastguard Worker    # This is the amalgamated source whose compiled output is meant to be faster.
235*6dbdd20aSAndroid Build Coastguard Worker    # We still pull the full source for the extensions (which are not available
236*6dbdd20aSAndroid Build Coastguard Worker    # in the amalgamation).
237*6dbdd20aSAndroid Build Coastguard Worker    # If updating the version, also update bazel/deps.bzl.
238*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
239*6dbdd20aSAndroid Build Coastguard Worker        'buildtools/sqlite.zip',
240*6dbdd20aSAndroid Build Coastguard Worker        'https://storage.googleapis.com/perfetto/sqlite-amalgamation-3440200.zip',
241*6dbdd20aSAndroid Build Coastguard Worker        '833be89b53b3be8b40a2e3d5fedb635080e3edb204957244f3d6987c2bb2345f',
242*6dbdd20aSAndroid Build Coastguard Worker        'all', 'all'),
243*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
244*6dbdd20aSAndroid Build Coastguard Worker        'buildtools/sqlite_src',
245*6dbdd20aSAndroid Build Coastguard Worker        'https://chromium.googlesource.com/external/github.com/sqlite/sqlite.git',
246*6dbdd20aSAndroid Build Coastguard Worker        'c8f9803dc32bfee78a9ca2b1abbe39499729219b',  # refs/tags/version-3.44.2.
247*6dbdd20aSAndroid Build Coastguard Worker        'all',
248*6dbdd20aSAndroid Build Coastguard Worker        'all'),
249*6dbdd20aSAndroid Build Coastguard Worker
250*6dbdd20aSAndroid Build Coastguard Worker    # JsonCpp for legacy json import. Used only by the trace processor in
251*6dbdd20aSAndroid Build Coastguard Worker    # standalone builds.
252*6dbdd20aSAndroid Build Coastguard Worker    # If updating the version, also update bazel/deps.bzl.
253*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
254*6dbdd20aSAndroid Build Coastguard Worker        'buildtools/jsoncpp',
255*6dbdd20aSAndroid Build Coastguard Worker        'https://chromium.googlesource.com/external/github.com/open-source-parsers/jsoncpp.git',
256*6dbdd20aSAndroid Build Coastguard Worker        '6aba23f4a8628d599a9ef7fa4811c4ff6e4070e2',  # refs/tags/1.9.3.
257*6dbdd20aSAndroid Build Coastguard Worker        'all',
258*6dbdd20aSAndroid Build Coastguard Worker        'all'),
259*6dbdd20aSAndroid Build Coastguard Worker
260*6dbdd20aSAndroid Build Coastguard Worker    # Libexpat for Instruments XML import.
261*6dbdd20aSAndroid Build Coastguard Worker    # If updating the version, also update bazel/deps.bzl.
262*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
263*6dbdd20aSAndroid Build Coastguard Worker        'buildtools/expat/src',
264*6dbdd20aSAndroid Build Coastguard Worker        'https://chromium.googlesource.com/external/github.com/libexpat/libexpat.git',
265*6dbdd20aSAndroid Build Coastguard Worker        'fa75b96546c069d17b8f80d91e0f4ef0cde3790d',  # refs/tags/upstream/R_2_6_2.
266*6dbdd20aSAndroid Build Coastguard Worker        'all',
267*6dbdd20aSAndroid Build Coastguard Worker        'all'),
268*6dbdd20aSAndroid Build Coastguard Worker
269*6dbdd20aSAndroid Build Coastguard Worker    # Archive with only the demangling sources from llvm-project.
270*6dbdd20aSAndroid Build Coastguard Worker    # See tools/repackage_llvm_demangler.sh on how to update this.
271*6dbdd20aSAndroid Build Coastguard Worker    # File suffix is the git reference to the commit at which we rearchived the
272*6dbdd20aSAndroid Build Coastguard Worker    # sources, as hosted on https://llvm.googlesource.com/llvm-project.
273*6dbdd20aSAndroid Build Coastguard Worker    # If updating the version, also update bazel/deps.bzl.
274*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
275*6dbdd20aSAndroid Build Coastguard Worker        'buildtools/llvm-project.tgz',
276*6dbdd20aSAndroid Build Coastguard Worker        'https://storage.googleapis.com/perfetto/llvm-project-617a15a9eac96088ae5e9134248d8236e34b91b1.tgz',
277*6dbdd20aSAndroid Build Coastguard Worker        '7e2541446a27f2a09a84520da7bc93cd71749ba0f17318f2d5291fbf45b97956',
278*6dbdd20aSAndroid Build Coastguard Worker        'all', 'all'),
279*6dbdd20aSAndroid Build Coastguard Worker
280*6dbdd20aSAndroid Build Coastguard Worker    # These dependencies are for libunwindstack, which is used by src/profiling.
281*6dbdd20aSAndroid Build Coastguard Worker    Dependency('buildtools/android-core',
282*6dbdd20aSAndroid Build Coastguard Worker               'https://android.googlesource.com/platform/system/core.git',
283*6dbdd20aSAndroid Build Coastguard Worker               '9e6cef7f07d8c11b3ea820938aeb7ff2e9dbaa52', 'all', 'all'),
284*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
285*6dbdd20aSAndroid Build Coastguard Worker        'buildtools/android-unwinding',
286*6dbdd20aSAndroid Build Coastguard Worker        'https://android.googlesource.com/platform/system/unwinding.git',
287*6dbdd20aSAndroid Build Coastguard Worker        '4b59ea8471e89d01300481a92de3230b79b6d7c7', 'all', 'all'),
288*6dbdd20aSAndroid Build Coastguard Worker    Dependency('buildtools/android-logging',
289*6dbdd20aSAndroid Build Coastguard Worker               'https://android.googlesource.com/platform/system/logging.git',
290*6dbdd20aSAndroid Build Coastguard Worker               '7b36b566c9113fc703d68f76e8f40c0c2432481c', 'all', 'all'),
291*6dbdd20aSAndroid Build Coastguard Worker    Dependency('buildtools/android-libbase',
292*6dbdd20aSAndroid Build Coastguard Worker               'https://android.googlesource.com/platform/system/libbase.git',
293*6dbdd20aSAndroid Build Coastguard Worker               '78f1c2f83e625bdf66d55b48bdb3a301c20d2fb3', 'all', 'all'),
294*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
295*6dbdd20aSAndroid Build Coastguard Worker        'buildtools/android-libprocinfo',
296*6dbdd20aSAndroid Build Coastguard Worker        'https://android.googlesource.com/platform/system/libprocinfo.git',
297*6dbdd20aSAndroid Build Coastguard Worker        'fd214c13ededecae97a3b15b5fccc8925a749a84', 'all', 'all'),
298*6dbdd20aSAndroid Build Coastguard Worker    Dependency('buildtools/lzma',
299*6dbdd20aSAndroid Build Coastguard Worker               'https://android.googlesource.com/platform/external/lzma.git',
300*6dbdd20aSAndroid Build Coastguard Worker               '7851dce6f4ca17f5caa1c93a4e0a45686b1d56c3', 'all', 'all'),
301*6dbdd20aSAndroid Build Coastguard Worker    Dependency('buildtools/zstd',
302*6dbdd20aSAndroid Build Coastguard Worker               'https://android.googlesource.com/platform/external/zstd.git',
303*6dbdd20aSAndroid Build Coastguard Worker               '77211fcc5e08c781734a386402ada93d0d18d093', 'all', 'all'),
304*6dbdd20aSAndroid Build Coastguard Worker    Dependency('buildtools/bionic',
305*6dbdd20aSAndroid Build Coastguard Worker               'https://android.googlesource.com/platform/bionic.git',
306*6dbdd20aSAndroid Build Coastguard Worker               'a0d0355105cb9d4a4b5384897448676133d7b8e2', 'all', 'all'),
307*6dbdd20aSAndroid Build Coastguard Worker
308*6dbdd20aSAndroid Build Coastguard Worker    # Zlib used both in the tracing binaries, as well as the trace processor and
309*6dbdd20aSAndroid Build Coastguard Worker    # assorted tools.
310*6dbdd20aSAndroid Build Coastguard Worker    # If updating the version, also update bazel/deps.bzl.
311*6dbdd20aSAndroid Build Coastguard Worker    Dependency('buildtools/zlib',
312*6dbdd20aSAndroid Build Coastguard Worker               'https://android.googlesource.com/platform/external/zlib.git',
313*6dbdd20aSAndroid Build Coastguard Worker               '6d3f6aa0f87c9791ca7724c279ef61384f331dfd', 'all', 'all'),
314*6dbdd20aSAndroid Build Coastguard Worker
315*6dbdd20aSAndroid Build Coastguard Worker    # Linenoise, used only by trace_processor in standalone builds.
316*6dbdd20aSAndroid Build Coastguard Worker    # If updating the version, also update bazel/deps.bzl.
317*6dbdd20aSAndroid Build Coastguard Worker    Dependency('buildtools/linenoise',
318*6dbdd20aSAndroid Build Coastguard Worker               'https://fuchsia.googlesource.com/third_party/linenoise.git',
319*6dbdd20aSAndroid Build Coastguard Worker               'c894b9e59f02203dbe4e2be657572cf88c4230c3', 'all', 'all'),
320*6dbdd20aSAndroid Build Coastguard Worker
321*6dbdd20aSAndroid Build Coastguard Worker    # Bloaty, used to investigate binary size
322*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
323*6dbdd20aSAndroid Build Coastguard Worker        'buildtools/bloaty.zip',
324*6dbdd20aSAndroid Build Coastguard Worker        'https://storage.googleapis.com/perfetto/bloaty-1.1-b3b829de35babc2fe831b9488ad2e50bca939412-mac.zip',
325*6dbdd20aSAndroid Build Coastguard Worker        '2d301bd72a20e3f42888c9274ceb4dca76c103608053572322412c2c65ab8cb8',
326*6dbdd20aSAndroid Build Coastguard Worker        'darwin', 'all'),
327*6dbdd20aSAndroid Build Coastguard Worker
328*6dbdd20aSAndroid Build Coastguard Worker    Dependency('buildtools/open_csd',
329*6dbdd20aSAndroid Build Coastguard Worker            'https://android.googlesource.com/platform/external/OpenCSD.git',
330*6dbdd20aSAndroid Build Coastguard Worker            '0ce01e934f95efb6a216a6efa35af1245151c779', 'all', 'all'),
331*6dbdd20aSAndroid Build Coastguard Worker]
332*6dbdd20aSAndroid Build Coastguard Worker
333*6dbdd20aSAndroid Build Coastguard Worker# Dependencies required to build Android code.
334*6dbdd20aSAndroid Build Coastguard Worker# URLs and SHA1s taken from:
335*6dbdd20aSAndroid Build Coastguard Worker# - https://dl.google.com/android/repository/repository-11.xml
336*6dbdd20aSAndroid Build Coastguard Worker# - https://dl.google.com/android/repository/sys-img/android/sys-img.xml
337*6dbdd20aSAndroid Build Coastguard WorkerBUILD_DEPS_ANDROID = [
338*6dbdd20aSAndroid Build Coastguard Worker    # Android NDK
339*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
340*6dbdd20aSAndroid Build Coastguard Worker        'buildtools/ndk.zip',
341*6dbdd20aSAndroid Build Coastguard Worker        'https://dl.google.com/android/repository/android-ndk-r26c-darwin.zip',
342*6dbdd20aSAndroid Build Coastguard Worker        '312756dfcbdbf389d35d651e17ca98683bd36cb83cc7bf7ad51cac5c06bd064b',
343*6dbdd20aSAndroid Build Coastguard Worker        'darwin', 'all'),
344*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
345*6dbdd20aSAndroid Build Coastguard Worker        'buildtools/ndk.zip',
346*6dbdd20aSAndroid Build Coastguard Worker        'https://dl.google.com/android/repository/android-ndk-r26c-linux.zip',
347*6dbdd20aSAndroid Build Coastguard Worker        '6d6e659834d28bb24ba7ae66148ad05115ebbad7dabed1af9b3265674774fcf6',
348*6dbdd20aSAndroid Build Coastguard Worker        'linux', 'x64'),
349*6dbdd20aSAndroid Build Coastguard Worker]
350*6dbdd20aSAndroid Build Coastguard Worker
351*6dbdd20aSAndroid Build Coastguard Worker# Dependencies required to run Android tests.
352*6dbdd20aSAndroid Build Coastguard WorkerTEST_DEPS_ANDROID = [
353*6dbdd20aSAndroid Build Coastguard Worker    # Android emulator images.
354*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
355*6dbdd20aSAndroid Build Coastguard Worker        'buildtools/aosp-arm.zip',
356*6dbdd20aSAndroid Build Coastguard Worker        'https://storage.googleapis.com/perfetto/aosp-02022018-arm.zip',
357*6dbdd20aSAndroid Build Coastguard Worker        'f5c7a3a22ad7aa0bd14ba467e8697e1e917d306699bd25622aa4419a413b9b67',
358*6dbdd20aSAndroid Build Coastguard Worker        'all', 'all'),
359*6dbdd20aSAndroid Build Coastguard Worker
360*6dbdd20aSAndroid Build Coastguard Worker    # platform-tools.zip contains adb binaries.
361*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
362*6dbdd20aSAndroid Build Coastguard Worker        'buildtools/android_sdk/platform-tools.zip',
363*6dbdd20aSAndroid Build Coastguard Worker        'https://dl.google.com/android/repository/platform-tools_r26.0.0-darwin.zip',
364*6dbdd20aSAndroid Build Coastguard Worker        '98d392cbd21ca20d643c7e1605760cc49075611e317c534096b5564053f4ac8e',
365*6dbdd20aSAndroid Build Coastguard Worker        'darwin', 'all'),
366*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
367*6dbdd20aSAndroid Build Coastguard Worker        'buildtools/android_sdk/platform-tools.zip',
368*6dbdd20aSAndroid Build Coastguard Worker        'https://dl.google.com/android/repository/platform-tools_r26.0.0-linux.zip',
369*6dbdd20aSAndroid Build Coastguard Worker        '90208207521d85abf0d46e3374aa4e04b7aff74e4f355c792ac334de7a77e50b',
370*6dbdd20aSAndroid Build Coastguard Worker        'linux', 'x64'),
371*6dbdd20aSAndroid Build Coastguard Worker
372*6dbdd20aSAndroid Build Coastguard Worker    # Android emulator binaries.
373*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
374*6dbdd20aSAndroid Build Coastguard Worker        'buildtools/emulator',
375*6dbdd20aSAndroid Build Coastguard Worker        'https://android.googlesource.com/platform/prebuilts/android-emulator.git',
376*6dbdd20aSAndroid Build Coastguard Worker        '4b260028dc27bc92c39bee9129cb2ba839970956', 'all', 'x64'),
377*6dbdd20aSAndroid Build Coastguard Worker]
378*6dbdd20aSAndroid Build Coastguard Worker
379*6dbdd20aSAndroid Build Coastguard Worker# This variable is updated by tools/roll-catapult-trace-viewer.
380*6dbdd20aSAndroid Build Coastguard WorkerCATAPULT_SHA256 = 'b30108e05268ce6c65bb4126b65f6bfac165d17f5c1fd285046e7e6fd76c209f'
381*6dbdd20aSAndroid Build Coastguard Worker
382*6dbdd20aSAndroid Build Coastguard WorkerTYPEFACES_SHA256 = '1065172aaf0e9c22bc4f206ed9fdf5f1b4355d233fb21f9f26a89cd66c941940'
383*6dbdd20aSAndroid Build Coastguard Worker
384*6dbdd20aSAndroid Build Coastguard WorkerUI_DEPS = [
385*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
386*6dbdd20aSAndroid Build Coastguard Worker        'buildtools/mac/nodejs.tgz',
387*6dbdd20aSAndroid Build Coastguard Worker        'https://storage.googleapis.com/chromium-nodejs/20.11.0/5b5681e12a21cda986410f69e03e6220a21dd4d2',
388*6dbdd20aSAndroid Build Coastguard Worker        'cecb99fbb369a9090dddc27e228b66335cd72555b44fa8839ef78e56c51682c5',
389*6dbdd20aSAndroid Build Coastguard Worker        'darwin', 'arm64'),
390*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
391*6dbdd20aSAndroid Build Coastguard Worker        'buildtools/mac/nodejs.tgz',
392*6dbdd20aSAndroid Build Coastguard Worker        'https://storage.googleapis.com/chromium-nodejs/20.11.0/e3c0fd53caae857309815f3f8de7c2dce49d7bca',
393*6dbdd20aSAndroid Build Coastguard Worker        '20affacca2480c368b75a1d91ec1a2720604b325207ef0cf39cfef3c235dad19',
394*6dbdd20aSAndroid Build Coastguard Worker        'darwin', 'x64'),
395*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
396*6dbdd20aSAndroid Build Coastguard Worker        'buildtools/linux64/nodejs.tgz',
397*6dbdd20aSAndroid Build Coastguard Worker        'https://storage.googleapis.com/chromium-nodejs/20.11.0/f9a337cfa0e2b92d3e5c671c26b454bd8e99769e',
398*6dbdd20aSAndroid Build Coastguard Worker        '0ba9cc91698c1f833a1fdc1fe0cb392d825ad484c71b0d84388ac80bfd3d6079',
399*6dbdd20aSAndroid Build Coastguard Worker        'linux', 'x64'),
400*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
401*6dbdd20aSAndroid Build Coastguard Worker        'buildtools/mac/emsdk.tgz',
402*6dbdd20aSAndroid Build Coastguard Worker        'https://storage.googleapis.com/perfetto/emscripten-2.0.12-mac.tgz',
403*6dbdd20aSAndroid Build Coastguard Worker        'aa125f8c8ff8a386d43e18c8ea0c98c875cc19160a899403e8967a5478f96f31',
404*6dbdd20aSAndroid Build Coastguard Worker        'darwin', 'all'),
405*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
406*6dbdd20aSAndroid Build Coastguard Worker        'buildtools/linux64/emsdk.tgz',
407*6dbdd20aSAndroid Build Coastguard Worker        'https://storage.googleapis.com/perfetto/emscripten-2.0.12-linux.tgz',
408*6dbdd20aSAndroid Build Coastguard Worker        'bfff9fb0326363c12e19b542f27a5f12cedbfc310f30621dc497c9af51d2d2e3',
409*6dbdd20aSAndroid Build Coastguard Worker        'linux', 'x64'),
410*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
411*6dbdd20aSAndroid Build Coastguard Worker        'buildtools/catapult_trace_viewer.tgz',
412*6dbdd20aSAndroid Build Coastguard Worker        'https://storage.googleapis.com/perfetto/catapult_trace_viewer-%s.tar.gz'
413*6dbdd20aSAndroid Build Coastguard Worker        % CATAPULT_SHA256, CATAPULT_SHA256, 'all', 'all'),
414*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
415*6dbdd20aSAndroid Build Coastguard Worker        'buildtools/typefaces.tgz',
416*6dbdd20aSAndroid Build Coastguard Worker        'https://storage.googleapis.com/perfetto/typefaces-%s.tar.gz' %
417*6dbdd20aSAndroid Build Coastguard Worker        TYPEFACES_SHA256, TYPEFACES_SHA256, 'all', 'all'),
418*6dbdd20aSAndroid Build Coastguard Worker
419*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
420*6dbdd20aSAndroid Build Coastguard Worker        'third_party/pnpm/pnpm',
421*6dbdd20aSAndroid Build Coastguard Worker        'https://storage.googleapis.com/perfetto/pnpm-linux-arm64-8.6.3',
422*6dbdd20aSAndroid Build Coastguard Worker        'ac76e9ab6a770479f93c1a2bf978d72636dbcb02608554378cf30075a78a22ac',
423*6dbdd20aSAndroid Build Coastguard Worker        'linux', 'arm64'),
424*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
425*6dbdd20aSAndroid Build Coastguard Worker        'third_party/pnpm/pnpm',
426*6dbdd20aSAndroid Build Coastguard Worker        'https://storage.googleapis.com/perfetto/pnpm-linux-x64-8.6.3',
427*6dbdd20aSAndroid Build Coastguard Worker        '5a58ccd78d44faac138d901976a7a8917c0f2a2f83743cfdd895fcd0bb6aa135',
428*6dbdd20aSAndroid Build Coastguard Worker        'linux', 'x64'),
429*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
430*6dbdd20aSAndroid Build Coastguard Worker        'third_party/pnpm/pnpm',
431*6dbdd20aSAndroid Build Coastguard Worker        'https://storage.googleapis.com/perfetto/pnpm-macos-arm64-8.6.3',
432*6dbdd20aSAndroid Build Coastguard Worker        'f527713d3183e30cfbfd7fd6403ceed730831c53649e50c979961eab3b2cf866',
433*6dbdd20aSAndroid Build Coastguard Worker        'darwin', 'arm64'),
434*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
435*6dbdd20aSAndroid Build Coastguard Worker        'third_party/pnpm/pnpm',
436*6dbdd20aSAndroid Build Coastguard Worker        'https://storage.googleapis.com/perfetto/pnpm-macos-x64-8.6.3',
437*6dbdd20aSAndroid Build Coastguard Worker        '6b425f7f0342341e9ee9427a9a2be2c89936c4a04efe6125f7af667eb02b10c1',
438*6dbdd20aSAndroid Build Coastguard Worker        'darwin', 'x64'),
439*6dbdd20aSAndroid Build Coastguard Worker]
440*6dbdd20aSAndroid Build Coastguard Worker
441*6dbdd20aSAndroid Build Coastguard Worker# Dependencies to build gRPC.
442*6dbdd20aSAndroid Build Coastguard WorkerBIGTRACE_DEPS = [
443*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
444*6dbdd20aSAndroid Build Coastguard Worker        'buildtools/grpc/src',
445*6dbdd20aSAndroid Build Coastguard Worker        'https://chromium.googlesource.com/external/github.com/grpc/grpc.git',
446*6dbdd20aSAndroid Build Coastguard Worker        '4795c5e69b25e8c767b498bea784da0ef8c96fd5', 'all', 'all', True),
447*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
448*6dbdd20aSAndroid Build Coastguard Worker      'buildtools/cpp-httplib',
449*6dbdd20aSAndroid Build Coastguard Worker      'https://github.com/yhirose/cpp-httplib.git',
450*6dbdd20aSAndroid Build Coastguard Worker      '6c3e8482f7b4e3b307bb42afbb85fd8771da86b8',
451*6dbdd20aSAndroid Build Coastguard Worker      'all', 'all', True
452*6dbdd20aSAndroid Build Coastguard Worker    )
453*6dbdd20aSAndroid Build Coastguard Worker]
454*6dbdd20aSAndroid Build Coastguard Worker
455*6dbdd20aSAndroid Build Coastguard Worker# Sysroots required to cross-compile Linux targets (linux-arm{,64}).
456*6dbdd20aSAndroid Build Coastguard Worker# These are taken from Chromium's build/linux/sysroot_scripts/sysroots.json.
457*6dbdd20aSAndroid Build Coastguard WorkerBUILD_DEPS_LINUX_CROSS_SYSROOTS = [
458*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
459*6dbdd20aSAndroid Build Coastguard Worker        'buildtools/debian_sid_arm-sysroot.tgz',
460*6dbdd20aSAndroid Build Coastguard Worker        'https://commondatastorage.googleapis.com/chrome-linux-sysroot/toolchain/11d6f690ca49e8ba01a1d8c5346cedad2cf308fd/debian_sid_arm_sysroot.tar.xz',
461*6dbdd20aSAndroid Build Coastguard Worker        'ff192fe073d140d836c9ca1e68f7200d558bb9aa6c5c8f4f76f794f82890f99a',
462*6dbdd20aSAndroid Build Coastguard Worker        'linux', 'all'),
463*6dbdd20aSAndroid Build Coastguard Worker    Dependency(
464*6dbdd20aSAndroid Build Coastguard Worker        'buildtools/debian_sid_arm64-sysroot.tgz',
465*6dbdd20aSAndroid Build Coastguard Worker        'https://commondatastorage.googleapis.com/chrome-linux-sysroot/toolchain/2befe8ce3e88be6080e4fb7e6d412278ea6a7625/debian_sid_arm64_sysroot.tar.xz',
466*6dbdd20aSAndroid Build Coastguard Worker        'e4389eab2fe363f3fbdfa4d3ce9d94457d78fd2c0e62171a7534867623eadc90',
467*6dbdd20aSAndroid Build Coastguard Worker        'linux', 'all'),
468*6dbdd20aSAndroid Build Coastguard Worker]
469*6dbdd20aSAndroid Build Coastguard Worker
470*6dbdd20aSAndroid Build Coastguard WorkerALL_DEPS = (
471*6dbdd20aSAndroid Build Coastguard Worker    BUILD_DEPS_HOST + BUILD_DEPS_ANDROID + BUILD_DEPS_LINUX_CROSS_SYSROOTS +
472*6dbdd20aSAndroid Build Coastguard Worker    TEST_DEPS_ANDROID + UI_DEPS)
473*6dbdd20aSAndroid Build Coastguard Worker
474*6dbdd20aSAndroid Build Coastguard WorkerROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
475*6dbdd20aSAndroid Build Coastguard WorkerUI_DIR = os.path.join(ROOT_DIR, 'ui')
476*6dbdd20aSAndroid Build Coastguard WorkerTOOLS_DIR = os.path.join(ROOT_DIR, 'tools')
477*6dbdd20aSAndroid Build Coastguard WorkerNODE_MODULES_STATUS_FILE = os.path.join(UI_DIR, 'node_modules', '.last_install')
478*6dbdd20aSAndroid Build Coastguard WorkerTEST_DATA_SCRIPT = os.path.join(TOOLS_DIR, 'test_data')
479*6dbdd20aSAndroid Build Coastguard Worker
480*6dbdd20aSAndroid Build Coastguard Worker
481*6dbdd20aSAndroid Build Coastguard Workerdef CheckCallRetry(*args, **kwargs):
482*6dbdd20aSAndroid Build Coastguard Worker  """ Like subprocess.check_call, with retries up to 5 times. """
483*6dbdd20aSAndroid Build Coastguard Worker  MAX_ATTEMPTS = 5
484*6dbdd20aSAndroid Build Coastguard Worker  for attempt in range(1, MAX_ATTEMPTS + 1):
485*6dbdd20aSAndroid Build Coastguard Worker    try:
486*6dbdd20aSAndroid Build Coastguard Worker      return subprocess.check_call(*args, **kwargs)
487*6dbdd20aSAndroid Build Coastguard Worker    except subprocess.CalledProcessError as error:
488*6dbdd20aSAndroid Build Coastguard Worker      if attempt == MAX_ATTEMPTS:
489*6dbdd20aSAndroid Build Coastguard Worker        raise error
490*6dbdd20aSAndroid Build Coastguard Worker      else:
491*6dbdd20aSAndroid Build Coastguard Worker        logging.error(error)
492*6dbdd20aSAndroid Build Coastguard Worker        time.sleep(attempt * 3)
493*6dbdd20aSAndroid Build Coastguard Worker
494*6dbdd20aSAndroid Build Coastguard Worker
495*6dbdd20aSAndroid Build Coastguard Workerdef DownloadURL(url, out_file):
496*6dbdd20aSAndroid Build Coastguard Worker  CheckCallRetry(['curl', '-L', '-#', '-o', out_file, url])
497*6dbdd20aSAndroid Build Coastguard Worker
498*6dbdd20aSAndroid Build Coastguard Worker
499*6dbdd20aSAndroid Build Coastguard Workerdef GetArch():
500*6dbdd20aSAndroid Build Coastguard Worker  arch = machine()
501*6dbdd20aSAndroid Build Coastguard Worker  if arch == 'arm64':
502*6dbdd20aSAndroid Build Coastguard Worker    return 'arm64'
503*6dbdd20aSAndroid Build Coastguard Worker  elif arch == 'aarch64':
504*6dbdd20aSAndroid Build Coastguard Worker    return 'arm64'
505*6dbdd20aSAndroid Build Coastguard Worker  else:
506*6dbdd20aSAndroid Build Coastguard Worker    # Assume everything else is x64 matching previous behaviour.
507*6dbdd20aSAndroid Build Coastguard Worker    return 'x64'
508*6dbdd20aSAndroid Build Coastguard Worker
509*6dbdd20aSAndroid Build Coastguard Worker
510*6dbdd20aSAndroid Build Coastguard Workerdef ReadFile(path):
511*6dbdd20aSAndroid Build Coastguard Worker  if not os.path.exists(path):
512*6dbdd20aSAndroid Build Coastguard Worker    return None
513*6dbdd20aSAndroid Build Coastguard Worker  with open(path) as f:
514*6dbdd20aSAndroid Build Coastguard Worker    return f.read().strip()
515*6dbdd20aSAndroid Build Coastguard Worker
516*6dbdd20aSAndroid Build Coastguard Worker
517*6dbdd20aSAndroid Build Coastguard Workerdef MkdirRecursive(path):
518*6dbdd20aSAndroid Build Coastguard Worker  # Works with both relative and absolute paths
519*6dbdd20aSAndroid Build Coastguard Worker  cwd = '/' if path.startswith('/') else ROOT_DIR
520*6dbdd20aSAndroid Build Coastguard Worker  for part in path.split('/'):
521*6dbdd20aSAndroid Build Coastguard Worker    cwd = os.path.join(cwd, part)
522*6dbdd20aSAndroid Build Coastguard Worker    if not os.path.exists(cwd):
523*6dbdd20aSAndroid Build Coastguard Worker      os.makedirs(cwd)
524*6dbdd20aSAndroid Build Coastguard Worker    else:
525*6dbdd20aSAndroid Build Coastguard Worker      assert (os.path.isdir(cwd))
526*6dbdd20aSAndroid Build Coastguard Worker
527*6dbdd20aSAndroid Build Coastguard Worker
528*6dbdd20aSAndroid Build Coastguard Workerdef HashLocalFile(path):
529*6dbdd20aSAndroid Build Coastguard Worker  if not os.path.exists(path):
530*6dbdd20aSAndroid Build Coastguard Worker    return None
531*6dbdd20aSAndroid Build Coastguard Worker  with open(path, 'rb') as f:
532*6dbdd20aSAndroid Build Coastguard Worker    return hashlib.sha256(f.read()).hexdigest()
533*6dbdd20aSAndroid Build Coastguard Worker
534*6dbdd20aSAndroid Build Coastguard Worker
535*6dbdd20aSAndroid Build Coastguard Workerdef ExtractZipfilePreservePermissions(zf, info, path):
536*6dbdd20aSAndroid Build Coastguard Worker  target_path = os.path.join(path, info.filename)
537*6dbdd20aSAndroid Build Coastguard Worker  mode = info.external_attr >> 16
538*6dbdd20aSAndroid Build Coastguard Worker  S_IFLNK  = 0o120000  # symbolic link
539*6dbdd20aSAndroid Build Coastguard Worker  if (mode & S_IFLNK) == S_IFLNK:
540*6dbdd20aSAndroid Build Coastguard Worker    dst = zf.read(info).decode()
541*6dbdd20aSAndroid Build Coastguard Worker    os.symlink(dst, target_path)
542*6dbdd20aSAndroid Build Coastguard Worker    return
543*6dbdd20aSAndroid Build Coastguard Worker  zf.extract(info.filename, path=path)
544*6dbdd20aSAndroid Build Coastguard Worker  min_acls = 0o755 if info.filename.endswith('/') else 0o644
545*6dbdd20aSAndroid Build Coastguard Worker  os.chmod(target_path, mode | min_acls)
546*6dbdd20aSAndroid Build Coastguard Worker
547*6dbdd20aSAndroid Build Coastguard Worker
548*6dbdd20aSAndroid Build Coastguard Workerdef IsGitRepoCheckoutOutAtRevision(path, revision):
549*6dbdd20aSAndroid Build Coastguard Worker  return ReadFile(os.path.join(path, '.git', 'HEAD')) == revision
550*6dbdd20aSAndroid Build Coastguard Worker
551*6dbdd20aSAndroid Build Coastguard Worker
552*6dbdd20aSAndroid Build Coastguard Workerdef RmtreeIfExists(path):
553*6dbdd20aSAndroid Build Coastguard Worker  # Git creates read-only files on windows, which cause failures with rmtree.
554*6dbdd20aSAndroid Build Coastguard Worker  # This seems the socially accepted way to deal with it.
555*6dbdd20aSAndroid Build Coastguard Worker  # See https://bugs.python.org/issue19643 .
556*6dbdd20aSAndroid Build Coastguard Worker  def del_read_only_for_windows(_action, name, _exc):
557*6dbdd20aSAndroid Build Coastguard Worker    os.chmod(name, stat.S_IWRITE)
558*6dbdd20aSAndroid Build Coastguard Worker    os.remove(name)
559*6dbdd20aSAndroid Build Coastguard Worker
560*6dbdd20aSAndroid Build Coastguard Worker  if not os.path.exists(path):
561*6dbdd20aSAndroid Build Coastguard Worker    return
562*6dbdd20aSAndroid Build Coastguard Worker  third_party_path = os.path.abspath(os.path.join(ROOT_DIR, 'third_party'))
563*6dbdd20aSAndroid Build Coastguard Worker  buildtools_path = os.path.abspath(os.path.join(ROOT_DIR, 'buildtools'))
564*6dbdd20aSAndroid Build Coastguard Worker  test_path = os.path.abspath(os.path.join(ROOT_DIR, 'test', 'data'))
565*6dbdd20aSAndroid Build Coastguard Worker  if (not os.path.abspath(path).startswith(buildtools_path) and
566*6dbdd20aSAndroid Build Coastguard Worker      not os.path.abspath(path).startswith(test_path) and
567*6dbdd20aSAndroid Build Coastguard Worker      not os.path.abspath(path).startswith(third_party_path)):
568*6dbdd20aSAndroid Build Coastguard Worker    # Safety check to prevent that some merge confilct ends up doing some
569*6dbdd20aSAndroid Build Coastguard Worker    # rm -rf / or similar.
570*6dbdd20aSAndroid Build Coastguard Worker    logging.fatal(
571*6dbdd20aSAndroid Build Coastguard Worker        'Cannot remove %s: outside of {buildtools, test/data, third_party}',
572*6dbdd20aSAndroid Build Coastguard Worker        path)
573*6dbdd20aSAndroid Build Coastguard Worker    sys.exit(1)
574*6dbdd20aSAndroid Build Coastguard Worker  logging.info('Removing %s' % path)
575*6dbdd20aSAndroid Build Coastguard Worker  if os.path.isdir(path):
576*6dbdd20aSAndroid Build Coastguard Worker    shutil.rmtree(path, onerror=del_read_only_for_windows)
577*6dbdd20aSAndroid Build Coastguard Worker  else:
578*6dbdd20aSAndroid Build Coastguard Worker    os.remove(path)
579*6dbdd20aSAndroid Build Coastguard Worker
580*6dbdd20aSAndroid Build Coastguard Worker
581*6dbdd20aSAndroid Build Coastguard Workerdef CheckoutGitRepo(path, git_url, revision, check_only):
582*6dbdd20aSAndroid Build Coastguard Worker  if IsGitRepoCheckoutOutAtRevision(path, revision):
583*6dbdd20aSAndroid Build Coastguard Worker    return False
584*6dbdd20aSAndroid Build Coastguard Worker  if check_only:
585*6dbdd20aSAndroid Build Coastguard Worker    return True
586*6dbdd20aSAndroid Build Coastguard Worker  path = path.replace('/', os.sep)
587*6dbdd20aSAndroid Build Coastguard Worker  RmtreeIfExists(path)
588*6dbdd20aSAndroid Build Coastguard Worker  MkdirRecursive(path)
589*6dbdd20aSAndroid Build Coastguard Worker  logging.info('Fetching %s @ %s into %s', git_url, revision, path)
590*6dbdd20aSAndroid Build Coastguard Worker  subprocess.check_call(['git', 'init', path], cwd=path)
591*6dbdd20aSAndroid Build Coastguard Worker  CheckCallRetry(['git', 'fetch', '--quiet', '--depth', '1', git_url, revision],
592*6dbdd20aSAndroid Build Coastguard Worker                 cwd=path)
593*6dbdd20aSAndroid Build Coastguard Worker  subprocess.check_call(['git', 'checkout', revision, '--quiet'], cwd=path)
594*6dbdd20aSAndroid Build Coastguard Worker  CheckCallRetry(
595*6dbdd20aSAndroid Build Coastguard Worker      ['git', 'submodule', 'update', '--init', '--recursive', '--quiet'],
596*6dbdd20aSAndroid Build Coastguard Worker      cwd=path)
597*6dbdd20aSAndroid Build Coastguard Worker  assert (IsGitRepoCheckoutOutAtRevision(path, revision))
598*6dbdd20aSAndroid Build Coastguard Worker  return True
599*6dbdd20aSAndroid Build Coastguard Worker
600*6dbdd20aSAndroid Build Coastguard Worker
601*6dbdd20aSAndroid Build Coastguard Workerdef InstallNodeModules(force_clean=False):
602*6dbdd20aSAndroid Build Coastguard Worker  if force_clean:
603*6dbdd20aSAndroid Build Coastguard Worker    node_modules = os.path.join(UI_DIR, 'node_modules')
604*6dbdd20aSAndroid Build Coastguard Worker    logging.info('Clearing %s', node_modules)
605*6dbdd20aSAndroid Build Coastguard Worker    subprocess.check_call(['git', 'clean', '-qxffd', node_modules],
606*6dbdd20aSAndroid Build Coastguard Worker                          cwd=ROOT_DIR)
607*6dbdd20aSAndroid Build Coastguard Worker  logging.info("Running `pnpm install --shamefully-hoist --frozen-lockfile` in {0}".format(UI_DIR))
608*6dbdd20aSAndroid Build Coastguard Worker
609*6dbdd20aSAndroid Build Coastguard Worker  # Some node modules have postinstall scripts (already bad) but worse
610*6dbdd20aSAndroid Build Coastguard Worker  # sometimes they are in the form: "postinstall: 'node ./scripts/foo'"
611*6dbdd20aSAndroid Build Coastguard Worker  # so here we need to ensure that our hermetic node is available in
612*6dbdd20aSAndroid Build Coastguard Worker  # PATH.
613*6dbdd20aSAndroid Build Coastguard Worker  env = os.environ.copy()
614*6dbdd20aSAndroid Build Coastguard Worker  env['PATH'] = TOOLS_DIR + ':' + env['PATH']
615*6dbdd20aSAndroid Build Coastguard Worker
616*6dbdd20aSAndroid Build Coastguard Worker  subprocess.check_call([
617*6dbdd20aSAndroid Build Coastguard Worker    os.path.join(TOOLS_DIR, 'pnpm'),
618*6dbdd20aSAndroid Build Coastguard Worker    'install',
619*6dbdd20aSAndroid Build Coastguard Worker    '--shamefully-hoist',
620*6dbdd20aSAndroid Build Coastguard Worker    '--frozen-lockfile'],
621*6dbdd20aSAndroid Build Coastguard Worker    cwd=UI_DIR,
622*6dbdd20aSAndroid Build Coastguard Worker    env=env)
623*6dbdd20aSAndroid Build Coastguard Worker  # pbjs has the bad habit of installing extra packages on its first
624*6dbdd20aSAndroid Build Coastguard Worker  # run. Run it here, so we avoid fetches while building.
625*6dbdd20aSAndroid Build Coastguard Worker  pbjs = ['node_modules/.bin/pbjs', '/dev/null', '-o', '/dev/null']
626*6dbdd20aSAndroid Build Coastguard Worker  subprocess.call(pbjs, cwd=UI_DIR, env=env)
627*6dbdd20aSAndroid Build Coastguard Worker  with open(NODE_MODULES_STATUS_FILE, 'w') as f:
628*6dbdd20aSAndroid Build Coastguard Worker    f.write(HashLocalFile(os.path.join(UI_DIR, 'pnpm-lock.yaml')))
629*6dbdd20aSAndroid Build Coastguard Worker
630*6dbdd20aSAndroid Build Coastguard Worker
631*6dbdd20aSAndroid Build Coastguard Workerdef CheckNodeModules():
632*6dbdd20aSAndroid Build Coastguard Worker  """Returns True if the modules are up-to-date.
633*6dbdd20aSAndroid Build Coastguard Worker
634*6dbdd20aSAndroid Build Coastguard Worker  There doesn't seem to be an easy way to check node modules versions. Instead
635*6dbdd20aSAndroid Build Coastguard Worker  just check if pnpm-lock.json changed since the last `pnpm install` call.
636*6dbdd20aSAndroid Build Coastguard Worker  """
637*6dbdd20aSAndroid Build Coastguard Worker  if not os.path.exists(NODE_MODULES_STATUS_FILE):
638*6dbdd20aSAndroid Build Coastguard Worker    return False
639*6dbdd20aSAndroid Build Coastguard Worker  with open(NODE_MODULES_STATUS_FILE, 'r') as f:
640*6dbdd20aSAndroid Build Coastguard Worker    actual = f.read()
641*6dbdd20aSAndroid Build Coastguard Worker  expected = HashLocalFile(os.path.join(UI_DIR, 'pnpm-lock.yaml'))
642*6dbdd20aSAndroid Build Coastguard Worker  return expected == actual
643*6dbdd20aSAndroid Build Coastguard Worker
644*6dbdd20aSAndroid Build Coastguard Worker
645*6dbdd20aSAndroid Build Coastguard Workerdef CheckHashes():
646*6dbdd20aSAndroid Build Coastguard Worker  for dep in ALL_DEPS:
647*6dbdd20aSAndroid Build Coastguard Worker    if dep.source_url.endswith('.git'):
648*6dbdd20aSAndroid Build Coastguard Worker      continue
649*6dbdd20aSAndroid Build Coastguard Worker    logging.info('Downloading %s for %s-%s', dep.source_url, dep.target_os,
650*6dbdd20aSAndroid Build Coastguard Worker                 dep.target_arch)
651*6dbdd20aSAndroid Build Coastguard Worker    with tempfile.NamedTemporaryFile(delete=False) as f:
652*6dbdd20aSAndroid Build Coastguard Worker      f.close()
653*6dbdd20aSAndroid Build Coastguard Worker      DownloadURL(dep.source_url, f.name)
654*6dbdd20aSAndroid Build Coastguard Worker      actual_checksum = HashLocalFile(f.name)
655*6dbdd20aSAndroid Build Coastguard Worker      os.unlink(f.name)
656*6dbdd20aSAndroid Build Coastguard Worker      if (actual_checksum != dep.checksum):
657*6dbdd20aSAndroid Build Coastguard Worker        logging.fatal('SHA-256 mismatch for {} expected {} was {}'.format(
658*6dbdd20aSAndroid Build Coastguard Worker            dep.source_url, dep.checksum, actual_checksum))
659*6dbdd20aSAndroid Build Coastguard Worker
660*6dbdd20aSAndroid Build Coastguard Worker
661*6dbdd20aSAndroid Build Coastguard Workerdef CheckDepotToolsIsRecent():
662*6dbdd20aSAndroid Build Coastguard Worker  gn_py_path = shutil.which('gn.py')
663*6dbdd20aSAndroid Build Coastguard Worker  if gn_py_path is None:
664*6dbdd20aSAndroid Build Coastguard Worker    return True  # depot_tools doesn't seem to be installed in the PATH.
665*6dbdd20aSAndroid Build Coastguard Worker  dt_dir = os.path.abspath(os.path.dirname(gn_py_path))
666*6dbdd20aSAndroid Build Coastguard Worker  cmd = ['git', '-C', dt_dir, 'merge-base', '--is-ancestor', 'a0cf4321', 'HEAD']
667*6dbdd20aSAndroid Build Coastguard Worker  git_ret = subprocess.call(cmd, stderr=subprocess.DEVNULL)
668*6dbdd20aSAndroid Build Coastguard Worker  if git_ret == 0:
669*6dbdd20aSAndroid Build Coastguard Worker    return True
670*6dbdd20aSAndroid Build Coastguard Worker  print('\033[91mYour depot_tools revision is too old. Please run:\033[0m')
671*6dbdd20aSAndroid Build Coastguard Worker  print('git -C %s fetch origin && git -C %s checkout -B main -t origin/main' %
672*6dbdd20aSAndroid Build Coastguard Worker        (dt_dir, dt_dir))
673*6dbdd20aSAndroid Build Coastguard Worker  return False
674*6dbdd20aSAndroid Build Coastguard Worker
675*6dbdd20aSAndroid Build Coastguard Worker
676*6dbdd20aSAndroid Build Coastguard Workerdef Main():
677*6dbdd20aSAndroid Build Coastguard Worker  parser = argparse.ArgumentParser()
678*6dbdd20aSAndroid Build Coastguard Worker  parser.add_argument(
679*6dbdd20aSAndroid Build Coastguard Worker      '--android',
680*6dbdd20aSAndroid Build Coastguard Worker      action='store_true',
681*6dbdd20aSAndroid Build Coastguard Worker      help='NDK and emulator images target_os="android"')
682*6dbdd20aSAndroid Build Coastguard Worker  parser.add_argument(
683*6dbdd20aSAndroid Build Coastguard Worker      '--linux-arm',
684*6dbdd20aSAndroid Build Coastguard Worker      action='store_true',
685*6dbdd20aSAndroid Build Coastguard Worker      help='Debian sysroots for target_os="linux" target_cpu="arm|arm64"')
686*6dbdd20aSAndroid Build Coastguard Worker  parser.add_argument(
687*6dbdd20aSAndroid Build Coastguard Worker      '--ui',
688*6dbdd20aSAndroid Build Coastguard Worker      action='store_true',
689*6dbdd20aSAndroid Build Coastguard Worker      help='Node and NPM packages to Build the Web-based UI via ./ui/build')
690*6dbdd20aSAndroid Build Coastguard Worker  parser.add_argument(
691*6dbdd20aSAndroid Build Coastguard Worker      '--grpc', action='store_true', help='Packages to build gRPC')
692*6dbdd20aSAndroid Build Coastguard Worker  parser.add_argument('--check-only')
693*6dbdd20aSAndroid Build Coastguard Worker  parser.add_argument('--filter', action='append')
694*6dbdd20aSAndroid Build Coastguard Worker  parser.add_argument('--verify', help='Check all URLs', action='store_true')
695*6dbdd20aSAndroid Build Coastguard Worker  parser.add_argument(
696*6dbdd20aSAndroid Build Coastguard Worker      '--no-toolchain', help='Do not download toolchain', action='store_true')
697*6dbdd20aSAndroid Build Coastguard Worker  parser.add_argument(
698*6dbdd20aSAndroid Build Coastguard Worker      '--build-os',
699*6dbdd20aSAndroid Build Coastguard Worker      default=system().lower(),
700*6dbdd20aSAndroid Build Coastguard Worker      choices=['windows', 'darwin', 'linux'],
701*6dbdd20aSAndroid Build Coastguard Worker      help='Override the autodetected build operating system')
702*6dbdd20aSAndroid Build Coastguard Worker  parser.add_argument(
703*6dbdd20aSAndroid Build Coastguard Worker      '--build-arch',
704*6dbdd20aSAndroid Build Coastguard Worker      default=GetArch(),
705*6dbdd20aSAndroid Build Coastguard Worker      choices=['arm64', 'x64'],
706*6dbdd20aSAndroid Build Coastguard Worker      help='Override the autodetected build CPU architecture')
707*6dbdd20aSAndroid Build Coastguard Worker  args = parser.parse_args()
708*6dbdd20aSAndroid Build Coastguard Worker  if args.verify:
709*6dbdd20aSAndroid Build Coastguard Worker    CheckHashes()
710*6dbdd20aSAndroid Build Coastguard Worker    return 0
711*6dbdd20aSAndroid Build Coastguard Worker
712*6dbdd20aSAndroid Build Coastguard Worker  target_os = args.build_os
713*6dbdd20aSAndroid Build Coastguard Worker  if args.ui and target_os == 'windows':
714*6dbdd20aSAndroid Build Coastguard Worker    print('Building the UI on Windows is unsupported')
715*6dbdd20aSAndroid Build Coastguard Worker    return 1
716*6dbdd20aSAndroid Build Coastguard Worker
717*6dbdd20aSAndroid Build Coastguard Worker  if not CheckDepotToolsIsRecent():
718*6dbdd20aSAndroid Build Coastguard Worker    return 1
719*6dbdd20aSAndroid Build Coastguard Worker
720*6dbdd20aSAndroid Build Coastguard Worker  deps = BUILD_DEPS_HOST
721*6dbdd20aSAndroid Build Coastguard Worker  if not args.no_toolchain:
722*6dbdd20aSAndroid Build Coastguard Worker    deps += BUILD_DEPS_TOOLCHAIN_HOST
723*6dbdd20aSAndroid Build Coastguard Worker  if args.android:
724*6dbdd20aSAndroid Build Coastguard Worker    deps += BUILD_DEPS_ANDROID + TEST_DEPS_ANDROID
725*6dbdd20aSAndroid Build Coastguard Worker  if args.linux_arm:
726*6dbdd20aSAndroid Build Coastguard Worker    deps += BUILD_DEPS_LINUX_CROSS_SYSROOTS
727*6dbdd20aSAndroid Build Coastguard Worker  if args.ui:
728*6dbdd20aSAndroid Build Coastguard Worker    deps += UI_DEPS
729*6dbdd20aSAndroid Build Coastguard Worker  # TODO(b/360084012) Change the arg name to bigtrace
730*6dbdd20aSAndroid Build Coastguard Worker  if args.grpc:
731*6dbdd20aSAndroid Build Coastguard Worker    deps += BIGTRACE_DEPS
732*6dbdd20aSAndroid Build Coastguard Worker  deps_updated = False
733*6dbdd20aSAndroid Build Coastguard Worker  nodejs_updated = False
734*6dbdd20aSAndroid Build Coastguard Worker
735*6dbdd20aSAndroid Build Coastguard Worker  for old_dir in CLEANUP_OLD_DIRS:
736*6dbdd20aSAndroid Build Coastguard Worker    RmtreeIfExists(os.path.join(ROOT_DIR, old_dir))
737*6dbdd20aSAndroid Build Coastguard Worker
738*6dbdd20aSAndroid Build Coastguard Worker  for dep in deps:
739*6dbdd20aSAndroid Build Coastguard Worker    target_arch = args.build_arch
740*6dbdd20aSAndroid Build Coastguard Worker    matches_os = dep.target_os == 'all' or target_os == dep.target_os
741*6dbdd20aSAndroid Build Coastguard Worker    matches_arch = dep.target_arch == 'all' or target_arch == dep.target_arch
742*6dbdd20aSAndroid Build Coastguard Worker    if not matches_os or not matches_arch:
743*6dbdd20aSAndroid Build Coastguard Worker      continue
744*6dbdd20aSAndroid Build Coastguard Worker    if args.filter and not any(f in dep.target_folder for f in args.filter):
745*6dbdd20aSAndroid Build Coastguard Worker      continue
746*6dbdd20aSAndroid Build Coastguard Worker    local_path = os.path.join(ROOT_DIR, dep.target_folder)
747*6dbdd20aSAndroid Build Coastguard Worker    if dep.source_url.endswith('.git'):
748*6dbdd20aSAndroid Build Coastguard Worker      deps_updated |= CheckoutGitRepo(local_path, dep.source_url, dep.checksum,
749*6dbdd20aSAndroid Build Coastguard Worker                                      args.check_only)
750*6dbdd20aSAndroid Build Coastguard Worker      continue
751*6dbdd20aSAndroid Build Coastguard Worker    is_compressed = any([local_path.endswith(ext) for ext in ['.zip', '.tgz', '.tbz2']])
752*6dbdd20aSAndroid Build Coastguard Worker    compressed_target_dir = os.path.splitext(local_path)[0] if is_compressed else None
753*6dbdd20aSAndroid Build Coastguard Worker    compressed_dir_stamp = os.path.join(compressed_target_dir, '.stamp') if is_compressed else None
754*6dbdd20aSAndroid Build Coastguard Worker
755*6dbdd20aSAndroid Build Coastguard Worker    if ((not is_compressed and HashLocalFile(local_path) == dep.checksum) or
756*6dbdd20aSAndroid Build Coastguard Worker        (is_compressed and ReadFile(compressed_dir_stamp) == dep.checksum)):
757*6dbdd20aSAndroid Build Coastguard Worker      continue
758*6dbdd20aSAndroid Build Coastguard Worker    deps_updated = True
759*6dbdd20aSAndroid Build Coastguard Worker    if args.check_only:
760*6dbdd20aSAndroid Build Coastguard Worker      continue
761*6dbdd20aSAndroid Build Coastguard Worker    MkdirRecursive(os.path.dirname(dep.target_folder))
762*6dbdd20aSAndroid Build Coastguard Worker    if HashLocalFile(local_path) != dep.checksum:
763*6dbdd20aSAndroid Build Coastguard Worker      download_path = local_path + '.tmp'
764*6dbdd20aSAndroid Build Coastguard Worker      logging.info('Downloading %s from %s', local_path, dep.source_url)
765*6dbdd20aSAndroid Build Coastguard Worker      DownloadURL(dep.source_url, download_path)
766*6dbdd20aSAndroid Build Coastguard Worker      os.chmod(download_path, 0o755)
767*6dbdd20aSAndroid Build Coastguard Worker      actual_checksum = HashLocalFile(download_path)
768*6dbdd20aSAndroid Build Coastguard Worker      if (actual_checksum != dep.checksum):
769*6dbdd20aSAndroid Build Coastguard Worker        os.remove(download_path)
770*6dbdd20aSAndroid Build Coastguard Worker        logging.fatal('SHA-256 mismatch for {} expected {} was {}'.format(
771*6dbdd20aSAndroid Build Coastguard Worker            download_path, dep.checksum, actual_checksum))
772*6dbdd20aSAndroid Build Coastguard Worker        return 1
773*6dbdd20aSAndroid Build Coastguard Worker      shutil.move(download_path, local_path)
774*6dbdd20aSAndroid Build Coastguard Worker      if 'nodejs' in dep.target_folder:
775*6dbdd20aSAndroid Build Coastguard Worker        nodejs_updated = True
776*6dbdd20aSAndroid Build Coastguard Worker
777*6dbdd20aSAndroid Build Coastguard Worker    assert (HashLocalFile(local_path) == dep.checksum)
778*6dbdd20aSAndroid Build Coastguard Worker
779*6dbdd20aSAndroid Build Coastguard Worker    if is_compressed:
780*6dbdd20aSAndroid Build Coastguard Worker      logging.info('Extracting %s into %s' % (local_path, compressed_target_dir))
781*6dbdd20aSAndroid Build Coastguard Worker      assert (os.path.commonprefix((ROOT_DIR, compressed_target_dir)) == ROOT_DIR)
782*6dbdd20aSAndroid Build Coastguard Worker      RmtreeIfExists(compressed_target_dir)
783*6dbdd20aSAndroid Build Coastguard Worker
784*6dbdd20aSAndroid Build Coastguard Worker      # Decompress the archive.
785*6dbdd20aSAndroid Build Coastguard Worker      if local_path.endswith('.tgz'):
786*6dbdd20aSAndroid Build Coastguard Worker        MkdirRecursive(compressed_target_dir)
787*6dbdd20aSAndroid Build Coastguard Worker        subprocess.check_call(['tar', '-oxf', local_path], cwd=compressed_target_dir)
788*6dbdd20aSAndroid Build Coastguard Worker      elif local_path.endswith('.zip'):
789*6dbdd20aSAndroid Build Coastguard Worker        with zipfile.ZipFile(local_path, 'r') as zf:
790*6dbdd20aSAndroid Build Coastguard Worker          for info in zf.infolist():
791*6dbdd20aSAndroid Build Coastguard Worker            ExtractZipfilePreservePermissions(zf, info, compressed_target_dir)
792*6dbdd20aSAndroid Build Coastguard Worker      elif local_path.endswith('.tbz2'):
793*6dbdd20aSAndroid Build Coastguard Worker        tar_path = '{}.tar.tmp'.format(local_path)
794*6dbdd20aSAndroid Build Coastguard Worker        with open(tar_path, 'w') as f:
795*6dbdd20aSAndroid Build Coastguard Worker          with bz2.open(local_path, 'r') as bf:
796*6dbdd20aSAndroid Build Coastguard Worker            f.write(bf.read())
797*6dbdd20aSAndroid Build Coastguard Worker        MkdirRecursive(compressed_target_dir)
798*6dbdd20aSAndroid Build Coastguard Worker        subprocess.check_call(['tar', '-oxf', tar_path], cwd=compressed_target_dir)
799*6dbdd20aSAndroid Build Coastguard Worker
800*6dbdd20aSAndroid Build Coastguard Worker      # If the zip contains one root folder, rebase one level up moving all
801*6dbdd20aSAndroid Build Coastguard Worker      # its sub files and folders inside |target_dir|.
802*6dbdd20aSAndroid Build Coastguard Worker      subdir = os.listdir(compressed_target_dir)
803*6dbdd20aSAndroid Build Coastguard Worker      if len(subdir) == 1:
804*6dbdd20aSAndroid Build Coastguard Worker        subdir = os.path.join(compressed_target_dir, subdir[0])
805*6dbdd20aSAndroid Build Coastguard Worker        if os.path.isdir(subdir):
806*6dbdd20aSAndroid Build Coastguard Worker          for subf in os.listdir(subdir):
807*6dbdd20aSAndroid Build Coastguard Worker            shutil.move(os.path.join(subdir, subf), compressed_target_dir)
808*6dbdd20aSAndroid Build Coastguard Worker          os.rmdir(subdir)
809*6dbdd20aSAndroid Build Coastguard Worker
810*6dbdd20aSAndroid Build Coastguard Worker      # Create stamp and remove the archive.
811*6dbdd20aSAndroid Build Coastguard Worker      with open(compressed_dir_stamp, 'w') as stamp_file:
812*6dbdd20aSAndroid Build Coastguard Worker        stamp_file.write(dep.checksum)
813*6dbdd20aSAndroid Build Coastguard Worker      os.remove(local_path)
814*6dbdd20aSAndroid Build Coastguard Worker
815*6dbdd20aSAndroid Build Coastguard Worker  if args.ui:
816*6dbdd20aSAndroid Build Coastguard Worker    # Needs to happen after nodejs is installed above.
817*6dbdd20aSAndroid Build Coastguard Worker    if args.check_only:
818*6dbdd20aSAndroid Build Coastguard Worker      deps_updated |= not CheckNodeModules()
819*6dbdd20aSAndroid Build Coastguard Worker    else:
820*6dbdd20aSAndroid Build Coastguard Worker      InstallNodeModules(force_clean=nodejs_updated)
821*6dbdd20aSAndroid Build Coastguard Worker
822*6dbdd20aSAndroid Build Coastguard Worker  cur_python_interpreter = sys.executable
823*6dbdd20aSAndroid Build Coastguard Worker  test_data_synced = 0 == subprocess.call([
824*6dbdd20aSAndroid Build Coastguard Worker      cur_python_interpreter, TEST_DATA_SCRIPT, 'status', '--quiet',
825*6dbdd20aSAndroid Build Coastguard Worker      '--ignore-new'
826*6dbdd20aSAndroid Build Coastguard Worker  ])
827*6dbdd20aSAndroid Build Coastguard Worker  if args.check_only:
828*6dbdd20aSAndroid Build Coastguard Worker    if not deps_updated and test_data_synced:
829*6dbdd20aSAndroid Build Coastguard Worker      with open(args.check_only, 'w') as f:
830*6dbdd20aSAndroid Build Coastguard Worker        f.write('OK')  # The content is irrelevant, just keep GN happy.
831*6dbdd20aSAndroid Build Coastguard Worker      return 0
832*6dbdd20aSAndroid Build Coastguard Worker    argz = ' '.join(
833*6dbdd20aSAndroid Build Coastguard Worker        [x for x in sys.argv[1:] if not x.startswith('--check-only')])
834*6dbdd20aSAndroid Build Coastguard Worker    print('\033[91mBuild deps are stale. ' +
835*6dbdd20aSAndroid Build Coastguard Worker          'Please run tools/install-build-deps %s\033[0m' % argz)
836*6dbdd20aSAndroid Build Coastguard Worker    if not test_data_synced:
837*6dbdd20aSAndroid Build Coastguard Worker      print('//test/data/ is out of sync. `tools/test_data status` for details')
838*6dbdd20aSAndroid Build Coastguard Worker    return 1
839*6dbdd20aSAndroid Build Coastguard Worker
840*6dbdd20aSAndroid Build Coastguard Worker  if not test_data_synced:
841*6dbdd20aSAndroid Build Coastguard Worker    cmd = [cur_python_interpreter, TEST_DATA_SCRIPT, 'download', '--overwrite']
842*6dbdd20aSAndroid Build Coastguard Worker    if not sys.stdout.isatty():
843*6dbdd20aSAndroid Build Coastguard Worker      cmd += ['--verbose']  # For CI bots
844*6dbdd20aSAndroid Build Coastguard Worker    subprocess.check_call(cmd)
845*6dbdd20aSAndroid Build Coastguard Worker
846*6dbdd20aSAndroid Build Coastguard Worker  if deps_updated:
847*6dbdd20aSAndroid Build Coastguard Worker    # Stale binary files may be compiled against old sysroot headers that aren't
848*6dbdd20aSAndroid Build Coastguard Worker    # tracked by gn.
849*6dbdd20aSAndroid Build Coastguard Worker    logging.warning('Remember to run "gn clean <output_directory>" ' +
850*6dbdd20aSAndroid Build Coastguard Worker                    'to avoid stale binary files.')
851*6dbdd20aSAndroid Build Coastguard Worker
852*6dbdd20aSAndroid Build Coastguard Worker
853*6dbdd20aSAndroid Build Coastguard Workerif __name__ == '__main__':
854*6dbdd20aSAndroid Build Coastguard Worker  logging.basicConfig(level=logging.INFO)
855*6dbdd20aSAndroid Build Coastguard Worker  sys.exit(Main())
856