xref: /aosp_15_r20/build/soong/cc/rs.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2017 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	"runtime"
20*333d2b36SAndroid Build Coastguard Worker	"strings"
21*333d2b36SAndroid Build Coastguard Worker
22*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
23*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint"
24*333d2b36SAndroid Build Coastguard Worker)
25*333d2b36SAndroid Build Coastguard Worker
26*333d2b36SAndroid Build Coastguard Workerfunc init() {
27*333d2b36SAndroid Build Coastguard Worker	pctx.VariableFunc("rsCmd", func(ctx android.PackageVarContext) string {
28*333d2b36SAndroid Build Coastguard Worker		if ctx.Config().AlwaysUsePrebuiltSdks() {
29*333d2b36SAndroid Build Coastguard Worker			// Use RenderScript prebuilts for unbundled builds
30*333d2b36SAndroid Build Coastguard Worker			return filepath.Join("prebuilts/sdk/tools", runtime.GOOS, "bin/llvm-rs-cc")
31*333d2b36SAndroid Build Coastguard Worker		} else {
32*333d2b36SAndroid Build Coastguard Worker			return ctx.Config().HostToolPath(ctx, "llvm-rs-cc").String()
33*333d2b36SAndroid Build Coastguard Worker		}
34*333d2b36SAndroid Build Coastguard Worker	})
35*333d2b36SAndroid Build Coastguard Worker}
36*333d2b36SAndroid Build Coastguard Worker
37*333d2b36SAndroid Build Coastguard Workervar rsCppCmdLine = strings.Replace(`
38*333d2b36SAndroid Build Coastguard Worker${rsCmd} -o ${outDir} -d ${outDir} -a ${out} -MD -reflect-c++ ${rsFlags} $in &&
39*333d2b36SAndroid Build Coastguard Workerecho '${out}: \' > ${out}.d &&
40*333d2b36SAndroid Build Coastguard Workerfor f in ${depFiles}; do cat $${f} | awk 'start { sub(/( \\)?$$/, " \\"); print } /:/ { start=1 }' >> ${out}.d; done &&
41*333d2b36SAndroid Build Coastguard Workertouch $out
42*333d2b36SAndroid Build Coastguard Worker`, "\n", "", -1)
43*333d2b36SAndroid Build Coastguard Worker
44*333d2b36SAndroid Build Coastguard Workervar (
45*333d2b36SAndroid Build Coastguard Worker	rsCpp = pctx.AndroidStaticRule("rsCpp",
46*333d2b36SAndroid Build Coastguard Worker		blueprint.RuleParams{
47*333d2b36SAndroid Build Coastguard Worker			Command:     rsCppCmdLine,
48*333d2b36SAndroid Build Coastguard Worker			CommandDeps: []string{"$rsCmd"},
49*333d2b36SAndroid Build Coastguard Worker			Depfile:     "${out}.d",
50*333d2b36SAndroid Build Coastguard Worker			Deps:        blueprint.DepsGCC,
51*333d2b36SAndroid Build Coastguard Worker		},
52*333d2b36SAndroid Build Coastguard Worker		"depFiles", "outDir", "rsFlags", "stampFile")
53*333d2b36SAndroid Build Coastguard Worker)
54*333d2b36SAndroid Build Coastguard Worker
55*333d2b36SAndroid Build Coastguard Worker// Takes a path to a .rscript or .fs file, and returns a path to a generated ScriptC_*.cpp file
56*333d2b36SAndroid Build Coastguard Worker// This has to match the logic in llvm-rs-cc in DetermineOutputFile.
57*333d2b36SAndroid Build Coastguard Workerfunc rsGeneratedCppFile(ctx android.ModuleContext, rsFile android.Path) android.WritablePath {
58*333d2b36SAndroid Build Coastguard Worker	fileName := strings.TrimSuffix(rsFile.Base(), rsFile.Ext())
59*333d2b36SAndroid Build Coastguard Worker	return android.PathForModuleGen(ctx, "rs", "ScriptC_"+fileName+".cpp")
60*333d2b36SAndroid Build Coastguard Worker}
61*333d2b36SAndroid Build Coastguard Worker
62*333d2b36SAndroid Build Coastguard Workerfunc rsGeneratedHFile(ctx android.ModuleContext, rsFile android.Path) android.WritablePath {
63*333d2b36SAndroid Build Coastguard Worker	fileName := strings.TrimSuffix(rsFile.Base(), rsFile.Ext())
64*333d2b36SAndroid Build Coastguard Worker	return android.PathForModuleGen(ctx, "rs", "ScriptC_"+fileName+".h")
65*333d2b36SAndroid Build Coastguard Worker}
66*333d2b36SAndroid Build Coastguard Worker
67*333d2b36SAndroid Build Coastguard Workerfunc rsGeneratedDepFile(ctx android.ModuleContext, rsFile android.Path) android.WritablePath {
68*333d2b36SAndroid Build Coastguard Worker	fileName := strings.TrimSuffix(rsFile.Base(), rsFile.Ext())
69*333d2b36SAndroid Build Coastguard Worker	return android.PathForModuleGen(ctx, "rs", fileName+".d")
70*333d2b36SAndroid Build Coastguard Worker}
71*333d2b36SAndroid Build Coastguard Worker
72*333d2b36SAndroid Build Coastguard Workerfunc rsGenerateCpp(ctx android.ModuleContext, rsFiles android.Paths, rsFlags string) android.Paths {
73*333d2b36SAndroid Build Coastguard Worker	stampFile := android.PathForModuleGen(ctx, "rs", "rs.stamp")
74*333d2b36SAndroid Build Coastguard Worker	depFiles := make(android.WritablePaths, 0, len(rsFiles))
75*333d2b36SAndroid Build Coastguard Worker	genFiles := make(android.WritablePaths, 0, 2*len(rsFiles))
76*333d2b36SAndroid Build Coastguard Worker	headers := make(android.Paths, 0, len(rsFiles))
77*333d2b36SAndroid Build Coastguard Worker	for _, rsFile := range rsFiles {
78*333d2b36SAndroid Build Coastguard Worker		depFiles = append(depFiles, rsGeneratedDepFile(ctx, rsFile))
79*333d2b36SAndroid Build Coastguard Worker		headerFile := rsGeneratedHFile(ctx, rsFile)
80*333d2b36SAndroid Build Coastguard Worker		genFiles = append(genFiles, rsGeneratedCppFile(ctx, rsFile), headerFile)
81*333d2b36SAndroid Build Coastguard Worker		headers = append(headers, headerFile)
82*333d2b36SAndroid Build Coastguard Worker	}
83*333d2b36SAndroid Build Coastguard Worker
84*333d2b36SAndroid Build Coastguard Worker	ctx.Build(pctx, android.BuildParams{
85*333d2b36SAndroid Build Coastguard Worker		Rule:            rsCpp,
86*333d2b36SAndroid Build Coastguard Worker		Description:     "llvm-rs-cc",
87*333d2b36SAndroid Build Coastguard Worker		Output:          stampFile,
88*333d2b36SAndroid Build Coastguard Worker		ImplicitOutputs: genFiles,
89*333d2b36SAndroid Build Coastguard Worker		Inputs:          rsFiles,
90*333d2b36SAndroid Build Coastguard Worker		Args: map[string]string{
91*333d2b36SAndroid Build Coastguard Worker			"rsFlags":  rsFlags,
92*333d2b36SAndroid Build Coastguard Worker			"outDir":   android.PathForModuleGen(ctx, "rs").String(),
93*333d2b36SAndroid Build Coastguard Worker			"depFiles": strings.Join(depFiles.Strings(), " "),
94*333d2b36SAndroid Build Coastguard Worker		},
95*333d2b36SAndroid Build Coastguard Worker	})
96*333d2b36SAndroid Build Coastguard Worker
97*333d2b36SAndroid Build Coastguard Worker	return headers
98*333d2b36SAndroid Build Coastguard Worker}
99*333d2b36SAndroid Build Coastguard Worker
100*333d2b36SAndroid Build Coastguard Workerfunc rsFlags(ctx ModuleContext, flags Flags, properties *BaseCompilerProperties) Flags {
101*333d2b36SAndroid Build Coastguard Worker	targetApi := String(properties.Renderscript.Target_api)
102*333d2b36SAndroid Build Coastguard Worker	if targetApi == "" && ctx.useSdk() {
103*333d2b36SAndroid Build Coastguard Worker		targetApiLevel := android.ApiLevelOrPanic(ctx, ctx.sdkVersion())
104*333d2b36SAndroid Build Coastguard Worker		if targetApiLevel.IsCurrent() || targetApiLevel.IsPreview() {
105*333d2b36SAndroid Build Coastguard Worker			// If the target level is current or preview, leave the 'target-api' unset.
106*333d2b36SAndroid Build Coastguard Worker			// This signals to llvm-rs-cc that the development API should be used.
107*333d2b36SAndroid Build Coastguard Worker		} else {
108*333d2b36SAndroid Build Coastguard Worker			targetApi = targetApiLevel.String()
109*333d2b36SAndroid Build Coastguard Worker		}
110*333d2b36SAndroid Build Coastguard Worker	}
111*333d2b36SAndroid Build Coastguard Worker
112*333d2b36SAndroid Build Coastguard Worker	if targetApi != "" {
113*333d2b36SAndroid Build Coastguard Worker		flags.rsFlags = append(flags.rsFlags, "-target-api "+targetApi)
114*333d2b36SAndroid Build Coastguard Worker	}
115*333d2b36SAndroid Build Coastguard Worker
116*333d2b36SAndroid Build Coastguard Worker	flags.rsFlags = append(flags.rsFlags, "-Wall", "-Werror")
117*333d2b36SAndroid Build Coastguard Worker	flags.rsFlags = append(flags.rsFlags, properties.Renderscript.Flags...)
118*333d2b36SAndroid Build Coastguard Worker	if ctx.Arch().ArchType.Multilib == "lib64" {
119*333d2b36SAndroid Build Coastguard Worker		flags.rsFlags = append(flags.rsFlags, "-m64")
120*333d2b36SAndroid Build Coastguard Worker	} else {
121*333d2b36SAndroid Build Coastguard Worker		flags.rsFlags = append(flags.rsFlags, "-m32")
122*333d2b36SAndroid Build Coastguard Worker	}
123*333d2b36SAndroid Build Coastguard Worker	flags.rsFlags = append(flags.rsFlags, "${config.RsGlobalIncludes}")
124*333d2b36SAndroid Build Coastguard Worker
125*333d2b36SAndroid Build Coastguard Worker	rootRsIncludeDirs := android.PathsForSource(ctx, properties.Renderscript.Include_dirs)
126*333d2b36SAndroid Build Coastguard Worker	flags.rsFlags = append(flags.rsFlags, includeDirsToFlags(rootRsIncludeDirs))
127*333d2b36SAndroid Build Coastguard Worker
128*333d2b36SAndroid Build Coastguard Worker	flags.Local.CommonFlags = append(flags.Local.CommonFlags,
129*333d2b36SAndroid Build Coastguard Worker		"-I"+android.PathForModuleGen(ctx, "rs").String(),
130*333d2b36SAndroid Build Coastguard Worker		"-Iframeworks/rs",
131*333d2b36SAndroid Build Coastguard Worker		"-Iframeworks/rs/cpp",
132*333d2b36SAndroid Build Coastguard Worker	)
133*333d2b36SAndroid Build Coastguard Worker
134*333d2b36SAndroid Build Coastguard Worker	return flags
135*333d2b36SAndroid Build Coastguard Worker}
136