blob: 9a9eccd7d9c8dd38a17bf6b090e3d57651939eb3 [file] [log] [blame]
Dan Willemsen1e704462016-08-21 15:17:17 -07001// Copyright 2017 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package build
16
17import (
Cole Faust583dfb42023-09-28 13:56:30 -070018 "fmt"
Dan Willemsendb8457c2017-05-12 16:38:17 -070019 "io/ioutil"
Dan Willemsen1e704462016-08-21 15:17:17 -070020 "os"
Dan Willemsen1e704462016-08-21 15:17:17 -070021 "path/filepath"
Dan Willemsen80d72612022-04-20 21:45:00 -070022 "sync"
Dan Willemsen1e704462016-08-21 15:17:17 -070023 "text/template"
Cole Faust583dfb42023-09-28 13:56:30 -070024 "time"
Colin Cross74cda722020-01-16 15:25:50 -080025
26 "android/soong/ui/metrics"
Dan Willemsen1e704462016-08-21 15:17:17 -070027)
28
Jingwen Chencda22c92020-11-23 00:22:30 -050029// SetupOutDir ensures the out directory exists, and has the proper files to
30// prevent kati from recursing into it.
Dan Willemsen1e704462016-08-21 15:17:17 -070031func SetupOutDir(ctx Context, config Config) {
32 ensureEmptyFileExists(ctx, filepath.Join(config.OutDir(), "Android.mk"))
33 ensureEmptyFileExists(ctx, filepath.Join(config.OutDir(), "CleanSpec.mk"))
Cole Faust583dfb42023-09-28 13:56:30 -070034 ensureEmptyDirectoriesExist(ctx, config.TempDir())
Anton Hansson17fc5a02021-06-18 16:37:14 +010035
36 // Potentially write a marker file for whether kati is enabled. This is used by soong_build to
37 // potentially run the AndroidMk singleton and postinstall commands.
38 // Note that the absence of the file does not not preclude running Kati for product
39 // configuration purposes.
40 katiEnabledMarker := filepath.Join(config.SoongOutDir(), ".soong.kati_enabled")
41 if config.SkipKatiNinja() {
42 os.Remove(katiEnabledMarker)
43 // Note that we can not remove the file for SkipKati builds yet -- some continuous builds
44 // --skip-make builds rely on kati targets being defined.
45 } else if !config.SkipKati() {
46 ensureEmptyFileExists(ctx, katiEnabledMarker)
Dan Willemsene0879fc2017-08-04 15:06:27 -070047 }
Anton Hansson17fc5a02021-06-18 16:37:14 +010048
Dan Willemsen1e704462016-08-21 15:17:17 -070049 // The ninja_build file is used by our buildbots to understand that the output
50 // can be parsed as ninja output.
51 ensureEmptyFileExists(ctx, filepath.Join(config.OutDir(), "ninja_build"))
Jeff Gastonb64fc1c2017-08-04 12:30:12 -070052 ensureEmptyFileExists(ctx, filepath.Join(config.OutDir(), ".out-dir"))
Colin Cross28f527c2019-11-26 16:19:04 -080053
54 if buildDateTimeFile, ok := config.environ.Get("BUILD_DATETIME_FILE"); ok {
Rupert Shuttlewortheeb5caa2020-11-25 07:13:54 +000055 err := ioutil.WriteFile(buildDateTimeFile, []byte(config.buildDateTime), 0666) // a+rw
Colin Cross28f527c2019-11-26 16:19:04 -080056 if err != nil {
57 ctx.Fatalln("Failed to write BUILD_DATETIME to file:", err)
58 }
59 } else {
60 ctx.Fatalln("Missing BUILD_DATETIME_FILE")
61 }
Cole Faust583dfb42023-09-28 13:56:30 -070062
63 // BUILD_NUMBER should be set to the source control value that
64 // represents the current state of the source code. E.g., a
65 // perforce changelist number or a git hash. Can be an arbitrary string
66 // (to allow for source control that uses something other than numbers),
67 // but must be a single word and a valid file name.
68 //
69 // If no BUILD_NUMBER is set, create a useful "I am an engineering build
70 // from this date/time" value. Make it start with a non-digit so that
71 // anyone trying to parse it as an integer will probably get "0".
72 buildNumber, ok := config.environ.Get("BUILD_NUMBER")
73 if ok {
74 writeValueIfChanged(ctx, config, config.OutDir(), "file_name_tag.txt", buildNumber)
75 } else {
76 var username string
77 if username, ok = config.environ.Get("BUILD_USERNAME"); !ok {
78 ctx.Fatalln("Missing BUILD_USERNAME")
79 }
80 buildNumber = fmt.Sprintf("eng.%.6s.%s", username, time.Now().Format("20060102.150405" /* YYYYMMDD.HHMMSS */))
81 writeValueIfChanged(ctx, config, config.OutDir(), "file_name_tag.txt", username)
82 }
83 // Write the build number to a file so it can be read back in
84 // without changing the command line every time. Avoids rebuilds
85 // when using ninja.
86 writeValueIfChanged(ctx, config, config.SoongOutDir(), "build_number.txt", buildNumber)
Dan Willemsen1e704462016-08-21 15:17:17 -070087}
88
89var combinedBuildNinjaTemplate = template.Must(template.New("combined").Parse(`
90builddir = {{.OutDir}}
Colin Cross8b8bec32019-11-15 13:18:43 -080091{{if .UseRemoteBuild }}pool local_pool
Dan Willemsen29971232018-09-26 14:58:30 -070092 depth = {{.Parallel}}
Colin Cross8b8bec32019-11-15 13:18:43 -080093{{end -}}
94pool highmem_pool
95 depth = {{.HighmemParallel}}
Anton Hansson0b55bdb2021-06-04 10:08:08 +010096{{if and (not .SkipKatiNinja) .HasKatiSuffix}}subninja {{.KatiBuildNinjaFile}}
Dan Willemsenfb1271a2018-09-26 15:00:42 -070097subninja {{.KatiPackageNinjaFile}}
Dan Willemsene0879fc2017-08-04 15:06:27 -070098{{end -}}
Dan Willemsenfb1271a2018-09-26 15:00:42 -070099subninja {{.SoongNinjaFile}}
Dan Willemsen1e704462016-08-21 15:17:17 -0700100`))
101
102func createCombinedBuildNinjaFile(ctx Context, config Config) {
Anton Hansson0b55bdb2021-06-04 10:08:08 +0100103 // If we're in SkipKati mode but want to run kati ninja, skip creating this file if it already exists
104 if config.SkipKati() && !config.SkipKatiNinja() {
Dan Willemsene0879fc2017-08-04 15:06:27 -0700105 if _, err := os.Stat(config.CombinedNinjaFile()); err == nil || !os.IsNotExist(err) {
106 return
107 }
108 }
109
Dan Willemsen1e704462016-08-21 15:17:17 -0700110 file, err := os.Create(config.CombinedNinjaFile())
111 if err != nil {
112 ctx.Fatalln("Failed to create combined ninja file:", err)
113 }
114 defer file.Close()
115
116 if err := combinedBuildNinjaTemplate.Execute(file, config); err != nil {
117 ctx.Fatalln("Failed to write combined ninja file:", err)
118 }
119}
120
Sam Delmericod9a34352022-11-15 17:27:21 -0500121// These are bitmasks which can be used to check whether various flags are set
Dan Willemsen1e704462016-08-21 15:17:17 -0700122const (
Anton Hansson5a7861a2021-06-04 10:09:01 +0100123 _ = iota
124 // Whether to run the kati config step.
125 RunProductConfig = 1 << iota
126 // Whether to run soong to generate a ninja file.
127 RunSoong = 1 << iota
128 // Whether to run kati to generate a ninja file.
129 RunKati = 1 << iota
Anton Hansson0b55bdb2021-06-04 10:08:08 +0100130 // Whether to include the kati-generated ninja file in the combined ninja.
131 RunKatiNinja = 1 << iota
Anton Hansson5a7861a2021-06-04 10:09:01 +0100132 // Whether to run ninja on the combined ninja.
Joe Onorato7f29a662023-02-23 15:47:06 -0800133 RunNinja = 1 << iota
134 RunDistActions = 1 << iota
135 RunBuildTests = 1 << iota
Dan Willemsen1e704462016-08-21 15:17:17 -0700136)
137
Rupert Shuttlewortheeb5caa2020-11-25 07:13:54 +0000138// checkProblematicFiles fails the build if existing Android.mk or CleanSpec.mk files are found at the root of the tree.
Anton Hanssonecf0f102018-09-19 22:14:17 +0100139func checkProblematicFiles(ctx Context) {
140 files := []string{"Android.mk", "CleanSpec.mk"}
141 for _, file := range files {
142 if _, err := os.Stat(file); !os.IsNotExist(err) {
143 absolute := absPath(ctx, file)
144 ctx.Printf("Found %s in tree root. This file needs to be removed to build.\n", file)
145 ctx.Fatalf(" rm %s\n", absolute)
146 }
147 }
148}
149
Rupert Shuttlewortheeb5caa2020-11-25 07:13:54 +0000150// checkCaseSensitivity issues a warning if a case-insensitive file system is being used.
Dan Willemsendb8457c2017-05-12 16:38:17 -0700151func checkCaseSensitivity(ctx Context, config Config) {
152 outDir := config.OutDir()
153 lowerCase := filepath.Join(outDir, "casecheck.txt")
154 upperCase := filepath.Join(outDir, "CaseCheck.txt")
155 lowerData := "a"
156 upperData := "B"
157
Rupert Shuttlewortheeb5caa2020-11-25 07:13:54 +0000158 if err := ioutil.WriteFile(lowerCase, []byte(lowerData), 0666); err != nil { // a+rw
Dan Willemsendb8457c2017-05-12 16:38:17 -0700159 ctx.Fatalln("Failed to check case sensitivity:", err)
160 }
161
Rupert Shuttlewortheeb5caa2020-11-25 07:13:54 +0000162 if err := ioutil.WriteFile(upperCase, []byte(upperData), 0666); err != nil { // a+rw
Dan Willemsendb8457c2017-05-12 16:38:17 -0700163 ctx.Fatalln("Failed to check case sensitivity:", err)
164 }
165
166 res, err := ioutil.ReadFile(lowerCase)
167 if err != nil {
168 ctx.Fatalln("Failed to check case sensitivity:", err)
169 }
170
171 if string(res) != lowerData {
172 ctx.Println("************************************************************")
173 ctx.Println("You are building on a case-insensitive filesystem.")
174 ctx.Println("Please move your source tree to a case-sensitive filesystem.")
175 ctx.Println("************************************************************")
176 ctx.Fatalln("Case-insensitive filesystems not supported")
177 }
178}
179
Rupert Shuttlewortheeb5caa2020-11-25 07:13:54 +0000180// help prints a help/usage message, via the build/make/help.sh script.
181func help(ctx Context, config Config) {
Jeff Gastondf4a0812017-05-30 20:11:20 -0700182 cmd := Command(ctx, config, "help.sh", "build/make/help.sh")
Dan Willemsenb2e6c2e2017-07-13 17:24:44 -0700183 cmd.Sandbox = dumpvarsSandbox
Dan Willemsenb82471a2018-05-17 16:37:09 -0700184 cmd.RunAndPrintOrFatal()
Dan Willemsen02781d52017-05-12 19:28:13 -0700185}
186
Rupert Shuttlewortheeb5caa2020-11-25 07:13:54 +0000187// checkRAM warns if there probably isn't enough RAM to complete a build.
188func checkRAM(ctx Context, config Config) {
Dan Willemsen570a2922020-05-26 23:02:29 -0700189 if totalRAM := config.TotalRAM(); totalRAM != 0 {
190 ram := float32(totalRAM) / (1024 * 1024 * 1024)
191 ctx.Verbosef("Total RAM: %.3vGB", ram)
192
193 if ram <= 16 {
194 ctx.Println("************************************************************")
195 ctx.Printf("You are building on a machine with %.3vGB of RAM\n", ram)
196 ctx.Println("")
197 ctx.Println("The minimum required amount of free memory is around 16GB,")
198 ctx.Println("and even with that, some configurations may not work.")
199 ctx.Println("")
200 ctx.Println("If you run into segfaults or other errors, try reducing your")
201 ctx.Println("-j value.")
202 ctx.Println("************************************************************")
203 } else if ram <= float32(config.Parallel()) {
Rupert Shuttlewortheeb5caa2020-11-25 07:13:54 +0000204 // Want at least 1GB of RAM per job.
Dan Willemsen570a2922020-05-26 23:02:29 -0700205 ctx.Printf("Warning: high -j%d count compared to %.3vGB of RAM", config.Parallel(), ram)
206 ctx.Println("If you run into segfaults or other errors, try a lower -j value")
207 }
208 }
Rupert Shuttlewortheeb5caa2020-11-25 07:13:54 +0000209}
210
Usta Shresthadb46a9b2022-07-11 11:29:56 -0400211// Build the tree. Various flags in `config` govern which components of
212// the build to run.
Anton Hansson5a7861a2021-06-04 10:09:01 +0100213func Build(ctx Context, config Config) {
Rupert Shuttlewortheeb5caa2020-11-25 07:13:54 +0000214 ctx.Verboseln("Starting build with args:", config.Arguments())
215 ctx.Verboseln("Environment:", config.Environment().Environ())
Dan Willemsen1e704462016-08-21 15:17:17 -0700216
Colin Cross74cda722020-01-16 15:25:50 -0800217 ctx.BeginTrace(metrics.Total, "total")
218 defer ctx.EndTrace()
219
Dan Willemsen1e704462016-08-21 15:17:17 -0700220 if inList("help", config.Arguments()) {
Rupert Shuttlewortheeb5caa2020-11-25 07:13:54 +0000221 help(ctx, config)
Dan Willemsen0b73b4b2017-05-12 19:28:13 -0700222 return
Dan Willemsen1e704462016-08-21 15:17:17 -0700223 }
224
Jeff Gaston3615fe82017-05-24 13:14:34 -0700225 // Make sure that no other Soong process is running with the same output directory
226 buildLock := BecomeSingletonOrFail(ctx, config)
227 defer buildLock.Unlock()
228
Usta Shrestha675564d2022-08-09 18:03:23 -0400229 logArgsOtherThan := func(specialTargets ...string) {
230 var ignored []string
231 for _, a := range config.Arguments() {
232 if !inList(a, specialTargets) {
233 ignored = append(ignored, a)
234 }
235 }
236 if len(ignored) > 0 {
237 ctx.Printf("ignoring arguments %q", ignored)
238 }
239 }
240
Rupert Shuttlewortheeb5caa2020-11-25 07:13:54 +0000241 if inList("clean", config.Arguments()) || inList("clobber", config.Arguments()) {
Usta Shrestha675564d2022-08-09 18:03:23 -0400242 logArgsOtherThan("clean", "clobber")
Rupert Shuttlewortheeb5caa2020-11-25 07:13:54 +0000243 clean(ctx, config)
244 return
245 }
246
Dan Willemsen80d72612022-04-20 21:45:00 -0700247 defer waitForDist(ctx)
248
Rupert Shuttlewortheeb5caa2020-11-25 07:13:54 +0000249 // checkProblematicFiles aborts the build if Android.mk or CleanSpec.mk are found at the root of the tree.
Anton Hanssonecf0f102018-09-19 22:14:17 +0100250 checkProblematicFiles(ctx)
251
Rupert Shuttlewortheeb5caa2020-11-25 07:13:54 +0000252 checkRAM(ctx, config)
253
Dan Willemsen1e704462016-08-21 15:17:17 -0700254 SetupOutDir(ctx, config)
255
Rupert Shuttlewortheeb5caa2020-11-25 07:13:54 +0000256 // checkCaseSensitivity issues a warning if a case-insensitive file system is being used.
Dan Willemsendb8457c2017-05-12 16:38:17 -0700257 checkCaseSensitivity(ctx, config)
258
Dan Willemsen18490112018-05-25 16:30:04 -0700259 SetupPath(ctx, config)
260
usta6fffdd52022-09-19 13:16:18 -0400261 what := evaluateWhatToRun(config, ctx.Verboseln)
Lukacs T. Berkia1b93722021-09-02 17:23:06 +0200262
Yoshisato Yanagisawa2cb0e5d2019-01-10 10:14:16 +0900263 if config.StartGoma() {
Yoshisato Yanagisawa2cb0e5d2019-01-10 10:14:16 +0900264 startGoma(ctx, config)
265 }
266
Ramy Medhatc8f6cc22023-03-31 09:50:34 -0400267 rbeCh := make(chan bool)
Colin Crosse7151f92023-11-28 14:18:12 -0800268 var rbePanic any
Ramy Medhatbbf25672019-07-17 12:30:04 +0000269 if config.StartRBE() {
Kousik Kumar4c180ad2022-05-27 07:48:37 -0400270 cleanupRBELogsDir(ctx, config)
Colin Crosse7151f92023-11-28 14:18:12 -0800271 checkRBERequirements(ctx, config)
Ramy Medhatc8f6cc22023-03-31 09:50:34 -0400272 go func() {
Colin Crosse7151f92023-11-28 14:18:12 -0800273 defer func() {
274 rbePanic = recover()
275 close(rbeCh)
276 }()
Ramy Medhatc8f6cc22023-03-31 09:50:34 -0400277 startRBE(ctx, config)
Ramy Medhatc8f6cc22023-03-31 09:50:34 -0400278 }()
Kousik Kumara1d8fa92022-03-18 02:50:31 -0400279 defer DumpRBEMetrics(ctx, config, filepath.Join(config.LogsDir(), "rbe_metrics.pb"))
Ramy Medhatc8f6cc22023-03-31 09:50:34 -0400280 } else {
281 close(rbeCh)
Ramy Medhatbbf25672019-07-17 12:30:04 +0000282 }
283
Anton Hansson5a7861a2021-06-04 10:09:01 +0100284 if what&RunProductConfig != 0 {
Dan Willemsen1e704462016-08-21 15:17:17 -0700285 runMakeProductConfig(ctx, config)
286 }
287
Rupert Shuttlewortheeb5caa2020-11-25 07:13:54 +0000288 // Everything below here depends on product config.
289
Colin Cross806fd942019-05-03 13:35:58 -0700290 if inList("installclean", config.Arguments()) ||
291 inList("install-clean", config.Arguments()) {
Usta Shrestha675564d2022-08-09 18:03:23 -0400292 logArgsOtherThan("installclean", "install-clean")
Rupert Shuttleworth1f304e62020-11-24 14:13:41 +0000293 installClean(ctx, config)
Dan Willemsenf052f782017-05-18 15:29:04 -0700294 ctx.Println("Deleted images and staging directories.")
295 return
Rupert Shuttlewortheeb5caa2020-11-25 07:13:54 +0000296 }
297
298 if inList("dataclean", config.Arguments()) ||
Colin Cross806fd942019-05-03 13:35:58 -0700299 inList("data-clean", config.Arguments()) {
Usta Shrestha675564d2022-08-09 18:03:23 -0400300 logArgsOtherThan("dataclean", "data-clean")
Rupert Shuttleworth1f304e62020-11-24 14:13:41 +0000301 dataClean(ctx, config)
Dan Willemsenf052f782017-05-18 15:29:04 -0700302 ctx.Println("Deleted data files.")
303 return
304 }
305
Anton Hansson5a7861a2021-06-04 10:09:01 +0100306 if what&RunSoong != 0 {
Dan Willemsen1e704462016-08-21 15:17:17 -0700307 runSoong(ctx, config)
308 }
309
Anton Hansson5a7861a2021-06-04 10:09:01 +0100310 if what&RunKati != 0 {
Dan Willemsen29971232018-09-26 14:58:30 -0700311 genKatiSuffix(ctx, config)
312 runKatiCleanSpec(ctx, config)
313 runKatiBuild(ctx, config)
Dan Willemsenfb1271a2018-09-26 15:00:42 -0700314 runKatiPackage(ctx, config)
Dan Willemsene0879fc2017-08-04 15:06:27 -0700315
Rupert Shuttlewortheeb5caa2020-11-25 07:13:54 +0000316 ioutil.WriteFile(config.LastKatiSuffixFile(), []byte(config.KatiSuffix()), 0666) // a+rw
Anton Hansson0b55bdb2021-06-04 10:08:08 +0100317 } else if what&RunKatiNinja != 0 {
Dan Willemsene0879fc2017-08-04 15:06:27 -0700318 // Load last Kati Suffix if it exists
319 if katiSuffix, err := ioutil.ReadFile(config.LastKatiSuffixFile()); err == nil {
320 ctx.Verboseln("Loaded previous kati config:", string(katiSuffix))
321 config.SetKatiSuffix(string(katiSuffix))
322 }
Dan Willemsen1e704462016-08-21 15:17:17 -0700323 }
324
Colin Cross37193492017-11-16 17:55:00 -0800325 // Write combined ninja file
326 createCombinedBuildNinjaFile(ctx, config)
327
Colin Cross8ba7d472020-06-25 11:27:52 -0700328 distGzipFile(ctx, config, config.CombinedNinjaFile())
329
Colin Cross37193492017-11-16 17:55:00 -0800330 if what&RunBuildTests != 0 {
331 testForDanglingRules(ctx, config)
332 }
333
Ramy Medhatc8f6cc22023-03-31 09:50:34 -0400334 <-rbeCh
Colin Crosse7151f92023-11-28 14:18:12 -0800335 if rbePanic != nil {
336 // If there was a ctx.Fatal in startRBE, rethrow it.
337 panic(rbePanic)
338 }
339
Anton Hansson5a7861a2021-06-04 10:09:01 +0100340 if what&RunNinja != 0 {
341 if what&RunKati != 0 {
Dan Willemsene0879fc2017-08-04 15:06:27 -0700342 installCleanIfNecessary(ctx, config)
343 }
Lukacs T. Berkid1e3f1f2021-03-16 08:55:23 +0100344 runNinjaForBuild(ctx, config)
Dan Willemsen1e704462016-08-21 15:17:17 -0700345 }
Joe Onorato7f29a662023-02-23 15:47:06 -0800346
347 if what&RunDistActions != 0 {
348 runDistActions(ctx, config)
349 }
Dan Willemsen1e704462016-08-21 15:17:17 -0700350}
Colin Cross8ba7d472020-06-25 11:27:52 -0700351
usta6fffdd52022-09-19 13:16:18 -0400352func evaluateWhatToRun(config Config, verboseln func(v ...interface{})) int {
353 //evaluate what to run
Joe Onorato7f29a662023-02-23 15:47:06 -0800354 what := 0
usta6fffdd52022-09-19 13:16:18 -0400355 if config.Checkbuild() {
356 what |= RunBuildTests
357 }
Joe Onorato7f29a662023-02-23 15:47:06 -0800358 if !config.SkipConfig() {
359 what |= RunProductConfig
360 } else {
usta6fffdd52022-09-19 13:16:18 -0400361 verboseln("Skipping Config as requested")
usta6fffdd52022-09-19 13:16:18 -0400362 }
Joe Onorato7f29a662023-02-23 15:47:06 -0800363 if !config.SkipSoong() {
364 what |= RunSoong
365 } else {
usta6fffdd52022-09-19 13:16:18 -0400366 verboseln("Skipping use of Soong as requested")
usta6fffdd52022-09-19 13:16:18 -0400367 }
Joe Onorato7f29a662023-02-23 15:47:06 -0800368 if !config.SkipKati() {
369 what |= RunKati
370 } else {
371 verboseln("Skipping Kati as requested")
372 }
373 if !config.SkipKatiNinja() {
374 what |= RunKatiNinja
375 } else {
376 verboseln("Skipping use of Kati ninja as requested")
377 }
378 if !config.SkipNinja() {
379 what |= RunNinja
380 } else {
usta6fffdd52022-09-19 13:16:18 -0400381 verboseln("Skipping Ninja as requested")
usta6fffdd52022-09-19 13:16:18 -0400382 }
383
384 if !config.SoongBuildInvocationNeeded() {
385 // This means that the output of soong_build is not needed and thus it would
386 // run unnecessarily. In addition, if this code wasn't there invocations
387 // with only special-cased target names like "m bp2build" would result in
388 // passing Ninja the empty target list and it would then build the default
389 // targets which is not what the user asked for.
390 what = what &^ RunNinja
391 what = what &^ RunKati
392 }
Joe Onorato7f29a662023-02-23 15:47:06 -0800393
394 if config.Dist() {
395 what |= RunDistActions
396 }
397
usta6fffdd52022-09-19 13:16:18 -0400398 return what
399}
400
Dan Willemsen80d72612022-04-20 21:45:00 -0700401var distWaitGroup sync.WaitGroup
402
403// waitForDist waits for all backgrounded distGzipFile and distFile writes to finish
404func waitForDist(ctx Context) {
405 ctx.BeginTrace("soong_ui", "dist")
406 defer ctx.EndTrace()
407
408 distWaitGroup.Wait()
409}
410
Colin Cross8ba7d472020-06-25 11:27:52 -0700411// distGzipFile writes a compressed copy of src to the distDir if dist is enabled. Failures
Dan Willemsen80d72612022-04-20 21:45:00 -0700412// are printed but non-fatal. Uses the distWaitGroup func for backgrounding (optimization).
Colin Cross8ba7d472020-06-25 11:27:52 -0700413func distGzipFile(ctx Context, config Config, src string, subDirs ...string) {
414 if !config.Dist() {
415 return
416 }
417
418 subDir := filepath.Join(subDirs...)
Rupert Shuttleworth3c9f5ac2020-12-10 11:32:38 +0000419 destDir := filepath.Join(config.RealDistDir(), "soong_ui", subDir)
Colin Cross8ba7d472020-06-25 11:27:52 -0700420
Rupert Shuttlewortheeb5caa2020-11-25 07:13:54 +0000421 if err := os.MkdirAll(destDir, 0777); err != nil { // a+rwx
Colin Cross8ba7d472020-06-25 11:27:52 -0700422 ctx.Printf("failed to mkdir %s: %s", destDir, err.Error())
Colin Cross8ba7d472020-06-25 11:27:52 -0700423 }
424
Dan Willemsen80d72612022-04-20 21:45:00 -0700425 distWaitGroup.Add(1)
426 go func() {
427 defer distWaitGroup.Done()
428 if err := gzipFileToDir(src, destDir); err != nil {
429 ctx.Printf("failed to dist %s: %s", filepath.Base(src), err.Error())
430 }
431 }()
Colin Cross8ba7d472020-06-25 11:27:52 -0700432}
433
434// distFile writes a copy of src to the distDir if dist is enabled. Failures are printed but
Dan Willemsen80d72612022-04-20 21:45:00 -0700435// non-fatal. Uses the distWaitGroup func for backgrounding (optimization).
Colin Cross8ba7d472020-06-25 11:27:52 -0700436func distFile(ctx Context, config Config, src string, subDirs ...string) {
437 if !config.Dist() {
438 return
439 }
440
441 subDir := filepath.Join(subDirs...)
Rupert Shuttleworth3c9f5ac2020-12-10 11:32:38 +0000442 destDir := filepath.Join(config.RealDistDir(), "soong_ui", subDir)
Colin Cross8ba7d472020-06-25 11:27:52 -0700443
Rupert Shuttlewortheeb5caa2020-11-25 07:13:54 +0000444 if err := os.MkdirAll(destDir, 0777); err != nil { // a+rwx
Colin Cross8ba7d472020-06-25 11:27:52 -0700445 ctx.Printf("failed to mkdir %s: %s", destDir, err.Error())
Colin Cross8ba7d472020-06-25 11:27:52 -0700446 }
447
Dan Willemsen80d72612022-04-20 21:45:00 -0700448 distWaitGroup.Add(1)
449 go func() {
450 defer distWaitGroup.Done()
451 if _, err := copyFile(src, filepath.Join(destDir, filepath.Base(src))); err != nil {
452 ctx.Printf("failed to dist %s: %s", filepath.Base(src), err.Error())
453 }
454 }()
Colin Cross8ba7d472020-06-25 11:27:52 -0700455}
Joe Onorato7f29a662023-02-23 15:47:06 -0800456
457// Actions to run on every build where 'dist' is in the actions.
458// Be careful, anything added here slows down EVERY CI build
459func runDistActions(ctx Context, config Config) {
460 runStagingSnapshot(ctx, config)
461}