Spracherkennung für: .go vermutete Sprache: C {C[60] Corba[60] CS[60]} [Methode: maximale Elemente, drei Dimensionen]
// Copyright 2022 Google Inc. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package android
import (
"encoding/json"
"os"
"strings"
"github.com/google/blueprint/bootstrap"
)
func init() {
RegisterPluginSingletonBuildComponents(InitRegistrationContext)
}
func RegisterPluginSingletonBuildComponents(ctx RegistrationContext) {
ctx.RegisterParallelSingletonType(
"plugins", pluginSingletonFactory)
}
// pluginSingleton is a singleton to handle allowlisting of the final Android-<product_name>.mk file
// output.
func pluginSingletonFactory() Singleton {
return &pluginSingleton{}
}
type pluginSingleton
struct{}
var allowedPluginsByName = map[string]
bool{
"aidl-soong-rules":
true,
"arm_compute_library_nn_driver":
true,
"cuttlefish-soong-rules":
true,
"ferrochrome-soong-rules":
true,
"gki-soong-rules":
true,
"hidl-soong-rules":
true,
"kernel-config-soong-rules":
true,
"soong-angle-codegen":
true,
"soong-api":
true,
"soong-art":
true,
"soong-ca-certificates":
true,
"soong-ca-certificates-apex":
true,
"soong-clang":
true,
"soong-clang-prebuilts":
true,
"soong-csuite":
true,
"soong-fluoride":
true,
"soong-fs_config":
true,
"soong-icu":
true,
"soong-java-config-error_prone":
true,
"soong-libchrome":
true,
"soong-llvm":
true,
"soong-noto-fonts":
true,
"soong-robolectric":
true,
"soong-sdv_binary_pdk":
true,
"soong-selinux":
true,
"treble_report_app":
true,
"treble_report_local":
true,
"treble_report_module":
true,
"vintf-compatibility-matrix-soong-rules":
true,
"xsdc-soong-rules":
true,
"xtensa":
true,
}
var internalPluginsPaths = []string{
"vendor/google/build/soong/internal_plugins.json",
}
func maybeAddInternalPluginsToAllowlist(ctx SingletonContext) {
for _, internalPluginsPath := range internalPluginsPaths {
if path := ExistentPathForSource(ctx, internalPluginsPath); path.Valid() {
ctx.AddNinjaFileDeps(path.String())
absPath := absolutePath(path.String())
var moreAllowed map[string]
bool
data, err := os.ReadFile(absPath)
if err != nil {
ctx.Errorf(
"Failed to open internal plugins path %q %q", internalPluginsPath, err)
}
if err := json.Unmarshal(data, &moreAllowed); err != nil {
ctx.Errorf(
"Internal plugins file %q did not parse correctly: %q", data, err)
}
for k, v := range moreAllowed {
allowedPluginsByName[k] = v
}
}
}
}
func (p *pluginSingleton) GenerateBuildActions(ctx SingletonContext) {
for _, p := range ctx.DeviceConfig().BuildBrokenPluginValidation() {
allowedPluginsByName[p] =
true
}
maybeAddInternalPluginsToAllowlist(ctx)
disallowedPlugins := map[string]
bool{}
soongBuildModule := ctx.GetModuleProxy(
"soong_build", ctx.Config().BuildOSTarget.Va
riations())
// Still visit all the variants because we also have a windows variant on the linux build.
ctx.VisitAllModuleVariantProxies(soongBuildModule, func(module ModuleProxy) {
ctx.VisitDirectDepsProxies(module, func(module ModuleProxy) {
if ctx.OtherModuleDependencyTag(module) != bootstrap.PluginDepTag {
return
}
name := ctx.ModuleName(module)
if _, ok := allowedPluginsByName[name]; ok {
return
}
dir := ctx.ModuleDir(module)
// allow use of plugins within Soong to not allowlist everything
if strings.HasPrefix(dir, "build/soong") {
return
}
// allow third party users outside of external to create new plugins, i.e. non-google paths
// under vendor or hardware
if !strings.HasPrefix(dir, "external/") && IsThirdPartyPath(dir) {
return
}
disallowedPlugins[name] = true
})
})
if len(disallowedPlugins) > 0 {
ctx.Errorf("New plugins are not supported; however %q were found. Please reach out to the build team or use BUILD_BROKEN_PLUGIN_VALIDATION (see Changes.md for more info).", SortedKeys(disallowedPlugins))
}
}
func (p *pluginSingleton) IncrementalSupported() bool {
// pluginSingleton depends on the contents of the vendor/google/build/soong/internal_plugins.json file
// that is not tracked as an incremental analysis input.
return false
}