xref: /aosp_15_r20/build/soong/cc/util.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
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