summaryrefslogtreecommitdiff
path: root/poky/meta/classes-recipe/barebox.bbclass
blob: 200ba08326af7fb76d1bfa266d6434f808d7edcc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#
# 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"

S = "${WORKDIR}/barebox-${PV}"
B = "${WORKDIR}/build"

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