forked from Mirror/pmbootstrap
* change "pmbootstrap kconfig_check" to "pmbootstrap kconfig check" * change "pmbootstrap menuconfig" to "pmbootstrap kconfig edit [-x|-g]" (with legacy alias, because the first syntax was referenced to a lot) * enable X11 interfaces: -x: xconfig, -g: gconfig * new function to copy the xauthority file: pmb.chroot.other.copy_xauthority() * remove menufconfig() function from the kernel template and all kernel aports ([skip ci] because it would rebuild all kernels and run out of time). Alpine has dropped this as well, and it wouldn't work with the new code anyway.
96 lines
3.8 KiB
Python
96 lines
3.8 KiB
Python
"""
|
|
Copyright 2018 Attila Szollosi
|
|
|
|
This file is part of pmbootstrap.
|
|
|
|
pmbootstrap 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 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
pmbootstrap 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 pmbootstrap. If not, see <http://www.gnu.org/licenses/>.
|
|
"""
|
|
import glob
|
|
import logging
|
|
import re
|
|
import os
|
|
|
|
import pmb.build
|
|
import pmb.config
|
|
import pmb.parse
|
|
|
|
|
|
def is_set(config, option):
|
|
"""
|
|
Check, whether a boolean or tristate option is enabled
|
|
either as builtin or module.
|
|
"""
|
|
return re.search("^CONFIG_" + option + "=[ym]", config, re.M) is not None
|
|
|
|
|
|
def check(args, pkgname, details=False):
|
|
"""
|
|
Check for necessary kernel config options.
|
|
|
|
:returns: True when the check was successful, False otherwise
|
|
"""
|
|
# Pkgname: allow omitting "linux-" prefix
|
|
if pkgname.startswith("linux-"):
|
|
flavor = pkgname.split("linux-")[1]
|
|
logging.info("PROTIP: You can simply do 'pmbootstrap kconfig check " +
|
|
flavor + "'")
|
|
else:
|
|
flavor = pkgname
|
|
|
|
# Read all kernel configs in the aport
|
|
ret = True
|
|
aport = pmb.build.find_aport(args, "linux-" + flavor)
|
|
for config_path in glob.glob(aport + "/config-*"):
|
|
logging.debug("Check kconfig: " + config_path)
|
|
with open(config_path) as handle:
|
|
config = handle.read()
|
|
|
|
# The architecture of the config is in the name, so it just needs to be
|
|
# extracted
|
|
config_arch = os.path.basename(config_path).split(".")[1]
|
|
|
|
# Loop trough necessary config options, and print a warning,
|
|
# if any is missing
|
|
path = "linux-" + flavor + "/" + os.path.basename(config_path)
|
|
for archs, options in pmb.config.necessary_kconfig_options.items():
|
|
if archs != "all":
|
|
# Split and check if the device's architecture architecture has special config
|
|
# options. If option does not contain the architecture of the device
|
|
# kernel, then just skip the option.
|
|
architectures = archs.split(" ")
|
|
if config_arch not in architectures:
|
|
continue
|
|
|
|
for option, option_value in options.items():
|
|
if option_value not in [True, False]:
|
|
raise RuntimeError("kconfig check code can only handle"
|
|
" True/False right now, given value '" +
|
|
str(option_value) + "' is not supported. If you"
|
|
" need this, please open an issue.")
|
|
if option_value != is_set(config, option):
|
|
ret = False
|
|
if details:
|
|
should = "should" if option_value else "should *not*"
|
|
link = ("https://wiki.postmarketos.org/wiki/"
|
|
"Kernel_configuration#CONFIG_" + option)
|
|
logging.info("WARNING: " + path + ": CONFIG_" + option + " " +
|
|
should + " be set. See <" + link +
|
|
"> for details.")
|
|
else:
|
|
logging.warning("WARNING: " + path + " isn't configured"
|
|
" properly for postmarketOS, run"
|
|
" 'pmbootstrap kconfig check' for"
|
|
" details!")
|
|
break
|
|
return ret
|