123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590 |
- // Copyright 2017 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 cc
- import (
- "reflect"
- "testing"
- "android/soong/android"
- "android/soong/bazel/cquery"
- )
- func TestLibraryReuse(t *testing.T) {
- t.Parallel()
- t.Run("simple", func(t *testing.T) {
- ctx := testCc(t, `
- cc_library {
- name: "libfoo",
- srcs: ["foo.c", "baz.o"],
- }`)
- libfooShared := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_shared").Rule("ld")
- libfooStatic := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_static").Output("libfoo.a")
- if len(libfooShared.Inputs) != 2 {
- t.Fatalf("unexpected inputs to libfoo shared: %#v", libfooShared.Inputs.Strings())
- }
- if len(libfooStatic.Inputs) != 2 {
- t.Fatalf("unexpected inputs to libfoo static: %#v", libfooStatic.Inputs.Strings())
- }
- if libfooShared.Inputs[0] != libfooStatic.Inputs[0] {
- t.Errorf("static object not reused for shared library")
- }
- if libfooShared.Inputs[1] != libfooStatic.Inputs[1] {
- t.Errorf("static object not reused for shared library")
- }
- })
- t.Run("extra static source", func(t *testing.T) {
- ctx := testCc(t, `
- cc_library {
- name: "libfoo",
- srcs: ["foo.c"],
- static: {
- srcs: ["bar.c"]
- },
- }`)
- libfooShared := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_shared").Rule("ld")
- libfooStatic := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_static").Output("libfoo.a")
- if len(libfooShared.Inputs) != 1 {
- t.Fatalf("unexpected inputs to libfoo shared: %#v", libfooShared.Inputs.Strings())
- }
- if len(libfooStatic.Inputs) != 2 {
- t.Fatalf("unexpected inputs to libfoo static: %#v", libfooStatic.Inputs.Strings())
- }
- if libfooShared.Inputs[0] != libfooStatic.Inputs[0] {
- t.Errorf("static object not reused for shared library")
- }
- })
- t.Run("extra shared source", func(t *testing.T) {
- ctx := testCc(t, `
- cc_library {
- name: "libfoo",
- srcs: ["foo.c"],
- shared: {
- srcs: ["bar.c"]
- },
- }`)
- libfooShared := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_shared").Rule("ld")
- libfooStatic := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_static").Output("libfoo.a")
- if len(libfooShared.Inputs) != 2 {
- t.Fatalf("unexpected inputs to libfoo shared: %#v", libfooShared.Inputs.Strings())
- }
- if len(libfooStatic.Inputs) != 1 {
- t.Fatalf("unexpected inputs to libfoo static: %#v", libfooStatic.Inputs.Strings())
- }
- if libfooShared.Inputs[0] != libfooStatic.Inputs[0] {
- t.Errorf("static object not reused for shared library")
- }
- })
- t.Run("extra static cflags", func(t *testing.T) {
- ctx := testCc(t, `
- cc_library {
- name: "libfoo",
- srcs: ["foo.c"],
- static: {
- cflags: ["-DFOO"],
- },
- }`)
- libfooShared := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_shared").Rule("ld")
- libfooStatic := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_static").Output("libfoo.a")
- if len(libfooShared.Inputs) != 1 {
- t.Fatalf("unexpected inputs to libfoo shared: %#v", libfooShared.Inputs.Strings())
- }
- if len(libfooStatic.Inputs) != 1 {
- t.Fatalf("unexpected inputs to libfoo static: %#v", libfooStatic.Inputs.Strings())
- }
- if libfooShared.Inputs[0] == libfooStatic.Inputs[0] {
- t.Errorf("static object reused for shared library when it shouldn't be")
- }
- })
- t.Run("extra shared cflags", func(t *testing.T) {
- ctx := testCc(t, `
- cc_library {
- name: "libfoo",
- srcs: ["foo.c"],
- shared: {
- cflags: ["-DFOO"],
- },
- }`)
- libfooShared := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_shared").Rule("ld")
- libfooStatic := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_static").Output("libfoo.a")
- if len(libfooShared.Inputs) != 1 {
- t.Fatalf("unexpected inputs to libfoo shared: %#v", libfooShared.Inputs.Strings())
- }
- if len(libfooStatic.Inputs) != 1 {
- t.Fatalf("unexpected inputs to libfoo static: %#v", libfooStatic.Inputs.Strings())
- }
- if libfooShared.Inputs[0] == libfooStatic.Inputs[0] {
- t.Errorf("static object reused for shared library when it shouldn't be")
- }
- })
- t.Run("global cflags for reused generated sources", func(t *testing.T) {
- ctx := testCc(t, `
- cc_library {
- name: "libfoo",
- srcs: [
- "foo.c",
- "a.proto",
- ],
- shared: {
- srcs: [
- "bar.c",
- ],
- },
- }`)
- libfooShared := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_shared").Rule("ld")
- libfooStatic := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_static").Output("libfoo.a")
- if len(libfooShared.Inputs) != 3 {
- t.Fatalf("unexpected inputs to libfoo shared: %#v", libfooShared.Inputs.Strings())
- }
- if len(libfooStatic.Inputs) != 2 {
- t.Fatalf("unexpected inputs to libfoo static: %#v", libfooStatic.Inputs.Strings())
- }
- if !reflect.DeepEqual(libfooShared.Inputs[0:2].Strings(), libfooStatic.Inputs.Strings()) {
- t.Errorf("static objects not reused for shared library")
- }
- libfoo := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_shared").Module().(*Module)
- if !inList("-DGOOGLE_PROTOBUF_NO_RTTI", libfoo.flags.Local.CFlags) {
- t.Errorf("missing protobuf cflags")
- }
- })
- }
- func TestStubsVersions(t *testing.T) {
- t.Parallel()
- bp := `
- cc_library {
- name: "libfoo",
- srcs: ["foo.c"],
- stubs: {
- versions: ["29", "R", "current"],
- },
- }
- `
- config := TestConfig(t.TempDir(), android.Android, nil, bp, nil)
- config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
- ctx := testCcWithConfig(t, config)
- variants := ctx.ModuleVariantsForTests("libfoo")
- for _, expectedVer := range []string{"29", "R", "current"} {
- expectedVariant := "android_arm_armv7-a-neon_shared_" + expectedVer
- if !inList(expectedVariant, variants) {
- t.Errorf("missing expected variant: %q", expectedVariant)
- }
- }
- }
- func TestStubsVersions_NotSorted(t *testing.T) {
- t.Parallel()
- bp := `
- cc_library {
- name: "libfoo",
- srcs: ["foo.c"],
- stubs: {
- versions: ["29", "current", "R"],
- },
- }
- `
- config := TestConfig(t.TempDir(), android.Android, nil, bp, nil)
- config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
- testCcErrorWithConfig(t, `"libfoo" .*: versions: not sorted`, config)
- }
- func TestStubsVersions_ParseError(t *testing.T) {
- t.Parallel()
- bp := `
- cc_library {
- name: "libfoo",
- srcs: ["foo.c"],
- stubs: {
- versions: ["29", "current", "X"],
- },
- }
- `
- testCcError(t, `"libfoo" .*: versions: "X" could not be parsed as an integer and is not a recognized codename`, bp)
- }
- func TestCcLibraryWithBazel(t *testing.T) {
- t.Parallel()
- bp := `
- cc_library {
- name: "foo",
- srcs: ["foo.cc"],
- bazel_module: { label: "//foo/bar:bar" },
- }`
- config := TestConfig(t.TempDir(), android.Android, nil, bp, nil)
- config.BazelContext = android.MockBazelContext{
- OutputBaseDir: "outputbase",
- LabelToCcInfo: map[string]cquery.CcInfo{
- "//foo/bar:bar": cquery.CcInfo{
- CcObjectFiles: []string{"foo.o"},
- Includes: []string{"include"},
- SystemIncludes: []string{"system_include"},
- Headers: []string{"foo.h"},
- RootDynamicLibraries: []string{"foo.so"},
- UnstrippedOutput: "foo_unstripped.so",
- },
- "//foo/bar:bar_bp2build_cc_library_static": cquery.CcInfo{
- CcObjectFiles: []string{"foo.o"},
- Includes: []string{"include"},
- SystemIncludes: []string{"system_include"},
- Headers: []string{"foo.h"},
- RootStaticArchives: []string{"foo.a"},
- },
- },
- }
- ctx := testCcWithConfig(t, config)
- staticFoo := ctx.ModuleForTests("foo", "android_arm_armv7-a-neon_static").Module()
- outputFiles, err := staticFoo.(android.OutputFileProducer).OutputFiles("")
- if err != nil {
- t.Errorf("Unexpected error getting cc_object outputfiles %s", err)
- }
- expectedOutputFiles := []string{"outputbase/execroot/__main__/foo.a"}
- android.AssertDeepEquals(t, "output files", expectedOutputFiles, outputFiles.Strings())
- flagExporter := ctx.ModuleProvider(staticFoo, FlagExporterInfoProvider).(FlagExporterInfo)
- android.AssertPathsRelativeToTopEquals(t, "exported include dirs", []string{"outputbase/execroot/__main__/include"}, flagExporter.IncludeDirs)
- android.AssertPathsRelativeToTopEquals(t, "exported system include dirs", []string{"outputbase/execroot/__main__/system_include"}, flagExporter.SystemIncludeDirs)
- android.AssertPathsRelativeToTopEquals(t, "exported headers", []string{"outputbase/execroot/__main__/foo.h"}, flagExporter.GeneratedHeaders)
- android.AssertPathsRelativeToTopEquals(t, "deps", []string{"outputbase/execroot/__main__/foo.h"}, flagExporter.Deps)
- sharedFoo := ctx.ModuleForTests("foo", "android_arm_armv7-a-neon_shared").Module()
- outputFiles, err = sharedFoo.(android.OutputFileProducer).OutputFiles("")
- if err != nil {
- t.Errorf("Unexpected error getting cc_library outputfiles %s", err)
- }
- expectedOutputFiles = []string{"outputbase/execroot/__main__/foo.so"}
- android.AssertDeepEquals(t, "output files", expectedOutputFiles, outputFiles.Strings())
- android.AssertStringEquals(t, "unstripped shared library", "outputbase/execroot/__main__/foo_unstripped.so", sharedFoo.(*Module).linker.unstrippedOutputFilePath().String())
- flagExporter = ctx.ModuleProvider(sharedFoo, FlagExporterInfoProvider).(FlagExporterInfo)
- android.AssertPathsRelativeToTopEquals(t, "exported include dirs", []string{"outputbase/execroot/__main__/include"}, flagExporter.IncludeDirs)
- android.AssertPathsRelativeToTopEquals(t, "exported system include dirs", []string{"outputbase/execroot/__main__/system_include"}, flagExporter.SystemIncludeDirs)
- android.AssertPathsRelativeToTopEquals(t, "exported headers", []string{"outputbase/execroot/__main__/foo.h"}, flagExporter.GeneratedHeaders)
- android.AssertPathsRelativeToTopEquals(t, "deps", []string{"outputbase/execroot/__main__/foo.h"}, flagExporter.Deps)
- }
- func TestCcLibraryWithBazelValidations(t *testing.T) {
- t.Parallel()
- bp := `
- cc_library {
- name: "foo",
- srcs: ["foo.cc"],
- bazel_module: { label: "//foo/bar:bar" },
- tidy: true,
- }`
- config := TestConfig(t.TempDir(), android.Android, nil, bp, nil)
- config.BazelContext = android.MockBazelContext{
- OutputBaseDir: "outputbase",
- LabelToCcInfo: map[string]cquery.CcInfo{
- "//foo/bar:bar": cquery.CcInfo{
- CcObjectFiles: []string{"foo.o"},
- Includes: []string{"include"},
- SystemIncludes: []string{"system_include"},
- Headers: []string{"foo.h"},
- RootDynamicLibraries: []string{"foo.so"},
- UnstrippedOutput: "foo_unstripped.so",
- },
- "//foo/bar:bar_bp2build_cc_library_static": cquery.CcInfo{
- CcObjectFiles: []string{"foo.o"},
- Includes: []string{"include"},
- SystemIncludes: []string{"system_include"},
- Headers: []string{"foo.h"},
- RootStaticArchives: []string{"foo.a"},
- TidyFiles: []string{"foo.c.tidy"},
- },
- },
- }
- ctx := android.GroupFixturePreparers(
- prepareForCcTest,
- android.FixtureMergeEnv(map[string]string{
- "ALLOW_LOCAL_TIDY_TRUE": "1",
- }),
- ).RunTestWithConfig(t, config).TestContext
- staticFoo := ctx.ModuleForTests("foo", "android_arm_armv7-a-neon_static").Module()
- outputFiles, err := staticFoo.(android.OutputFileProducer).OutputFiles("")
- if err != nil {
- t.Errorf("Unexpected error getting cc_object outputfiles %s", err)
- }
- expectedOutputFiles := []string{"out/soong/.intermediates/foo/android_arm_armv7-a-neon_static/validated/foo.a"}
- android.AssertPathsRelativeToTopEquals(t, "output files", expectedOutputFiles, outputFiles)
- flagExporter := ctx.ModuleProvider(staticFoo, FlagExporterInfoProvider).(FlagExporterInfo)
- android.AssertPathsRelativeToTopEquals(t, "exported include dirs", []string{"outputbase/execroot/__main__/include"}, flagExporter.IncludeDirs)
- android.AssertPathsRelativeToTopEquals(t, "exported system include dirs", []string{"outputbase/execroot/__main__/system_include"}, flagExporter.SystemIncludeDirs)
- android.AssertPathsRelativeToTopEquals(t, "exported headers", []string{"outputbase/execroot/__main__/foo.h"}, flagExporter.GeneratedHeaders)
- android.AssertPathsRelativeToTopEquals(t, "deps", []string{"outputbase/execroot/__main__/foo.h"}, flagExporter.Deps)
- sharedFoo := ctx.ModuleForTests("foo", "android_arm_armv7-a-neon_shared").Module()
- outputFiles, err = sharedFoo.(android.OutputFileProducer).OutputFiles("")
- if err != nil {
- t.Errorf("Unexpected error getting cc_library outputfiles %s", err)
- }
- expectedOutputFiles = []string{"outputbase/execroot/__main__/foo.so"}
- android.AssertDeepEquals(t, "output files", expectedOutputFiles, outputFiles.Strings())
- android.AssertStringEquals(t, "unstripped shared library", "outputbase/execroot/__main__/foo_unstripped.so", sharedFoo.(*Module).linker.unstrippedOutputFilePath().String())
- flagExporter = ctx.ModuleProvider(sharedFoo, FlagExporterInfoProvider).(FlagExporterInfo)
- android.AssertPathsRelativeToTopEquals(t, "exported include dirs", []string{"outputbase/execroot/__main__/include"}, flagExporter.IncludeDirs)
- android.AssertPathsRelativeToTopEquals(t, "exported system include dirs", []string{"outputbase/execroot/__main__/system_include"}, flagExporter.SystemIncludeDirs)
- android.AssertPathsRelativeToTopEquals(t, "exported headers", []string{"outputbase/execroot/__main__/foo.h"}, flagExporter.GeneratedHeaders)
- android.AssertPathsRelativeToTopEquals(t, "deps", []string{"outputbase/execroot/__main__/foo.h"}, flagExporter.Deps)
- }
- func TestLibraryVersionScript(t *testing.T) {
- t.Parallel()
- result := PrepareForIntegrationTestWithCc.RunTestWithBp(t, `
- cc_library {
- name: "libfoo",
- srcs: ["foo.c"],
- version_script: "foo.map.txt",
- }`)
- libfoo := result.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Rule("ld")
- android.AssertStringListContains(t, "missing dependency on version_script",
- libfoo.Implicits.Strings(), "foo.map.txt")
- android.AssertStringDoesContain(t, "missing flag for version_script",
- libfoo.Args["ldFlags"], "-Wl,--version-script,foo.map.txt")
- }
- func TestLibraryDynamicList(t *testing.T) {
- t.Parallel()
- result := PrepareForIntegrationTestWithCc.RunTestWithBp(t, `
- cc_library {
- name: "libfoo",
- srcs: ["foo.c"],
- dynamic_list: "foo.dynamic.txt",
- }`)
- libfoo := result.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Rule("ld")
- android.AssertStringListContains(t, "missing dependency on dynamic_list",
- libfoo.Implicits.Strings(), "foo.dynamic.txt")
- android.AssertStringDoesContain(t, "missing flag for dynamic_list",
- libfoo.Args["ldFlags"], "-Wl,--dynamic-list,foo.dynamic.txt")
- }
- func TestCcLibrarySharedWithBazelValidations(t *testing.T) {
- t.Parallel()
- bp := `
- cc_library_shared {
- name: "foo",
- srcs: ["foo.cc"],
- bazel_module: { label: "//foo/bar:bar" },
- tidy: true,
- }`
- config := TestConfig(t.TempDir(), android.Android, nil, bp, nil)
- config.BazelContext = android.MockBazelContext{
- OutputBaseDir: "outputbase",
- LabelToCcInfo: map[string]cquery.CcInfo{
- "//foo/bar:bar": cquery.CcInfo{
- CcObjectFiles: []string{"foo.o"},
- Includes: []string{"include"},
- SystemIncludes: []string{"system_include"},
- RootDynamicLibraries: []string{"foo.so"},
- TocFile: "foo.so.toc",
- TidyFiles: []string{"foo.c.tidy"},
- },
- },
- }
- ctx := android.GroupFixturePreparers(
- prepareForCcTest,
- android.FixtureMergeEnv(map[string]string{
- "ALLOW_LOCAL_TIDY_TRUE": "1",
- }),
- ).RunTestWithConfig(t, config).TestContext
- sharedFoo := ctx.ModuleForTests("foo", "android_arm_armv7-a-neon_shared").Module()
- producer := sharedFoo.(android.OutputFileProducer)
- outputFiles, err := producer.OutputFiles("")
- if err != nil {
- t.Errorf("Unexpected error getting cc_object outputfiles %s", err)
- }
- expectedOutputFiles := []string{"out/soong/.intermediates/foo/android_arm_armv7-a-neon_shared/validated/foo.so"}
- android.AssertPathsRelativeToTopEquals(t, "output files", expectedOutputFiles, outputFiles)
- tocFilePath := sharedFoo.(*Module).Toc()
- if !tocFilePath.Valid() {
- t.Errorf("Invalid tocFilePath: %s", tocFilePath)
- }
- tocFile := tocFilePath.Path()
- expectedToc := "outputbase/execroot/__main__/foo.so.toc"
- android.AssertStringEquals(t, "toc file", expectedToc, tocFile.String())
- entries := android.AndroidMkEntriesForTest(t, ctx, sharedFoo)[0]
- expectedFlags := []string{"-Ioutputbase/execroot/__main__/include", "-isystem outputbase/execroot/__main__/system_include"}
- gotFlags := entries.EntryMap["LOCAL_EXPORT_CFLAGS"]
- android.AssertDeepEquals(t, "androidmk exported cflags", expectedFlags, gotFlags)
- android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "cc_library_shared", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
- }
- func TestCcLibrarySharedWithBazel(t *testing.T) {
- t.Parallel()
- bp := `
- cc_library_shared {
- name: "foo",
- srcs: ["foo.cc"],
- bazel_module: { label: "//foo/bar:bar" },
- }`
- config := TestConfig(t.TempDir(), android.Android, nil, bp, nil)
- config.BazelContext = android.MockBazelContext{
- OutputBaseDir: "outputbase",
- LabelToCcInfo: map[string]cquery.CcInfo{
- "//foo/bar:bar": cquery.CcInfo{
- CcObjectFiles: []string{"foo.o"},
- Includes: []string{"include"},
- SystemIncludes: []string{"system_include"},
- RootDynamicLibraries: []string{"foo.so"},
- TocFile: "foo.so.toc",
- },
- },
- }
- ctx := testCcWithConfig(t, config)
- sharedFoo := ctx.ModuleForTests("foo", "android_arm_armv7-a-neon_shared").Module()
- producer := sharedFoo.(android.OutputFileProducer)
- outputFiles, err := producer.OutputFiles("")
- if err != nil {
- t.Errorf("Unexpected error getting cc_object outputfiles %s", err)
- }
- expectedOutputFiles := []string{"outputbase/execroot/__main__/foo.so"}
- android.AssertDeepEquals(t, "output files", expectedOutputFiles, outputFiles.Strings())
- tocFilePath := sharedFoo.(*Module).Toc()
- if !tocFilePath.Valid() {
- t.Errorf("Invalid tocFilePath: %s", tocFilePath)
- }
- tocFile := tocFilePath.Path()
- expectedToc := "outputbase/execroot/__main__/foo.so.toc"
- android.AssertStringEquals(t, "toc file", expectedToc, tocFile.String())
- entries := android.AndroidMkEntriesForTest(t, ctx, sharedFoo)[0]
- expectedFlags := []string{"-Ioutputbase/execroot/__main__/include", "-isystem outputbase/execroot/__main__/system_include"}
- gotFlags := entries.EntryMap["LOCAL_EXPORT_CFLAGS"]
- android.AssertDeepEquals(t, "androidmk exported cflags", expectedFlags, gotFlags)
- android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "cc_library_shared", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
- }
- func TestWholeStaticLibPrebuilts(t *testing.T) {
- t.Parallel()
- result := PrepareForIntegrationTestWithCc.RunTestWithBp(t, `
- cc_prebuilt_library_static {
- name: "libprebuilt",
- srcs: ["foo.a"],
- }
- cc_library_static {
- name: "libdirect",
- whole_static_libs: ["libprebuilt"],
- }
- cc_library_static {
- name: "libtransitive",
- whole_static_libs: ["libdirect"],
- }
- cc_library_static {
- name: "libdirect_with_srcs",
- srcs: ["bar.c"],
- whole_static_libs: ["libprebuilt"],
- }
- cc_library_static {
- name: "libtransitive_with_srcs",
- srcs: ["baz.c"],
- whole_static_libs: ["libdirect_with_srcs"],
- }
- `)
- libdirect := result.ModuleForTests("libdirect", "android_arm64_armv8-a_static").Rule("arWithLibs")
- libtransitive := result.ModuleForTests("libtransitive", "android_arm64_armv8-a_static").Rule("arWithLibs")
- libdirectWithSrcs := result.ModuleForTests("libdirect_with_srcs", "android_arm64_armv8-a_static").Rule("arWithLibs")
- libtransitiveWithSrcs := result.ModuleForTests("libtransitive_with_srcs", "android_arm64_armv8-a_static").Rule("arWithLibs")
- barObj := result.ModuleForTests("libdirect_with_srcs", "android_arm64_armv8-a_static").Rule("cc")
- bazObj := result.ModuleForTests("libtransitive_with_srcs", "android_arm64_armv8-a_static").Rule("cc")
- android.AssertStringListContains(t, "missing dependency on foo.a",
- libdirect.Inputs.Strings(), "foo.a")
- android.AssertStringDoesContain(t, "missing flag for foo.a",
- libdirect.Args["arLibs"], "foo.a")
- android.AssertStringListContains(t, "missing dependency on foo.a",
- libtransitive.Inputs.Strings(), "foo.a")
- android.AssertStringDoesContain(t, "missing flag for foo.a",
- libtransitive.Args["arLibs"], "foo.a")
- android.AssertStringListContains(t, "missing dependency on foo.a",
- libdirectWithSrcs.Inputs.Strings(), "foo.a")
- android.AssertStringDoesContain(t, "missing flag for foo.a",
- libdirectWithSrcs.Args["arLibs"], "foo.a")
- android.AssertStringListContains(t, "missing dependency on bar.o",
- libdirectWithSrcs.Inputs.Strings(), barObj.Output.String())
- android.AssertStringDoesContain(t, "missing flag for bar.o",
- libdirectWithSrcs.Args["arObjs"], barObj.Output.String())
- android.AssertStringListContains(t, "missing dependency on foo.a",
- libtransitiveWithSrcs.Inputs.Strings(), "foo.a")
- android.AssertStringDoesContain(t, "missing flag for foo.a",
- libtransitiveWithSrcs.Args["arLibs"], "foo.a")
- android.AssertStringListContains(t, "missing dependency on bar.o",
- libtransitiveWithSrcs.Inputs.Strings(), barObj.Output.String())
- android.AssertStringDoesContain(t, "missing flag for bar.o",
- libtransitiveWithSrcs.Args["arObjs"], barObj.Output.String())
- android.AssertStringListContains(t, "missing dependency on baz.o",
- libtransitiveWithSrcs.Inputs.Strings(), bazObj.Output.String())
- android.AssertStringDoesContain(t, "missing flag for baz.o",
- libtransitiveWithSrcs.Args["arObjs"], bazObj.Output.String())
- }
|