LaMont Jones | ac79679 | 2024-04-11 11:01:18 -0700 | [diff] [blame] | 1 | // Copyright 2024 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 | |
| 15 | package main |
| 16 | |
| 17 | import ( |
| 18 | "flag" |
LaMont Jones | 14e2ac6 | 2024-04-17 11:21:37 -0700 | [diff] [blame] | 19 | "fmt" |
LaMont Jones | ac79679 | 2024-04-11 11:01:18 -0700 | [diff] [blame] | 20 | "os" |
LaMont Jones | 14e2ac6 | 2024-04-17 11:21:37 -0700 | [diff] [blame] | 21 | "path/filepath" |
LaMont Jones | ac79679 | 2024-04-11 11:01:18 -0700 | [diff] [blame] | 22 | |
| 23 | rc_lib "android/soong/cmd/release_config/release_config_lib" |
| 24 | ) |
| 25 | |
| 26 | func main() { |
| 27 | var top string |
LaMont Jones | 7ac07de | 2024-04-11 11:50:06 -0700 | [diff] [blame] | 28 | var quiet bool |
LaMont Jones | ac79679 | 2024-04-11 11:01:18 -0700 | [diff] [blame] | 29 | var releaseConfigMapPaths rc_lib.StringList |
| 30 | var targetRelease string |
| 31 | var outputDir string |
| 32 | var err error |
| 33 | var configs *rc_lib.ReleaseConfigs |
LaMont Jones | ed22f82 | 2024-05-29 13:56:39 -0700 | [diff] [blame] | 34 | var json, pb, textproto, inheritance bool |
LaMont Jones | 14e2ac6 | 2024-04-17 11:21:37 -0700 | [diff] [blame] | 35 | var product string |
LaMont Jones | 1578882 | 2024-04-24 16:01:44 -0700 | [diff] [blame] | 36 | var allMake bool |
LaMont Jones | b4f866c | 2024-06-04 13:19:01 -0700 | [diff] [blame] | 37 | var useBuildVar, allowMissing bool |
LaMont Jones | 15902f2 | 2024-05-01 10:06:32 -0700 | [diff] [blame] | 38 | var guard bool |
LaMont Jones | 14e2ac6 | 2024-04-17 11:21:37 -0700 | [diff] [blame] | 39 | |
| 40 | defaultRelease := os.Getenv("TARGET_RELEASE") |
| 41 | if defaultRelease == "" { |
| 42 | defaultRelease = "trunk_staging" |
| 43 | } |
LaMont Jones | ac79679 | 2024-04-11 11:01:18 -0700 | [diff] [blame] | 44 | |
| 45 | flag.StringVar(&top, "top", ".", "path to top of workspace") |
LaMont Jones | 14e2ac6 | 2024-04-17 11:21:37 -0700 | [diff] [blame] | 46 | flag.StringVar(&product, "product", os.Getenv("TARGET_PRODUCT"), "TARGET_PRODUCT for the build") |
LaMont Jones | 7ac07de | 2024-04-11 11:50:06 -0700 | [diff] [blame] | 47 | flag.BoolVar(&quiet, "quiet", false, "disable warning messages") |
LaMont Jones | ac79679 | 2024-04-11 11:01:18 -0700 | [diff] [blame] | 48 | flag.Var(&releaseConfigMapPaths, "map", "path to a release_config_map.textproto. may be repeated") |
LaMont Jones | 14e2ac6 | 2024-04-17 11:21:37 -0700 | [diff] [blame] | 49 | flag.StringVar(&targetRelease, "release", defaultRelease, "TARGET_RELEASE for this build") |
LaMont Jones | b4f866c | 2024-06-04 13:19:01 -0700 | [diff] [blame] | 50 | flag.BoolVar(&allowMissing, "allow-missing", false, "Use trunk_staging values if release not found") |
LaMont Jones | ac79679 | 2024-04-11 11:01:18 -0700 | [diff] [blame] | 51 | flag.StringVar(&outputDir, "out_dir", rc_lib.GetDefaultOutDir(), "basepath for the output. Multiple formats are created") |
LaMont Jones | 14e2ac6 | 2024-04-17 11:21:37 -0700 | [diff] [blame] | 52 | flag.BoolVar(&textproto, "textproto", true, "write artifacts as text protobuf") |
| 53 | flag.BoolVar(&json, "json", true, "write artifacts as json") |
| 54 | flag.BoolVar(&pb, "pb", true, "write artifacts as binary protobuf") |
LaMont Jones | 8e2a6b1 | 2024-05-14 09:21:10 -0700 | [diff] [blame] | 55 | flag.BoolVar(&allMake, "all_make", false, "write makefiles for all release configs") |
LaMont Jones | ed22f82 | 2024-05-29 13:56:39 -0700 | [diff] [blame] | 56 | flag.BoolVar(&inheritance, "inheritance", true, "write inheritance graph") |
LaMont Jones | e41ea1e | 2024-04-29 14:16:19 -0700 | [diff] [blame] | 57 | flag.BoolVar(&useBuildVar, "use_get_build_var", false, "use get_build_var PRODUCT_RELEASE_CONFIG_MAPS") |
LaMont Jones | 15902f2 | 2024-05-01 10:06:32 -0700 | [diff] [blame] | 58 | flag.BoolVar(&guard, "guard", true, "whether to guard with RELEASE_BUILD_FLAGS_IN_PROTOBUF") |
LaMont Jones | e41ea1e | 2024-04-29 14:16:19 -0700 | [diff] [blame] | 59 | |
LaMont Jones | ac79679 | 2024-04-11 11:01:18 -0700 | [diff] [blame] | 60 | flag.Parse() |
| 61 | |
LaMont Jones | 7ac07de | 2024-04-11 11:50:06 -0700 | [diff] [blame] | 62 | if quiet { |
| 63 | rc_lib.DisableWarnings() |
| 64 | } |
| 65 | |
LaMont Jones | ac79679 | 2024-04-11 11:01:18 -0700 | [diff] [blame] | 66 | if err = os.Chdir(top); err != nil { |
| 67 | panic(err) |
| 68 | } |
LaMont Jones | b4f866c | 2024-06-04 13:19:01 -0700 | [diff] [blame] | 69 | configs, err = rc_lib.ReadReleaseConfigMaps(releaseConfigMapPaths, targetRelease, useBuildVar, allowMissing) |
LaMont Jones | ac79679 | 2024-04-11 11:01:18 -0700 | [diff] [blame] | 70 | if err != nil { |
| 71 | panic(err) |
| 72 | } |
LaMont Jones | 14e2ac6 | 2024-04-17 11:21:37 -0700 | [diff] [blame] | 73 | config, err := configs.GetReleaseConfig(targetRelease) |
| 74 | if err != nil { |
| 75 | panic(err) |
| 76 | } |
LaMont Jones | ac79679 | 2024-04-11 11:01:18 -0700 | [diff] [blame] | 77 | err = os.MkdirAll(outputDir, 0775) |
| 78 | if err != nil { |
| 79 | panic(err) |
| 80 | } |
LaMont Jones | f4cc08e | 2024-04-26 09:14:30 -0700 | [diff] [blame] | 81 | |
LaMont Jones | 693c703 | 2024-05-16 10:47:22 -0700 | [diff] [blame] | 82 | makefilePath := filepath.Join(outputDir, fmt.Sprintf("release_config-%s-%s.varmk", product, targetRelease)) |
LaMont Jones | 15902f2 | 2024-05-01 10:06:32 -0700 | [diff] [blame] | 83 | useProto, ok := config.FlagArtifacts["RELEASE_BUILD_FLAGS_IN_PROTOBUF"] |
| 84 | if guard && (!ok || rc_lib.MarshalValue(useProto.Value) == "") { |
| 85 | // We were told to guard operation and either we have no build flag, or it is False. |
| 86 | // Write an empty file so that release_config.mk will use the old process. |
| 87 | os.WriteFile(makefilePath, []byte{}, 0644) |
LaMont Jones | 992011e | 2024-05-08 09:13:13 -0700 | [diff] [blame] | 88 | return |
| 89 | } |
| 90 | // Write the makefile where release_config.mk is going to look for it. |
| 91 | err = configs.WriteMakefile(makefilePath, targetRelease) |
| 92 | if err != nil { |
| 93 | panic(err) |
| 94 | } |
| 95 | if allMake { |
LaMont Jones | 897ab4e | 2024-05-02 15:19:18 -0700 | [diff] [blame] | 96 | // Write one makefile per release config, using the canonical release name. |
LaMont Jones | ce599ef | 2024-05-15 11:44:26 -0700 | [diff] [blame] | 97 | for _, c := range configs.GetSortedReleaseConfigs() { |
| 98 | if c.Name != targetRelease { |
LaMont Jones | 693c703 | 2024-05-16 10:47:22 -0700 | [diff] [blame] | 99 | makefilePath = filepath.Join(outputDir, fmt.Sprintf("release_config-%s-%s.varmk", product, c.Name)) |
LaMont Jones | ce599ef | 2024-05-15 11:44:26 -0700 | [diff] [blame] | 100 | err = configs.WriteMakefile(makefilePath, c.Name) |
LaMont Jones | 992011e | 2024-05-08 09:13:13 -0700 | [diff] [blame] | 101 | if err != nil { |
| 102 | panic(err) |
| 103 | } |
LaMont Jones | 1578882 | 2024-04-24 16:01:44 -0700 | [diff] [blame] | 104 | } |
| 105 | } |
LaMont Jones | ac79679 | 2024-04-11 11:01:18 -0700 | [diff] [blame] | 106 | } |
LaMont Jones | ed22f82 | 2024-05-29 13:56:39 -0700 | [diff] [blame] | 107 | if inheritance { |
| 108 | inheritPath := filepath.Join(outputDir, fmt.Sprintf("inheritance_graph-%s.dot", product)) |
| 109 | err = configs.WriteInheritanceGraph(inheritPath) |
| 110 | if err != nil { |
| 111 | panic(err) |
| 112 | } |
| 113 | } |
LaMont Jones | 14e2ac6 | 2024-04-17 11:21:37 -0700 | [diff] [blame] | 114 | if json { |
| 115 | err = configs.WriteArtifact(outputDir, product, "json") |
| 116 | if err != nil { |
| 117 | panic(err) |
| 118 | } |
| 119 | } |
| 120 | if pb { |
| 121 | err = configs.WriteArtifact(outputDir, product, "pb") |
| 122 | if err != nil { |
| 123 | panic(err) |
| 124 | } |
| 125 | } |
| 126 | if textproto { |
| 127 | err = configs.WriteArtifact(outputDir, product, "textproto") |
| 128 | if err != nil { |
| 129 | panic(err) |
| 130 | } |
LaMont Jones | ac79679 | 2024-04-11 11:01:18 -0700 | [diff] [blame] | 131 | } |
Justin Yun | 5f53869 | 2024-05-22 20:35:20 +0900 | [diff] [blame] | 132 | if err = config.WritePartitionBuildFlags(outputDir); err != nil { |
LaMont Jones | 15902f2 | 2024-05-01 10:06:32 -0700 | [diff] [blame] | 133 | panic(err) |
| 134 | } |
| 135 | |
LaMont Jones | ac79679 | 2024-04-11 11:01:18 -0700 | [diff] [blame] | 136 | } |