#
# Copyright OpenEmbedded Contributors
#
# SPDX-License-Identifier: MIT
#

inherit kernel-arch deploy cml1 pkgconfig

LICENSE ?= "GPL-2.0-only"

PROVIDES += "virtual/bootloader"

PACKAGE_ARCH = "${MACHINE_ARCH}"

DEPENDS += "bison-native flex-native lz4-native"

S = "${UNPACKDIR}/barebox-${PV}"
B = "${WORKDIR}/build"
KBUILD_OUTPUT = "${B}"
OE_TERMINAL_EXPORTS += "KBUILD_OUTPUT"

require conf/image-uefi.conf

# For some platforms and configuration, the barebox build process will require
# additional host tools that can be activated/deactivated here.
PACKAGECONFIG ??= "openssl libusb fit"

PACKAGECONFIG[openssl] = ",,openssl-native"
PACKAGECONFIG[libusb] = ",,libusb1-native"
PACKAGECONFIG[fit] = ",,u-boot-tools-native dtc-native"

export KBUILD_BUILD_USER ?= "oe-user"
export KBUILD_BUILD_HOST ?= "oe-host"

# unlike the kernel, barebox may build against host tools like openssl
export HOST_EXTRACFLAGS

def get_layer_rev(path):
    try:
        rev, _ = bb.process.run(['git', 'describe', "--match=''", '--always', '--dirty', '--broken'], cwd=path)
    except bb.process.ExecutionError:
        rev = ""
    return rev.strip()

BAREBOX_BUILDSYSTEM_VERSION[doc] = "Build system version to add to the barebox image. By default this is the git description of the containing layer."
BAREBOX_BUILDSYSTEM_VERSION ??= "${@get_layer_rev(os.path.dirname(d.getVar('FILE')))}"

BAREBOX_FIRMWARE_DIR[doc] = "Overwrite barebox' firmware blobs search directory (CONFIG_EXTRA_FIRMWARE_DIR) with this path, default ${B}/firmware"
BAREBOX_FIRMWARE_DIR ??= "${B}/firmware"

EXTRA_OEMAKE = " \
    CROSS_COMPILE=${TARGET_PREFIX} -C ${S} O=${B} \
    BUILDSYSTEM_VERSION=${BAREBOX_BUILDSYSTEM_VERSION} \
    CONFIG_EXTRA_FIRMWARE_DIR=${BAREBOX_FIRMWARE_DIR} \
    PKG_CONFIG=pkg-config-native \
    CROSS_PKG_CONFIG=pkg-config \
"

BAREBOX_CONFIG[doc] = "The barebox kconfig defconfig file. Not used if a file called defconfig is added to the SRC_URI."
BAREBOX_CONFIG ?= ""

# set sensible default configs for some of oe-core's QEMU MACHINEs
BAREBOX_CONFIG:qemuarm = "multi_v7_defconfig"
BAREBOX_CONFIG:qemuarm64 = "multi_v8_defconfig"
BAREBOX_CONFIG:qemux86-64 = "efi_defconfig"

# prevent from acting as non-buildable provider
python () {
    bareboxconfig = d.getVar('BAREBOX_CONFIG')
    bareboxdefconfig = 'file://defconfig' in d.getVar('SRC_URI')

    if not bareboxconfig and not bareboxdefconfig:
        raise bb.parse.SkipRecipe("BAREBOX_CONFIG must be set in the %s machine configuration or file://defconfig must be given in SRC_URI." % d.getVar("MACHINE"))
}

barebox_do_configure() {
        if [ -e ${UNPACKDIR}/defconfig ]; then
                cp ${UNPACKDIR}/defconfig ${B}/.config
        else
                if [ -n "${BAREBOX_CONFIG}" ]; then
                        oe_runmake ${BAREBOX_CONFIG}
                else
                        bbfatal "No defconfig given. Either add file 'file://defconfig' to SRC_URI or set BAREBOX_CONFIG"
                fi
        fi

        ${S}/scripts/kconfig/merge_config.sh -m .config ${@" ".join(find_cfgs(d))}
        cml1_do_configure
}

BAREBOX_ENV_DIR[doc] = "Overlay the barebox built-in environment with the environment provided by the BSP if specified."
BAREBOX_ENV_DIR ??= "${UNPACKDIR}/env/"

barebox_do_compile () {
        export userccflags="${TARGET_LDFLAGS}${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}"
        unset LDFLAGS
        unset CFLAGS
        unset CPPFLAGS
        unset CXXFLAGS
        unset MACHINE
        # Allow to use ${UNPACKDIR} in kconfig options to include additionally fetched files
        export UNPACKDIR=${UNPACKDIR}

        if [ -d ${BAREBOX_ENV_DIR} ]; then
                BAREBOX_DEFAULT_ENV="$(grep ^CONFIG_DEFAULT_ENVIRONMENT_PATH .config | cut -d '=' -f 2 | tr -d '"')"
                oe_runmake CONFIG_DEFAULT_ENVIRONMENT_PATH="\"${BAREBOX_DEFAULT_ENV} ${BAREBOX_ENV_DIR}\""
        else
                oe_runmake
        fi
}

BAREBOX_BINARY[doc] = "Specify the barebox binary to install. If not specified all barebox artifacts are installed."
BAREBOX_BINARY ??= "${@'barebox.efi' if d.getVar('EFI_PROVIDER') == 'barebox' else ''}"
BAREBOX_SUFFIX[doc] = "Specify the suffix for ${BAREBOX_IMAGE}."
BAREBOX_SUFFIX ??= "img"
BAREBOX_IMAGE[doc] = "A unique barebox image name. Unused if ${BAREBOX_BINARY} is not set."
BAREBOX_IMAGE_DEFAULT ?= "${PN}-${MACHINE}-${PV}-${PR}.${BAREBOX_SUFFIX}"
BAREBOX_IMAGE ?= "${@'${EFI_BOOT_IMAGE}' if d.getVar('EFI_PROVIDER') == 'barebox' else '${BAREBOX_IMAGE_DEFAULT}'}"

BAREBOX_INSTALL_PATH ?= "${@'${EFI_FILES_PATH}' if d.getVar('EFI_PROVIDER') == 'barebox' else '/boot'}"

barebox_do_install () {
        if [ -n "${BAREBOX_BINARY}" ]; then

                BAREBOX_BIN=${B}/${BAREBOX_BINARY}
                if [ ! -f "${BAREBOX_BIN}" ]; then
                        BAREBOX_BIN=${B}/images/${BAREBOX_BINARY}
                fi
                if [ ! -f "${BAREBOX_BIN}" ]; then
                        bbfatal "Failed to locate ${BAREBOX_BINARY}"
                fi

                install -D -m 644 ${BAREBOX_BIN} ${D}${BAREBOX_INSTALL_PATH}/${BAREBOX_IMAGE}
                ln -sf ${BAREBOX_IMAGE} ${D}${BAREBOX_INSTALL_PATH}/${BAREBOX_BINARY}
        else
                install -d ${D}${BAREBOX_INSTALL_PATH}/
                for image in $(cat ${B}/barebox-flash-images); do
                        install -m 644 ${B}/${image} ${D}${BAREBOX_INSTALL_PATH}/
                done
        fi
}
FILES:${PN} = "${BAREBOX_INSTALL_PATH}"

barebox_do_deploy () {
        if [ -n "${BAREBOX_BINARY}" ]; then

                BAREBOX_BIN=${B}/${BAREBOX_BINARY}
                if [ ! -f "${BAREBOX_BIN}" ]; then
                        BAREBOX_BIN=${B}/images/${BAREBOX_BINARY}
                fi

                install -D -m 644 ${BAREBOX_BIN} ${DEPLOYDIR}/${BAREBOX_IMAGE}
                ln -sf ${BAREBOX_IMAGE} ${DEPLOYDIR}/${BAREBOX_BINARY}
        else
                for image in $(cat ${B}/barebox-flash-images); do
                        cp ${B}/${image} ${DEPLOYDIR}
                done
        fi
}
addtask deploy after do_compile

EXPORT_FUNCTIONS do_configure do_compile do_install do_deploy
