|
@@ -20,7 +20,6 @@
|
|
|
|
|
|
from binascii import hexlify
|
|
|
import asyncio
|
|
|
-import csv
|
|
|
import os
|
|
|
from random import randint
|
|
|
import sys
|
|
@@ -100,73 +99,6 @@ class SystemInfo:
|
|
|
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
|
|
|
|
|
@@ -574,24 +506,11 @@ async def fixup_config(sysinfo, configfile):
|
|
|
|
|
|
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)
|
|
|
+ configlines = list()
|
|
|
|
|
|
# Combine with the minimal configuration
|
|
|
minimalconfigfile = os.path.join(args.buildrootdir,
|
|
@@ -650,9 +569,6 @@ async def gen_config(args):
|
|
|
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
|
|
@@ -668,7 +584,7 @@ async def gen_config(args):
|
|
|
"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")
|
|
|
+ "randconfig")
|
|
|
ret = await proc.wait()
|
|
|
if ret:
|
|
|
return ret
|
|
@@ -702,17 +618,8 @@ if __name__ == '__main__':
|
|
|
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")
|
|
|
+ parser.add_argument("--toolchains-csv", help="Legacy, unused", type=str)
|
|
|
+ parser.add_argument("--no-toolchains-csv", help="Legacy, unused")
|
|
|
|
|
|
args = parser.parse_args()
|
|
|
|