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