buildroot 可以让简化固件生成。

0. buildroot 网址 https://git.buildroot.net/buildroot/?h=2020.02.x

1. buildroot 可以使用默认编译的工具链,也可以使用他人编译好的工具链。

参考: https://www.cnblogs.com/ranson7zop/p/8042264.html

2. 100ask 和 原版的 buildroot 差异。 使用 diff -r 命令对文件夹进行比较。这里对比使用的是 100ask 的 2019 的 buildroot。 100ask 的 2020.02.x 的 buildroot,是对应 2020.02 这个版本的。 具体可以 使用 sudo apt-get install gitk 安装一个 gitk 来方便对比查看。

2.1 增加:

configs 文件夹下面关于 100ask 的文件。 board 文件夹下面关于 100ask 的文件。 utils 文件夹下面多了 utils/defconfig_hook.py

2.2 修改:

2.2.1 package/busybox/busybox.config, 100ask 使用的版本是 1.29.3,原版版本是 1.28.0

100ask 增加了:

  55 CONFIG_STACK_OPTIMIZATION_386=y

  94 # CONFIG_FEATURE_ETC_SERVICES is not set

  105 CONFIG_FEATURE_EDITING_WINCH=y

  155 CONFIG_BZIP2_SMALL=0

  293 # CONFIG_FEATURE_SORT_OPTIMIZE_MEMORY is not set

  485 CONFIG_FEATURE_WAIT_FOR_INIT=y

 508 # CONFIG_ADD_SHELL is not set
 509 # CONFIG_REMOVE_SHELL is not set

 713 # CONFIG_FEATURE_VOLUMEID_LFS is not set

 765 # CONFIG_FLASHCP is not set

 790 # CONFIG_FEATURE_LESS_RAW is not set
 791 # CONFIG_FEATURE_LESS_ENV is not set

 818 CONFIG_UBIRENAME=y

 911 CONFIG_FEATURE_NSLOOKUP_BIG=y
 912 CONFIG_FEATURE_NSLOOKUP_LONG_OPTIONS=y

 923 CONFIG_TC=y
 924 CONFIG_FEATURE_TC_INGRESS=y

 976 # CONFIG_FEATURE_UDHCPC6_RFC5970 is not set

1063 CONFIG_SVOK=y

1092 # CONFIG_ASH_BASH_SOURCE_CURDIR is not set
1093 CONFIG_ASH_BASH_NOT_FOUND_HOOK=y

1110 # CONFIG_HUSH_LINENO_VAR is not set
1111 # CONFIG_HUSH_BASH_SOURCE_CURDIR is not set

1132 # CONFIG_HUSH_COMMAND is not set

100ask 修改了:

 507 CONFIG_USE_BB_CRYPT_SHA=y   <--  501 # CONFIG_USE_BB_CRYPT_SHA is not set
 551 CONFIG_DEPMOD=y  <--  545 # CONFIG_DEPMOD is not set
 555 CONFIG_MODINFO=y  <--  549 # CONFIG_MODINFO is not set

100ask 删除了:

 504 # CONFIG_ADD_SHELL is not set
 505 # CONFIG_REMOVE_SHELL is not set

 755 # CONFIG_FLASHCP is not set

 803 CONFIG_UBIRENAME=y

diff 结果:

diff busybox.config ../origin_buildroot/busybox.config 
3,4c3,4
< # Busybox version: 1.29.3
< # Tue Feb 11 12:29:36 2020
---
> # Busybox version: 1.28.0
> # Wed Feb  7 09:44:57 2018
55d54
< CONFIG_STACK_OPTIMIZATION_386=y
94d92
< # CONFIG_FEATURE_ETC_SERVICES is not set
105d102
< CONFIG_FEATURE_EDITING_WINCH=y
155d151
< CONFIG_BZIP2_SMALL=0
293d288
< # CONFIG_FEATURE_SORT_OPTIMIZE_MEMORY is not set
332a328
> CONFIG_WHOAMI=y
336d331
< CONFIG_WHOAMI=y
485d479
< CONFIG_FEATURE_WAIT_FOR_INIT=y
507,509c501
< CONFIG_USE_BB_CRYPT_SHA=y
< # CONFIG_ADD_SHELL is not set
< # CONFIG_REMOVE_SHELL is not set
---
> # CONFIG_USE_BB_CRYPT_SHA is not set
511a504,505
> # CONFIG_ADD_SHELL is not set
> # CONFIG_REMOVE_SHELL is not set
551c545
< CONFIG_DEPMOD=y
---
> # CONFIG_DEPMOD is not set
555c549
< CONFIG_MODINFO=y
---
> # CONFIG_MODINFO is not set
713d706
< # CONFIG_FEATURE_VOLUMEID_LFS is not set
761a755
> # CONFIG_FLASHCP is not set
765d758
< # CONFIG_FLASHCP is not set
790,791d782
< # CONFIG_FEATURE_LESS_RAW is not set
< # CONFIG_FEATURE_LESS_ENV is not set
811a803
> CONFIG_UBIRENAME=y
818d809
< CONFIG_UBIRENAME=y
911,912d901
< CONFIG_FEATURE_NSLOOKUP_BIG=y
< CONFIG_FEATURE_NSLOOKUP_LONG_OPTIONS=y
923,924d911
< CONFIG_TC=y
< CONFIG_FEATURE_TC_INGRESS=y
976d962
< # CONFIG_FEATURE_UDHCPC6_RFC5970 is not set
1063d1048
< CONFIG_SVOK=y
1092,1093d1076
< # CONFIG_ASH_BASH_SOURCE_CURDIR is not set
< CONFIG_ASH_BASH_NOT_FOUND_HOOK=y
1110,1111d1092
< # CONFIG_HUSH_LINENO_VAR is not set
< # CONFIG_HUSH_BASH_SOURCE_CURDIR is not set
1132d1112
< # CONFIG_HUSH_COMMAND is not set
2.2.2 package/skeleton-init-sysv/skeleton/etc/fstab

100ask 删除了:

# <file system> <mount pt>      <type>  <options>       <dump>  <pass>
/dev/root       /               ext2    rw,noauto       0       1

diff结果:

diff fstab ../origin_buildroot/fstab 
1a2
> /dev/root /       ext2    rw,noauto   0   1
2.2.3 Makefile

100ask 增加了:

 989 CFG_ := $(if $(DEFCONFIG),$(DEFCONFIG),$(CONFIG_DIR)/defconfig)

100ask 修改了:

 984         $(TOPDIR)/utils/defconfig_hook.py -m $(1)/configs/$$@ $(BASE_DIR)/.config            
 985         $$(COMMON_CONFIG_ENV) BR2_DEFCONFIG=$(1)/configs/$$@ \                           <--        984         @$$(COMMON_CONFIG_ENV) BR2_DEFCONFIG=$(1)/configs/$$@ \
 986                $$< --defconfig=$(BASE_DIR)/.config $$(CONFIG_CONFIG_IN)                  <--        985                 $$< --defconfig=$(1)/configs/$$@ $$(CONFIG_CONFIG_IN)

 994 #       @$(COMMON_CONFIG_ENV) $< \                                                                  <--     992         @$(COMMON_CONFIG_ENV) $< \
 995 #               --savedefconfig=$(if $(DEFCONFIG),$(DEFCONFIG),$(CONFIG_DIR     )/defconfig) \      <--     993                 --savedefconfig=$(if $(DEFCONFIG),$(DEFCONFIG),$(CONFIG_DIR)/defconfig) \
 996 #               $(CONFIG_CONFIG_IN)                                                                 <--     994                 $(CONFIG_CONFIG_IN)
 997 #       @$(SED) '/BR2_DEFCONFIG=/d' $(if $(DEFCONFIG),$(DEFCONFIG),$(CONFIG     _DIR)/defconfig)    <--     995         @$(SED) '/BR2_DEFCONFIG=/d' $(if $(DEFCONFIG),$(DEFCONFIG),$(CONFIG_DIR)/defconfig)
 998         grep "#include" $(CFG_) > $(CFG_).split || true
 999 
1000         @$(COMMON_CONFIG_ENV) $< --savedefconfig=$(CFG_) $(CONFIG_CONFIG_IN     )
1001         @$(SED) '/BR2_DEFCONFIG=/d' $(CFG_)
1002 
1003         cat $(CFG_) >> $(CFG_).split
1004         $(TOPDIR)/utils/defconfig_hook.py -s $(CFG_).split $(CFG_)
1005         rm $(CFG_).split

从984行可以看到使用了, utils/defconfig_hook.py 这个100ask 增加的文件。

diff 结果:

diff Makefile ../origin_buildroot/Makefile 
984,986c984,985
<   $(TOPDIR)/utils/defconfig_hook.py -m $(1)/configs/$$@ $(BASE_DIR)/.config
<   $$(COMMON_CONFIG_ENV) BR2_DEFCONFIG=$(1)/configs/$$@ \
<          $$< --defconfig=$(BASE_DIR)/.config $$(CONFIG_CONFIG_IN)
---
>   @$$(COMMON_CONFIG_ENV) BR2_DEFCONFIG=$(1)/configs/$$@ \
>       $$< --defconfig=$(1)/configs/$$@ $$(CONFIG_CONFIG_IN)
989d987
< CFG_ := $(if $(DEFCONFIG),$(DEFCONFIG),$(CONFIG_DIR)/defconfig)
994,998c992,995
< # @$(COMMON_CONFIG_ENV) $< \
< #     --savedefconfig=$(if $(DEFCONFIG),$(DEFCONFIG),$(CONFIG_DIR)/defconfig) \
< #     $(CONFIG_CONFIG_IN)
< # @$(SED) '/BR2_DEFCONFIG=/d' $(if $(DEFCONFIG),$(DEFCONFIG),$(CONFIG_DIR)/defconfig)
<   grep "#include" $(CFG_) > $(CFG_).split || true
---
>   @$(COMMON_CONFIG_ENV) $< \
>       --savedefconfig=$(if $(DEFCONFIG),$(DEFCONFIG),$(CONFIG_DIR)/defconfig) \
>       $(CONFIG_CONFIG_IN)
>   @$(SED) '/BR2_DEFCONFIG=/d' $(if $(DEFCONFIG),$(DEFCONFIG),$(CONFIG_DIR)/defconfig)
1000,1005d996
<   @$(COMMON_CONFIG_ENV) $< --savedefconfig=$(CFG_) $(CONFIG_CONFIG_IN)
<   @$(SED) '/BR2_DEFCONFIG=/d' $(CFG_)
<   
<   cat $(CFG_) >> $(CFG_).split
<   $(TOPDIR)/utils/defconfig_hook.py -s $(CFG_).split $(CFG_)
<   rm $(CFG_).split

3. 2020.02 的差异对比

board 增加了 100ask 文件夹 和 stmicroelectronics/stm32mp157-dk , stmicroelectronics/stm32mp157-myir docs/manual 增加了 docbook-xsl.css, github_hash_mongrel2.png, logo.png, manual.html, manual.pdf, manual.text. utils 增加了 defconfig_hook.py configs 增加了 100ask 和 stm32mp157_myir 相关文件。

boot/arm-trusted-firmware/arm-trusted-firmware.mk diff 结果: diff -r ./boot/arm-trusted-firmware/arm-trusted-firmware.mk ../origin_buildroot/boot/arm-trusted-firmware/arm-trusted-firmware.mk

8,9d7
< ARM_TRUSTED_FIRMWARE_LICENSE = BSD-3-Clause
< ARM_TRUSTED_FIRMWARE_LICENSE_FILES = license.rst
21a20,23
> # The licensing of custom or from-git versions is unknown.
> # This is valid only for the official v1.4.
> ARM_TRUSTED_FIRMWARE_LICENSE = BSD-3-Clause
> ARM_TRUSTED_FIRMWARE_LICENSE_FILES = license.rst
30,33d31
< ifeq ($(BR2_TARGET_ARM_TRUSTED_FIRMWARE_NEEDS_DTC),y)
< ARM_TRUSTED_FIRMWARE_DEPENDENCIES += host-dtc
< endif
< 
34a33,37
> 
> ifeq ($(BR2_TARGET_ARM_TRUSTED_FIRMWARE_DEBUG),y)
> ARM_TRUSTED_FIRMWARE_MAKE_OPTS += DEBUG=1
> ARM_TRUSTED_FIRMWARE_IMG_DIR = $(@D)/build/$(ARM_TRUSTED_FIRMWARE_PLATFORM)/debug
> else
35a39
> endif
53a58,71
> ifeq ($(BR2_TARGET_ARM_TRUSTED_FIRMWARE_BL32_OPTEE),y)
> ARM_TRUSTED_FIRMWARE_DEPENDENCIES += optee-os
> ARM_TRUSTED_FIRMWARE_MAKE_OPTS += \
>   BL32=$(BINARIES_DIR)/tee-header_v2.bin \
>   BL32_EXTRA1=$(BINARIES_DIR)/tee-pager_v2.bin \
>   BL32_EXTRA2=$(BINARIES_DIR)/tee-pageable_v2.bin
> ifeq ($(BR2_aarch64),y)
> ARM_TRUSTED_FIRMWARE_MAKE_OPTS += SPD=opteed
> endif
> ifeq ($(BR2_arm),y)
> ARM_TRUSTED_FIRMWARE_MAKE_OPTS += AARCH32_SP=optee
> endif
> endif # BR2_TARGET_ARM_TRUSTED_FIRMWARE_BL32_OPTEE
> 
55c73,74
< ARM_TRUSTED_FIRMWARE_MAKE_OPTS += BL33=$(BINARIES_DIR)/u-boot.bin
---
> ARM_TRUSTED_FIRMWARE_UBOOT_BIN = $(call qstrip,$(BR2_TARGET_ARM_TRUSTED_FIRMWARE_UBOOT_BL33_IMAGE))
> ARM_TRUSTED_FIRMWARE_MAKE_OPTS += BL33=$(BINARIES_DIR)/$(ARM_TRUSTED_FIRMWARE_UBOOT_BIN)
121a141,143
> 
> ARM_TRUSTED_FIRMWARE_MAKE_TARGETS += \
>   $(call qstrip,$(BR2_TARGET_ARM_TRUSTED_FIRMWARE_ADDITIONAL_TARGETS))

Makefile diff 结果: diff Makefile ../origin_buildroot/Makefile

1003,1005c1003,1004
<   $(TOPDIR)/utils/defconfig_hook.py -m $(1)/configs/$$@ $(BASE_DIR)/.config
<   $$(COMMON_CONFIG_ENV) BR2_DEFCONFIG=$(1)/configs/$$@ \
<       $$< --defconfig=$(BASE_DIR)/.config $$(CONFIG_CONFIG_IN)
---
>   @$$(COMMON_CONFIG_ENV) BR2_DEFCONFIG=$(1)/configs/$$@ \
>       $$< --defconfig=$(1)/configs/$$@ $$(CONFIG_CONFIG_IN)
1008d1006
< CFG_ := $(if $(DEFCONFIG),$(DEFCONFIG),$(CONFIG_DIR)/defconfig)
1013,1024c1011,1015
< # @$(COMMON_CONFIG_ENV) $< \
< #     --savedefconfig=$(if $(DEFCONFIG),$(DEFCONFIG),$(CONFIG_DIR)/defconfig) \
< #     $(CONFIG_CONFIG_IN)
< # @$(SED) '/BR2_DEFCONFIG=/d' $(if $(DEFCONFIG),$(DEFCONFIG),$(CONFIG_DIR)/defconfig)
<   grep "#include" $(CFG_) > $(CFG_).split || true
<   
<   @$(COMMON_CONFIG_ENV) $< --savedefconfig=$(CFG_) $(CONFIG_CONFIG_IN)
<   @$(SED) '/BR2_DEFCONFIG=/d' $(CFG_)
<   
<   cat $(CFG_) >> $(CFG_).split
<   $(TOPDIR)/utils/defconfig_hook.py -s $(CFG_).split $(CFG_)
<   rm $(CFG_).split
---
>   @$(COMMON_CONFIG_ENV) $< \
>       --savedefconfig=$(if $(DEFCONFIG),$(DEFCONFIG),$(CONFIG_DIR)/defconfig) \
>       $(CONFIG_CONFIG_IN)
>   @$(SED) '/BR2_DEFCONFIG=/d' $(if $(DEFCONFIG),$(DEFCONFIG),$(CONFIG_DIR)/defconfig)
> 

4. 修改 buildroot 下载源码包的路径,把 configs 里面相应的 config 中的 BR2_DL_DIR 修改了就可以了。

参考: https://blog.csdn.net/xiang_shao344/article/details/84839623

5. 比较两个文件夹中文件是否一致(只看文件名,不看文件内容)。

find directory1 -printf "%P\n" | sort > file1
find directory2 -printf "%P\n" | sort | diff file1 -

参考: https://www.jb51.net/article/140596.htm

6. 在2019.02 的基础上,把 qt 改为新版本的。

首先修改 packages/qt5/Config.in 里面的版本。

config BR2_PACKAGE_QT5_VERSION_LATEST
    bool "LATEST (5.14)"

然后修改 packages/qt5/qt5.mk 里面的具体版本信息。

QT5_VERSION_MAJOR = 5.14
QT5_VERSION = $(QT5_VERSION_MAJOR).2

因为 qt 取消了 hash 文件的连接,所以后面修改 hash 只能手动修改了。主要的链接 http://download.qt.io/archive/qt/5.14/5.14.2/submodules/ 在这个里面相应的 .tar.xz 后面的 details 链接里面有相应的 sha256 字符串。把相应的字符串添加到对应的 hash 文件里面。 qt5xmlpatterns/qt5xmlpatterns.hash qt5declarative/ 这下面需要新建 5.14.2,然后从 2020.05 的档里面复制 0001-qsgtexture-fix-debug-build-with-uclibc.patch, 0002-examples-fix-parallel-install.patch 到 5.14.2 的文件夹里面。然后修改 qt5declarative.hash。 qt5charts/qt5charts.hash qt5connectivity/ 这下面需要新建 5.14.2,然后从 2020.05 的档里面复制 qt5connectivity.hash 到 5.14.2 的文件夹里面。 qt5imageformats/qt5imageformats.hash qt5location/ 这下面需要新建 5.14.2,然后修改 qt5location.hash。 qt5multimedia/qt5multimedia.hash qt5quickcontrols/qt5quickcontrols.hash qt5quickcontrols2/ 这下面需要新建 5.14.2,然后从 2020.05 的档里面复制 qt5quickcontrols2.hash 到 5.14.2 的文件夹里面。 qt5script/qt5script.hash qt5svg/qt5svg.hash qt5tools/ 这下面需要新建 5.14.2,然后从 2020.05 的档里面复制 0001-Disable-designer-tool-fixes-configure-error.patch 到 5.14.2 的文件夹里面。然后修改 qt5tools.hash。

qt53d/qt53d.hash qt5graphicaleffects/qt5graphicaleffects.hash qt5scxml/qt5scxml.hash qt5sensors/qt5sensors.hash qt5serialbus/ 这下面需要新建 5.14.2,然后从 2020.05 的档里面复制 qt5serialbus.hash 到 5.14.2 的文件夹里面。 qt5serialport/ 这下面需要新建 5.14.2,然后从 2020.05 的档里面复制 qt5serialport.hash 到 5.14.2 的文件夹里面。 qt5virtualkeyboard/ 这下面需要新建 5.14.2,然后从 2020.05 的档里面复制 qt5virtualkeyboard.hash 到 5.14.2 的文件夹里面。 qt5websockets/qt5websockets.hash qt5wayland/qt5wayland.hash qt5webchannel/qt5webchannel.hash qt5webengine/ 这下面需要新建 5.14.2,然后从 2020.05 的档里面复制 0001-gn.pro-don-t-link-statically-with-libstc.patch 到 5.14.2 的文件夹里面。然后修改 qt5webengine.hash。

其他类似的改法。

参考: https://blog.csdn.net/flfihpv259/article/details/88746243

7. 当 qt 改为高版本之后,重新编译,发生了 rootfs 容量不够的现象,提示,修改 BR2_TARGET_ROOTFS_EXT2_SIZE 这个数值。这个数值可以通过 make menuconfig 来修改,也可以直接修改 .config,还可以直接修改 defconfig。

100ask对应的 defconfig 文件里面,通过 #include "FilesystemImages.config" , 来包含 100ask/ 下面的 FilesystemImages.config,在这个 config 里面,修改 BR2_TARGET_ROOTFS_EXT2_SIZE,然后通过 make xxx_defconfig,重新生成 .config,然后 make 就可以了。 使用 qt-14.2 的时候,容量超过了 512M,把 BR2_TARGET_ROOTFS_EXT2_SIZE 设置为 768M,就可以顺利生成了。

8. buildroot 不支持 make -jN,但是可以设置 BR2_JLEVEL 来达到多线程编译。

参考: https://blog.csdn.net/liuqun69/article/details/82455823

其他

参考: https://blog.csdn.net/linczone/article/details/45894181 https://www.cnblogs.com/arnoldlu/p/9553995.html https://www.cnblogs.com/erhu-67786482/p/11418171.html

标签: boot

添加新评论