utils/genrandconfig: switch to async/await format

This requires python 3.5 or newer but is a bit cleaner than the
previous coroutine method.

This should also fix a python3.12 issue:
[Tue, 28 May 2024 13:09:05] INFO: generate the configuration
Traceback (most recent call last):
  File "/home/autobuild/autobuild/instance-0/buildroot/utils/genrandconfig", line 833, in <module>
    ret = asyncio.run(gen_config(args))
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/asyncio/runners.py", line 194, in run
    return runner.run(main)
           ^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/asyncio/runners.py", line 89, in run
    raise ValueError("a coroutine was expected, got {!r}".format(coro))
ValueError: a coroutine was expected, got <generator object gen_config at 0xffff7bd822c0>
[Tue, 28 May 2024 13:09:06] WARN: failed to generate configuration

Signed-off-by: James Hilliard <james.hilliard1@gmail.com>
Reviewed-by: Vincent Fazio <vfazio@xes-inc.com>
Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
(cherry picked from commit 584ebdea6e)
Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
This commit is contained in:
James Hilliard 2024-05-28 07:22:18 -06:00 committed by Peter Korsgaard
parent 626c967c5f
commit 58ec14fe8f

View File

@ -28,11 +28,6 @@ import traceback
from distutils.version import StrictVersion from distutils.version import StrictVersion
import platform import platform
if sys.version_info < (3, 8):
from asyncio import coroutine
else:
from types import coroutine
class SystemInfo: class SystemInfo:
DEFAULT_NEEDED_PROGS = ["make", "git", "gcc", "timeout"] DEFAULT_NEEDED_PROGS = ["make", "git", "gcc", "timeout"]
@ -60,8 +55,7 @@ class SystemInfo:
# -- # --
return None return None
@coroutine async def has(self, prog):
def has(self, prog):
"""Checks whether a program is available. """Checks whether a program is available.
Lazily evaluates missing entries. Lazily evaluates missing entries.
@ -76,11 +70,11 @@ class SystemInfo:
have_it = self.find_prog(prog) have_it = self.find_prog(prog)
# java[c] needs special care # java[c] needs special care
if have_it and prog in ('java', 'javac'): if have_it and prog in ('java', 'javac'):
proc = yield from asyncio.create_subprocess_shell( proc = await asyncio.create_subprocess_shell(
"%s -version | grep gcj" % prog, "%s -version | grep gcj" % prog,
stdout=asyncio.subprocess.DEVNULL, stdout=asyncio.subprocess.DEVNULL,
stderr=asyncio.subprocess.DEVNULL) stderr=asyncio.subprocess.DEVNULL)
ret = yield from proc.wait() ret = await proc.wait()
if ret != 1: if ret != 1:
have_it = False have_it = False
# -- # --
@ -159,8 +153,7 @@ def get_toolchain_configs(toolchains_csv, buildrootdir):
return configs return configs
@coroutine async def is_toolchain_usable(configfile, config):
def is_toolchain_usable(configfile, config):
"""Check if the toolchain is actually usable.""" """Check if the toolchain is actually usable."""
with open(configfile) as configf: with open(configfile) as configf:
@ -180,9 +173,9 @@ def is_toolchain_usable(configfile, config):
'BR2_TOOLCHAIN_EXTERNAL_LINARO_AARCH64=y\n' in configlines or \ 'BR2_TOOLCHAIN_EXTERNAL_LINARO_AARCH64=y\n' in configlines or \
'BR2_TOOLCHAIN_EXTERNAL_LINARO_AARCH64_BE=y\n' in configlines or \ 'BR2_TOOLCHAIN_EXTERNAL_LINARO_AARCH64_BE=y\n' in configlines or \
'BR2_TOOLCHAIN_EXTERNAL_LINARO_ARMEB=y\n' in configlines: 'BR2_TOOLCHAIN_EXTERNAL_LINARO_ARMEB=y\n' in configlines:
proc = yield from asyncio.create_subprocess_exec( proc = await asyncio.create_subprocess_exec(
'ldd', '--version', stdout=asyncio.subprocess.PIPE) 'ldd', '--version', stdout=asyncio.subprocess.PIPE)
ldd_version_output, _ = yield from proc.communicate() ldd_version_output, _ = await proc.communicate()
if proc.returncode: if proc.returncode:
return False return False
glibc_version = ldd_version_output.decode().splitlines()[0].split()[-1] glibc_version = ldd_version_output.decode().splitlines()[0].split()[-1]
@ -193,8 +186,7 @@ def is_toolchain_usable(configfile, config):
return True return True
@coroutine async def fixup_config(sysinfo, configfile):
def fixup_config(sysinfo, configfile):
"""Finalize the configuration and reject any problematic combinations """Finalize the configuration and reject any problematic combinations
This function returns 'True' when the configuration has been This function returns 'True' when the configuration has been
@ -210,8 +202,7 @@ def fixup_config(sysinfo, configfile):
BR2_TOOLCHAIN_EXTERNAL_URL = 'BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/' BR2_TOOLCHAIN_EXTERNAL_URL = 'BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/'
has_java = yield from sysinfo.has("java") if "BR2_NEEDS_HOST_JAVA=y\n" in configlines and not await sysinfo.has("java"):
if "BR2_NEEDS_HOST_JAVA=y\n" in configlines and not has_java:
return False return False
# The ctng toolchain is affected by PR58854 # The ctng toolchain is affected by PR58854
if 'BR2_PACKAGE_LTTNG_TOOLS=y\n' in configlines and \ if 'BR2_PACKAGE_LTTNG_TOOLS=y\n' in configlines and \
@ -681,8 +672,7 @@ def fixup_config(sysinfo, configfile):
return True return True
@coroutine async def gen_config(args):
def gen_config(args):
"""Generate a new random configuration """Generate a new random configuration
This function generates the configuration, by choosing a random This function generates the configuration, by choosing a random
@ -740,8 +730,7 @@ def gen_config(args):
# Randomly enable BR2_REPRODUCIBLE 10% of times # Randomly enable BR2_REPRODUCIBLE 10% of times
# also enable tar filesystem images for testing # also enable tar filesystem images for testing
has_diffoscope = yield from sysinfo.has("diffoscope") if await sysinfo.has("diffoscope") and randint(0, 10) == 0:
if has_diffoscope and randint(0, 10) == 0:
configlines.append("BR2_REPRODUCIBLE=y\n") configlines.append("BR2_REPRODUCIBLE=y\n")
configlines.append("BR2_TARGET_ROOTFS_TAR=y\n") configlines.append("BR2_TARGET_ROOTFS_TAR=y\n")
@ -755,14 +744,13 @@ def gen_config(args):
with open(configfile, "w+") as configf: with open(configfile, "w+") as configf:
configf.writelines(configlines) configf.writelines(configlines)
proc = yield from asyncio.create_subprocess_exec( proc = await asyncio.create_subprocess_exec(
"make", "O=%s" % args.outputdir, "-C", args.buildrootdir, "olddefconfig") "make", "O=%s" % args.outputdir, "-C", args.buildrootdir, "olddefconfig")
ret = yield from proc.wait() ret = await proc.wait()
if ret: if ret:
return ret return ret
toolchain_usable = yield from is_toolchain_usable(configfile, toolchainconfig) if not await is_toolchain_usable(configfile, toolchainconfig):
if not toolchain_usable:
return 2 return 2
# Now, generate the random selection of packages, and fixup # Now, generate the random selection of packages, and fixup
@ -776,37 +764,33 @@ def gen_config(args):
file=sys.stderr) file=sys.stderr)
return 1 return 1
bounded_loop -= 1 bounded_loop -= 1
make_rand = [ proc = await asyncio.create_subprocess_exec(
"make", "O=%s" % args.outputdir, "-C", args.buildrootdir, "make", "O=%s" % args.outputdir, "-C", args.buildrootdir,
"KCONFIG_SEED=0x%s" % hexlify(os.urandom(4)).decode("ascii").upper(), "KCONFIG_SEED=0x%s" % hexlify(os.urandom(4)).decode("ascii").upper(),
"KCONFIG_PROBABILITY=%d" % randint(1, 20), "KCONFIG_PROBABILITY=%d" % randint(1, 20),
"randpackageconfig" if args.toolchains_csv else "randconfig" "randpackageconfig" if args.toolchains_csv else "randconfig")
] ret = await proc.wait()
proc = yield from asyncio.create_subprocess_exec(*make_rand)
ret = yield from proc.wait()
if ret: if ret:
return ret return ret
ret = yield from fixup_config(sysinfo, configfile) if await fixup_config(sysinfo, configfile):
if ret:
break break
proc = yield from asyncio.create_subprocess_exec( proc = await asyncio.create_subprocess_exec(
"make", "O=%s" % args.outputdir, "-C", args.buildrootdir, "olddefconfig") "make", "O=%s" % args.outputdir, "-C", args.buildrootdir, "olddefconfig")
ret = yield from proc.wait() ret = await proc.wait()
if ret: if ret:
return ret return ret
proc = yield from asyncio.create_subprocess_exec( proc = await asyncio.create_subprocess_exec(
"make", "O=%s" % args.outputdir, "-C", args.buildrootdir, "savedefconfig") "make", "O=%s" % args.outputdir, "-C", args.buildrootdir, "savedefconfig")
ret = yield from proc.wait() ret = await proc.wait()
if ret: if ret:
return ret return ret
proc = yield from asyncio.create_subprocess_exec( proc = await asyncio.create_subprocess_exec(
"make", "O=%s" % args.outputdir, "-C", args.buildrootdir, "dependencies") "make", "O=%s" % args.outputdir, "-C", args.buildrootdir, "dependencies")
ret = yield from proc.wait() return await proc.wait()
return ret
if __name__ == '__main__': if __name__ == '__main__':