diff options
| -rw-r--r-- | android/arch.go | 6 | ||||
| -rw-r--r-- | android/arch_test.go | 85 | ||||
| -rw-r--r-- | cc/compiler.go | 3 | ||||
| -rw-r--r-- | java/config/config.go | 5 | ||||
| -rw-r--r-- | java/droiddoc.go | 16 | ||||
| -rw-r--r-- | java/hiddenapi_singleton.go | 2 | ||||
| -rw-r--r-- | java/java.go | 5 | ||||
| -rw-r--r-- | java/sdk_test.go | 6 | ||||
| -rw-r--r-- | java/testing.go | 19 | ||||
| -rw-r--r-- | rust/library.go | 11 | ||||
| -rw-r--r-- | rust/library_test.go | 14 | ||||
| -rw-r--r-- | sdk/java_sdk_test.go | 4 | ||||
| -rw-r--r-- | sh/Android.bp | 1 | ||||
| -rw-r--r-- | sh/sh_binary.go | 37 | ||||
| -rw-r--r-- | tradefed/autogen.go | 32 | ||||
| -rw-r--r-- | tradefed/config.go | 1 | ||||
| -rw-r--r-- | tradefed/makevars.go | 1 |
17 files changed, 212 insertions, 36 deletions
diff --git a/android/arch.go b/android/arch.go index 08c0256b7..514a09946 100644 --- a/android/arch.go +++ b/android/arch.go @@ -1026,6 +1026,7 @@ func createArchPropTypeDesc(props reflect.Type) []archPropTypeDesc { "Not_windows", "Arm_on_x86", "Arm_on_x86_64", + "Native_bridge", } for _, os := range OsTypeList { targets = append(targets, os.Field) @@ -1413,6 +1414,11 @@ func (m *ModuleBase) setArchProperties(ctx BottomUpMutatorContext) { prefix := "target.arm_on_x86_64" m.appendProperties(ctx, genProps, targetProp, field, prefix) } + if os == Android && m.Target().NativeBridge == NativeBridgeEnabled { + field := "Native_bridge" + prefix := "target.native_bridge" + m.appendProperties(ctx, genProps, targetProp, field, prefix) + } } } } diff --git a/android/arch_test.go b/android/arch_test.go index b987d5697..8525b0349 100644 --- a/android/arch_test.go +++ b/android/arch_test.go @@ -383,3 +383,88 @@ func TestArchMutator(t *testing.T) { }) } } + +func TestArchMutatorNativeBridge(t *testing.T) { + bp := ` + // This module is only enabled for x86. + module { + name: "foo", + } + + // This module is enabled for x86 and arm (via native bridge). + module { + name: "bar", + native_bridge_supported: true, + } + + // This module is enabled for arm (native_bridge) only. + module { + name: "baz", + native_bridge_supported: true, + enabled: false, + target: { + native_bridge: { + enabled: true, + } + } + } + ` + + testCases := []struct { + name string + config func(Config) + fooVariants []string + barVariants []string + bazVariants []string + }{ + { + name: "normal", + config: nil, + fooVariants: []string{"android_x86_64_silvermont", "android_x86_silvermont"}, + barVariants: []string{"android_x86_64_silvermont", "android_native_bridge_arm64_armv8-a", "android_x86_silvermont", "android_native_bridge_arm_armv7-a-neon"}, + bazVariants: []string{"android_native_bridge_arm64_armv8-a", "android_native_bridge_arm_armv7-a-neon"}, + }, + } + + enabledVariants := func(ctx *TestContext, name string) []string { + var ret []string + variants := ctx.ModuleVariantsForTests(name) + for _, variant := range variants { + m := ctx.ModuleForTests(name, variant) + if m.Module().Enabled() { + ret = append(ret, variant) + } + } + return ret + } + + for _, tt := range testCases { + t.Run(tt.name, func(t *testing.T) { + config := TestArchConfigNativeBridge(buildDir, nil, bp, nil) + + ctx := NewTestArchContext() + ctx.RegisterModuleType("module", archTestModuleFactory) + ctx.Register(config) + if tt.config != nil { + tt.config(config) + } + + _, errs := ctx.ParseFileList(".", []string{"Android.bp"}) + FailIfErrored(t, errs) + _, errs = ctx.PrepareBuildActions(config) + FailIfErrored(t, errs) + + if g, w := enabledVariants(ctx, "foo"), tt.fooVariants; !reflect.DeepEqual(w, g) { + t.Errorf("want foo variants:\n%q\ngot:\n%q\n", w, g) + } + + if g, w := enabledVariants(ctx, "bar"), tt.barVariants; !reflect.DeepEqual(w, g) { + t.Errorf("want bar variants:\n%q\ngot:\n%q\n", w, g) + } + + if g, w := enabledVariants(ctx, "baz"), tt.bazVariants; !reflect.DeepEqual(w, g) { + t.Errorf("want qux variants:\n%q\ngot:\n%q\n", w, g) + } + }) + } +} diff --git a/cc/compiler.go b/cc/compiler.go index 681b1ab90..e7495da88 100644 --- a/cc/compiler.go +++ b/cc/compiler.go @@ -300,8 +300,7 @@ func (compiler *baseCompiler) compilerFlags(ctx ModuleContext, flags Flags, deps if !(ctx.useSdk() || ctx.useVndk()) || ctx.Host() { flags.SystemIncludeFlags = append(flags.SystemIncludeFlags, "${config.CommonGlobalIncludes}", - tc.IncludeFlags(), - "${config.CommonNativehelperInclude}") + tc.IncludeFlags()) } if ctx.useSdk() { diff --git a/java/config/config.go b/java/config/config.go index edaed2a10..bb5be3aca 100644 --- a/java/config/config.go +++ b/java/config/config.go @@ -28,8 +28,9 @@ import ( var ( pctx = android.NewPackageContext("android/soong/java/config") - DefaultBootclasspathLibraries = []string{"core.platform.api.stubs", "core-lambda-stubs"} - DefaultSystemModules = "core-platform-api-stubs-system-modules" + // TODO(b/157640067): Don't depend on the legacy API by default in the long term. + DefaultBootclasspathLibraries = []string{"legacy.core.platform.api.stubs", "core-lambda-stubs"} + DefaultSystemModules = "legacy-core-platform-api-stubs-system-modules" DefaultLibraries = []string{"ext", "framework"} DefaultLambdaStubsLibrary = "core-lambda-stubs" SdkLambdaStubsPath = "prebuilts/sdk/tools/core-lambda-stubs.jar" diff --git a/java/droiddoc.go b/java/droiddoc.go index d61c62c60..4c3e11236 100644 --- a/java/droiddoc.go +++ b/java/droiddoc.go @@ -1424,10 +1424,9 @@ func metalavaCmd(ctx android.ModuleContext, rule *android.RuleBuilder, javaVersi rule.HighMem() cmd := rule.Command() - rspFile := "" + var implicitsRsp android.WritablePath if len(implicits) > 0 { - implicitsRsp := android.PathForModuleOut(ctx, ctx.ModuleName()+"-"+"implicits.rsp") - rspFile = implicitsRsp.String() + implicitsRsp = android.PathForModuleOut(ctx, ctx.ModuleName()+"-"+"implicits.rsp") impRule := android.NewRuleBuilder() impCmd := impRule.Command() // A dummy action that copies the ninja generated rsp file to a new location. This allows us to @@ -1454,10 +1453,10 @@ func metalavaCmd(ctx android.ModuleContext, rule *android.RuleBuilder, javaVersi inputs = append(inputs, strings.Split(v, ",")...) } cmd.Text((&remoteexec.REParams{ - Labels: map[string]string{"type": "compile", "lang": "java", "compiler": "metalava"}, + Labels: map[string]string{"type": "compile", "lang": "java", "compiler": "metalava", "shallow": "true"}, ExecStrategy: execStrategy, Inputs: inputs, - RSPFile: rspFile, + RSPFile: implicitsRsp.String(), ToolchainInputs: []string{config.JavaCmd(ctx).String()}, Platform: map[string]string{remoteexec.PoolKey: pool}, }).NoVarTemplate(ctx.Config())) @@ -1468,7 +1467,12 @@ func metalavaCmd(ctx android.ModuleContext, rule *android.RuleBuilder, javaVersi FlagWithArg("-encoding ", "UTF-8"). FlagWithArg("-source ", javaVersion.String()). FlagWithRspFileInputList("@", srcs). - FlagWithInput("@", srcJarList) + FlagWithInput("@", srcJarList). + FlagWithOutput("--strict-input-files:warn ", android.PathForModuleOut(ctx, ctx.ModuleName()+"-"+"violations.txt")) + + if implicitsRsp.String() != "" { + cmd.FlagWithArg("--strict-input-files-exempt ", "@"+implicitsRsp.String()) + } if len(bootclasspath) > 0 { cmd.FlagWithInputList("-bootclasspath ", bootclasspath.Paths(), ":") diff --git a/java/hiddenapi_singleton.go b/java/hiddenapi_singleton.go index 2f35798b5..bff591cb0 100644 --- a/java/hiddenapi_singleton.go +++ b/java/hiddenapi_singleton.go @@ -116,7 +116,7 @@ func stubFlagsRule(ctx android.SingletonContext) { // Core Platform API stubs corePlatformStubModules := []string{ - "core.platform.api.stubs", + "legacy.core.platform.api.stubs", } // Allow products to define their own stubs for custom product jars that apps can use. diff --git a/java/java.go b/java/java.go index ee4b8d89b..226e0b91b 100644 --- a/java/java.go +++ b/java/java.go @@ -837,8 +837,9 @@ type linkTypeContext interface { func (m *Module) getLinkType(name string) (ret linkType, stubs bool) { switch name { - case "core.current.stubs", "core.platform.api.stubs", "stub-annotations", - "private-stub-annotations-jar", "core-lambda-stubs", "core-generated-annotation-stubs": + case "core.current.stubs", "legacy.core.platform.api.stubs", "stable.core.platform.api.stubs", + "stub-annotations", "private-stub-annotations-jar", + "core-lambda-stubs", "core-generated-annotation-stubs": return javaCore, true case "android_stubs_current": return javaSdk, true diff --git a/java/sdk_test.go b/java/sdk_test.go index 52d2df552..e5d322c58 100644 --- a/java/sdk_test.go +++ b/java/sdk_test.go @@ -156,9 +156,9 @@ func TestClasspath(t *testing.T) { { name: "nostdlib system_modules", - properties: `sdk_version: "none", system_modules: "core-platform-api-stubs-system-modules"`, - system: "core-platform-api-stubs-system-modules", - bootclasspath: []string{"core-platform-api-stubs-system-modules-lib"}, + properties: `sdk_version: "none", system_modules: "legacy-core-platform-api-stubs-system-modules"`, + system: "legacy-core-platform-api-stubs-system-modules", + bootclasspath: []string{"legacy-core-platform-api-stubs-system-modules-lib"}, java8classpath: []string{}, }, { diff --git a/java/testing.go b/java/testing.go index faf4d32b4..f993f56b3 100644 --- a/java/testing.go +++ b/java/testing.go @@ -173,7 +173,8 @@ func GatherRequiredDepsForTest() string { "android_module_lib_stubs_current", "android_system_server_stubs_current", "core.current.stubs", - "core.platform.api.stubs", + "legacy.core.platform.api.stubs", + "stable.core.platform.api.stubs", "kotlin-stdlib", "kotlin-stdlib-jdk7", "kotlin-stdlib-jdk8", @@ -186,7 +187,7 @@ func GatherRequiredDepsForTest() string { name: "%s", srcs: ["a.java"], sdk_version: "none", - system_modules: "core-platform-api-stubs-system-modules", + system_modules: "legacy-core-platform-api-stubs-system-modules", } `, extra) } @@ -196,7 +197,7 @@ func GatherRequiredDepsForTest() string { name: "framework", srcs: ["a.java"], sdk_version: "none", - system_modules: "core-platform-api-stubs-system-modules", + system_modules: "legacy-core-platform-api-stubs-system-modules", aidl: { export_include_dirs: ["framework/aidl"], }, @@ -211,7 +212,7 @@ func GatherRequiredDepsForTest() string { name: "android.hidl.base-V1.0-java", srcs: ["a.java"], sdk_version: "none", - system_modules: "core-platform-api-stubs-system-modules", + system_modules: "legacy-core-platform-api-stubs-system-modules", installable: true, } @@ -219,7 +220,7 @@ func GatherRequiredDepsForTest() string { name: "android.hidl.manager-V1.0-java", srcs: ["a.java"], sdk_version: "none", - system_modules: "core-platform-api-stubs-system-modules", + system_modules: "legacy-core-platform-api-stubs-system-modules", installable: true, } @@ -227,7 +228,7 @@ func GatherRequiredDepsForTest() string { name: "org.apache.http.legacy", srcs: ["a.java"], sdk_version: "none", - system_modules: "core-platform-api-stubs-system-modules", + system_modules: "legacy-core-platform-api-stubs-system-modules", installable: true, } @@ -235,7 +236,7 @@ func GatherRequiredDepsForTest() string { name: "android.test.base", srcs: ["a.java"], sdk_version: "none", - system_modules: "core-platform-api-stubs-system-modules", + system_modules: "legacy-core-platform-api-stubs-system-modules", installable: true, } @@ -243,14 +244,14 @@ func GatherRequiredDepsForTest() string { name: "android.test.mock", srcs: ["a.java"], sdk_version: "none", - system_modules: "core-platform-api-stubs-system-modules", + system_modules: "legacy-core-platform-api-stubs-system-modules", installable: true, } ` systemModules := []string{ "core-current-stubs-system-modules", - "core-platform-api-stubs-system-modules", + "legacy-core-platform-api-stubs-system-modules", } for _, extra := range systemModules { diff --git a/rust/library.go b/rust/library.go index 8aa033c0f..2e5126639 100644 --- a/rust/library.go +++ b/rust/library.go @@ -329,12 +329,21 @@ func (library *libraryDecorator) compilerDeps(ctx DepsContext, deps Deps) Deps { return deps } + +func (library *libraryDecorator) sharedLibFilename(ctx ModuleContext) string { + return library.getStem(ctx) + ctx.toolchain().SharedLibSuffix() +} + func (library *libraryDecorator) compilerFlags(ctx ModuleContext, flags Flags) Flags { flags.RustFlags = append(flags.RustFlags, "-C metadata="+ctx.baseModuleName()) flags = library.baseCompiler.compilerFlags(ctx, flags) if library.shared() || library.static() { library.includeDirs = append(library.includeDirs, android.PathsForModuleSrc(ctx, library.Properties.Include_dirs)...) } + if library.shared() { + flags.LinkFlags = append(flags.LinkFlags, "-Wl,-soname="+library.sharedLibFilename(ctx)) + } + return flags } @@ -371,7 +380,7 @@ func (library *libraryDecorator) compile(ctx ModuleContext, flags Flags, deps Pa outputs := TransformSrctoStatic(ctx, srcPath, deps, flags, outputFile, deps.linkDirs) library.coverageFile = outputs.coverageFile } else if library.shared() { - fileName := library.getStem(ctx) + ctx.toolchain().SharedLibSuffix() + fileName := library.sharedLibFilename(ctx) outputFile = android.PathForModuleOut(ctx, fileName) outputs := TransformSrctoShared(ctx, srcPath, deps, flags, outputFile, deps.linkDirs) diff --git a/rust/library_test.go b/rust/library_test.go index 9f9f374b9..37dd5414c 100644 --- a/rust/library_test.go +++ b/rust/library_test.go @@ -114,3 +114,17 @@ func TestValidateLibraryStem(t *testing.T) { }`) } + +func TestSharedLibraryFlags(t *testing.T) { + ctx := testRust(t, ` + rust_library_host { + name: "libfoo", + srcs: ["foo.rs"], + crate_name: "foo", + }`) + + libfooShared := ctx.ModuleForTests("libfoo", "linux_glibc_x86_64_shared").Output("libfoo.so") + if !strings.Contains(libfooShared.Args["linkFlags"], "-Wl,-soname=libfoo.so") { + t.Errorf("missing expected -Wl,-soname linker flag for libfoo shared lib, linkFlags: %#v", libfooShared.Args["linkFlags"]) + } +} diff --git a/sdk/java_sdk_test.go b/sdk/java_sdk_test.go index af792f2e6..56706c7ee 100644 --- a/sdk/java_sdk_test.go +++ b/sdk/java_sdk_test.go @@ -43,10 +43,10 @@ java_system_modules_import { name: "core-current-stubs-system-modules", } java_system_modules_import { - name: "core-platform-api-stubs-system-modules", + name: "legacy-core-platform-api-stubs-system-modules", } java_import { - name: "core.platform.api.stubs", + name: "legacy.core.platform.api.stubs", } java_import { name: "android_stubs_current", diff --git a/sh/Android.bp b/sh/Android.bp index 0b04e7dea..0f40c5f68 100644 --- a/sh/Android.bp +++ b/sh/Android.bp @@ -5,6 +5,7 @@ bootstrap_go_package { "blueprint", "soong", "soong-android", + "soong-tradefed", ], srcs: [ "sh_binary.go", diff --git a/sh/sh_binary.go b/sh/sh_binary.go index 2dcd7162c..9276a62e9 100644 --- a/sh/sh_binary.go +++ b/sh/sh_binary.go @@ -22,6 +22,7 @@ import ( "github.com/google/blueprint/proptools" "android/soong/android" + "android/soong/tradefed" ) // sh_binary is for shell scripts (and batch files) that are installed as @@ -74,6 +75,19 @@ type TestProperties struct { // list of files or filegroup modules that provide data that should be installed alongside // the test. Data []string `android:"path,arch_variant"` + + // Add RootTargetPreparer to auto generated test config. This guarantees the test to run + // with root permission. + Require_root *bool + + // the name of the test configuration template (for example "AndroidTestTemplate.xml") that + // should be installed with the module. + Test_config_template *string `android:"path,arch_variant"` + + // Flag to indicate whether or not to create test config automatically. If AndroidTest.xml + // doesn't exist next to the Android.bp, this attribute doesn't need to be set to true + // explicitly. + Auto_gen_config *bool } type ShBinary struct { @@ -93,7 +107,8 @@ type ShTest struct { testProperties TestProperties - data android.Paths + data android.Paths + testConfig android.Path } func (s *ShBinary) HostToolPath() android.OptionalPath { @@ -190,6 +205,16 @@ func (s *ShTest) GenerateAndroidBuildActions(ctx android.ModuleContext) { s.installedFile = ctx.InstallExecutable(installDir, s.outputFilePath.Base(), s.outputFilePath) s.data = android.PathsForModuleSrc(ctx, s.testProperties.Data) + + var configs []tradefed.Config + if Bool(s.testProperties.Require_root) { + configs = append(configs, tradefed.Object{"target_preparer", "com.android.tradefed.targetprep.RootTargetPreparer", nil}) + } else { + options := []tradefed.Option{{Name: "force-root", Value: "false"}} + configs = append(configs, tradefed.Object{"target_preparer", "com.android.tradefed.targetprep.RootTargetPreparer", options}) + } + s.testConfig = tradefed.AutoGenShellTestConfig(ctx, s.testProperties.Test_config, + s.testProperties.Test_config_template, s.testProperties.Test_suites, configs, s.testProperties.Auto_gen_config, s.outputFilePath.Base()) } func (s *ShTest) InstallInData() bool { @@ -206,7 +231,13 @@ func (s *ShTest) AndroidMkEntries() []android.AndroidMkEntries { s.customAndroidMkEntries(entries) entries.AddStrings("LOCAL_COMPATIBILITY_SUITE", s.testProperties.Test_suites...) - entries.SetString("LOCAL_TEST_CONFIG", proptools.String(s.testProperties.Test_config)) + if s.testProperties.Test_config != nil { + entries.SetString("LOCAL_TEST_CONFIG", proptools.String(s.testProperties.Test_config)) + } else { + if s.testConfig != nil { + entries.SetString("LOCAL_FULL_TEST_CONFIG", s.testConfig.String()) + } + } for _, d := range s.data { rel := d.Rel() path := d.String() @@ -265,3 +296,5 @@ func ShTestHostFactory() android.Module { android.InitAndroidArchModule(module, android.HostSupported, android.MultilibFirst) return module } + +var Bool = proptools.Bool diff --git a/tradefed/autogen.go b/tradefed/autogen.go index be44cac5d..28291465b 100644 --- a/tradefed/autogen.go +++ b/tradefed/autogen.go @@ -40,9 +40,9 @@ func getTestConfig(ctx android.ModuleContext, prop *string) android.Path { } var autogenTestConfig = pctx.StaticRule("autogenTestConfig", blueprint.RuleParams{ - Command: "sed 's&{MODULE}&${name}&g;s&{EXTRA_CONFIGS}&'${extraConfigs}'&g' $template > $out", + Command: "sed 's&{MODULE}&${name}&g;s&{EXTRA_CONFIGS}&'${extraConfigs}'&g;s&{OUTPUT_FILENAME}&'${outputFileName}'&g' $template > $out", CommandDeps: []string{"$template"}, -}, "name", "template", "extraConfigs") +}, "name", "template", "extraConfigs", "outputFileName") func testConfigPath(ctx android.ModuleContext, prop *string, testSuites []string, autoGenConfig *bool, testConfigTemplateProp *string) (path android.Path, autogenPath android.WritablePath) { p := getTestConfig(ctx, prop) @@ -108,10 +108,14 @@ func (ob Object) Config() string { } func autogenTemplate(ctx android.ModuleContext, output android.WritablePath, template string, configs []Config) { - autogenTemplateWithName(ctx, ctx.ModuleName(), output, template, configs) + autogenTemplateWithNameAndOutputFile(ctx, ctx.ModuleName(), output, template, configs, "") } func autogenTemplateWithName(ctx android.ModuleContext, name string, output android.WritablePath, template string, configs []Config) { + autogenTemplateWithNameAndOutputFile(ctx, ctx.ModuleName(), output, template, configs, "") +} + +func autogenTemplateWithNameAndOutputFile(ctx android.ModuleContext, name string, output android.WritablePath, template string, configs []Config, outputFileName string) { var configStrings []string for _, config := range configs { configStrings = append(configStrings, config.Config()) @@ -124,9 +128,10 @@ func autogenTemplateWithName(ctx android.ModuleContext, name string, output andr Description: "test config", Output: output, Args: map[string]string{ - "name": name, - "template": template, - "extraConfigs": extraConfigs, + "name": name, + "template": template, + "extraConfigs": extraConfigs, + "outputFileName": outputFileName, }, }) } @@ -150,6 +155,21 @@ func AutoGenNativeTestConfig(ctx android.ModuleContext, testConfigProp *string, return path } +func AutoGenShellTestConfig(ctx android.ModuleContext, testConfigProp *string, + testConfigTemplateProp *string, testSuites []string, config []Config, autoGenConfig *bool, outputFileName string) android.Path { + path, autogenPath := testConfigPath(ctx, testConfigProp, testSuites, autoGenConfig, testConfigTemplateProp) + if autogenPath != nil { + templatePath := getTestConfigTemplate(ctx, testConfigTemplateProp) + if templatePath.Valid() { + autogenTemplateWithNameAndOutputFile(ctx, ctx.ModuleName(), autogenPath, templatePath.String(), config, outputFileName) + } else { + autogenTemplateWithNameAndOutputFile(ctx, ctx.ModuleName(), autogenPath, "${ShellTestConfigTemplate}", config, outputFileName) + } + return autogenPath + } + return path +} + func AutoGenNativeBenchmarkTestConfig(ctx android.ModuleContext, testConfigProp *string, testConfigTemplateProp *string, testSuites []string, configs []Config, autoGenConfig *bool) android.Path { path, autogenPath := testConfigPath(ctx, testConfigProp, testSuites, autoGenConfig, testConfigTemplateProp) diff --git a/tradefed/config.go b/tradefed/config.go index a289073e4..34195c364 100644 --- a/tradefed/config.go +++ b/tradefed/config.go @@ -33,6 +33,7 @@ func init() { pctx.SourcePathVariable("PythonBinaryHostTestConfigTemplate", "build/make/core/python_binary_host_test_config_template.xml") pctx.SourcePathVariable("RustDeviceTestConfigTemplate", "build/make/core/rust_device_test_config_template.xml") pctx.SourcePathVariable("RustHostTestConfigTemplate", "build/make/core/rust_host_test_config_template.xml") + pctx.SourcePathVariable("ShellTestConfigTemplate", "build/make/core/shell_test_config_template.xml") pctx.SourcePathVariable("EmptyTestConfig", "build/make/core/empty_test_config.xml") } diff --git a/tradefed/makevars.go b/tradefed/makevars.go index d4cf7a86c..f9682e448 100644 --- a/tradefed/makevars.go +++ b/tradefed/makevars.go @@ -33,6 +33,7 @@ func makeVarsProvider(ctx android.MakeVarsContext) { ctx.Strict("PYTHON_BINARY_HOST_TEST_CONFIG_TEMPLATE", "${PythonBinaryHostTestConfigTemplate}") ctx.Strict("RUST_DEVICE_TEST_CONFIG_TEMPLATE", "${RustDeviceTestConfigTemplate}") ctx.Strict("RUST_HOST_TEST_CONFIG_TEMPLATE", "${RustHostTestConfigTemplate}") + ctx.Strict("SHELL_TEST_CONFIG_TEMPLATE", "${ShellTestConfigTemplate}") ctx.Strict("EMPTY_TEST_CONFIG", "${EmptyTestConfig}") } |