Add `data_libs` property to cc_test rules
This allows dependencies on link:shared variant of library modules, and adds the shared libraries adjacent to the test binary Test: Manually verified on bionic-unit-tests target Change-Id: I5d406bf9428664c5ac3d3c5915507b750375debb
This commit is contained in:
parent
0eeff82c98
commit
79d66a5db7
8
cc/cc.go
8
cc/cc.go
|
@ -96,6 +96,9 @@ type Deps struct {
|
||||||
HeaderLibs []string
|
HeaderLibs []string
|
||||||
RuntimeLibs []string
|
RuntimeLibs []string
|
||||||
|
|
||||||
|
// Used for data dependencies adjacent to tests
|
||||||
|
DataLibs []string
|
||||||
|
|
||||||
StaticUnwinderIfLegacy bool
|
StaticUnwinderIfLegacy bool
|
||||||
|
|
||||||
ReexportSharedLibHeaders, ReexportStaticLibHeaders, ReexportHeaderLibHeaders []string
|
ReexportSharedLibHeaders, ReexportStaticLibHeaders, ReexportHeaderLibHeaders []string
|
||||||
|
@ -423,6 +426,7 @@ type xref interface {
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
dataLibDepTag = DependencyTag{Name: "data_lib", Library: true, Shared: true}
|
||||||
sharedExportDepTag = DependencyTag{Name: "shared", Library: true, Shared: true, ReexportFlags: true}
|
sharedExportDepTag = DependencyTag{Name: "shared", Library: true, Shared: true, ReexportFlags: true}
|
||||||
earlySharedDepTag = DependencyTag{Name: "early_shared", Library: true, Shared: true}
|
earlySharedDepTag = DependencyTag{Name: "early_shared", Library: true, Shared: true}
|
||||||
lateSharedDepTag = DependencyTag{Name: "late shared", Library: true, Shared: true}
|
lateSharedDepTag = DependencyTag{Name: "late shared", Library: true, Shared: true}
|
||||||
|
@ -1980,6 +1984,10 @@ func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
|
||||||
addSharedLibDependencies(lateSharedDepTag, lib, "")
|
addSharedLibDependencies(lateSharedDepTag, lib, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
actx.AddVariationDependencies([]blueprint.Variation{
|
||||||
|
{Mutator: "link", Variation: "shared"},
|
||||||
|
}, dataLibDepTag, deps.DataLibs...)
|
||||||
|
|
||||||
actx.AddVariationDependencies([]blueprint.Variation{
|
actx.AddVariationDependencies([]blueprint.Variation{
|
||||||
{Mutator: "link", Variation: "shared"},
|
{Mutator: "link", Variation: "shared"},
|
||||||
}, runtimeDepTag, deps.RuntimeLibs...)
|
}, runtimeDepTag, deps.RuntimeLibs...)
|
||||||
|
|
|
@ -526,6 +526,56 @@ func TestVndkUsingCoreVariant(t *testing.T) {
|
||||||
checkVndkLibrariesOutput(t, ctx, "vndkcorevariant.libraries.txt", []string{"libc++.so", "libvndk2.so", "libvndk_sp.so"})
|
checkVndkLibrariesOutput(t, ctx, "vndkcorevariant.libraries.txt", []string{"libc++.so", "libvndk2.so", "libvndk_sp.so"})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestDataLibs(t *testing.T) {
|
||||||
|
bp := `
|
||||||
|
cc_test_library {
|
||||||
|
name: "test_lib",
|
||||||
|
srcs: ["test_lib.cpp"],
|
||||||
|
gtest: false,
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_test {
|
||||||
|
name: "main_test",
|
||||||
|
data_libs: ["test_lib"],
|
||||||
|
gtest: false,
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
config := TestConfig(buildDir, android.Android, nil, bp, nil)
|
||||||
|
config.TestProductVariables.DeviceVndkVersion = StringPtr("current")
|
||||||
|
config.TestProductVariables.Platform_vndk_version = StringPtr("VER")
|
||||||
|
config.TestProductVariables.VndkUseCoreVariant = BoolPtr(true)
|
||||||
|
|
||||||
|
ctx := testCcWithConfig(t, config)
|
||||||
|
module := ctx.ModuleForTests("main_test", "android_arm_armv7-a-neon").Module()
|
||||||
|
testBinary := module.(*Module).linker.(*testBinary)
|
||||||
|
outputFiles, err := module.(android.OutputFileProducer).OutputFiles("")
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Expected cc_test to produce output files, error: %s", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if len(outputFiles) != 1 {
|
||||||
|
t.Errorf("expected exactly one output file. output files: [%s]", outputFiles)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if len(testBinary.dataPaths()) != 1 {
|
||||||
|
t.Errorf("expected exactly one test data file. test data files: [%s]", testBinary.dataPaths())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
outputPath := outputFiles[0].String()
|
||||||
|
testBinaryPath := testBinary.dataPaths()[0].String()
|
||||||
|
|
||||||
|
if !strings.HasSuffix(outputPath, "/main_test") {
|
||||||
|
t.Errorf("expected test output file to be 'main_test', but was '%s'", outputPath)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !strings.HasSuffix(testBinaryPath, "/test_lib.so") {
|
||||||
|
t.Errorf("expected test data file to be 'test_lib.so', but was '%s'", testBinaryPath)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestVndkWhenVndkVersionIsNotSet(t *testing.T) {
|
func TestVndkWhenVndkVersionIsNotSet(t *testing.T) {
|
||||||
ctx := testCcNoVndk(t, `
|
ctx := testCcNoVndk(t, `
|
||||||
cc_library {
|
cc_library {
|
||||||
|
|
20
cc/test.go
20
cc/test.go
|
@ -58,6 +58,9 @@ type TestBinaryProperties struct {
|
||||||
// the test
|
// the test
|
||||||
Data []string `android:"path,arch_variant"`
|
Data []string `android:"path,arch_variant"`
|
||||||
|
|
||||||
|
// list of shared library modules that should be installed alongside the test
|
||||||
|
Data_libs []string `android:"arch_variant"`
|
||||||
|
|
||||||
// list of compatibility suites (for example "cts", "vts") that the module should be
|
// list of compatibility suites (for example "cts", "vts") that the module should be
|
||||||
// installed into.
|
// installed into.
|
||||||
Test_suites []string `android:"arch_variant"`
|
Test_suites []string `android:"arch_variant"`
|
||||||
|
@ -325,6 +328,7 @@ func (test *testBinary) linkerInit(ctx BaseModuleContext) {
|
||||||
func (test *testBinary) linkerDeps(ctx DepsContext, deps Deps) Deps {
|
func (test *testBinary) linkerDeps(ctx DepsContext, deps Deps) Deps {
|
||||||
deps = test.testDecorator.linkerDeps(ctx, deps)
|
deps = test.testDecorator.linkerDeps(ctx, deps)
|
||||||
deps = test.binaryDecorator.linkerDeps(ctx, deps)
|
deps = test.binaryDecorator.linkerDeps(ctx, deps)
|
||||||
|
deps.DataLibs = append(deps.DataLibs, test.Properties.Data_libs...)
|
||||||
return deps
|
return deps
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -336,6 +340,21 @@ func (test *testBinary) linkerFlags(ctx ModuleContext, flags Flags) Flags {
|
||||||
|
|
||||||
func (test *testBinary) install(ctx ModuleContext, file android.Path) {
|
func (test *testBinary) install(ctx ModuleContext, file android.Path) {
|
||||||
test.data = android.PathsForModuleSrc(ctx, test.Properties.Data)
|
test.data = android.PathsForModuleSrc(ctx, test.Properties.Data)
|
||||||
|
|
||||||
|
ctx.VisitDirectDepsWithTag(dataLibDepTag, func(dep android.Module) {
|
||||||
|
depName := ctx.OtherModuleName(dep)
|
||||||
|
ccDep, ok := dep.(LinkableInterface)
|
||||||
|
|
||||||
|
if !ok {
|
||||||
|
ctx.ModuleErrorf("data_lib %q is not a linkable cc module", depName)
|
||||||
|
}
|
||||||
|
if ccDep.OutputFile().Valid() {
|
||||||
|
test.data = append(test.data, ccDep.OutputFile().Path())
|
||||||
|
} else {
|
||||||
|
ctx.ModuleErrorf("data_lib %q has no output file", depName)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
var api_level_prop string
|
var api_level_prop string
|
||||||
var configs []tradefed.Config
|
var configs []tradefed.Config
|
||||||
var min_level string
|
var min_level string
|
||||||
|
@ -507,6 +526,7 @@ func (benchmark *benchmarkDecorator) linkerDeps(ctx DepsContext, deps Deps) Deps
|
||||||
|
|
||||||
func (benchmark *benchmarkDecorator) install(ctx ModuleContext, file android.Path) {
|
func (benchmark *benchmarkDecorator) install(ctx ModuleContext, file android.Path) {
|
||||||
benchmark.data = android.PathsForModuleSrc(ctx, benchmark.Properties.Data)
|
benchmark.data = android.PathsForModuleSrc(ctx, benchmark.Properties.Data)
|
||||||
|
|
||||||
var configs []tradefed.Config
|
var configs []tradefed.Config
|
||||||
if Bool(benchmark.Properties.Require_root) {
|
if Bool(benchmark.Properties.Require_root) {
|
||||||
configs = append(configs, tradefed.Object{"target_preparer", "com.android.tradefed.targetprep.RootTargetPreparer", nil})
|
configs = append(configs, tradefed.Object{"target_preparer", "com.android.tradefed.targetprep.RootTargetPreparer", nil})
|
||||||
|
|
|
@ -500,6 +500,7 @@ func CreateTestContext() *android.TestContext {
|
||||||
ctx := android.NewTestArchContext()
|
ctx := android.NewTestArchContext()
|
||||||
ctx.RegisterModuleType("cc_fuzz", FuzzFactory)
|
ctx.RegisterModuleType("cc_fuzz", FuzzFactory)
|
||||||
ctx.RegisterModuleType("cc_test", TestFactory)
|
ctx.RegisterModuleType("cc_test", TestFactory)
|
||||||
|
ctx.RegisterModuleType("cc_test_library", TestLibraryFactory)
|
||||||
ctx.RegisterModuleType("llndk_headers", llndkHeadersFactory)
|
ctx.RegisterModuleType("llndk_headers", llndkHeadersFactory)
|
||||||
ctx.RegisterModuleType("vendor_public_library", vendorPublicLibraryFactory)
|
ctx.RegisterModuleType("vendor_public_library", vendorPublicLibraryFactory)
|
||||||
ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
|
ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
|
||||||
|
|
Loading…
Reference in New Issue