Support building a par file that does not automatically run
Mainly so that we can build a `python` prebuilt that acts like the normal python install, though you could also build different ones with more packages pre-installed. Bug: 117811537 Test: move built py2-cmd into prebuilts/build-tools/path/linux-x86/python and build Change-Id: I21215f6fd3754d89f8c65e1dfeb3f2deea23239f
This commit is contained in:
@@ -42,6 +42,11 @@ type BinaryProperties struct {
|
|||||||
// list of compatibility suites (for example "cts", "vts") that the module should be
|
// list of compatibility suites (for example "cts", "vts") that the module should be
|
||||||
// installed into.
|
// installed into.
|
||||||
Test_suites []string `android:"arch_variant"`
|
Test_suites []string `android:"arch_variant"`
|
||||||
|
|
||||||
|
// whether to use `main` when starting the executable. The default is true, when set to
|
||||||
|
// false it will act much like the normal `python` executable, but with the sources and
|
||||||
|
// libraries automatically included in the PYTHONPATH.
|
||||||
|
Autorun *bool `android:"arch_variant"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type binaryDecorator struct {
|
type binaryDecorator struct {
|
||||||
@@ -74,6 +79,10 @@ func PythonBinaryHostFactory() android.Module {
|
|||||||
return module.Init()
|
return module.Init()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (binary *binaryDecorator) autorun() bool {
|
||||||
|
return BoolDefault(binary.binaryProperties.Autorun, true)
|
||||||
|
}
|
||||||
|
|
||||||
func (binary *binaryDecorator) bootstrapperProps() []interface{} {
|
func (binary *binaryDecorator) bootstrapperProps() []interface{} {
|
||||||
return []interface{}{&binary.binaryProperties}
|
return []interface{}{&binary.binaryProperties}
|
||||||
}
|
}
|
||||||
@@ -82,7 +91,10 @@ func (binary *binaryDecorator) bootstrap(ctx android.ModuleContext, actualVersio
|
|||||||
embeddedLauncher bool, srcsPathMappings []pathMapping, srcsZip android.Path,
|
embeddedLauncher bool, srcsPathMappings []pathMapping, srcsZip android.Path,
|
||||||
depsSrcsZips android.Paths) android.OptionalPath {
|
depsSrcsZips android.Paths) android.OptionalPath {
|
||||||
|
|
||||||
main := binary.getPyMainFile(ctx, srcsPathMappings)
|
main := ""
|
||||||
|
if binary.autorun() {
|
||||||
|
main = binary.getPyMainFile(ctx, srcsPathMappings)
|
||||||
|
}
|
||||||
|
|
||||||
var launcherPath android.OptionalPath
|
var launcherPath android.OptionalPath
|
||||||
if embeddedLauncher {
|
if embeddedLauncher {
|
||||||
|
@@ -54,7 +54,6 @@ var (
|
|||||||
|
|
||||||
embeddedPar = pctx.AndroidStaticRule("embeddedPar",
|
embeddedPar = pctx.AndroidStaticRule("embeddedPar",
|
||||||
blueprint.RuleParams{
|
blueprint.RuleParams{
|
||||||
// `echo -n` to trim the newline, since the python code just wants the name
|
|
||||||
Command: `rm -f $out.main && ` +
|
Command: `rm -f $out.main && ` +
|
||||||
`sed 's/ENTRY_POINT/$main/' build/soong/python/scripts/main.py >$out.main &&` +
|
`sed 's/ENTRY_POINT/$main/' build/soong/python/scripts/main.py >$out.main &&` +
|
||||||
`$mergeParCmd -p -pm $out.main --prefix $launcher $out $srcsZips && ` +
|
`$mergeParCmd -p -pm $out.main --prefix $launcher $out $srcsZips && ` +
|
||||||
@@ -62,6 +61,14 @@ var (
|
|||||||
CommandDeps: []string{"$mergeParCmd", "$parCmd", "build/soong/python/scripts/main.py"},
|
CommandDeps: []string{"$mergeParCmd", "$parCmd", "build/soong/python/scripts/main.py"},
|
||||||
},
|
},
|
||||||
"main", "srcsZips", "launcher")
|
"main", "srcsZips", "launcher")
|
||||||
|
|
||||||
|
embeddedParNoMain = pctx.AndroidStaticRule("embeddedParNoMain",
|
||||||
|
blueprint.RuleParams{
|
||||||
|
Command: `$mergeParCmd -p --prefix $launcher $out $srcsZips && ` +
|
||||||
|
`chmod +x $out`,
|
||||||
|
CommandDeps: []string{"$mergeParCmd"},
|
||||||
|
},
|
||||||
|
"srcsZips", "launcher")
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
@@ -107,17 +114,30 @@ func registerBuildActionForParFile(ctx android.ModuleContext, embeddedLauncher b
|
|||||||
// added launcherPath to the implicits Ninja dependencies.
|
// added launcherPath to the implicits Ninja dependencies.
|
||||||
implicits = append(implicits, launcherPath.Path())
|
implicits = append(implicits, launcherPath.Path())
|
||||||
|
|
||||||
ctx.Build(pctx, android.BuildParams{
|
if main == "" {
|
||||||
Rule: embeddedPar,
|
ctx.Build(pctx, android.BuildParams{
|
||||||
Description: "embedded python archive",
|
Rule: embeddedParNoMain,
|
||||||
Output: binFile,
|
Description: "embedded python archive",
|
||||||
Implicits: implicits,
|
Output: binFile,
|
||||||
Args: map[string]string{
|
Implicits: implicits,
|
||||||
"main": strings.Replace(strings.TrimSuffix(main, pyExt), "/", ".", -1),
|
Args: map[string]string{
|
||||||
"srcsZips": strings.Join(srcsZips.Strings(), " "),
|
"srcsZips": strings.Join(srcsZips.Strings(), " "),
|
||||||
"launcher": launcherPath.String(),
|
"launcher": launcherPath.String(),
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
} else {
|
||||||
|
ctx.Build(pctx, android.BuildParams{
|
||||||
|
Rule: embeddedPar,
|
||||||
|
Description: "embedded python archive",
|
||||||
|
Output: binFile,
|
||||||
|
Implicits: implicits,
|
||||||
|
Args: map[string]string{
|
||||||
|
"main": strings.Replace(strings.TrimSuffix(main, pyExt), "/", ".", -1),
|
||||||
|
"srcsZips": strings.Join(srcsZips.Strings(), " "),
|
||||||
|
"launcher": launcherPath.String(),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return binFile
|
return binFile
|
||||||
|
@@ -156,6 +156,8 @@ type bootstrapper interface {
|
|||||||
bootstrap(ctx android.ModuleContext, ActualVersion string, embeddedLauncher bool,
|
bootstrap(ctx android.ModuleContext, ActualVersion string, embeddedLauncher bool,
|
||||||
srcsPathMappings []pathMapping, srcsZip android.Path,
|
srcsPathMappings []pathMapping, srcsZip android.Path,
|
||||||
depsSrcsZips android.Paths) android.OptionalPath
|
depsSrcsZips android.Paths) android.OptionalPath
|
||||||
|
|
||||||
|
autorun() bool
|
||||||
}
|
}
|
||||||
|
|
||||||
type installer interface {
|
type installer interface {
|
||||||
@@ -307,9 +309,14 @@ func (p *Module) DepsMutator(ctx android.BottomUpMutatorContext) {
|
|||||||
|
|
||||||
if p.bootstrapper != nil && p.isEmbeddedLauncherEnabled(pyVersion2) {
|
if p.bootstrapper != nil && p.isEmbeddedLauncherEnabled(pyVersion2) {
|
||||||
ctx.AddVariationDependencies(nil, pythonLibTag, "py2-stdlib")
|
ctx.AddVariationDependencies(nil, pythonLibTag, "py2-stdlib")
|
||||||
|
|
||||||
|
launcherModule := "py2-launcher"
|
||||||
|
if p.bootstrapper.autorun() {
|
||||||
|
launcherModule = "py2-launcher-autorun"
|
||||||
|
}
|
||||||
ctx.AddFarVariationDependencies([]blueprint.Variation{
|
ctx.AddFarVariationDependencies([]blueprint.Variation{
|
||||||
{Mutator: "arch", Variation: ctx.Target().String()},
|
{Mutator: "arch", Variation: ctx.Target().String()},
|
||||||
}, launcherTag, "py2-launcher")
|
}, launcherTag, launcherModule)
|
||||||
|
|
||||||
// Add py2-launcher shared lib dependencies. Ideally, these should be
|
// Add py2-launcher shared lib dependencies. Ideally, these should be
|
||||||
// derived from the `shared_libs` property of "py2-launcher". However, we
|
// derived from the `shared_libs` property of "py2-launcher". However, we
|
||||||
@@ -422,7 +429,11 @@ func (p *Module) GeneratePythonBuildActions(ctx android.ModuleContext) {
|
|||||||
p.properties.Actual_version, ctx.ModuleName()))
|
p.properties.Actual_version, ctx.ModuleName()))
|
||||||
}
|
}
|
||||||
expandedSrcs := ctx.ExpandSources(srcs, exclude_srcs)
|
expandedSrcs := ctx.ExpandSources(srcs, exclude_srcs)
|
||||||
if len(expandedSrcs) == 0 {
|
requiresSrcs := true
|
||||||
|
if p.bootstrapper != nil && !p.bootstrapper.autorun() {
|
||||||
|
requiresSrcs = false
|
||||||
|
}
|
||||||
|
if len(expandedSrcs) == 0 && requiresSrcs {
|
||||||
ctx.ModuleErrorf("doesn't have any source files!")
|
ctx.ModuleErrorf("doesn't have any source files!")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -656,4 +667,5 @@ func (p *Module) InstallInData() bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var Bool = proptools.Bool
|
var Bool = proptools.Bool
|
||||||
|
var BoolDefault = proptools.BoolDefault
|
||||||
var String = proptools.String
|
var String = proptools.String
|
||||||
|
Reference in New Issue
Block a user