1*333d2b36SAndroid Build Coastguard Worker// Copyright 2015 Google Inc. All rights reserved. 2*333d2b36SAndroid Build Coastguard Worker// 3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*333d2b36SAndroid Build Coastguard Worker// 7*333d2b36SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*333d2b36SAndroid Build Coastguard Worker// 9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*333d2b36SAndroid Build Coastguard Worker// limitations under the License. 14*333d2b36SAndroid Build Coastguard Worker 15*333d2b36SAndroid Build Coastguard Workerpackage cc 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "path/filepath" 19*333d2b36SAndroid Build Coastguard Worker "strings" 20*333d2b36SAndroid Build Coastguard Worker 21*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 22*333d2b36SAndroid Build Coastguard Worker) 23*333d2b36SAndroid Build Coastguard Worker 24*333d2b36SAndroid Build Coastguard Worker// Efficiently converts a list of include directories to a single string 25*333d2b36SAndroid Build Coastguard Worker// of cflags with -I prepended to each directory. 26*333d2b36SAndroid Build Coastguard Workerfunc includeDirsToFlags(dirs android.Paths) string { 27*333d2b36SAndroid Build Coastguard Worker return android.JoinWithPrefix(dirs.Strings(), "-I") 28*333d2b36SAndroid Build Coastguard Worker} 29*333d2b36SAndroid Build Coastguard Worker 30*333d2b36SAndroid Build Coastguard Workervar indexList = android.IndexList[string] 31*333d2b36SAndroid Build Coastguard Workervar inList = android.InList[string] 32*333d2b36SAndroid Build Coastguard Workervar filterList = android.FilterList 33*333d2b36SAndroid Build Coastguard Workervar removeListFromList = android.RemoveListFromList 34*333d2b36SAndroid Build Coastguard Workervar removeFromList = android.RemoveFromList 35*333d2b36SAndroid Build Coastguard Worker 36*333d2b36SAndroid Build Coastguard Workerfunc flagsToBuilderFlags(in Flags) builderFlags { 37*333d2b36SAndroid Build Coastguard Worker return builderFlags{ 38*333d2b36SAndroid Build Coastguard Worker globalCommonFlags: strings.Join(in.Global.CommonFlags, " "), 39*333d2b36SAndroid Build Coastguard Worker globalAsFlags: strings.Join(in.Global.AsFlags, " "), 40*333d2b36SAndroid Build Coastguard Worker globalYasmFlags: strings.Join(in.Global.YasmFlags, " "), 41*333d2b36SAndroid Build Coastguard Worker globalCFlags: strings.Join(in.Global.CFlags, " "), 42*333d2b36SAndroid Build Coastguard Worker globalToolingCFlags: strings.Join(in.Global.ToolingCFlags, " "), 43*333d2b36SAndroid Build Coastguard Worker globalToolingCppFlags: strings.Join(in.Global.ToolingCppFlags, " "), 44*333d2b36SAndroid Build Coastguard Worker globalConlyFlags: strings.Join(in.Global.ConlyFlags, " "), 45*333d2b36SAndroid Build Coastguard Worker globalCppFlags: strings.Join(in.Global.CppFlags, " "), 46*333d2b36SAndroid Build Coastguard Worker globalLdFlags: strings.Join(in.Global.LdFlags, " "), 47*333d2b36SAndroid Build Coastguard Worker 48*333d2b36SAndroid Build Coastguard Worker localCommonFlags: strings.Join(in.Local.CommonFlags, " "), 49*333d2b36SAndroid Build Coastguard Worker localAsFlags: strings.Join(in.Local.AsFlags, " "), 50*333d2b36SAndroid Build Coastguard Worker localYasmFlags: strings.Join(in.Local.YasmFlags, " "), 51*333d2b36SAndroid Build Coastguard Worker localCFlags: strings.Join(in.Local.CFlags, " "), 52*333d2b36SAndroid Build Coastguard Worker localToolingCFlags: strings.Join(in.Local.ToolingCFlags, " "), 53*333d2b36SAndroid Build Coastguard Worker localToolingCppFlags: strings.Join(in.Local.ToolingCppFlags, " "), 54*333d2b36SAndroid Build Coastguard Worker localConlyFlags: strings.Join(in.Local.ConlyFlags, " "), 55*333d2b36SAndroid Build Coastguard Worker localCppFlags: strings.Join(in.Local.CppFlags, " "), 56*333d2b36SAndroid Build Coastguard Worker localLdFlags: strings.Join(in.Local.LdFlags, " "), 57*333d2b36SAndroid Build Coastguard Worker 58*333d2b36SAndroid Build Coastguard Worker noOverrideFlags: strings.Join(in.NoOverrideFlags, " "), 59*333d2b36SAndroid Build Coastguard Worker aidlFlags: strings.Join(in.aidlFlags, " "), 60*333d2b36SAndroid Build Coastguard Worker rsFlags: strings.Join(in.rsFlags, " "), 61*333d2b36SAndroid Build Coastguard Worker libFlags: strings.Join(in.libFlags, " "), 62*333d2b36SAndroid Build Coastguard Worker extraLibFlags: strings.Join(in.extraLibFlags, " "), 63*333d2b36SAndroid Build Coastguard Worker tidyFlags: strings.Join(in.TidyFlags, " "), 64*333d2b36SAndroid Build Coastguard Worker sAbiFlags: strings.Join(in.SAbiFlags, " "), 65*333d2b36SAndroid Build Coastguard Worker toolchain: in.Toolchain, 66*333d2b36SAndroid Build Coastguard Worker gcovCoverage: in.GcovCoverage, 67*333d2b36SAndroid Build Coastguard Worker tidy: in.Tidy, 68*333d2b36SAndroid Build Coastguard Worker needTidyFiles: in.NeedTidyFiles, 69*333d2b36SAndroid Build Coastguard Worker sAbiDump: in.SAbiDump, 70*333d2b36SAndroid Build Coastguard Worker emitXrefs: in.EmitXrefs, 71*333d2b36SAndroid Build Coastguard Worker clangVerify: in.ClangVerify, 72*333d2b36SAndroid Build Coastguard Worker 73*333d2b36SAndroid Build Coastguard Worker systemIncludeFlags: strings.Join(in.SystemIncludeFlags, " "), 74*333d2b36SAndroid Build Coastguard Worker 75*333d2b36SAndroid Build Coastguard Worker assemblerWithCpp: in.AssemblerWithCpp, 76*333d2b36SAndroid Build Coastguard Worker 77*333d2b36SAndroid Build Coastguard Worker proto: in.proto, 78*333d2b36SAndroid Build Coastguard Worker protoC: in.protoC, 79*333d2b36SAndroid Build Coastguard Worker protoOptionsFile: in.protoOptionsFile, 80*333d2b36SAndroid Build Coastguard Worker 81*333d2b36SAndroid Build Coastguard Worker yacc: in.Yacc, 82*333d2b36SAndroid Build Coastguard Worker lex: in.Lex, 83*333d2b36SAndroid Build Coastguard Worker } 84*333d2b36SAndroid Build Coastguard Worker} 85*333d2b36SAndroid Build Coastguard Worker 86*333d2b36SAndroid Build Coastguard Workerfunc flagsToStripFlags(in Flags) StripFlags { 87*333d2b36SAndroid Build Coastguard Worker return StripFlags{Toolchain: in.Toolchain} 88*333d2b36SAndroid Build Coastguard Worker} 89*333d2b36SAndroid Build Coastguard Worker 90*333d2b36SAndroid Build Coastguard Workerfunc addPrefix(list []string, prefix string) []string { 91*333d2b36SAndroid Build Coastguard Worker for i := range list { 92*333d2b36SAndroid Build Coastguard Worker list[i] = prefix + list[i] 93*333d2b36SAndroid Build Coastguard Worker } 94*333d2b36SAndroid Build Coastguard Worker return list 95*333d2b36SAndroid Build Coastguard Worker} 96*333d2b36SAndroid Build Coastguard Worker 97*333d2b36SAndroid Build Coastguard Worker// linkDirOnDevice/linkName -> target 98*333d2b36SAndroid Build Coastguard Workerfunc makeSymlinkCmd(linkDirOnDevice string, linkName string, target string) string { 99*333d2b36SAndroid Build Coastguard Worker dir := filepath.Join("$(PRODUCT_OUT)", linkDirOnDevice) 100*333d2b36SAndroid Build Coastguard Worker return "mkdir -p " + dir + " && " + 101*333d2b36SAndroid Build Coastguard Worker "ln -sf " + target + " " + filepath.Join(dir, linkName) 102*333d2b36SAndroid Build Coastguard Worker} 103*333d2b36SAndroid Build Coastguard Worker 104*333d2b36SAndroid Build Coastguard Workerfunc WriteStringToFileRule(ctx android.SingletonContext, content, out string) android.OutputPath { 105*333d2b36SAndroid Build Coastguard Worker outPath := android.PathForOutput(ctx, out) 106*333d2b36SAndroid Build Coastguard Worker android.WriteFileRule(ctx, outPath, content) 107*333d2b36SAndroid Build Coastguard Worker return outPath 108*333d2b36SAndroid Build Coastguard Worker} 109*333d2b36SAndroid Build Coastguard Worker 110*333d2b36SAndroid Build Coastguard Worker// Dump a map to a list file as: 111*333d2b36SAndroid Build Coastguard Worker// 112*333d2b36SAndroid Build Coastguard Worker// {key1} {value1} 113*333d2b36SAndroid Build Coastguard Worker// {key2} {value2} 114*333d2b36SAndroid Build Coastguard Worker// ... 115*333d2b36SAndroid Build Coastguard Workerfunc installMapListFileRule(ctx android.SingletonContext, m map[string]string, path string) android.OutputPath { 116*333d2b36SAndroid Build Coastguard Worker var txtBuilder strings.Builder 117*333d2b36SAndroid Build Coastguard Worker for idx, k := range android.SortedKeys(m) { 118*333d2b36SAndroid Build Coastguard Worker if idx > 0 { 119*333d2b36SAndroid Build Coastguard Worker txtBuilder.WriteString("\n") 120*333d2b36SAndroid Build Coastguard Worker } 121*333d2b36SAndroid Build Coastguard Worker txtBuilder.WriteString(k) 122*333d2b36SAndroid Build Coastguard Worker txtBuilder.WriteString(" ") 123*333d2b36SAndroid Build Coastguard Worker txtBuilder.WriteString(m[k]) 124*333d2b36SAndroid Build Coastguard Worker } 125*333d2b36SAndroid Build Coastguard Worker return WriteStringToFileRule(ctx, txtBuilder.String(), path) 126*333d2b36SAndroid Build Coastguard Worker} 127