xref: /aosp_15_r20/build/soong/python/builder.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 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