#!/usr/bin/env python3

# Copyright (C) 2014 by Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

# This script generates a random configuration for testing Buildroot.

from binascii import hexlify
import asyncio
import csv
import os
from random import randint
import sys
import traceback
from distutils.version import StrictVersion
import platform

if sys.version_info < (3, 8):
    from asyncio import coroutine
else:
    from types import coroutine


class SystemInfo:
    DEFAULT_NEEDED_PROGS = ["make", "git", "gcc", "timeout"]
    DEFAULT_OPTIONAL_PROGS = ["bzr", "java", "javac", "jar", "diffoscope"]

    def __init__(self):
        self.needed_progs = list(self.__class__.DEFAULT_NEEDED_PROGS)
        self.optional_progs = list(self.__class__.DEFAULT_OPTIONAL_PROGS)
        self.progs = {}

    def find_prog(self, name, flags=os.X_OK, env=os.environ):
        if not name or name[0] == os.sep:
            raise ValueError(name)

        prog_path = env.get("PATH", None)
        # for windows compatibility, we'd need to take PATHEXT into account

        if prog_path:
            for prog_dir in filter(None, prog_path.split(os.pathsep)):
                # os.join() not necessary: non-empty prog_dir
                # and name[0] != os.sep
                prog = prog_dir + os.sep + name
                if os.access(prog, flags):
                    return prog
        # --
        return None

    @coroutine
    def has(self, prog):
        """Checks whether a program is available.
        Lazily evaluates missing entries.

        Returns: None if prog not found, else path to the program [evaluates
        to True]
        """
        try:
            return self.progs[prog]
        except KeyError:
            pass

        have_it = self.find_prog(prog)
        # java[c] needs special care
        if have_it and prog in ('java', 'javac'):
            proc = yield from asyncio.create_subprocess_shell(
                "%s -version | grep gcj" % prog,
                stdout=asyncio.subprocess.DEVNULL,
                stderr=asyncio.subprocess.DEVNULL)
            ret = yield from proc.wait()
            if ret != 1:
                have_it = False
        # --
        self.progs[prog] = have_it
        return have_it

    def check_requirements(self):
        """Checks program dependencies.

        Returns: True if all mandatory programs are present, else False.
        """
        do_check_has_prog = self.has

        missing_requirements = False
        for prog in self.needed_progs:
            if not do_check_has_prog(prog):
                print("ERROR: your system lacks the '%s' program" % prog)
                missing_requirements = True

        # check optional programs here,
        # else they'd get checked by each worker instance
        for prog in self.optional_progs:
            do_check_has_prog(prog)

        return not missing_requirements


def get_toolchain_configs(toolchains_csv, buildrootdir):
    """Fetch and return the possible toolchain configurations

    This function returns an array of toolchain configurations. Each
    toolchain configuration is itself an array of lines of the defconfig.
    """

    with open(toolchains_csv) as r:
        # filter empty lines and comments
        lines = [t for t in r.readlines() if len(t.strip()) > 0 and t[0] != '#']
        toolchains = lines
    configs = []

    (_, _, _, _, hostarch) = os.uname()
    # ~2015 distros report x86 when on a 32bit install
    if hostarch == 'i686' or hostarch == 'i386' or hostarch == 'x86':
        hostarch = 'x86'

    for row in csv.reader(toolchains):
        config = {}
        configfile = row[0]
        config_hostarch = row[1]
        keep = False

        # Keep all toolchain configs that work regardless of the host
        # architecture
        if config_hostarch == "any":
            keep = True

        # Keep all toolchain configs that can work on the current host
        # architecture
        if hostarch == config_hostarch:
            keep = True

        # Assume that x86 32 bits toolchains work on x86_64 build
        # machines
        if hostarch == 'x86_64' and config_hostarch == "x86":
            keep = True

        if not keep:
            continue

        if not os.path.isabs(configfile):
            configfile = os.path.join(buildrootdir, configfile)

        with open(configfile) as r:
            config = r.readlines()
        configs.append(config)
    return configs


@coroutine
def is_toolchain_usable(configfile, config):
    """Check if the toolchain is actually usable."""

    with open(configfile) as configf:
        configlines = configf.readlines()

    # Check that the toolchain configuration is still present
    for toolchainline in config:
        if toolchainline not in configlines:
            print("WARN: toolchain can't be used", file=sys.stderr)
            print("      Missing: %s" % toolchainline.strip(), file=sys.stderr)
            return False

    # The latest Linaro toolchains on x86-64 hosts requires glibc
    # 2.14+ on the host.
    if platform.machine() == 'x86_64':
        if 'BR2_TOOLCHAIN_EXTERNAL_LINARO_ARM=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_ARMEB=y\n' in configlines:
            proc = yield from asyncio.create_subprocess_exec(
                'ldd', '--version', stdout=asyncio.subprocess.PIPE)
            ldd_version_output, _ = yield from proc.communicate()
            if proc.returncode:
                return False
            glibc_version = ldd_version_output.decode().splitlines()[0].split()[-1]
            if StrictVersion('2.14') > StrictVersion(glibc_version):
                print("WARN: ignoring the Linaro ARM toolchains because too old host glibc", file=sys.stderr)
                return False

    return True


@coroutine
def fixup_config(sysinfo, configfile):
    """Finalize the configuration and reject any problematic combinations

    This function returns 'True' when the configuration has been
    accepted, and 'False' when the configuration has not been accepted because
    it is known to fail (in which case another random configuration will be
    generated).
    """

    with open(configfile) as configf:
        configlines = configf.readlines()

    ROOTFS_SIZE = '5G'

    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 has_java:
        return False
    # The ctng toolchain is affected by PR58854
    if 'BR2_PACKAGE_LTTNG_TOOLS=y\n' in configlines and \
       BR2_TOOLCHAIN_EXTERNAL_URL + 'armv5-ctng-linux-gnueabi.tar.xz"\n' in configlines:
        return False
    # The ctng toolchain tigger an assembler error with guile package when compiled with -Os (same issue as for CS ARM 2014.05-29)
    if 'BR2_PACKAGE_GUILE=y\n' in configlines and \
       'BR2_OPTIMIZE_S=y\n' in configlines and \
       BR2_TOOLCHAIN_EXTERNAL_URL + 'armv5-ctng-linux-gnueabi.tar.xz"\n' in configlines:
        return False
    # The ctng toolchain is affected by PR58854
    if 'BR2_PACKAGE_LTTNG_TOOLS=y\n' in configlines and \
       BR2_TOOLCHAIN_EXTERNAL_URL + 'armv6-ctng-linux-uclibcgnueabi.tar.xz"\n' in configlines:
        return False
    # The ctng toolchain is affected by PR58854
    if 'BR2_PACKAGE_LTTNG_TOOLS=y\n' in configlines and \
       BR2_TOOLCHAIN_EXTERNAL_URL + 'armv7-ctng-linux-gnueabihf.tar.xz"\n' in configlines:
        return False
    # The ctng toolchain is affected by PR60155
    if 'BR2_PACKAGE_SDL=y\n' in configlines and \
       BR2_TOOLCHAIN_EXTERNAL_URL + 'powerpc-ctng-linux-uclibc.tar.xz"\n' in configlines:
        return False
    # The ctng toolchain is affected by PR60155
    if 'BR2_PACKAGE_LIBMPEG2=y\n' in configlines and \
       BR2_TOOLCHAIN_EXTERNAL_URL + 'powerpc-ctng-linux-uclibc.tar.xz"\n' in configlines:
        return False
    # This MIPS toolchain uses eglibc-2.18 which lacks SYS_getdents64
    if 'BR2_PACKAGE_STRONGSWAN=y\n' in configlines and \
       BR2_TOOLCHAIN_EXTERNAL_URL + 'mips64el-ctng_n64-linux-gnu.tar.xz"\n' in configlines:
        return False
    # This MIPS toolchain uses eglibc-2.18 which lacks SYS_getdents64
    if 'BR2_PACKAGE_PYTHON3=y\n' in configlines and \
       BR2_TOOLCHAIN_EXTERNAL_URL + 'mips64el-ctng_n64-linux-gnu.tar.xz"\n' in configlines:
        return False
    # libffi not available on ARMv7-M, but propagating libffi arch
    # dependencies in Buildroot is really too much work, so we handle
    # this here.
    if 'BR2_ARM_CPU_ARMV7M=y\n' in configlines and \
       'BR2_PACKAGE_LIBFFI=y\n' in configlines:
        return False
    # libopenssl needs atomic, but propagating this dependency in
    # Buildroot is really too much work, so we handle this here.
    if 'BR2_PACKAGE_LIBOPENSSL=y\n' in configlines and \
       'BR2_TOOLCHAIN_HAS_ATOMIC=y\n' not in configlines:
        return False
    if 'BR2_PACKAGE_SUNXI_BOARDS=y\n' in configlines:
        configlines.remove('BR2_PACKAGE_SUNXI_BOARDS_FEX_FILE=""\n')
        configlines.append('BR2_PACKAGE_SUNXI_BOARDS_FEX_FILE="a10/hackberry.fex"\n')
    # This MIPS uClibc toolchain fails to build the gdb package
    if 'BR2_PACKAGE_GDB=y\n' in configlines and \
       BR2_TOOLCHAIN_EXTERNAL_URL + 'mipsel-ctng-linux-uclibc.tar.xz"\n' in configlines:
        return False
    # This MIPS uClibc toolchain fails to build the rt-tests package
    if 'BR2_PACKAGE_RT_TESTS=y\n' in configlines and \
       BR2_TOOLCHAIN_EXTERNAL_URL + 'mipsel-ctng-linux-uclibc.tar.xz"\n' in configlines:
        return False
    # This MIPS uClibc toolchain fails to build the civetweb package
    if 'BR2_PACKAGE_CIVETWEB=y\n' in configlines and \
       BR2_TOOLCHAIN_EXTERNAL_URL + 'mipsel-ctng-linux-uclibc.tar.xz"\n' in configlines:
        return False
    # This MIPS ctng toolchain fails to build the python3 package
    if 'BR2_PACKAGE_PYTHON3=y\n' in configlines and \
       BR2_TOOLCHAIN_EXTERNAL_URL + 'mips64el-ctng_n64-linux-gnu.tar.xz"\n' in configlines:
        return False
    # This MIPS uClibc toolchain fails to build the strace package
    if 'BR2_PACKAGE_STRACE=y\n' in configlines and \
       BR2_TOOLCHAIN_EXTERNAL_URL + 'mipsel-ctng-linux-uclibc.tar.xz"\n' in configlines:
        return False
    # This MIPS uClibc toolchain fails to build the cdrkit package
    if 'BR2_PACKAGE_CDRKIT=y\n' in configlines and \
       'BR2_STATIC_LIBS=y\n' in configlines and \
       BR2_TOOLCHAIN_EXTERNAL_URL + 'mipsel-ctng-linux-uclibc.tar.xz"\n' in configlines:
        return False
    # uClibc vfork static linking issue
    if 'BR2_PACKAGE_ALSA_LIB=y\n' in configlines and \
       'BR2_STATIC_LIBS=y\n' in configlines and \
       BR2_TOOLCHAIN_EXTERNAL_URL + 'i486-ctng-linux-uclibc.tar.xz"\n' in configlines:
        return False
    # This MIPS uClibc toolchain fails to build the weston package
    if 'BR2_PACKAGE_WESTON=y\n' in configlines and \
       BR2_TOOLCHAIN_EXTERNAL_URL + 'mipsel-ctng-linux-uclibc.tar.xz"\n' in configlines:
        return False
    # The cs nios2 2017.02 toolchain is affected by binutils PR19405
    if 'BR2_TOOLCHAIN_EXTERNAL_CODESOURCERY_NIOSII=y\n' in configlines and \
       'BR2_PACKAGE_BOOST=y\n' in configlines:
        return False
    # The cs nios2 2017.02 toolchain is affected by binutils PR19405
    if 'BR2_TOOLCHAIN_EXTERNAL_CODESOURCERY_NIOSII=y\n' in configlines and \
       'BR2_PACKAGE_QT5BASE_GUI=y\n' in configlines:
        return False
    # The cs nios2 2017.02 toolchain is affected by binutils PR19405
    if 'BR2_TOOLCHAIN_EXTERNAL_CODESOURCERY_NIOSII=y\n' in configlines and \
       'BR2_PACKAGE_FLANN=y\n' in configlines:
        return False
    # No C library for internal toolchain
    if 'BR2_TOOLCHAIN_BUILDROOT_NONE=y' in configlines:
        return False
    # Xtensa custom cores require an overlay file with internal
    # toolchains
    if 'BR2_XTENSA_CUSTOM=y' in configlines and \
       'BR2_TOOLCHAIN_BUILDROOT=y' in configlines:
        return False

    if 'BR2_TOOLCHAIN_BARE_METAL_BUILDROOT=y\n' in configlines:
        configlines.remove('BR2_TOOLCHAIN_BARE_METAL_BUILDROOT_ARCH=""\n')
        configlines.append('BR2_TOOLCHAIN_BARE_METAL_BUILDROOT_ARCH="microblazeel-xilinx-elf"\n')

    if 'BR2_PACKAGE_AUFS_UTIL=y\n' in configlines and \
       'BR2_PACKAGE_AUFS_UTIL_VERSION=""\n' in configlines:
        return False
    if 'BR2_PACKAGE_A10DISP=y\n' in configlines:
        return False

    if 'BR2_PACKAGE_HOST_UBOOT_TOOLS_ENVIMAGE=y\n' in configlines and \
       'BR2_PACKAGE_HOST_UBOOT_TOOLS_ENVIMAGE_SOURCE=""\n' in configlines and \
       'BR2_PACKAGE_HOST_UBOOT_TOOLS_ENVIMAGE_SIZE=""\n' in configlines:
        bootenv = os.path.join(args.outputdir, "boot_env.txt")
        with open(bootenv, "w+") as bootenvf:
            bootenvf.write("prop=value")
        configlines.remove('BR2_PACKAGE_HOST_UBOOT_TOOLS_ENVIMAGE_SOURCE=""\n')
        configlines.append('BR2_PACKAGE_HOST_UBOOT_TOOLS_ENVIMAGE_SOURCE="%s"\n' % bootenv)
        configlines.remove('BR2_PACKAGE_HOST_UBOOT_TOOLS_ENVIMAGE_SIZE=""\n')
        configlines.append('BR2_PACKAGE_HOST_UBOOT_TOOLS_ENVIMAGE_SIZE="0x1000"\n')

    if 'BR2_PACKAGE_HOST_UBOOT_TOOLS_BOOT_SCRIPT=y\n' in configlines and \
       'BR2_PACKAGE_HOST_UBOOT_TOOLS_BOOT_SCRIPT_SOURCE=""\n' in configlines:
        bootscr = os.path.join(args.outputdir, "boot_script.txt")
        with open(bootscr, "w+") as bootscrf:
            bootscrf.write("prop=value")
        configlines.remove('BR2_PACKAGE_HOST_UBOOT_TOOLS_BOOT_SCRIPT_SOURCE=""\n')
        configlines.append('BR2_PACKAGE_HOST_UBOOT_TOOLS_BOOT_SCRIPT_SOURCE="%s"\n' % bootscr)

    if 'BR2_ROOTFS_SKELETON_CUSTOM=y\n' in configlines and \
       'BR2_ROOTFS_SKELETON_CUSTOM_PATH=""\n' in configlines:
        configlines.remove('BR2_ROOTFS_SKELETON_CUSTOM=y\n')
        configlines.remove('BR2_ROOTFS_SKELETON_CUSTOM_PATH=""\n')

    if 'BR2_LINUX_KERNEL=y\n' in configlines and \
       'BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y\n' in configlines and \
       'BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE=""\n' in configlines:
        configlines.remove('BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y\n')
        configlines.append('BR2_LINUX_KERNEL_USE_ARCH_DEFAULT_CONFIG=y\n')
        configlines.remove('BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE=""\n')

    if 'BR2_LINUX_KERNEL=y\n' in configlines and \
       'BR2_LINUX_KERNEL_USE_DEFCONFIG=y\n' in configlines and \
       'BR2_LINUX_KERNEL_DEFCONFIG=""\n' in configlines:
        configlines.remove('BR2_LINUX_KERNEL_USE_DEFCONFIG=y\n')
        configlines.append('BR2_LINUX_KERNEL_USE_ARCH_DEFAULT_CONFIG=y\n')
        configlines.remove('BR2_LINUX_KERNEL_DEFCONFIG=""\n')

    if 'BR2_LINUX_KERNEL=y\n' in configlines and \
       'BR2_LINUX_KERNEL_CUSTOM_GIT=y\n' in configlines and \
       'BR2_LINUX_KERNEL_CUSTOM_REPO_URL=""\n' in configlines:
        configlines.remove('BR2_LINUX_KERNEL_CUSTOM_GIT=y\n')
        configlines.append('BR2_LINUX_KERNEL_LATEST_VERSION=y\n')
        configlines.remove('BR2_LINUX_KERNEL_CUSTOM_REPO_URL=""\n')

    if 'BR2_LINUX_KERNEL=y\n' in configlines and \
       'BR2_LINUX_KERNEL_CUSTOM_HG=y\n' in configlines and \
       'BR2_LINUX_KERNEL_CUSTOM_REPO_URL=""\n' in configlines:
        configlines.remove('BR2_LINUX_KERNEL_CUSTOM_HG=y\n')
        configlines.append('BR2_LINUX_KERNEL_LATEST_VERSION=y\n')
        configlines.remove('BR2_LINUX_KERNEL_CUSTOM_REPO_URL=""\n')

    if 'BR2_LINUX_KERNEL=y\n' in configlines and \
       'BR2_LINUX_KERNEL_CUSTOM_SVN=y\n' in configlines and \
       'BR2_LINUX_KERNEL_CUSTOM_REPO_URL=""\n' in configlines:
        configlines.remove('BR2_LINUX_KERNEL_CUSTOM_SVN=y\n')
        configlines.append('BR2_LINUX_KERNEL_LATEST_VERSION=y\n')
        configlines.remove('BR2_LINUX_KERNEL_CUSTOM_REPO_URL=""\n')

    if 'BR2_LINUX_KERNEL=y\n' in configlines and \
       'BR2_LINUX_KERNEL_CUSTOM_TARBALL=y\n' in configlines and \
       'BR2_LINUX_KERNEL_CUSTOM_TARBALL_LOCATION=""\n' in configlines:
        configlines.remove('BR2_LINUX_KERNEL_CUSTOM_TARBALL=y\n')
        configlines.append('BR2_LINUX_KERNEL_LATEST_VERSION=y\n')
        configlines.remove('BR2_LINUX_KERNEL_CUSTOM_TARBALL_LOCATION=""\n')

    if 'BR2_LINUX_KERNEL=y\n' in configlines and \
       'BR2_LINUX_KERNEL_CUSTOM_VERSION=y\n' in configlines and \
       'BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE=""\n' in configlines:
        configlines.remove('BR2_LINUX_KERNEL_CUSTOM_VERSION=y\n')
        configlines.append('BR2_LINUX_KERNEL_LATEST_VERSION=y\n')
        configlines.remove('BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE=""\n')

    if 'BR2_LINUX_KERNEL=y\n' in configlines and \
       'BR2_LINUX_KERNEL_DTS_SUPPORT=y\n' in configlines and \
       'BR2_LINUX_KERNEL_INTREE_DTS_NAME=""\n' in configlines and \
       'BR2_LINUX_KERNEL_CUSTOM_DTS_PATH=""\n' in configlines:
        configlines.remove('BR2_LINUX_KERNEL_DTS_SUPPORT=y\n')
        configlines.remove('BR2_LINUX_KERNEL_INTREE_DTS_NAME=""\n')
        configlines.remove('BR2_LINUX_KERNEL_CUSTOM_DTS_PATH=""\n')
        if 'BR2_LINUX_KERNEL_APPENDED_UIMAGE=y\n' in configlines:
            configlines.remove('BR2_LINUX_KERNEL_APPENDED_UIMAGE=y\n')
            configlines.append('BR2_LINUX_KERNEL_UIMAGE=y\n')
        if 'BR2_LINUX_KERNEL_APPENDED_ZIMAGE=y\n' in configlines:
            configlines.remove('BR2_LINUX_KERNEL_APPENDED_ZIMAGE=y\n')
            configlines.append('BR2_LINUX_KERNEL_ZIMAGE=y\n')
        if 'BR2_LINUX_KERNEL_CUIMAGE=y\n' in configlines:
            configlines.remove('BR2_LINUX_KERNEL_CUIMAGE=y\n')
            configlines.append('BR2_LINUX_KERNEL_UIMAGE=y\n')
        if 'BR2_LINUX_KERNEL_SIMPLEIMAGE=y\n' in configlines:
            configlines.remove('BR2_LINUX_KERNEL_SIMPLEIMAGE=y\n')
            configlines.append('BR2_LINUX_KERNEL_VMLINUX=y\n')

    if 'BR2_LINUX_KERNEL_EXT_AUFS=y\n' in configlines and \
       'BR2_LINUX_KERNEL_EXT_AUFS_VERSION=""\n' in configlines:
        configlines.remove('BR2_LINUX_KERNEL_EXT_AUFS=y\n')
        configlines.remove('BR2_LINUX_KERNEL_EXT_AUFS_VERSION=""\n')

    if 'BR2_PACKAGE_LINUX_BACKPORTS=y\n' in configlines and \
       'BR2_PACKAGE_LINUX_BACKPORTS_USE_CUSTOM_CONFIG=y\n' in configlines and \
       'BR2_PACKAGE_LINUX_BACKPORTS_CUSTOM_CONFIG_FILE=""\n' in configlines:
        configlines.remove('BR2_PACKAGE_LINUX_BACKPORTS=y\n')
        configlines.remove('BR2_PACKAGE_LINUX_BACKPORTS_USE_CUSTOM_CONFIG=y\n')
        configlines.remove('BR2_PACKAGE_LINUX_BACKPORTS_CUSTOM_CONFIG_FILE=""\n')

    if 'BR2_PACKAGE_LINUX_BACKPORTS=y\n' in configlines and \
       'BR2_PACKAGE_LINUX_BACKPORTS_USE_DEFCONFIG=y\n' in configlines and \
       'BR2_PACKAGE_LINUX_BACKPORTS_DEFCONFIG=""\n' in configlines:
        configlines.remove('BR2_PACKAGE_LINUX_BACKPORTS=y\n')
        configlines.remove('BR2_PACKAGE_LINUX_BACKPORTS_USE_DEFCONFIG=y\n')
        configlines.remove('BR2_PACKAGE_LINUX_BACKPORTS_DEFCONFIG=""\n')

    if 'BR2_KERNEL_HEADERS_VERSION=y\n' in configlines and \
       'BR2_DEFAULT_KERNEL_VERSION=""\n' in configlines:
        configlines.remove('BR2_KERNEL_HEADERS_VERSION=y\n')
        configlines.remove('BR2_DEFAULT_KERNEL_VERSION=""\n')

    if 'BR2_KERNEL_HEADERS_CUSTOM_GIT=y\n' in configlines and \
       'BR2_KERNEL_HEADERS_CUSTOM_REPO_URL=""\n':
        configlines.remove('BR2_KERNEL_HEADERS_CUSTOM_GIT=y\n')
        configlines.remove('BR2_KERNEL_HEADERS_CUSTOM_REPO_URL=""\n')

    if 'BR2_KERNEL_HEADERS_CUSTOM_TARBALL=y\n' in configlines and \
       'BR2_KERNEL_HEADERS_CUSTOM_TARBALL_LOCATION=""\n' in configlines:
        configlines.remove('BR2_KERNEL_HEADERS_CUSTOM_TARBALL=y\n')
        configlines.remove('BR2_KERNEL_HEADERS_CUSTOM_TARBALL_LOCATION=""\n')

    if 'BR2_TARGET_ARM_TRUSTED_FIRMWARE=y\n' in configlines and \
       'BR2_TARGET_ARM_TRUSTED_FIRMWARE_PLATFORM=""\n' in configlines:
        return False

    if 'BR2_TARGET_ARM_TRUSTED_FIRMWARE=y\n' in configlines and \
       'BR2_TARGET_ARM_TRUSTED_FIRMWARE_CUSTOM_VERSION=y\n' in configlines and \
       'BR2_TARGET_ARM_TRUSTED_FIRMWARE_CUSTOM_VERSION_VALUE=""\n' in configlines:
        configlines.remove('BR2_TARGET_ARM_TRUSTED_FIRMWARE_CUSTOM_VERSION=y\n')
        configlines.append('BR2_TARGET_ARM_TRUSTED_FIRMWARE_LATEST_VERSION=y\n')
        configlines.remove('BR2_TARGET_ARM_TRUSTED_FIRMWARE_CUSTOM_VERSION_VALUE=""\n')

    if 'BR2_TARGET_ARM_TRUSTED_FIRMWARE=y\n' in configlines and \
       'BR2_TARGET_ARM_TRUSTED_FIRMWARE_CUSTOM_TARBALL=y\n' in configlines and \
       'BR2_TARGET_ARM_TRUSTED_FIRMWARE_CUSTOM_TARBALL_LOCATION=""\n' in configlines:
        configlines.remove('BR2_TARGET_ARM_TRUSTED_FIRMWARE_CUSTOM_TARBALL=y\n')
        configlines.append('BR2_TARGET_ARM_TRUSTED_FIRMWARE_LATEST_VERSION=y\n')
        configlines.remove('BR2_TARGET_ARM_TRUSTED_FIRMWARE_CUSTOM_TARBALL_LOCATION=""\n')

    if 'BR2_TARGET_ARM_TRUSTED_FIRMWARE=y\n' in configlines and \
       'BR2_TARGET_ARM_TRUSTED_FIRMWARE_CUSTOM_GIT=y\n' in configlines and \
       'BR2_TARGET_ARM_TRUSTED_FIRMWARE_CUSTOM_REPO_URL=""\n' in configlines:
        configlines.remove('BR2_TARGET_ARM_TRUSTED_FIRMWARE_CUSTOM_GIT=y\n')
        configlines.append('BR2_TARGET_ARM_TRUSTED_FIRMWARE_LATEST_VERSION=y\n')
        configlines.remove('BR2_TARGET_ARM_TRUSTED_FIRMWARE_CUSTOM_REPO_URL=""\n')

    if 'BR2_TARGET_AT91BOOTSTRAP3=y\n' in configlines and \
       'BR2_TARGET_AT91BOOTSTRAP3_DEFCONFIG=""\n' in configlines:
        configlines.remove('BR2_TARGET_AT91BOOTSTRAP3=y\n')
        configlines.remove('BR2_TARGET_AT91BOOTSTRAP3_DEFCONFIG=""\n')

    if 'BR2_TARGET_BAREBOX=y\n' in configlines and \
       'BR2_TARGET_BAREBOX_USE_CUSTOM_CONFIG=y\n' in configlines and \
       'BR2_TARGET_BAREBOX_CUSTOM_CONFIG_FILE=""\n' in configlines:
        configlines.remove('BR2_TARGET_BAREBOX=y\n')
        configlines.remove('BR2_TARGET_BAREBOX_USE_CUSTOM_CONFIG=y\n')
        configlines.remove('BR2_TARGET_BAREBOX_CUSTOM_CONFIG_FILE=""\n')

    if 'BR2_TARGET_BAREBOX=y\n' in configlines and \
       'BR2_TARGET_BAREBOX_USE_DEFCONFIG=y\n' in configlines and \
       'BR2_TARGET_BAREBOX_BOARD_DEFCONFIG=""\n' in configlines:
        configlines.remove('BR2_TARGET_BAREBOX=y\n')
        configlines.remove('BR2_TARGET_BAREBOX_USE_DEFCONFIG=y\n')
        configlines.remove('BR2_TARGET_BAREBOX_BOARD_DEFCONFIG=""\n')

    if 'BR2_TARGET_BOOT_WRAPPER_AARCH64=y\n' in configlines and \
       'BR2_TARGET_BOOT_WRAPPER_AARCH64_DTS=""\n' in configlines:
        return False

    if 'BR2_TARGET_OPTEE_OS=y\n' in configlines and \
       'BR2_TARGET_OPTEE_OS_CUSTOM_TARBALL=y\n' in configlines and \
       'BR2_TARGET_OPTEE_OS_CUSTOM_TARBALL_LOCATION=""\n' in configlines:
        configlines.remove('BR2_TARGET_OPTEE_OS_CUSTOM_TARBALL=y\n')
        configlines.append('BR2_TARGET_OPTEE_OS_LATEST=y\n')
        configlines.remove('BR2_TARGET_OPTEE_OS_CUSTOM_TARBALL_LOCATION=""\n')

    if 'BR2_TARGET_OPTEE_OS=y\n' in configlines and \
       'BR2_TARGET_OPTEE_OS_PLATFORM=""\n' in configlines:
        configlines.remove('BR2_TARGET_OPTEE_OS=y\n')
        configlines.remove('BR2_TARGET_OPTEE_OS_PLATFORM=""\n')

    if 'BR2_TARGET_ROOTFS_CRAMFS=y\n' in configlines:
        configlines.remove('BR2_TARGET_ROOTFS_CRAMFS=y\n')

    if 'BR2_TARGET_ROOTFS_EXT2=y\n' in configlines and \
       'BR2_TARGET_ROOTFS_EXT2_SIZE="60M"\n' in configlines:
        configlines.remove('BR2_TARGET_ROOTFS_EXT2_SIZE="60M"\n')
        configlines.append('BR2_TARGET_ROOTFS_EXT2_SIZE="%s"\n' % ROOTFS_SIZE)

    if 'BR2_TARGET_ROOTFS_F2FS=y\n' in configlines and \
       'BR2_TARGET_ROOTFS_F2FS_SIZE="100M"\n' in configlines:
        configlines.remove('BR2_TARGET_ROOTFS_F2FS_SIZE="100M"\n')
        configlines.append('BR2_TARGET_ROOTFS_F2FS_SIZE="%s"\n' % ROOTFS_SIZE)

    if 'BR2_TARGET_ROOTFS_UBIFS=y\n' in configlines and \
       'BR2_TARGET_ROOTFS_UBIFS_MAXLEBCNT=2048\n' in configlines:
        configlines.remove('BR2_TARGET_ROOTFS_UBIFS_MAXLEBCNT=2048\n')
        configlines.append('BR2_TARGET_ROOTFS_UBIFS_MAXLEBCNT=41610\n')

    if 'BR2_TARGET_ROOTFS_UBI=y\n' in configlines and \
       'BR2_TARGET_ROOTFS_UBI_USE_CUSTOM_CONFIG=y\n' in configlines and \
       'BR2_TARGET_ROOTFS_UBI_CUSTOM_CONFIG_FILE=""\n' in configlines:
        configlines.remove('BR2_TARGET_ROOTFS_UBI_USE_CUSTOM_CONFIG=y\n')
        configlines.remove('BR2_TARGET_ROOTFS_UBI_CUSTOM_CONFIG_FILE=""\n')

    if 'BR2_TARGET_S500_BOOTLOADER=y\n' in configlines and \
       'BR2_TARGET_S500_BOOTLOADER_BOARD=""\n' in configlines:
        configlines.remove('BR2_TARGET_S500_BOOTLOADER=y\n')
        configlines.remove('BR2_TARGET_S500_BOOTLOADER_BOARD=""\n')

    if 'BR2_TARGET_TI_K3_R5_LOADER=y\n' in configlines and \
       'BR2_TARGET_TI_K3_R5_LOADER_USE_DEFCONFIG=y\n' in configlines and \
       'BR2_TARGET_TI_K3_R5_LOADER_BOARD_DEFCONFIG=""\n' in configlines:
        return False

    if 'BR2_TARGET_UBOOT=y\n' in configlines and \
       'BR2_TARGET_UBOOT_BUILD_SYSTEM_KCONFIG=y\n' in configlines and \
       'BR2_TARGET_UBOOT_USE_CUSTOM_CONFIG=y\n' in configlines and \
       'BR2_TARGET_UBOOT_CUSTOM_CONFIG_FILE=""\n' in configlines:
        configlines.remove('BR2_TARGET_UBOOT=y\n')
        configlines.remove('BR2_TARGET_UBOOT_BUILD_SYSTEM_KCONFIG=y\n')
        configlines.remove('BR2_TARGET_UBOOT_USE_CUSTOM_CONFIG=y\n')
        configlines.remove('BR2_TARGET_UBOOT_CUSTOM_CONFIG_FILE=""\n')

    if 'BR2_TARGET_UBOOT=y\n' in configlines and \
       'BR2_TARGET_UBOOT_BUILD_SYSTEM_KCONFIG=y\n' in configlines and \
       'BR2_TARGET_UBOOT_USE_DEFCONFIG=y\n' in configlines and \
       'BR2_TARGET_UBOOT_BOARD_DEFCONFIG=""\n' in configlines:
        configlines.remove('BR2_TARGET_UBOOT=y\n')
        configlines.remove('BR2_TARGET_UBOOT_BUILD_SYSTEM_KCONFIG=y\n')
        configlines.remove('BR2_TARGET_UBOOT_USE_DEFCONFIG=y\n')
        configlines.remove('BR2_TARGET_UBOOT_BOARD_DEFCONFIG=""\n')

    if 'BR2_TARGET_UBOOT=y\n' in configlines and \
       'BR2_TARGET_UBOOT_BUILD_SYSTEM_LEGACY=y\n' in configlines and \
       'BR2_TARGET_UBOOT_BOARDNAME=""\n' in configlines:
        configlines.remove('BR2_TARGET_UBOOT=y\n')
        configlines.remove('BR2_TARGET_UBOOT_BUILD_SYSTEM_LEGACY=y\n')
        configlines.remove('BR2_TARGET_UBOOT_BOARDNAME=""\n')

    if 'BR2_TOOLCHAIN_EXTERNAL=y\n' in configlines and \
       'BR2_TOOLCHAIN_EXTERNAL_PREINSTALLED=y\n' in configlines and \
       'BR2_TOOLCHAIN_EXTERNAL_PATH=""\n' in configlines:
        configlines.remove('BR2_TOOLCHAIN_EXTERNAL=y\n')
        configlines.remove('BR2_TOOLCHAIN_EXTERNAL_PREINSTALLED=y\n')
        configlines.remove('BR2_TOOLCHAIN_EXTERNAL_PATH=""\n')
        if 'BR2_ARCH_HAS_NO_TOOLCHAIN_BUILDROOT=y\n' in configlines:
            return False

    if 'BR2_TOOLCHAIN_EXTERNAL=y\n' in configlines and \
       'BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y\n' in configlines and \
       'BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y\n' in configlines and \
       'BR2_TOOLCHAIN_EXTERNAL_URL=""\n' in configlines:
        configlines.remove('BR2_TOOLCHAIN_EXTERNAL=y\n')
        configlines.remove('BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y\n')
        configlines.remove('BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y\n')
        configlines.remove('BR2_TOOLCHAIN_EXTERNAL_URL=""\n')
        if 'BR2_ARCH_HAS_NO_TOOLCHAIN_BUILDROOT=y\n' in configlines:
            return False

    if 'BR2_TARGET_MXS_BOOTLETS=y\n' in configlines and \
       'BR2_TARGET_MXS_BOOTLETS_CUSTOM_BOARD=y\n' in configlines and \
       'BR2_TARGET_MXS_BOOTLETS_CUSTOM_BOARD_NAME=""\n' in configlines:
        configlines.remove('BR2_TARGET_MXS_BOOTLETS_CUSTOM_BOARD=y\n')
        configlines.append('BR2_TARGET_MXS_BOOTLETS_STMP37xx=y\n')
        configlines.remove('BR2_TARGET_MXS_BOOTLETS_CUSTOM_BOARD_NAME=""\n')

    if 'BR2_TARGET_MXS_BOOTLETS=y\n' in configlines and \
       'BR2_TARGET_MXS_BOOTLETS_CUSTOM_GIT=y\n' in configlines and \
       'BR2_TARGET_MXS_BOOTLETS_CUSTOM_GIT_URL=""\n' in configlines:
        configlines.remove('BR2_TARGET_MXS_BOOTLETS_CUSTOM_GIT=y\n')
        configlines.append('BR2_TARGET_MXS_BOOTLETS_FREESCALE=y\n')
        configlines.remove('BR2_TARGET_MXS_BOOTLETS_CUSTOM_GIT_URL=""\n')

    if 'BR2_TARGET_MXS_BOOTLETS=y\n' in configlines and \
       'BR2_TARGET_MXS_BOOTLETS_CUSTOM_TARBALL=y\n' in configlines and \
       'BR2_TARGET_MXS_BOOTLETS_CUSTOM_TARBALL_URL=""\n' in configlines:
        configlines.remove('BR2_TARGET_MXS_BOOTLETS_CUSTOM_TARBALL=y\n')
        configlines.append('BR2_TARGET_MXS_BOOTLETS_FREESCALE=y\n')
        configlines.remove('BR2_TARGET_MXS_BOOTLETS_CUSTOM_TARBALL_URL=""\n')

    if 'BR2_TARGET_OPENSBI=y\n' in configlines and \
       'BR2_TARGET_OPENSBI_CUSTOM_GIT=y\n' in configlines and \
       'BR2_TARGET_OPENSBI_CUSTOM_REPO_URL=""\n' in configlines:
        configlines.remove('BR2_TARGET_OPENSBI_CUSTOM_GIT=y\n')
        configlines.append('BR2_TARGET_OPENSBI_LATEST_VERSION=y\n')
        configlines.remove('BR2_TARGET_OPENSBI_CUSTOM_REPO_URL=""\n')

    if 'BR2_TARGET_OPENSBI=y\n' in configlines and \
       'BR2_TARGET_OPENSBI_CUSTOM_TARBALL=y\n' in configlines and \
       'BR2_TARGET_OPENSBI_CUSTOM_TARBALL_LOCATION=""\n' in configlines:
        configlines.remove('BR2_TARGET_OPENSBI_CUSTOM_TARBALL=y\n')
        configlines.append('BR2_TARGET_OPENSBI_LATEST_VERSION=y\n')
        configlines.remove('BR2_TARGET_OPENSBI_CUSTOM_TARBALL_LOCATION=""\n')

    if 'BR2_TARGET_OPENSBI=y\n' in configlines and \
       'BR2_TARGET_OPENSBI_CUSTOM_VERSION=y\n' in configlines and \
       'BR2_TARGET_OPENSBI_CUSTOM_VERSION_VALUE=""\n' in configlines:
        configlines.remove('BR2_TARGET_OPENSBI_CUSTOM_VERSION=y\n')
        configlines.append('BR2_TARGET_OPENSBI_LATEST_VERSION=y\n')
        configlines.remove('BR2_TARGET_OPENSBI_CUSTOM_VERSION_VALUE=""\n')

    if 'BR2_PACKAGE_REFPOLICY=y\n' in configlines and \
       'BR2_PACKAGE_REFPOLICY_CUSTOM_GIT=y\n' in configlines and \
       'BR2_PACKAGE_REFPOLICY_CUSTOM_REPO_URL=""\n' in configlines:
        configlines.remove('BR2_PACKAGE_REFPOLICY_CUSTOM_GIT=y\n')
        configlines.append('BR2_PACKAGE_REFPOLICY_UPSTREAM_VERSION=y\n')
        configlines.remove('BR2_PACKAGE_REFPOLICY_CUSTOM_REPO_URL=""\n')

    if 'BR2_PACKAGE_XENOMAI=y\n' in configlines and \
       'BR2_PACKAGE_XENOMAI_CUSTOM_GIT=y\n' in configlines and \
       'BR2_PACKAGE_XENOMAI_REPOSITORY=""\n' in configlines:
        configlines.remove('BR2_PACKAGE_XENOMAI_CUSTOM_GIT=y\n')
        configlines.append('BR2_PACKAGE_XENOMAI_LATEST_VERSION=y\n')
        configlines.remove('BR2_PACKAGE_XENOMAI_REPOSITORY=""\n')

    if 'BR2_PACKAGE_XENOMAI=y\n' in configlines and \
       'BR2_PACKAGE_XENOMAI_CUSTOM_TARBALL=y\n' in configlines and \
       'BR2_PACKAGE_XENOMAI_CUSTOM_TARBALL_URL=""\n' in configlines:
        configlines.remove('BR2_PACKAGE_XENOMAI_CUSTOM_TARBALL=y\n')
        configlines.append('BR2_PACKAGE_XENOMAI_LATEST_VERSION=y\n')
        configlines.remove('BR2_PACKAGE_XENOMAI_CUSTOM_TARBALL_URL=""\n')

    if 'BR2_PACKAGE_XENOMAI=y\n' in configlines and \
       'BR2_PACKAGE_XENOMAI_CUSTOM_VERSION=y\n' in configlines and \
       'BR2_PACKAGE_XENOMAI_CUSTOM_VERSION_VALUE=""\n' in configlines:
        configlines.remove('BR2_PACKAGE_XENOMAI_CUSTOM_VERSION=y\n')
        configlines.append('BR2_PACKAGE_XENOMAI_LATEST_VERSION=y\n')
        configlines.remove('BR2_PACKAGE_XENOMAI_CUSTOM_VERSION_VALUE=""\n')

    if 'BR2_PACKAGE_XVISOR=y\n' in configlines and \
       'BR2_PACKAGE_XVISOR_USE_CUSTOM_CONFIG=y\n' in configlines and \
       'BR2_PACKAGE_XVISOR_CUSTOM_CONFIG_FILE=""\n' in configlines:
        configlines.remove('BR2_PACKAGE_XVISOR_USE_CUSTOM_CONFIG=y\n')
        configlines.append('BR2_PACKAGE_XVISOR_USE_DEFCONFIG=y\n')
        configlines.remove('BR2_PACKAGE_XVISOR_CUSTOM_CONFIG_FILE=""\n')

    # Don't build igh-ethercat driver as they are highly
    # kernel-version specific
    for opt in ['8139TOO', 'E100', 'E1000', 'E1000E', 'R8169']:
        optstr = 'BR2_PACKAGE_IGH_ETHERCAT_%s=y\n' % opt
        if optstr in configlines:
            configlines.remove(optstr)

    with open(configfile, "w+") as configf:
        configf.writelines(configlines)

    return True


@coroutine
def gen_config(args):
    """Generate a new random configuration

    This function generates the configuration, by choosing a random
    toolchain configuration and then generating a random selection of
    packages.
    """

    sysinfo = SystemInfo()

    if args.toolchains_csv:
        # Select a random toolchain configuration
        configs = get_toolchain_configs(args.toolchains_csv, args.buildrootdir)

        i = randint(0, len(configs) - 1)
        toolchainconfig = configs[i]
    else:
        toolchainconfig = []

    configlines = list(toolchainconfig)

    # Combine with the minimal configuration
    minimalconfigfile = os.path.join(args.buildrootdir,
                                     'support/config-fragments/minimal.config')
    with open(minimalconfigfile) as minimalf:
        configlines += minimalf.readlines()

    # Allow hosts with old certificates to download over https
    configlines.append("BR2_WGET=\"wget --passive-ftp -nd -t 3 --no-check-certificate\"\n")

    # Per-package folder
    if randint(0, 15) == 0:
        configlines.append("BR2_PER_PACKAGE_DIRECTORIES=y\n")

    # Amend the configuration with a few things.
    if randint(0, 20) == 0:
        configlines.append("BR2_ENABLE_DEBUG=y\n")
    if randint(0, 20) == 0:
        configlines.append("BR2_ENABLE_RUNTIME_DEBUG=y\n")
    if randint(0, 1) == 0:
        configlines.append("BR2_INIT_BUSYBOX=y\n")
    elif randint(0, 15) == 0:
        configlines.append("BR2_INIT_SYSTEMD=y\n")
    elif randint(0, 10) == 0:
        configlines.append("BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_EUDEV=y\n")
    if randint(0, 20) == 0:
        configlines.append("BR2_STATIC_LIBS=y\n")
    if randint(0, 20) == 0:
        configlines.append("BR2_PACKAGE_PYTHON3_PY_ONLY=y\n")
    if randint(0, 5) == 0:
        configlines.append("BR2_OPTIMIZE_2=y\n")
    if randint(0, 4) == 0:
        configlines.append("BR2_SYSTEM_ENABLE_NLS=y\n")
    if randint(0, 4) == 0:
        configlines.append("BR2_FORTIFY_SOURCE_2=y\n")

    # Randomly enable BR2_REPRODUCIBLE 10% of times
    # also enable tar filesystem images for testing
    has_diffoscope = yield from sysinfo.has("diffoscope")
    if has_diffoscope and randint(0, 10) == 0:
        configlines.append("BR2_REPRODUCIBLE=y\n")
        configlines.append("BR2_TARGET_ROOTFS_TAR=y\n")

    # Write out the configuration file
    if not os.path.exists(args.outputdir):
        os.makedirs(args.outputdir)
    if args.outputdir == os.path.abspath(os.path.join(args.buildrootdir, "output")):
        configfile = os.path.join(args.buildrootdir, ".config")
    else:
        configfile = os.path.join(args.outputdir, ".config")
    with open(configfile, "w+") as configf:
        configf.writelines(configlines)

    proc = yield from asyncio.create_subprocess_exec(
        "make", "O=%s" % args.outputdir, "-C", args.buildrootdir, "olddefconfig")
    ret = yield from proc.wait()
    if ret:
        return ret

    toolchain_usable = yield from is_toolchain_usable(configfile, toolchainconfig)
    if not toolchain_usable:
        return 2

    # Now, generate the random selection of packages, and fixup
    # things if needed.
    # Safe-guard, in case we can not quickly come to a valid
    # configuration: allow at most 100 (arbitrary) iterations.
    bounded_loop = 100
    while True:
        if bounded_loop == 0:
            print("ERROR: cannot generate random configuration after 100 iterations",
                  file=sys.stderr)
            return 1
        bounded_loop -= 1
        make_rand = [
            "make", "O=%s" % args.outputdir, "-C", args.buildrootdir,
            "KCONFIG_SEED=0x%s" % hexlify(os.urandom(4)).decode("ascii").upper(),
            "KCONFIG_PROBABILITY=%d" % randint(1, 20),
            "randpackageconfig" if args.toolchains_csv else "randconfig"
        ]
        proc = yield from asyncio.create_subprocess_exec(*make_rand)
        ret = yield from proc.wait()
        if ret:
            return ret

        ret = yield from fixup_config(sysinfo, configfile)
        if ret:
            break

    proc = yield from asyncio.create_subprocess_exec(
        "make", "O=%s" % args.outputdir, "-C", args.buildrootdir, "olddefconfig")
    ret = yield from proc.wait()
    if ret:
        return ret

    proc = yield from asyncio.create_subprocess_exec(
        "make", "O=%s" % args.outputdir, "-C", args.buildrootdir, "savedefconfig")
    ret = yield from proc.wait()
    if ret:
        return ret

    proc = yield from asyncio.create_subprocess_exec(
        "make", "O=%s" % args.outputdir, "-C", args.buildrootdir, "dependencies")
    ret = yield from proc.wait()
    return ret


if __name__ == '__main__':
    import argparse
    parser = argparse.ArgumentParser(description="Generate a random configuration")
    parser.add_argument("--outputdir", "-o",
                        help="Output directory (relative to current directory)",
                        type=str, default='output')
    parser.add_argument("--buildrootdir", "-b",
                        help="Buildroot directory (relative to current directory)",
                        type=str, default='.')

    toolchains_csv = parser.add_mutually_exclusive_group(required=False)
    toolchains_csv.add_argument("--toolchains-csv",
                                dest="toolchains_csv",
                                help="Path of the toolchain configuration file",
                                type=str)
    toolchains_csv.add_argument("--no-toolchains-csv",
                                dest="toolchains_csv",
                                help="Generate random toolchain configuration",
                                action='store_false')
    parser.set_defaults(toolchains_csv="support/config-fragments/autobuild/toolchain-configs.csv")

    args = parser.parse_args()

    # We need the absolute path to use with O=, because the relative
    # path to the output directory here is not relative to the
    # Buildroot sources, but to the current directory.
    args.outputdir = os.path.abspath(args.outputdir)

    try:
        if sys.version_info < (3, 7):
            loop = asyncio.get_event_loop()
            ret = loop.run_until_complete(gen_config(args))
        else:
            ret = asyncio.run(gen_config(args))
    except Exception:
        traceback.print_exc()
        parser.exit(1)
    parser.exit(ret)
