1// Copyright 2017 Google Inc. All rights reserved. 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14 15package cc 16 17import ( 18 "strings" 19 "sync" 20 21 "android/soong/android" 22 "android/soong/cc/config" 23) 24 25var ( 26 lsdumpPaths []string 27 sabiLock sync.Mutex 28) 29 30type SAbiProperties struct { 31 CreateSAbiDumps bool `blueprint:"mutated"` 32 ReexportedIncludeFlags []string 33} 34 35type sabi struct { 36 Properties SAbiProperties 37} 38 39func (sabimod *sabi) props() []interface{} { 40 return []interface{}{&sabimod.Properties} 41} 42 43func (sabimod *sabi) begin(ctx BaseModuleContext) {} 44 45func (sabimod *sabi) deps(ctx BaseModuleContext, deps Deps) Deps { 46 return deps 47} 48 49func inListWithPrefixSearch(flag string, filter []string) bool { 50 // Assuming the filter is small enough. 51 // If the suffix of a filter element is *, try matching prefixes as well. 52 for _, f := range filter { 53 if (f == flag) || (strings.HasSuffix(f, "*") && strings.HasPrefix(flag, strings.TrimSuffix(f, "*"))) { 54 return true 55 } 56 } 57 return false 58} 59 60func filterOutWithPrefix(list []string, filter []string) (remainder []string) { 61 // Go through the filter, matching and optionally doing a prefix search for list elements. 62 for _, l := range list { 63 if !inListWithPrefixSearch(l, filter) { 64 remainder = append(remainder, l) 65 } 66 } 67 return 68} 69 70func (sabimod *sabi) flags(ctx ModuleContext, flags Flags) Flags { 71 // Assuming that the cflags which clang LibTooling tools cannot 72 // understand have not been converted to ninja variables yet. 73 flags.ToolingCFlags = filterOutWithPrefix(flags.CFlags, config.ClangLibToolingUnknownCflags) 74 flags.ToolingCppFlags = filterOutWithPrefix(flags.CppFlags, config.ClangLibToolingUnknownCflags) 75 76 return flags 77} 78 79func sabiDepsMutator(mctx android.TopDownMutatorContext) { 80 if c, ok := mctx.Module().(*Module); ok && 81 ((c.isVndk() && c.useVndk()) || inList(c.Name(), llndkLibraries) || 82 (c.sabi != nil && c.sabi.Properties.CreateSAbiDumps)) { 83 mctx.VisitDirectDeps(func(m android.Module) { 84 tag := mctx.OtherModuleDependencyTag(m) 85 switch tag { 86 case staticDepTag, staticExportDepTag, lateStaticDepTag, wholeStaticDepTag: 87 88 cc, _ := m.(*Module) 89 if cc == nil { 90 return 91 } 92 cc.sabi.Properties.CreateSAbiDumps = true 93 } 94 }) 95 } 96} 97