pmb.build._package: detect recursion

This commit is contained in:
Oliver Smith 2021-01-28 02:06:04 +01:00
parent 34d6b3edb3
commit 5b2efb59e9
No known key found for this signature in database
GPG Key ID: 5AE7F5513E0885CB
1 changed files with 40 additions and 0 deletions

View File

@ -15,6 +15,9 @@ import pmb.parse
import pmb.parse.arch
stack = []
def skip_already_built(args, pkgname, arch):
"""
Check if the package was already built in this session, and add it
@ -179,6 +182,23 @@ def is_necessary_warn_depends(args, apkbuild, arch, force, depends_built):
return ret
def stack_check_recursion(pkgname):
global stack
if pkgname not in stack:
return
msg = f"Recursion found while building '{stack[0]}'!\n\n"
msg += f"Package '{pkgname}' depends on itself:\n\n"
msg += f"{pkgname}\n"
for i in range(stack.index(pkgname) + 1, len(stack)):
msg += f"-> {stack[i]}\n"
msg += f"-> {pkgname}\n"
raise RuntimeError(msg)
def init_buildenv(args, apkbuild, arch, strict=False, force=False, cross=None,
suffix="native", skip_init_buildenv=False, src=None):
"""
@ -494,27 +514,47 @@ def package(args, pkgname, arch=None, force=False, strict=False,
:returns: None if the build was not necessary
output path relative to the packages folder ("armhf/ab-1-r2.apk")
"""
global stack
stack_check_recursion(pkgname)
stack.append(pkgname)
stack_str = f"[package build stack] {' -> '.join(stack)}"
# Once per session is enough
arch = arch or args.arch_native
logging.verbose(f"{stack_str}: evaluating")
if skip_already_built(args, pkgname, arch):
logging.verbose(f"{stack_str}: skip build: skip_already_built")
stack.pop()
return
# Only build when APKBUILD exists
apkbuild = get_apkbuild(args, pkgname, arch)
if not apkbuild:
logging.verbose(f"{stack_str}: skip build: get_apkbuild")
stack.pop()
return
# Detect the build environment (skip unnecessary builds)
if not check_build_for_arch(args, pkgname, arch):
logging.verbose(f"{stack_str}: skip build: check_build_for_arch")
stack.pop()
return
suffix = pmb.build.autodetect.suffix(args, apkbuild, arch)
cross = pmb.build.autodetect.crosscompile(args, apkbuild, arch, suffix)
logging.verbose(f"{stack_str}: building dependencies")
if not init_buildenv(args, apkbuild, arch, strict, force, cross, suffix,
skip_init_buildenv, src):
logging.verbose(f"{stack_str}: skip build: init_buildenv")
stack.pop()
return
# Build and finish up
logging.verbose(f"{stack_str}: building")
(output, cmd, env) = run_abuild(args, apkbuild, arch, strict, force, cross,
suffix, src)
finish(args, apkbuild, arch, output, strict, suffix)
logging.verbose(f"{stack_str}: built successfully")
stack.pop()
return output