| Artur Satayev | 849f844 | 2020-04-28 14:57:42 +0100 | [diff] [blame] | 1 | /* | 
|  | 2 | * Copyright (C) 2020 The Android Open Source Project | 
|  | 3 | * | 
|  | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | 5 | * you may not use this file except in compliance with the License. | 
|  | 6 | * You may obtain a copy of the License at | 
|  | 7 | * | 
|  | 8 | *      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | 9 | * | 
|  | 10 | * Unless required by applicable law or agreed to in writing, software | 
|  | 11 | * distributed under the License is distributed on an "AS IS" BASIS, | 
|  | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | 13 | * See the License for the specific language governing permissions and | 
|  | 14 | * limitations under the License. | 
|  | 15 | */ | 
|  | 16 |  | 
|  | 17 | package apex | 
|  | 18 |  | 
|  | 19 | import ( | 
| Artur Satayev | a4405fa | 2020-05-14 15:15:01 +0100 | [diff] [blame] | 20 | "github.com/google/blueprint" | 
| Artur Satayev | 9af168d | 2020-06-24 10:17:19 +0000 | [diff] [blame] | 21 |  | 
|  | 22 | "android/soong/android" | 
| Artur Satayev | 849f844 | 2020-04-28 14:57:42 +0100 | [diff] [blame] | 23 | ) | 
|  | 24 |  | 
|  | 25 | func init() { | 
| Jooyung Han | 4495f84 | 2023-04-25 16:39:59 +0900 | [diff] [blame] | 26 | registerApexDepsInfoComponents(android.InitRegistrationContext) | 
|  | 27 | } | 
|  | 28 |  | 
|  | 29 | func registerApexDepsInfoComponents(ctx android.RegistrationContext) { | 
| LaMont Jones | 0c10e4d | 2023-05-16 00:58:37 +0000 | [diff] [blame] | 30 | ctx.RegisterParallelSingletonType("apex_depsinfo_singleton", apexDepsInfoSingletonFactory) | 
| Artur Satayev | 849f844 | 2020-04-28 14:57:42 +0100 | [diff] [blame] | 31 | } | 
|  | 32 |  | 
|  | 33 | type apexDepsInfoSingleton struct { | 
| Artur Satayev | 019560f | 2020-07-02 11:51:47 +0000 | [diff] [blame] | 34 | allowedApexDepsInfoCheckResult android.OutputPath | 
| Artur Satayev | 849f844 | 2020-04-28 14:57:42 +0100 | [diff] [blame] | 35 | } | 
|  | 36 |  | 
|  | 37 | func apexDepsInfoSingletonFactory() android.Singleton { | 
|  | 38 | return &apexDepsInfoSingleton{} | 
|  | 39 | } | 
|  | 40 |  | 
| Artur Satayev | 019560f | 2020-07-02 11:51:47 +0000 | [diff] [blame] | 41 | var ( | 
|  | 42 | // Generate new apex allowed_deps.txt by merging all internal dependencies. | 
|  | 43 | generateApexDepsInfoFilesRule = pctx.AndroidStaticRule("generateApexDepsInfoFilesRule", blueprint.RuleParams{ | 
|  | 44 | Command: "cat $out.rsp | xargs cat" + | 
|  | 45 | // Only track non-external dependencies, i.e. those that end up in the binary | 
|  | 46 | " | grep -v '(external)'" + | 
|  | 47 | // Ignore comments in any of the files | 
|  | 48 | " | grep -v '^#'" + | 
|  | 49 | " | sort -u -f >$out", | 
| Artur Satayev | 849f844 | 2020-04-28 14:57:42 +0100 | [diff] [blame] | 50 | Rspfile:        "$out.rsp", | 
|  | 51 | RspfileContent: "$in", | 
| Artur Satayev | 019560f | 2020-07-02 11:51:47 +0000 | [diff] [blame] | 52 | }) | 
|  | 53 |  | 
|  | 54 | // Diff two given lists while ignoring comments in the allowed deps file. | 
|  | 55 | diffAllowedApexDepsInfoRule = pctx.AndroidStaticRule("diffAllowedApexDepsInfoRule", blueprint.RuleParams{ | 
|  | 56 | Description: "Diff ${allowed_deps} and ${new_allowed_deps}", | 
|  | 57 | Command: ` | 
|  | 58 | if grep -v '^#' ${allowed_deps} | diff -B - ${new_allowed_deps}; then | 
|  | 59 | touch ${out}; | 
|  | 60 | else | 
|  | 61 | echo -e "\n******************************"; | 
| Pedro Loureiro | 87c8817 | 2023-02-07 17:08:35 +0000 | [diff] [blame] | 62 | echo "ERROR: go/apex-allowed-deps-error contains more information"; | 
| Artur Satayev | 019560f | 2020-07-02 11:51:47 +0000 | [diff] [blame] | 63 | echo "******************************"; | 
|  | 64 | echo "Detected changes to allowed dependencies in updatable modules."; | 
| Artur Satayev | 8dfcbe4 | 2021-03-11 16:45:04 +0000 | [diff] [blame] | 65 | echo "To fix and update packages/modules/common/build/allowed_deps.txt, please run:"; | 
| Mathew Inwood | 768a011 | 2021-08-02 16:43:05 +0100 | [diff] [blame] | 66 | echo -e "$$ (croot && packages/modules/common/build/update-apex-allowed-deps.sh)\n"; | 
|  | 67 | echo "When submitting the generated CL, you must include the following information"; | 
|  | 68 | echo "in the commit message if you are adding a new dependency:"; | 
| Pedro Loureiro | 87c8817 | 2023-02-07 17:08:35 +0000 | [diff] [blame] | 69 | echo "Apex-Size-Increase: Expected binary size increase for affected APEXes (or the size of the .jar / .so file of the new library)"; | 
|  | 70 | echo "Previous-Platform-Support: Are the maintainers of the new dependency committed to supporting previous platform releases?"; | 
|  | 71 | echo "Aosp-First: Is the new dependency being developed AOSP-first or internal?"; | 
|  | 72 | echo "Test-Info: What’s the testing strategy for the new dependency? Does it have its own tests, and are you adding integration tests? How/when are the tests run?"; | 
| Mathew Inwood | 768a011 | 2021-08-02 16:43:05 +0100 | [diff] [blame] | 73 | echo "You do not need OWNERS approval to submit the change, but mainline-modularization@"; | 
|  | 74 | echo "will periodically review additions and may require changes."; | 
| Artur Satayev | 019560f | 2020-07-02 11:51:47 +0000 | [diff] [blame] | 75 | echo -e "******************************\n"; | 
|  | 76 | exit 1; | 
|  | 77 | fi; | 
|  | 78 | `, | 
|  | 79 | }, "allowed_deps", "new_allowed_deps") | 
| Artur Satayev | 849f844 | 2020-04-28 14:57:42 +0100 | [diff] [blame] | 80 | ) | 
|  | 81 |  | 
|  | 82 | func (s *apexDepsInfoSingleton) GenerateBuildActions(ctx android.SingletonContext) { | 
| Artur Satayev | 9af168d | 2020-06-24 10:17:19 +0000 | [diff] [blame] | 83 | updatableFlatLists := android.Paths{} | 
| Artur Satayev | 849f844 | 2020-04-28 14:57:42 +0100 | [diff] [blame] | 84 | ctx.VisitAllModules(func(module android.Module) { | 
|  | 85 | if binaryInfo, ok := module.(android.ApexBundleDepsInfoIntf); ok { | 
| Colin Cross | 5a37718 | 2023-12-14 14:46:23 -0800 | [diff] [blame] | 86 | apexInfo, _ := android.SingletonModuleProvider(ctx, module, android.ApexInfoProvider) | 
| Colin Cross | 56a8321 | 2020-09-15 18:30:11 -0700 | [diff] [blame] | 87 | if path := binaryInfo.FlatListPath(); path != nil { | 
|  | 88 | if binaryInfo.Updatable() || apexInfo.Updatable { | 
|  | 89 | updatableFlatLists = append(updatableFlatLists, path) | 
|  | 90 | } | 
| Artur Satayev | 849f844 | 2020-04-28 14:57:42 +0100 | [diff] [blame] | 91 | } | 
|  | 92 | } | 
|  | 93 | }) | 
|  | 94 |  | 
| Artur Satayev | b77b0c5 | 2021-03-18 11:04:09 +0000 | [diff] [blame] | 95 | allowedDepsSource := android.ExistentPathForSource(ctx, "packages/modules/common/build/allowed_deps.txt") | 
| Artur Satayev | 019560f | 2020-07-02 11:51:47 +0000 | [diff] [blame] | 96 | newAllowedDeps := android.PathForOutput(ctx, "apex", "depsinfo", "new-allowed-deps.txt") | 
| Artur Satayev | 019560f | 2020-07-02 11:51:47 +0000 | [diff] [blame] | 97 | s.allowedApexDepsInfoCheckResult = android.PathForOutput(ctx, newAllowedDeps.Rel()+".check") | 
| Artur Satayev | b77b0c5 | 2021-03-18 11:04:09 +0000 | [diff] [blame] | 98 |  | 
|  | 99 | if !allowedDepsSource.Valid() { | 
|  | 100 | // Unbundled projects may not have packages/modules/common/ checked out; ignore those. | 
|  | 101 | ctx.Build(pctx, android.BuildParams{ | 
|  | 102 | Rule:   android.Touch, | 
|  | 103 | Output: s.allowedApexDepsInfoCheckResult, | 
|  | 104 | }) | 
|  | 105 | } else { | 
|  | 106 | allowedDeps := allowedDepsSource.Path() | 
|  | 107 |  | 
|  | 108 | ctx.Build(pctx, android.BuildParams{ | 
|  | 109 | Rule:   generateApexDepsInfoFilesRule, | 
|  | 110 | Inputs: append(updatableFlatLists, allowedDeps), | 
|  | 111 | Output: newAllowedDeps, | 
|  | 112 | }) | 
|  | 113 |  | 
|  | 114 | ctx.Build(pctx, android.BuildParams{ | 
|  | 115 | Rule:   diffAllowedApexDepsInfoRule, | 
|  | 116 | Input:  newAllowedDeps, | 
|  | 117 | Output: s.allowedApexDepsInfoCheckResult, | 
|  | 118 | Args: map[string]string{ | 
|  | 119 | "allowed_deps":     allowedDeps.String(), | 
|  | 120 | "new_allowed_deps": newAllowedDeps.String(), | 
|  | 121 | }, | 
|  | 122 | }) | 
|  | 123 | } | 
| Artur Satayev | 01aa11e | 2020-07-30 18:26:28 +0100 | [diff] [blame] | 124 |  | 
|  | 125 | ctx.Phony("apex-allowed-deps-check", s.allowedApexDepsInfoCheckResult) | 
| Artur Satayev | 019560f | 2020-07-02 11:51:47 +0000 | [diff] [blame] | 126 | } | 
|  | 127 |  | 
|  | 128 | func (s *apexDepsInfoSingleton) MakeVars(ctx android.MakeVarsContext) { | 
|  | 129 | // Export check result to Make. The path is added to droidcore. | 
|  | 130 | ctx.Strict("APEX_ALLOWED_DEPS_CHECK", s.allowedApexDepsInfoCheckResult.String()) | 
| Artur Satayev | 849f844 | 2020-04-28 14:57:42 +0100 | [diff] [blame] | 131 | } |