From 29c7a7b85f51377fa1c1cd25b87f8bc598765817 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Sun, 19 May 2019 18:28:35 +0300 Subject: Initial import Signed-off-by: Laurent Pinchart --- kbuild.sh | 416 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 416 insertions(+) create mode 100755 kbuild.sh diff --git a/kbuild.sh b/kbuild.sh new file mode 100755 index 0000000..b979b36 --- /dev/null +++ b/kbuild.sh @@ -0,0 +1,416 @@ +#!/bin/sh + +set -e + +#OPTIONS='CONFIG_DEBUG_SECTION_MISMATCH=y' +#OPTIONS='C=1' +OPTIONS="KALLSYMS_EXTRA_PASS=0" +KCFLAGS="-Werror -Wno-error=cpp" + +NFS_ROOT=$HOME/src/netboot +TFTP_ROOT=$HOME/tftpboot + +echo $PWD | grep -q libcamera && PLATFORM=x86 +echo $PWD | grep -q media && PLATFORM=omap3 +echo $PWD | grep -q omap && PLATFORM=omap4+ +echo $PWD | grep -q plusoptix && PLATFORM=imx7 +echo $PWD | grep -q renesas && PLATFORM=gen3 +echo $PWD | grep -q xilinx && PLATFORM=zynqmp + +do_compile_doc=0 +do_menu_config=0 +do_package_deb=0 +opt_bootloader= +opt_cmdline_file= +opt_defconfig= + +while [[ $# != 0 ]] ; do + option=$1 + shift + + case $option in + --bootloader) + opt_bootloader=$1 + if [[ ! -r $opt_bootloader ]] ; then + echo "Boot loader file $opt_bootloader is not readable" + exit 1 + fi + shift + ;; + --cmdline) + opt_cmdline_file=$1 + if [[ ! -r $opt_cmdline_file ]] ; then + echo "Command line file $opt_cmdline_file is not readable" + exit 1 + fi + shift + ;; + --config) + do_menu_config=1 + ;; + --deb) + do_package_deb=1 + ;; + --defconfig) + opt_defconfig=$1 + if [[ ! -r $opt_defconfig ]] ; then + echo "defconfig file $opt_defconfig is not readable" + exit 1 + fi + shift + ;; + --doc) + do_compile_doc=1 + ;; + --*) + echo "Unrecognized option $option" + exit 1 + ;; + *) + PLATFORM=$option + ;; + esac +done + +case $PLATFORM in + gen3) + ARCH=arm64 + BOOT_DIR=$TFTP_ROOT/gen3 + DTBS="renesas/r8a7795-es1-h3ulcb.dtb renesas/r8a7795-es1-salvator-x.dtb renesas/r8a7795-h3ulcb.dtb renesas/r8a7795-h3ulcb-kf.dtb renesas/r8a7795-salvator-x.dtb renesas/r8a7795-salvator-xs.dtb renesas/r8a7796-m3ulcb.dtb renesas/r8a7796-salvator-x.dtb renesas/r8a77995-draak.dtb" + DTBS=$(cd arch/arm64/boot/dts ; ls renesas/*.dts | sed 's/\.dts/.dtb/') + #DTBS="renesas/r8a77965-salvator-xs.dtb" + IMAGE=FIT + LOADADDR=0x48080000 + ;; + imx7) + ARCH=arm + #BOOT_DIR=$TFTP_ROOT/imx7 + BOOT_DIR=$NFS_ROOT/arm32/boot + DTBS="imx7d-sx-pl-emar.dtb imx7d-sx-pl-test.dtb" + IMAGE=zImage + LOADADDR=0x80008000 + ;; + omap3) + ARCH=arm + BOOT_DIR=$TFTP_ROOT/omap3 + DTBS="omap3-beagle-xm.dtb omap3-overo-storm-tobi.dtb" + IMAGE=zImage + ;; + omap4+) + ARCH=arm + BOOT_DIR=$TFTP_ROOT/omap4 + DTBS="omap4-panda.dtb omap4-panda-es.dtb am57xx-evm-reva3.dtb:am57xx-beagle-x15.dtb" + IMAGE=FIT + LOADADDR=0x80008000 + ;; + scarlet) + ARCH=arm64 + BOOT_DIR=$NFS_ROOT/arm64/boot + CMDLINE="console=ttyS2,115200n8 earlyprintk=ttyS2,115200n8 console=tty1 init=/sbin/init root=PARTUUID=%U/PARTNROFF=1 rootwait rw noinitrd ignore_loglevel" + CMDLINE="console=ttyS2,115200n8 earlyprintk=ttyS2,115200n8 console=tty1 ip=dhcp root=/dev/nfs rootwait rw noinitrd ignore_loglevel" + DTBS="rockchip/rk3399-gru-scarlet-inx.dtb" + IMAGE=cros-arm + LOADADDR=0 + ;; + soraka) + ARCH=x86 + BOOT_DIR=$TFTP_ROOT/x86 + CMDLINE="console=ttyS0,115200n8 earlyprintk=ttyS0,115200n8 console=tty1 ip=dhcp root=/dev/nfs rootwait rw noinitrd ignore_loglevel" + IMAGE=cros-x86 + KCFLAGS="$KCFLAGS -Wno-error=frame-larger-than=" + ;; + x86) + ARCH=x86 + BOOT_DIR=$TFTP_ROOT/x86 + IMAGE=bzImage + KCFLAGS="$KCFLAGS -Wno-error=frame-larger-than=" + ;; + zynqmp) + ARCH=arm64 + BOOT_DIR=$TFTP_ROOT/xilinx + DTBS="xilinx/zynqmp-zcu106-revA.dtb" + IMAGE=Image + LOADADDR=0x10000000 + KCFLAGS="$KCFLAGS -Wno-error=packed-not-aligned -Wno-error=sizeof-pointer-memaccess -Wno-error=stringop-truncation -Wno-error=stringop-overflow" + target_dir=$NFS_ROOT/zynqmp + ;; + *) + echo "Invalid platform $PLATFORM" + exit 1 + ;; +esac + +case $ARCH in + arm) + arch_dir=arm32 + cross_compile=arm-buildroot-linux-uclibcgnueabihf- + image_kernel=zImage + ;; + arm64) + arch_dir=arm64 + cross_compile=aarch64-buildroot-linux-gnu- + image_kernel=Image + ;; + x86) + arch_dir=x86 + cross_compile= + image_kernel=bzImage + ;; +esac + +target_dir=${target_dir:-$NFS_ROOT/$arch_dir} +output_dir=${output_dir:-$PWD/output/$arch_dir} + +# +# Parallelize make with twice as many jobs as CPUs +# + +num_cpus=$(cat /proc/cpuinfo | grep '^processor\b' | wc -l) +pmake="make -j$((num_cpus*2))" + +OPTIONS="KALLSYMS_EXTRA_PASS=0 KCFLAGS='$KCFLAGS'" + +echo "Compiling for platform $PLATFORM with $num_cpus CPUs" + +mkdir -p $output_dir/ + +if [[ -n "$opt_defconfig" ]] ; then + mkdir -p $output_dir/arch/$ARCH/configs/ + cp $opt_defconfig $output_dir/arch/$ARCH/configs/build_defconfig + make ARCH=$ARCH O=$output_dir build_defconfig + rm $output_dir/arch/$ARCH/configs/build_defconfig +fi + +if [[ $do_menu_config = 1 ]] ; then + make ARCH=$ARCH O=$output_dir menuconfig + exit 0 +fi + +# +# Compile documentation if requested +# + +if [[ $do_compile_doc = 1 ]] ; then + $pmake ARCH=$ARCH O=$output_dir DOCBOOKS='' htmldocs +fi + +# +# Compile the kernel, modules and DTBs +# + +dtbs= +for dtb in $DTBS ; do + dtb=${dtb/:*/} + dtbs="$dtbs $dtb" +done + +eval $pmake ARCH=$ARCH O=$output_dir CROSS_COMPILE=$cross_compile $OPTIONS \ + $image_kernel $dtbs + +grep 'CONFIG_MODULES=y' $output_dir/.config > /dev/null && modules=modules +if [[ x$modules == xmodules ]] ; then + eval $pmake ARCH=$ARCH O=$output_dir CROSS_COMPILE=$cross_compile $OPTIONS \ + $modules +fi + +version=$(cat $output_dir/include/generated/utsrelease.h | cut -d '"' -f 2) + +# +# Create the image +# + +make_fit_image() { + local kernel_its=$output_dir/arch/$ARCH/boot/kernel_fdt.its + + cat < $kernel_its +/dts-v1/; +/ { + description = "Kernel + FDT image for $board board"; + #address-cells = <1>; + + images { + kernel { + description = "Linux kernel"; + data = /incbin/("$output_dir/arch/$ARCH/boot/$image_kernel"); + type = "kernel"; + arch = "$ARCH"; + os = "linux"; + compression = "none"; + load = <$LOADADDR>; + entry = <$LOADADDR>; + hash-1 { + algo = "crc32"; + }; + hash-2 { + algo = "sha1"; + }; + }; +EOF + + local dtb + + for dtb in $DTBS ; do + local src=${dtb/:*/} + local dst=${dtb/*:/} + dst=${dst/*\//} + + cat <> $kernel_its + fdt-$dst { + description = "Flattened Device Tree blob $dst"; + data = /incbin/("$output_dir/arch/$ARCH/boot/dts/$src"); + type = "flat_dt"; + arch = "$ARCH"; + compression = "none"; + hash-1 { + algo = "crc32"; + }; + hash-2 { + algo = "sha1"; + }; + }; +EOF + done + + local config=$(echo $DTBS | sed 's/.*[:/]//') + cat <> $kernel_its + }; + + configurations { + default = "conf-$config"; +EOF + for dtb in $DTBS ; do + local dst=${dtb/*:/} + dst=${dst/*\//} + + cat <> $kernel_its + conf-$dst { + description = "Boot Linux kernel with $dst blob"; + kernel = "kernel"; + fdt = "fdt-$dst"; + }; +EOF + done + + cat <> $kernel_its + }; +}; +EOF + + PATH="$output_dir/scripts/dtc:$PATH" mkimage -f $kernel_its ${kernel_its/its/itb} +} + +make_srec_image() { + local image=$output_dir/arch/$ARCH/boot/$image_kernel + + cat $image | lzma -z -e > $image.xz + objcopy -I binary -O srec --srec-forceS3 --srec-len 516 \ + $image.xz $image.xz.srec + + for dtb in $DTBS ; do + local src=${dtb/:*/} + + objcopy -I binary -O srec --srec-forceS3 --srec-len 516 \ + $src $src.srec + done +} + +make_uboot_image() { + mkimage -A $ARCH -O linux -T kernel -C none -a $LOADADDR -e $LOADADDR \ + -n "Linux-${version}" -d $output_dir/arch/$ARCH/boot/$kernel_image \ + $output_dir/arch/$ARCH/boot/uImage +} + +make_cros_image() { + local boot_dir=$output_dir/arch/$ARCH/boot + local vmlinuz=$boot_dir/$1 + local bootloader + local config + + if [[ -f $opt_bootloader ]] ; then + bootloader=$opt_bootloader + else + dd if=/dev/zero of=$boot_dir/bootloader bs=512 count=1 + bootloader=$boot_dir/bootloader + fi + + if [[ -f $opt_cmdline_file ]] ; then + config=$opt_cmdline_file + else + echo "$CMDLINE" > $boot_dir/cmdline + config=$boot_dir/cmdline + fi + + vbutil_kernel \ + --pack $boot_dir/vmlinuz.image \ + --version 1 \ + --vmlinuz $vmlinuz \ + --arch $ARCH \ + --keyblock /usr/share/vboot/devkeys/kernel.keyblock \ + --signprivate /usr/share/vboot/devkeys/kernel_data_key.vbprivk \ + --config $config \ + --bootloader $bootloader +} + +case $IMAGE in +FIT) + make_fit_image + image_file=$output_dir/arch/$ARCH/boot/kernel_fdt.itb + ;; +cros-arm) + make_fit_image + make_cros_image kernel_fdt.itb + image_file=$output_dir/arch/$ARCH/boot/vmlinuz.image + ;; +cros-x86) + make_fit_image + make_cros_image bzImage + image_file=$output_dir/arch/$ARCH/boot/vmlinuz.image + ;; +srec) + make_srec_image + image_file=$output_dir/arch/$ARCH/boot/$kernel_image.xz.srec + ;; +uImage) + make_uboot_image + image_file=$output_dir/arch/$ARCH/boot/uImage + ;; +*) + image_file=$output_dir/arch/$ARCH/boot/$IMAGE + ;; +esac + +# +# Copy the files to their destination directories +# + +copy_dtbs() { + local dtb + local target_dir=$1 + + for dtb in $DTBS ; do + local src=${dtb/:*/} + local dst=${dtb/*:/} + dst=${dst/*\//} + + cp $output_dir/arch/${ARCH}/boot/dts/$src* $target_dir/$dst + done +} + +mkdir -p $BOOT_DIR +cp $image_file $BOOT_DIR/ + +if [[ $IMAGE != FIT && $IMAGE != cros-arm && $IMAGE != cros-x86 ]] ; then + copy_dtbs $BOOT_DIR/ +fi + +if [[ x$modules = xmodules ]] ; then + $pmake ARCH=$ARCH O=$output_dir CROSS_COMPILE=$cross_compile INSTALL_MOD_PATH=$target_dir modules_install + echo "Kernel modules installed to $target_dir/lib/modules/$version" +fi + +if [[ $do_package_deb = 1 ]] ; then + $pmake ARCH=$ARCH O=$output_dir CROSS_COMPILE=$cross_compile bindeb-pkg +fi + +echo "Kernel image available in $image_file" +echo "Build $version completed at $(date)" -- cgit v1.2.3