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