Files
build_soong/cc/sabi.go
Jayant Chowdhary a4fce191ba Dump abi for vendor variants of VNDK libraries.
Currently, abi is dumped for platform variants of system libraries.
Dump them for vendor variants since they are the ones which need to be abi
stable on security updates. This also ties abi dumping to BOARD_VNDK_VERSION.

Test: For libfoo:
	1) Added a source file with a dummy function for the core
	   variant.
	2) Excluded the source file from the vendor variant.
	3) BOARD_VNDK_VERSION=current mm -j64 produces libfoo.so.lsdump with no
	   dummy_function since the source file was not included in the vendor
	   variant.

Test: Inspected build.ninja and confirmed that all of a library's abi
dump dependencies (.sdump files are dependencies of the final .lsdump files) are
from vendor variants.

Change-Id: Ie0bf91fcd81606c131845d9872261166b5db72aa
2017-09-11 17:36:46 -07:00

98 lines
2.8 KiB
Go

// 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 (
"strings"
"github.com/google/blueprint"
"android/soong/android"
"android/soong/cc/config"
)
type SAbiProperties struct {
CreateSAbiDumps bool `blueprint:"mutated"`
ReexportedIncludeFlags []string
}
type sabi struct {
Properties SAbiProperties
}
func (sabimod *sabi) props() []interface{} {
return []interface{}{&sabimod.Properties}
}
func (sabimod *sabi) begin(ctx BaseModuleContext) {}
func (sabimod *sabi) deps(ctx BaseModuleContext, deps Deps) Deps {
return deps
}
func inListWithPrefixSearch(flag string, filter []string) bool {
// Assuming the filter is small enough.
// If the suffix of a filter element is *, try matching prefixes as well.
for _, f := range filter {
if (f == flag) || (strings.HasSuffix(f, "*") && strings.HasPrefix(flag, strings.TrimSuffix(f, "*"))) {
return true
}
}
return false
}
func filterOutWithPrefix(list []string, filter []string) (remainder []string) {
// Go through the filter, matching and optionally doing a prefix search for list elements.
for _, l := range list {
if !inListWithPrefixSearch(l, filter) {
remainder = append(remainder, l)
}
}
return
}
func (sabimod *sabi) flags(ctx ModuleContext, flags Flags) Flags {
// Assuming that the cflags which clang LibTooling tools cannot
// understand have not been converted to ninja variables yet.
flags.ToolingCFlags = filterOutWithPrefix(flags.CFlags, config.ClangLibToolingUnknownCflags)
// RSClang does not support recent mcpu option likes exynos-m2.
// So we need overriding mcpu option when we want to use it.
if ctx.Arch().CpuVariant == "exynos-m2" {
flags.ToolingCFlags = append(flags.ToolingCFlags, "-mcpu=cortex-a53")
}
return flags
}
func sabiDepsMutator(mctx android.TopDownMutatorContext) {
if c, ok := mctx.Module().(*Module); ok &&
((c.isVndk() && c.vndk()) || inList(c.Name(), llndkLibraries) ||
(c.sabi != nil && c.sabi.Properties.CreateSAbiDumps)) {
mctx.VisitDirectDeps(func(m blueprint.Module) {
tag := mctx.OtherModuleDependencyTag(m)
switch tag {
case staticDepTag, staticExportDepTag, lateStaticDepTag, wholeStaticDepTag:
cc, _ := m.(*Module)
if cc == nil {
return
}
cc.sabi.Properties.CreateSAbiDumps = true
}
})
}
}