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