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:
parent
626c967c5f
commit
58ec14fe8f
@ -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__':
|
||||||
|
Loading…
Reference in New Issue
Block a user