# 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__)
