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 python 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Worker// This file contains Ninja build actions for building Python program. 18*333d2b36SAndroid Build Coastguard Worker 19*333d2b36SAndroid Build Coastguard Workerimport ( 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 _ "github.com/google/blueprint/bootstrap" 25*333d2b36SAndroid Build Coastguard Worker) 26*333d2b36SAndroid Build Coastguard Worker 27*333d2b36SAndroid Build Coastguard Workervar ( 28*333d2b36SAndroid Build Coastguard Worker pctx = android.NewPackageContext("android/soong/python") 29*333d2b36SAndroid Build Coastguard Worker 30*333d2b36SAndroid Build Coastguard Worker zip = pctx.AndroidStaticRule("zip", 31*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 32*333d2b36SAndroid Build Coastguard Worker Command: `$parCmd -o $out $args`, 33*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"$parCmd"}, 34*333d2b36SAndroid Build Coastguard Worker }, 35*333d2b36SAndroid Build Coastguard Worker "args") 36*333d2b36SAndroid Build Coastguard Worker 37*333d2b36SAndroid Build Coastguard Worker combineZip = pctx.AndroidStaticRule("combineZip", 38*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 39*333d2b36SAndroid Build Coastguard Worker Command: `$mergeParCmd $out $in`, 40*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"$mergeParCmd"}, 41*333d2b36SAndroid Build Coastguard Worker }, 42*333d2b36SAndroid Build Coastguard Worker ) 43*333d2b36SAndroid Build Coastguard Worker 44*333d2b36SAndroid Build Coastguard Worker hostPar = pctx.AndroidStaticRule("hostPar", 45*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 46*333d2b36SAndroid Build Coastguard Worker Command: `sed -e 's/%interpreter%/$interp/g' -e 's/%main%/__soong_entrypoint_redirector__.py/g' build/soong/python/scripts/stub_template_host.txt > $out.main && ` + 47*333d2b36SAndroid Build Coastguard Worker "sed -e 's/ENTRY_POINT/$main/g' build/soong/python/scripts/main_non_embedded.py >`dirname $out`/__soong_entrypoint_redirector__.py && " + 48*333d2b36SAndroid Build Coastguard Worker "$parCmd -o $out.entrypoint_zip -C `dirname $out` -f `dirname $out`/__soong_entrypoint_redirector__.py && " + 49*333d2b36SAndroid Build Coastguard Worker `echo "#!/usr/bin/env $interp" >${out}.prefix &&` + 50*333d2b36SAndroid Build Coastguard Worker `$mergeParCmd -p --prefix ${out}.prefix -pm $out.main $out $srcsZips $out.entrypoint_zip && ` + 51*333d2b36SAndroid Build Coastguard Worker "chmod +x $out && (rm -f $out.main; rm -f ${out}.prefix; rm -f $out.entrypoint_zip; rm -f `dirname $out`/__soong_entrypoint_redirector__.py)", 52*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"$mergeParCmd", "$parCmd", "build/soong/python/scripts/stub_template_host.txt", "build/soong/python/scripts/main_non_embedded.py"}, 53*333d2b36SAndroid Build Coastguard Worker }, 54*333d2b36SAndroid Build Coastguard Worker "interp", "main", "srcsZips") 55*333d2b36SAndroid Build Coastguard Worker 56*333d2b36SAndroid Build Coastguard Worker embeddedPar = pctx.AndroidStaticRule("embeddedPar", 57*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 58*333d2b36SAndroid Build Coastguard Worker Command: `rm -f $out.main && ` + 59*333d2b36SAndroid Build Coastguard Worker `sed 's/ENTRY_POINT/$main/' build/soong/python/scripts/main.py >$out.main &&` + 60*333d2b36SAndroid Build Coastguard Worker `$mergeParCmd -p -pm $out.main --prefix $launcher $out $srcsZips && ` + 61*333d2b36SAndroid Build Coastguard Worker `chmod +x $out && rm -rf $out.main`, 62*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"$mergeParCmd", "build/soong/python/scripts/main.py"}, 63*333d2b36SAndroid Build Coastguard Worker }, 64*333d2b36SAndroid Build Coastguard Worker "main", "srcsZips", "launcher") 65*333d2b36SAndroid Build Coastguard Worker 66*333d2b36SAndroid Build Coastguard Worker embeddedParNoMain = pctx.AndroidStaticRule("embeddedParNoMain", 67*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 68*333d2b36SAndroid Build Coastguard Worker Command: `$mergeParCmd -p --prefix $launcher $out $srcsZips && ` + 69*333d2b36SAndroid Build Coastguard Worker `chmod +x $out`, 70*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"$mergeParCmd"}, 71*333d2b36SAndroid Build Coastguard Worker }, 72*333d2b36SAndroid Build Coastguard Worker "srcsZips", "launcher") 73*333d2b36SAndroid Build Coastguard Worker 74*333d2b36SAndroid Build Coastguard Worker precompile = pctx.AndroidStaticRule("precompilePython", blueprint.RuleParams{ 75*333d2b36SAndroid Build Coastguard Worker Command: `LD_LIBRARY_PATH="$ldLibraryPath" ` + 76*333d2b36SAndroid Build Coastguard Worker `PYTHONPATH=$stdlibZip/internal/$stdlibPkg ` + 77*333d2b36SAndroid Build Coastguard Worker `$launcher build/soong/python/scripts/precompile_python.py $in $out`, 78*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{ 79*333d2b36SAndroid Build Coastguard Worker "$stdlibZip", 80*333d2b36SAndroid Build Coastguard Worker "$launcher", 81*333d2b36SAndroid Build Coastguard Worker "build/soong/python/scripts/precompile_python.py", 82*333d2b36SAndroid Build Coastguard Worker }, 83*333d2b36SAndroid Build Coastguard Worker }, "stdlibZip", "stdlibPkg", "launcher", "ldLibraryPath") 84*333d2b36SAndroid Build Coastguard Worker) 85*333d2b36SAndroid Build Coastguard Worker 86*333d2b36SAndroid Build Coastguard Workerfunc init() { 87*333d2b36SAndroid Build Coastguard Worker pctx.Import("github.com/google/blueprint/bootstrap") 88*333d2b36SAndroid Build Coastguard Worker pctx.Import("android/soong/android") 89*333d2b36SAndroid Build Coastguard Worker 90*333d2b36SAndroid Build Coastguard Worker pctx.HostBinToolVariable("parCmd", "soong_zip") 91*333d2b36SAndroid Build Coastguard Worker pctx.HostBinToolVariable("mergeParCmd", "merge_zips") 92*333d2b36SAndroid Build Coastguard Worker} 93*333d2b36SAndroid Build Coastguard Worker 94*333d2b36SAndroid Build Coastguard Workerfunc registerBuildActionForParFile(ctx android.ModuleContext, embeddedLauncher bool, 95*333d2b36SAndroid Build Coastguard Worker launcherPath android.OptionalPath, interpreter, main, binName string, 96*333d2b36SAndroid Build Coastguard Worker srcsZips android.Paths) android.Path { 97*333d2b36SAndroid Build Coastguard Worker 98*333d2b36SAndroid Build Coastguard Worker // .intermediate output path for bin executable. 99*333d2b36SAndroid Build Coastguard Worker binFile := android.PathForModuleOut(ctx, binName) 100*333d2b36SAndroid Build Coastguard Worker 101*333d2b36SAndroid Build Coastguard Worker // implicit dependency for parFile build action. 102*333d2b36SAndroid Build Coastguard Worker implicits := srcsZips 103*333d2b36SAndroid Build Coastguard Worker 104*333d2b36SAndroid Build Coastguard Worker if !embeddedLauncher { 105*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 106*333d2b36SAndroid Build Coastguard Worker Rule: hostPar, 107*333d2b36SAndroid Build Coastguard Worker Description: "host python archive", 108*333d2b36SAndroid Build Coastguard Worker Output: binFile, 109*333d2b36SAndroid Build Coastguard Worker Implicits: implicits, 110*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 111*333d2b36SAndroid Build Coastguard Worker "interp": strings.Replace(interpreter, "/", `\/`, -1), 112*333d2b36SAndroid Build Coastguard Worker "main": strings.Replace(strings.TrimSuffix(main, pyExt), "/", ".", -1), 113*333d2b36SAndroid Build Coastguard Worker "srcsZips": strings.Join(srcsZips.Strings(), " "), 114*333d2b36SAndroid Build Coastguard Worker }, 115*333d2b36SAndroid Build Coastguard Worker }) 116*333d2b36SAndroid Build Coastguard Worker } else if launcherPath.Valid() { 117*333d2b36SAndroid Build Coastguard Worker // added launcherPath to the implicits Ninja dependencies. 118*333d2b36SAndroid Build Coastguard Worker implicits = append(implicits, launcherPath.Path()) 119*333d2b36SAndroid Build Coastguard Worker 120*333d2b36SAndroid Build Coastguard Worker if main == "" { 121*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 122*333d2b36SAndroid Build Coastguard Worker Rule: embeddedParNoMain, 123*333d2b36SAndroid Build Coastguard Worker Description: "embedded python archive", 124*333d2b36SAndroid Build Coastguard Worker Output: binFile, 125*333d2b36SAndroid Build Coastguard Worker Implicits: implicits, 126*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 127*333d2b36SAndroid Build Coastguard Worker "srcsZips": strings.Join(srcsZips.Strings(), " "), 128*333d2b36SAndroid Build Coastguard Worker "launcher": launcherPath.String(), 129*333d2b36SAndroid Build Coastguard Worker }, 130*333d2b36SAndroid Build Coastguard Worker }) 131*333d2b36SAndroid Build Coastguard Worker } else { 132*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 133*333d2b36SAndroid Build Coastguard Worker Rule: embeddedPar, 134*333d2b36SAndroid Build Coastguard Worker Description: "embedded python archive", 135*333d2b36SAndroid Build Coastguard Worker Output: binFile, 136*333d2b36SAndroid Build Coastguard Worker Implicits: implicits, 137*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 138*333d2b36SAndroid Build Coastguard Worker "main": strings.Replace(strings.TrimSuffix(main, pyExt), "/", ".", -1), 139*333d2b36SAndroid Build Coastguard Worker "srcsZips": strings.Join(srcsZips.Strings(), " "), 140*333d2b36SAndroid Build Coastguard Worker "launcher": launcherPath.String(), 141*333d2b36SAndroid Build Coastguard Worker }, 142*333d2b36SAndroid Build Coastguard Worker }) 143*333d2b36SAndroid Build Coastguard Worker } 144*333d2b36SAndroid Build Coastguard Worker } 145*333d2b36SAndroid Build Coastguard Worker 146*333d2b36SAndroid Build Coastguard Worker return binFile 147*333d2b36SAndroid Build Coastguard Worker} 148