#!/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


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

    async 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 = await asyncio.create_subprocess_shell(
                "%s -version | grep gcj" % prog,
                stdout=asyncio.subprocess.DEVNULL,
                stderr=asyncio.subprocess.DEVNULL)
            ret = await 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


async 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

    return True


async 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/'

    if "BR2_NEEDS_HOST_JAVA=y\n" in configlines and not await sysinfo.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
    # No C library for internal toolchain
    if 'BR2_TOOLCHAIN_BUILDROOT_NONE=y\n' in configlines:
        return False
    # Xtensa custom cores require an overlay file with internal
    # toolchains
    if 'BR2_XTENSA_CUSTOM=y\n' in configlines and \
       'BR2_TOOLCHAIN_BUILDROOT=y\n' in configlines:
        return False

    # On xtensa, python needs headers >= 3.17, but propagating that to all packages
    # is a bit tedious, so just catch it here.
    if 'BR2_XTENSA_CUSTOM=y\n' in configlines and \
       'BR2_PACKAGE_PYTHON3=y\n' in configlines and \
       'BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_17=y\n' not 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


async 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 -nd -t 3 --no-check-certificate\"\n")
    configlines.append("BR2_CURL=\"curl --ftp-pasv --retry 3 --insecure\"\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
    if await sysinfo.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 = await asyncio.create_subprocess_exec(
        "make", "O=%s" % args.outputdir, "-C", args.buildrootdir, "olddefconfig")
    ret = await proc.wait()
    if ret:
        return ret

    if not await is_toolchain_usable(configfile, toolchainconfig):
        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
        proc = await asyncio.create_subprocess_exec(
            "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")
        ret = await proc.wait()
        if ret:
            return ret

        if await fixup_config(sysinfo, configfile):
            break

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

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

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


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)
