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 ReexportedIncludes []string `blueprint:"mutated"` 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.Local.ToolingCFlags = filterOutWithPrefix(flags.Local.CFlags, config.ClangLibToolingUnknownCflags) 74 flags.Global.ToolingCFlags = filterOutWithPrefix(flags.Global.CFlags, config.ClangLibToolingUnknownCflags) 75 flags.Local.ToolingCppFlags = filterOutWithPrefix(flags.Local.CppFlags, config.ClangLibToolingUnknownCflags) 76 flags.Global.ToolingCppFlags = filterOutWithPrefix(flags.Global.CppFlags, config.ClangLibToolingUnknownCflags) 77 78 return flags 79} 80 81func sabiDepsMutator(mctx android.TopDownMutatorContext) { 82 if c, ok := mctx.Module().(*Module); ok && 83 ((c.IsVndk() && c.UseVndk()) || c.isLlndk(mctx.Config()) || 84 (c.sabi != nil && c.sabi.Properties.CreateSAbiDumps)) { 85 mctx.VisitDirectDeps(func(m android.Module) { 86 tag := mctx.OtherModuleDependencyTag(m) 87 switch tag { 88 case StaticDepTag, staticExportDepTag, lateStaticDepTag, wholeStaticDepTag: 89 90 cc, _ := m.(*Module) 91 if cc == nil { 92 return 93 } 94 cc.sabi.Properties.CreateSAbiDumps = true 95 } 96 }) 97 } 98} 99 100func addLsdumpPath(lsdumpPath string) { 101 sabiLock.Lock() 102 lsdumpPaths = append(lsdumpPaths, lsdumpPath) 103 sabiLock.Unlock() 104} 105