blob: 5f9d88306d924b6c35dd299c365dfcf1698cd082 [file]
// 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 cc
import (
"fmt"
"runtime"
"slices"
"strings"
"testing"
"android/soong/android"
)
func TestBinaryLinkerScripts(t *testing.T) {
t.Parallel()
result := PrepareForIntegrationTestWithCc.RunTestWithBp(t, `
cc_binary {
name: "foo",
srcs: ["foo.cc"],
linker_scripts: ["foo.ld", "bar.ld"],
}`)
binFoo := result.ModuleForTests(t, "foo", "android_arm64_armv8-a").Rule("ld")
android.AssertStringListContains(t, "missing dependency on linker_scripts",
binFoo.Implicits.Strings(), "foo.ld")
android.AssertStringListContains(t, "missing dependency on linker_scripts",
binFoo.Implicits.Strings(), "bar.ld")
android.AssertStringDoesContain(t, "missing flag for linker_scripts",
binFoo.Args["ldFlags"], "-Wl,--script,foo.ld")
android.AssertStringDoesContain(t, "missing flag for linker_scripts",
binFoo.Args["ldFlags"], "-Wl,--script,bar.ld")
}
func TestBinaryLibs(t *testing.T) {
t.Parallel()
bp := `
cc_binary_host {
name: "foo",
srcs: ["foo.cc"],
static_libs: ["libstatic"],
shared_libs: ["libshared"],
system_shared_libs: ["libsystem"],
static: {
static_libs: ["libstatic_static"],
},
shared: {
static_libs: ["libstatic_shared"],
shared_libs: ["libshared_shared"],
},
stl: "none",
}
`
libs := []string{"libstatic", "libshared", "libstatic_static", "libshared_static", "libstatic_shared", "libshared_shared", "libsystem"}
for _, lib := range libs {
bp += fmt.Sprintf(`cc_library { name: "%s", host_supported: true }`+"\n", lib)
}
testCases := []struct {
name string
preparer android.FixturePreparer
linuxOnly bool
static []string
shared []string
}{
{
name: "normal",
preparer: nil,
static: []string{"libstatic", "libstatic_shared"},
shared: []string{"libshared", "libshared_shared", "libsystem"},
},
{
name: "BUILD_HOST_static=1",
preparer: android.FixtureModifyConfig(func(config android.Config) {
config.TestProductVariables.HostStaticBinaries = BoolPtr(true)
}),
linuxOnly: true,
static: []string{"libstatic", "libstatic_static", "libsystem"},
shared: nil,
},
}
for _, testCase := range testCases {
t.Run(testCase.name, func(t *testing.T) {
if testCase.linuxOnly && runtime.GOOS != "linux" {
t.Skip("test only supported on linux")
}
result := android.GroupFixturePreparers(
PrepareForIntegrationTestWithCc,
android.OptionalFixturePreparer(testCase.preparer),
).RunTestWithBp(t, bp)
binFoo := result.ModuleForTests(t, "foo", result.Config.BuildOSTarget.String()).Rule("ld")
var binFooSharedLibs []string
var binFooStaticLibs []string
for _, dep := range binFoo.Implicits {
if strings.HasSuffix(dep.Base(), ".so.toc") {
binFooSharedLibs = append(binFooSharedLibs, strings.TrimSuffix(dep.Base(), ".so.toc"))
}
if strings.HasSuffix(dep.Base(), ".dylib.toc") {
binFooSharedLibs = append(binFooSharedLibs, strings.TrimSuffix(dep.Base(), ".dylib.toc"))
}
if strings.HasSuffix(dep.Base(), ".a") {
binFooStaticLibs = append(binFooStaticLibs, strings.TrimSuffix(dep.Base(), ".a"))
}
}
if g, w := binFooSharedLibs, testCase.shared; !slices.Equal(g, w) {
t.Errorf("incorrect shared libs, expected %q got %q", w, g)
}
if g, w := binFooStaticLibs, testCase.static; !slices.Equal(g, w) {
t.Errorf("incorrect static libs, expected %q got %q", w, g)
}
})
}
}