blob: 01ad6385c0ed2cd2a48be3ed4ab4dfcab561d8e5 [file] [log] [blame]
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2020 Mediatek Inc.
#!/usr/bin/env python
from argparse import ArgumentParser, FileType, ArgumentDefaultsHelpFormatter
import os
import sys
import stat
import shutil
import re
# Parse project defconfig to get special config file, build config file and out-of-tree kernel modules
def get_config_in_defconfig(file_name, kernel_dir):
file_handle = open(file_name, 'r')
pattern_buildconfig = re.compile('^CONFIG_BUILD_CONFIG_FILE\s*=\s*(.+)$')
pattern_extmodules = re.compile('^CONFIG_EXT_MODULES\s*=\s*(.+)$')
build_config = ''
ext_modules = ''
for line in file_handle.readlines():
result = pattern_buildconfig.match(line)
if result:
build_config = result.group(1).strip('"')
result = pattern_extmodules.match(line)
if result:
ext_modules = result.group(1).strip('"')
file_handle.close()
return (build_config, ext_modules)
def help():
print('Usage:')
print(' python scripts/gen_build_config.py --project <project> --kernel-defconfig <kernel project defconfig file> --kernel-defconfig-overlays <kernel project overlay defconfig files> --kernel-build-config-overlays <kernel build config overlays> --build-mode <mode> --out-file <gen build.config>')
print('Or:')
print(' python scripts/gen_build_config.py -p <project> --kernel-defconfig <kernel project defconfig file> --kernel-defconfig-overlays <kernel project overlay defconfig files> --kernel-build-config-overlays <kernel build config overlays> -m <mode> -o <gen build.config>')
print('')
print('Attention: Must set generated build.config, and project or kernel project defconfig file!!')
sys.exit(2)
def main(**args):
project = args["project"]
kernel_defconfig = args["kernel_defconfig"]
kernel_defconfig_overlays = args["kernel_defconfig_overlays"]
kernel_build_config_overlays = args["kernel_build_config_overlays"]
build_mode = args["build_mode"]
abi_mode = args["abi_mode"]
out_file = args["out_file"]
if ((project == '') and (kernel_defconfig == '')) or (out_file == ''):
help()
# get gen_build_config.py absolute path and name by sys.argv[0]: /***/{kernel dir}/scripts/gen_build_config.py
# kernel directory is dir(sys.argv[0])/../.., absolute path
current_working_dir = os.path.abspath(os.getcwd())
current_file_path = os.path.abspath(sys.argv[0])
abs_kernel_dir = os.path.dirname(os.path.dirname(current_file_path))
kernel_dir = abs_kernel_dir.split(current_working_dir)[1].lstrip('/')
gen_build_config = out_file
gen_build_config_dir = os.path.dirname(gen_build_config)
if not os.path.exists(gen_build_config_dir):
os.makedirs(gen_build_config_dir)
mode_config = ''
if (build_mode == 'eng') or (build_mode == 'userdebug') or (build_mode == 'user'):
mode_config = '%s.config' % (build_mode)
project_defconfig = ''
project_defconfig_name = ''
if kernel_defconfig:
project_defconfig_name = kernel_defconfig
pattern_project = re.compile('^(.+)_defconfig$')
project = pattern_project.match(kernel_defconfig).group(1).strip()
else:
project_defconfig_name = '%s_defconfig' % (project)
defconfig_dir = ''
if project_defconfig_name != 'gki_defconfig':
if os.path.exists('%s/arch/arm/configs/%s' % (abs_kernel_dir, project_defconfig_name)):
defconfig_dir = 'arch/arm/configs'
elif os.path.exists('%s/arch/arm64/configs/%s' % (abs_kernel_dir, project_defconfig_name)):
defconfig_dir = 'arch/arm64/configs'
else:
print('Error: cannot find project defconfig file under ' + abs_kernel_dir)
sys.exit(2)
project_defconfig = '%s/%s/%s' % (abs_kernel_dir, defconfig_dir, project_defconfig_name)
device_modules_build_config = ''
ext_modules = ''
if project_defconfig_name == 'gki_defconfig':
device_modules_build_config = '%s/build.config.mtk_kernel_device_modules' % (abs_kernel_dir)
mode_config = ''
else:
(device_modules_build_config, ext_modules) = get_config_in_defconfig(project_defconfig, os.path.basename(abs_kernel_dir))
device_modules_build_config = '%s/%s' % (abs_kernel_dir, device_modules_build_config)
if not os.path.exists(device_modules_build_config):
print('Error: cannot get build.config under ' + abs_kernel_dir + '.')
print('Please check whether ' + project_defconfig + ' defined CONFIG_BUILD_CONFIG_FILE.')
sys.exit(2)
file_text = []
file_text.append("PATH=${ROOT_DIR}/../prebuilts/perl/linux-x86/bin:${ROOT_DIR}/build/kernel/build-tools/path/linux-x86:/usr/bin:/bin")
file_text.append("TRIM_NONLISTED_KMI=")
file_text.append("KMI_SYMBOL_LIST_STRICT_MODE=")
file_text.append("MODULES_ORDER=")
file_text.append("KMI_ENFORCED=1")
file_text.append("if [ \"x${DO_ABI_MONITOR}\" == \"x1\" ]; then")
file_text.append(" KMI_SYMBOL_LIST_MODULE_GROUPING=0")
file_text.append(" KMI_SYMBOL_LIST_ADD_ONLY=1")
file_text.append(" ADDITIONAL_KMI_SYMBOL_LISTS=\"${ADDITIONAL_KMI_SYMBOL_LISTS} android/abi_gki_aarch64\"")
file_text.append("fi")
file_text.append("unset BUILD_NUMBER")
file_text.append("if [ -z \"${SOURCE_DATE_EPOCH}\" ]; then")
file_text.append(" export SOURCE_DATE_EPOCH=0")
file_text.append(" export GKI_SOURCE_DATE_EPOCH=0")
file_text.append("fi")
file_text.append("\nDEFCONFIG=olddefconfig")
all_defconfig = '${ROOT_DIR}/${KERNEL_DIR}/arch/arm64/configs/gki_defconfig'
pre_defconfig_cmds = 'cd ${KERNEL_DIR} && make O=${OUT_DIR} gki_defconfig && cd ${ROOT_DIR}'
if project_defconfig_name != 'gki_defconfig':
kernel_defconfig_overlays_files = ''
for name in kernel_defconfig_overlays.split():
kernel_defconfig_overlays_files = '%s %s/kernel/configs/%s' % (kernel_defconfig_overlays_files, abs_kernel_dir, name)
all_defconfig = '%s %s' % (project_defconfig, kernel_defconfig_overlays_files)
if mode_config:
all_defconfig = '%s %s/kernel/configs/%s' % (all_defconfig, abs_kernel_dir, mode_config)
pre_defconfig_cmds = '%s && cd ${OUT_DIR} && bash ${ROOT_DIR}/${KERNEL_DIR}/scripts/kconfig/merge_config.sh -m .config %s && cd ${ROOT_DIR}' % (pre_defconfig_cmds, all_defconfig)
pre_defconfig_cmds = 'PRE_DEFCONFIG_CMDS=\'if [ -f ${OUT_DIR}/.config ]; then cp -f -p ${OUT_DIR}/.config ${OUT_DIR}/.config.timestamp; else touch ${OUT_DIR}/.config.timestamp; fi; %s\'' % (pre_defconfig_cmds)
file_text.append(pre_defconfig_cmds)
file_text.append("POST_DEFCONFIG_CMDS='if ! cmp -s ${OUT_DIR}/.config.timestamp ${OUT_DIR}/.config; then rm -f ${OUT_DIR}/.config.timestamp; else mv -f ${OUT_DIR}/.config.timestamp ${OUT_DIR}/.config; fi'\n")
has_fpsgo = False
has_met = False
ext_modules_list = []
ext_modules_file = '%s/kernel/configs/ext_modules.list' % (abs_kernel_dir)
if os.path.exists(ext_modules_file):
file_handle = open(ext_modules_file, 'r')
for line in file_handle.readlines():
line_strip = line.strip()
if "fpsgo" in line_strip:
has_fpsgo = True
elif "met_drv" in line_strip:
has_met = True
else:
ext_modules_list.append(line_strip)
file_handle.close()
if len(ext_modules_list) > 0:
file_text.append('EXT_MODULES+=\"%s\"' % (' '.join(ext_modules_list)))
if has_fpsgo:
file_text.append("""
if [ -d "../vendor/mediatek/kernel_modules/fpsgo_int" ]; then
EXT_MODULES+=" ../vendor/mediatek/kernel_modules/fpsgo_int"
else
EXT_MODULES+=" ../vendor/mediatek/kernel_modules/fpsgo_cus"
fi""")
if has_met:
file_text.append("EXT_MODULES+=\" ../vendor/mediatek/kernel_modules/met_drv_v3\"")
file_text.append("""if [ -d "../vendor/mediatek/kernel_modules/met_drv_secure_v3" ]; then
EXT_MODULES+=" ../vendor/mediatek/kernel_modules/met_drv_secure_v3"
fi""")
file_text.append("DIST_CMDS='cp -p ${OUT_DIR}/.config ${DIST_DIR}'\n")
file_text.append("if [ \"x${PROJECT_DEFCONFIG_NAME}\" != \"xgki_defconfig\" ]; then")
file_text.append(" GKI_BUILD_CONFIG=kernel_device_modules-5.15/build.config.gki.aarch64.vendor")
file_text.append("fi")
file_text.append("GKI_PATH=${ROOT_DIR}/../prebuilts/perl/linux-x86/bin:${ROOT_DIR}/build/kernel/build-tools/path/linux-x86:/usr/bin:/bin")
file_text.append("GKI_KCONFIG_EXT_PREFIX=${KCONFIG_EXT_PREFIX}")
file_text.append("GKI_VENDOR_DEFCONFIG=${DEFCONFIG}")
file_text.append("GKI_PRE_DEFCONFIG_CMDS=${PRE_DEFCONFIG_CMDS}")
file_text.append("GKI_POST_DEFCONFIG_CMDS=${GKI_POST_DEFCONFIG_CMDS}")
gen_build_config_mtk = '%s.mtk' % (gen_build_config)
file_handle = open(gen_build_config_mtk, 'w')
for line in file_text:
file_handle.write(line + '\n')
file_handle.close()
gki_build_config = '%s/build.config.gki.aarch64' % (abs_kernel_dir)
gen_build_config_gki = '%s/build.config.gki.aarch64' % (gen_build_config_dir)
file_text = []
if os.path.exists(gki_build_config):
file_handle = open(gki_build_config, 'r')
for line in file_handle.readlines():
line_strip = line.strip()
pattern_source = re.compile('^\.\s.+$')
result = pattern_source.match(line_strip)
if not result:
file_text.append(line_strip)
file_handle.close()
file_handle = open(gen_build_config_gki, 'w')
for line in file_text:
file_handle.write(line + '\n')
file_handle.close()
file_handle = open(gen_build_config, 'w')
kernel_dir_line = 'KERNEL_DIR=%s' % (kernel_dir)
file_handle.write(kernel_dir_line + '\n')
build_config_fragments = 'BUILD_CONFIG_FRAGMENTS="${KERNEL_DIR}/%s"' % (os.path.basename(device_modules_build_config))
file_handle.write(build_config_fragments + '\n\n')
rel_gen_build_config_dir = 'REL_GEN_BUILD_CONFIG_DIR=`./${KERNEL_DIR}/scripts/get_rel_path.sh %s ${ROOT_DIR}`' % (gen_build_config_dir)
file_handle.write(rel_gen_build_config_dir + '\n')
kernel_build_mode_cmds = 'KERNEL_BUILD_MODE=%s' % (build_mode)
file_handle.write(kernel_build_mode_cmds + '\n')
kernel_project_defconfig = 'PROJECT_DEFCONFIG_NAME=%s' % (project_defconfig_name)
file_handle.write(kernel_project_defconfig + '\n')
rel_project_defconfig = '%s/%s/%s' % (kernel_dir, defconfig_dir, project_defconfig_name)
kernel_defconfig_cmds = ' KERNEL_DEFCONFIG_FILE=%s' % (rel_project_defconfig)
file_handle.write('if [ "x${PROJECT_DEFCONFIG_NAME}" != "xgki_defconfig" ]; then\n')
file_handle.write(kernel_defconfig_cmds + '\n')
file_handle.write(' GET_CONFIG_ABI_MONITOR=`grep \"^CONFIG_ABI_MONITOR\s*=\s*y\" ${KERNEL_DEFCONFIG_FILE} | xargs`\n')
file_handle.write(' if [ "${KERNEL_BUILD_MODE}" == "user" ] && [ "x${GET_CONFIG_ABI_MONITOR}" != "x" ]; then\n')
file_handle.write(' DO_ABI_MONITOR=1\n')
build_config_fragments = ' BUILD_CONFIG_FRAGMENTS="${BUILD_CONFIG_FRAGMENTS} ${REL_GEN_BUILD_CONFIG_DIR}/%s' % (os.path.basename(gen_build_config_gki))
file_handle.write(build_config_fragments + '"\n')
file_handle.write(' fi\n')
file_handle.write('fi\n')
build_config_fragments = 'BUILD_CONFIG_FRAGMENTS="${BUILD_CONFIG_FRAGMENTS} ${REL_GEN_BUILD_CONFIG_DIR}/%s' % (os.path.basename(gen_build_config_mtk))
file_handle.write(build_config_fragments + '"\n')
file_handle.write('if [ "x${PROJECT_DEFCONFIG_NAME}" != "xgki_defconfig" ]; then\n')
file_handle.write(' if [ "x${GKI_BUILD_CONFIG}" == "x" ] && [ "x${GKI_PREBUILTS_DIR}" == "x" ]; then\n')
file_handle.write(' if [ "x${ENABLE_GKI_CHECKER}" == "xtrue" ] || [ -d "${ROOT_DIR}/../vendor/mediatek/internal" ] && [ "${KERNEL_BUILD_MODE}" == "user" ]; then\n')
file_handle.write(' BUILD_CONFIG_FRAGMENTS="${BUILD_CONFIG_FRAGMENTS} ${KERNEL_DIR}/build.config.mtk.check_gki"\n')
file_handle.write(' fi\n')
file_handle.write(' fi\n')
file_handle.write('fi\n')
if kernel_build_config_overlays:
build_config_fragments = 'BUILD_CONFIG_FRAGMENTS="${BUILD_CONFIG_FRAGMENTS} %s"' % (kernel_build_config_overlays)
file_handle.write(build_config_fragments + '\n')
file_handle.close()
if __name__ == '__main__':
parser = ArgumentParser(formatter_class=ArgumentDefaultsHelpFormatter)
parser.add_argument("-p","--project", dest="project", help="specify the project to build kernel.", default="")
parser.add_argument("--kernel-defconfig", dest="kernel_defconfig", help="special kernel project defconfig file.",default="")
parser.add_argument("--kernel-defconfig-overlays", dest="kernel_defconfig_overlays", help="special kernel project overlay defconfig files.",default="")
parser.add_argument("--kernel-build-config-overlays", dest="kernel_build_config_overlays", help="special kernel build config overlays files.",default="")
parser.add_argument("-m","--build-mode", dest="build_mode", help="specify the build mode to build kernel.", default="user")
parser.add_argument("--abi", dest="abi_mode", help="specify whether build.config is used to check ABI.", default="no")
parser.add_argument("-o","--out-file", dest="out_file", help="specify the generated build.config file.", required=True)
args = parser.parse_args()
main(**args.__dict__)