f8231dd0ea
This allows us to set product variables as build settings instead of loading them from a target's provider, which further allows us to read product config variables in transitions. Bug: 287539062 Bug: 269577299 Test: Presubmits Change-Id: I8497703f706162572ceb3486240e1eb02a37f5f6
156 lines
5.9 KiB
Go
156 lines
5.9 KiB
Go
// 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"
|
|
"path/filepath"
|
|
"runtime"
|
|
|
|
"github.com/google/blueprint/proptools"
|
|
)
|
|
|
|
// TestConfig returns a Config object for testing.
|
|
func TestConfig(buildDir string, env map[string]string, bp string, fs map[string][]byte) Config {
|
|
envCopy := make(map[string]string)
|
|
for k, v := range env {
|
|
envCopy[k] = v
|
|
}
|
|
|
|
// Copy the real PATH value to the test environment, it's needed by
|
|
// NonHermeticHostSystemTool() used in x86_darwin_host.go
|
|
envCopy["PATH"] = os.Getenv("PATH")
|
|
|
|
config := &config{
|
|
productVariables: ProductVariables{
|
|
DeviceName: stringPtr("test_device"),
|
|
DeviceProduct: stringPtr("test_product"),
|
|
Platform_sdk_version: intPtr(30),
|
|
Platform_sdk_codename: stringPtr("S"),
|
|
Platform_base_sdk_extension_version: intPtr(1),
|
|
Platform_version_active_codenames: []string{"S", "Tiramisu"},
|
|
DeviceSystemSdkVersions: []string{"14", "15"},
|
|
Platform_systemsdk_versions: []string{"29", "30"},
|
|
AAPTConfig: []string{"normal", "large", "xlarge", "hdpi", "xhdpi", "xxhdpi"},
|
|
AAPTPreferredConfig: stringPtr("xhdpi"),
|
|
AAPTCharacteristics: stringPtr("nosdcard"),
|
|
AAPTPrebuiltDPI: []string{"xhdpi", "xxhdpi"},
|
|
UncompressPrivAppDex: boolPtr(true),
|
|
ShippingApiLevel: stringPtr("30"),
|
|
},
|
|
|
|
outDir: buildDir,
|
|
soongOutDir: filepath.Join(buildDir, "soong"),
|
|
captureBuild: true,
|
|
env: envCopy,
|
|
|
|
// Set testAllowNonExistentPaths so that test contexts don't need to specify every path
|
|
// passed to PathForSource or PathForModuleSrc.
|
|
TestAllowNonExistentPaths: true,
|
|
|
|
BazelContext: noopBazelContext{},
|
|
BuildMode: BazelProdMode,
|
|
mixedBuildDisabledModules: make(map[string]struct{}),
|
|
mixedBuildEnabledModules: make(map[string]struct{}),
|
|
bazelForceEnabledModules: make(map[string]struct{}),
|
|
}
|
|
config.deviceConfig = &deviceConfig{
|
|
config: config,
|
|
}
|
|
config.TestProductVariables = &config.productVariables
|
|
|
|
config.mockFileSystem(bp, fs)
|
|
|
|
determineBuildOS(config)
|
|
|
|
return Config{config}
|
|
}
|
|
|
|
func modifyTestConfigToSupportArchMutator(testConfig Config) {
|
|
config := testConfig.config
|
|
|
|
config.Targets = map[OsType][]Target{
|
|
Android: []Target{
|
|
{Android, Arch{ArchType: Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridgeDisabled, "", "", false},
|
|
{Android, Arch{ArchType: Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}, NativeBridgeDisabled, "", "", false},
|
|
},
|
|
config.BuildOS: []Target{
|
|
{config.BuildOS, Arch{ArchType: X86_64}, NativeBridgeDisabled, "", "", false},
|
|
{config.BuildOS, Arch{ArchType: X86}, NativeBridgeDisabled, "", "", false},
|
|
},
|
|
}
|
|
|
|
// Make the CommonOS OsType available for all products.
|
|
config.Targets[CommonOS] = []Target{commonTargetMap[CommonOS.Name]}
|
|
|
|
if runtime.GOOS == "darwin" {
|
|
config.Targets[config.BuildOS] = config.Targets[config.BuildOS][:1]
|
|
}
|
|
|
|
config.BuildOSTarget = config.Targets[config.BuildOS][0]
|
|
config.BuildOSCommonTarget = getCommonTargets(config.Targets[config.BuildOS])[0]
|
|
config.AndroidCommonTarget = getCommonTargets(config.Targets[Android])[0]
|
|
config.AndroidFirstDeviceTarget = FirstTarget(config.Targets[Android], "lib64", "lib32")[0]
|
|
config.TestProductVariables.DeviceArch = proptools.StringPtr("arm64")
|
|
config.TestProductVariables.DeviceArchVariant = proptools.StringPtr("armv8-a")
|
|
config.TestProductVariables.DeviceSecondaryArch = proptools.StringPtr("arm")
|
|
config.TestProductVariables.DeviceSecondaryArchVariant = proptools.StringPtr("armv7-a-neon")
|
|
}
|
|
|
|
// ModifyTestConfigForMusl takes a Config returned by TestConfig and changes the host targets from glibc to musl.
|
|
func ModifyTestConfigForMusl(config Config) {
|
|
delete(config.Targets, config.BuildOS)
|
|
config.productVariables.HostMusl = boolPtr(true)
|
|
determineBuildOS(config.config)
|
|
config.Targets[config.BuildOS] = []Target{
|
|
{config.BuildOS, Arch{ArchType: X86_64}, NativeBridgeDisabled, "", "", false},
|
|
{config.BuildOS, Arch{ArchType: X86}, NativeBridgeDisabled, "", "", false},
|
|
}
|
|
|
|
config.BuildOSTarget = config.Targets[config.BuildOS][0]
|
|
config.BuildOSCommonTarget = getCommonTargets(config.Targets[config.BuildOS])[0]
|
|
}
|
|
|
|
func modifyTestConfigForMuslArm64HostCross(config Config) {
|
|
config.Targets[LinuxMusl] = append(config.Targets[LinuxMusl],
|
|
Target{config.BuildOS, Arch{ArchType: Arm64}, NativeBridgeDisabled, "", "", true})
|
|
}
|
|
|
|
// TestArchConfig returns a Config object suitable for using for tests that
|
|
// need to run the arch mutator.
|
|
func TestArchConfig(buildDir string, env map[string]string, bp string, fs map[string][]byte) Config {
|
|
testConfig := TestConfig(buildDir, env, bp, fs)
|
|
modifyTestConfigToSupportArchMutator(testConfig)
|
|
return testConfig
|
|
}
|
|
|
|
// CreateTestConfiguredJarList is a function to create ConfiguredJarList for tests.
|
|
func CreateTestConfiguredJarList(list []string) ConfiguredJarList {
|
|
// Create the ConfiguredJarList in as similar way as it is created at runtime by marshalling to
|
|
// a json list of strings and then unmarshalling into a ConfiguredJarList instance.
|
|
b, err := json.Marshal(list)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
var jarList ConfiguredJarList
|
|
err = json.Unmarshal(b, &jarList)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
return jarList
|
|
}
|