platform_build_soong/cc/object_test.go
Yi-Yo Chiang 88960aa827 cc: Vendor modules should NOT derive its "SDK" level from VNDK
Although vendor modules can be built bundled, they are technially not
part of the "platform", as it cannot access platform libraries (system
partition) directly.
They can only link to a restricted set of platform libraries (LLNDK),
and access restricted set of APIs.
We used to derive the LLNDK API level from the VNDK version. However
after VNDK deprecation, there is no "VNDK version" anymore.
Instead we would just derive the value from platform SDK version:
* If building an in-development build, build vendor modules against the
  in-development "current" API level.
* If building a REL / Final build, vendor should target the latest
  stable API.

Bug: 320423828
Test: go test
Test: presubmit
Test: build and boot
Change-Id: I2c5ef6530e9046b2dcc282bc1f020d8a505eab15
2024-01-23 12:43:38 +08:00

154 lines
3.8 KiB
Go

// Copyright 2019 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 (
"fmt"
"testing"
"android/soong/android"
)
func TestMinSdkVersionsOfCrtObjects(t *testing.T) {
bp := `
cc_object {
name: "crt_foo",
srcs: ["foo.c"],
crt: true,
stl: "none",
min_sdk_version: "28",
vendor_available: true,
}
`
variants := []struct {
variant string
num string
}{
{"android_arm64_armv8-a", "10000"},
{"android_arm64_armv8-a_sdk_28", "28"},
{"android_arm64_armv8-a_sdk_29", "29"},
{"android_arm64_armv8-a_sdk_30", "30"},
{"android_arm64_armv8-a_sdk_current", "10000"},
{"android_vendor.29_arm64_armv8-a", "29"},
}
ctx := prepareForCcTest.RunTestWithBp(t, bp)
for _, v := range variants {
cflags := ctx.ModuleForTests("crt_foo", v.variant).Rule("cc").Args["cFlags"]
expected := "-target aarch64-linux-android" + v.num + " "
android.AssertStringDoesContain(t, "cflag", cflags, expected)
}
ctx = prepareForCcTestWithoutVndk.RunTestWithBp(t, bp)
android.AssertStringDoesContain(t, "cflag",
ctx.ModuleForTests("crt_foo", "android_vendor_arm64_armv8-a").Rule("cc").Args["cFlags"],
"-target aarch64-linux-android10000 ")
}
func TestUseCrtObjectOfCorrectVersion(t *testing.T) {
ctx := testCc(t, `
cc_binary {
name: "bin",
srcs: ["foo.c"],
stl: "none",
min_sdk_version: "29",
sdk_version: "current",
}
`)
// Sdk variant uses the crt object of the matching min_sdk_version
variant := "android_arm64_armv8-a_sdk"
crt := ctx.ModuleForTests("bin", variant).Rule("ld").Args["crtBegin"]
android.AssertStringDoesContain(t, "crt dep of sdk variant", crt,
"29/crtbegin_dynamic.o")
// platform variant uses the crt object built for platform
variant = "android_arm64_armv8-a"
crt = ctx.ModuleForTests("bin", variant).Rule("ld").Args["crtBegin"]
android.AssertStringDoesContain(t, "crt dep of platform variant", crt,
variant+"/crtbegin_dynamic.o")
}
func TestLinkerScript(t *testing.T) {
t.Run("script", func(t *testing.T) {
testCc(t, `
cc_object {
name: "foo",
srcs: ["baz.o"],
linker_script: "foo.lds",
}`)
})
}
func TestCcObjectOutputFile(t *testing.T) {
testcases := []struct {
name string
moduleName string
bp string
}{
{
name: "normal",
moduleName: "foo",
bp: `
srcs: ["bar.c"],
`,
},
{
name: "suffix",
moduleName: "foo.o",
bp: `
srcs: ["bar.c"],
`,
},
{
name: "keep symbols",
moduleName: "foo",
bp: `
srcs: ["bar.c"],
prefix_symbols: "foo_",
`,
},
{
name: "partial linking",
moduleName: "foo",
bp: `
srcs: ["bar.c", "baz.c"],
`,
},
{
name: "partial linking and prefix symbols",
moduleName: "foo",
bp: `
srcs: ["bar.c", "baz.c"],
prefix_symbols: "foo_",
`,
},
}
for _, testcase := range testcases {
bp := fmt.Sprintf(`
cc_object {
name: "%s",
%s
}
`, testcase.moduleName, testcase.bp)
t.Run(testcase.name, func(t *testing.T) {
ctx := PrepareForIntegrationTestWithCc.RunTestWithBp(t, bp)
android.AssertPathRelativeToTopEquals(t, "expected output file foo.o",
fmt.Sprintf("out/soong/.intermediates/%s/android_arm64_armv8-a/foo.o", testcase.moduleName),
ctx.ModuleForTests(testcase.moduleName, "android_arm64_armv8-a").Output("foo.o").Output)
})
}
}