buildroot - TreeNewbeer/Coonix GitHub Wiki

准备工作

首先需要把buildroot源码 clone 回来,在这里buildroot版本选择的是 2020.02.x 。

    git clone -b 2020.02.x --depth=1 https://github.com/buildroot/buildroot.git

然后建立建立以下目录

cd /path/to/buildroot
mkdir -p board/nuvoton/rootfs/etc/init.d/
cd board/nuvoton/rootfs/etc/init.d/

然后在该目录中新建 S10mdev 文件,文件内容如下:

#!/bin/sh
#
# Start mdev....
#

case "$1" in
  start)
        echo "Starting mdev..."
        echo /sbin/mdev >/proc/sys/kernel/hotplug
        mount -t ramfs mdev /dev
        mkdir -p /dev/pts
        mkdir -p /dev/shm
        /sbin/mdev -s
        ;;
  stop)
        ;;
  restart|reload)
        ;;
  *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
esac

exit $?

给 S10mdev 加上执行权限

chmod +x S10mdev

然后回到 board/nuvoton 目录,新建 install_rootfs.sh 文件,文件内容如下:

#!/bin/sh
cp -a board/nuvoton/rootfs/etc/init.d/S10mdev output/target/etc/init.d/

给 install_rootfs.sh 文件加上执行权限

chmod +x install_rootfs.sh

buildroot 设置

首先进入 menuconfig 界面,在终端中输入

make menuconfig
  • Target options

    • Target Architecture -> (X) ARM (little endian)
    • Enable VFP extension support
  • Toolchain

    • Kernel Headers -> Custom Git repository
    • URL of custom repository -> https://gitee.com/OpenNuvoton/NUC980-linux-4.4.y.git
    • Custom repository version -> master
    • Custom kernel headers series -> 4.4.x
    • Enable WCHAR support
    • Enable toolchain locale/i18n support
    • Enable stack protection support
    • Build cross gdb for the host
  • System Configuration

    • Root password -> 填写root密码
    • Run a getty (login prompt) after boot
      • TTY Port -> ttyS0
    • Custom scripts to run before creating filesystem images -> board/nuvoton/install_rootfs.sh
  • Kernel

  • Target Packages

    • Networking applications -> dhcpcd
  • Filesystem images

    • initial RAM filesystem linked into linux kernel
    • yaffs2 root filesystem
  • Bootloaders

然后保存设置开始编译

buildroot 编译

由于buildroot需要下载许多软件包,所以最好提前开好代理。不开也没关系,就是慢一点。在终端中输入

make -j xx

开始编译。 xx一般和CPU逻辑核心数相同。在clone linux-kernel 的时候,buildroot会拉取所有文件,其实buildroot只需要源代码并不需要git log之类的东西,所以可以用以下操作手动帮buildroot下载 linux-kernel。

cd path/to/buildroot/dl/linux/
rm -rf git
git clone --depth=1 https://gitee.com/OpenNuvoton/NUC980-linux-4.4.y.git git

uboot 也要这样操作一番,不然会出现一个404错误,不知道是不是 URL for custom repository 没填对。

cd path/to/buildroot/dl/uboot/
rm -rf git
git clone --depth=1 https://gitee.com/OpenNuvoton/NUC970_U-Boot_v2016.11.git

用 gcc 4.9 版本以上编译新唐提供的uboot会出现以下错误:

board/nuvoton/nuc980/spinand_boot.c:112:83: 错误:macro "__DATE__" might prevent reproducible builds [-Werror=date-time]

这个宏的意思是每次重新编译生成二进制文件时,__DATE__ 这个宏的值都会改变,即使源文件没有任何变化。在此将引起这个错误的这两个宏去掉,文件位于

/path/to/buildroot/output/build/uboot-master/board/nuvoton/nuc980/spinand_boot.c

然后按如下修改

@@ -109,7 +109,7 @@ 
        void board_init_f(unsigned long bootflag)
        __attribute__((noreturn)) void (*uboot)(void);
 
        nuc980_serial_init();
-       printf("\n SPL load main U-Boot from SPI NAND Flash! (%s %s)\n",__DATE__,__TIME__);
+       printf("\n SPL load main U-Boot from SPI NAND Flash!\n");
 
        if (maxchips < 1)
                maxchips = 1;

编译linux-kernel 的时候会遇到一个这样的错误

./scripts/gen_initramfs_list.sh: Cannot open '../rootfs'

需要手动建立一下这样文件夹

cd /path/to/buildroot/output/build/linux-master/
mkdir -p ../rootfs

还会遇到一个这样的错误

cp: 无法创建普通文件'../image/980image': 没有那个文件或目录

也需要手动建立一下这个文件夹

cd /path/to/buildroot/output/build/linux-master/
mkdir -p ../image

最后编译生成的 uboot,kernel 和 rootfs 位于 /path/to/buildroot/output/images/ 文件夹中。