# buildroot 根文件系統
[buildroot](https://buildroot.org/ )可用于構建小型的linux根文件系統。
大小最小可低至2M,與內核一起可以放入最小8M的spi flash中。
buildroot中可以方便地加入第三方軟件包(其實已經內置了很多),省去了手工交叉編譯的煩惱。
美中不足的是不支持包管理系統,沒有gcc等。
## 下載安裝:
首先安裝一些依賴,比如linux頭文件:
`apt-get install linux-headers-$(uname -r)`
然后下載安裝:
~~~
wget https://buildroot.org/downloads/buildroot-2017.08.tar.gz
tar xvf buildroot-2017.08.tar.gz
cd buildroot-2017.08/
make menuconfig
~~~
## 配置
### Target options

注意此處eabi, bsp中為eabi,主線為eabihf(同時選擇VFP)
### Toolchain

### System configuration

### Filesystem images

首先配置工具鏈,因為之前開發uboot和內核都用到了自己下載的工具鏈,所以這里也配置成外部工具鏈。
在本機上外部工具鏈配置為:/opt/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/
工具鏈前綴是:arm-linux-gnueabihf
外部工具鏈gcc版本:我們使用的是最新的6.3版本
外部工具鏈內核頭文件:是在arm-linux-gnueabi/libc/usr/include/linux/version.h里讀取內核版本信息。本機的版本是4.6. (bsp為3.0.4)
C庫還是選擇傳統的glibc。需要小體積可以選uclibc(需要自行編譯安裝)。
再在system 設置下主機名,root密碼等。
另外是串口號,波特率等
最后就是配置自己需要的軟件包,在menuconfig中選中即可。
有時候下載速度慢,可以復制下載鏈接,使用迅雷等下載好后,拷貝到dl目錄下,會自動識別。
## 編譯
make
> 有時候構建會出現莫名其妙的錯誤,make clean下會ok?
編譯完成后,會生成 output/images/rootfs.tar,此即所需的根文件系統
默認失能串口登錄,需要修改/etc/inittab:
ttyS0::respawn:/sbin/getty -L ttyS0 115200 vt100 # GENERIC_SERIAL
## 刪除軟件包
buildroot在menuconfig里去掉軟件包后,并不會在打包的鏡像里去掉。
需要手動在output/target/usr/bin/里移除
make xxx-clean
清理 output/build/xxx, 包含
## 重新編譯軟件包
刪除這個目錄下的.stamp_built和.stamp_target_installed.然后回到buildroot根目錄下make。buildroot會自動重新編譯對應軟件包并且拷貝到文件系統。
有些軟件包,比如QT,只刪除標記并不能達到完全重新編譯的效果,需要手工刪除編譯目錄來重新編譯。
## 加入軟件包
1. 在package/Config.in 中對應位置添加 source "package/<pkg>/Config.in"
2. package/<pkg>下添加
Config.in, 使用kconfig編寫,描述該軟件包的狀態(Y/N/M)
<pkg>.mk 使用make編寫,描述該軟件包獲取源的方法,編譯、安裝的方法等
可選的<pkt>.hash 檢查下載文件的完整性
可選的.patch文件 在編譯前給源代碼打補丁
Config.in寫法
config BR2_PACKAGE_<PKG>
bool "pkg name"
depends on BR2_PACKAGE_XXX
select BR2_PACKAGE_XXX
help
pkg help content
### 網絡下載的軟件包
一般軟件包寫法
需要指定軟件包的基本信息(版本、下載地址等),依賴關系,
根據不同類型目標來設置<pkg>_INSTALL_xxx=YES or NO
~~~
應用軟件包 TARGET_DIR 無需修改
共享庫文件 TARGET_DIR 和 STAGING_DIR
靜態庫 STAGING_DIR
安裝入bootloader或kernel BINARIES_DIR
~~~
定義一般軟件包generic-package的動作
~~~
<pkg>_CONFIGURE_CMDS, 配置命令, 總是調用
<pkg>_BUILD_CMDS, 編譯命令,總是調用
<pkg>_INSTALL_TARGET_CMDS, //如上節所示調用
<pkg>_INSTALL_STAGING_CMDS,
<pkg>_INSTALL_IMAGES_CMDS,
<pkg>_INSTALL_CMDS, 主機軟件包總是調用
<pkg>_CLEAN_CMDS //清理命令
<pkg>_UNINSTALL_TARGET_CMDS
<pkg>_UNINSTALL_STAGING_CMDS
~~~
常用軟件包信息
~~~
LIBFOO_VERSION 版本號,如LIBFOO_VERSION = 0.1.2
LIBFOO_SOURCE 軟件包tar的名字,默認是packagename-$(LIBFOO_VERSION).tar.gz.
如LIBFOO_SOURCE = foobar-$(LIBFOO_VERSION).tar.bz2
LIBFOO_PATCH 補丁名
LIBFOO_SITE 軟件包源地址
缺省為http://$$(BR2_SOURCEFORGE_MIRROR).dl.sourceforge.net/sourceforge/packagename.
LIBFOO_SITE=http://www.libfoosoftware.org/libfoo
LIBFOO_SITE=http://svn.xiph.org/trunk/Tremor/
LIBFOO_SITE_METHOD 獲取軟件包的方法
wget, svn, git, bzr, 不指定的話會從URL猜測方法。
LIBFOO_DEPENDENCIES 列出軟件包的依賴
$(@D) 軟件包的源代碼解壓目錄
$(MAKE) 調用make
$(MAKE1) 不能使用并行編譯時候的make
$(TARGET_MAKE_ENV) $(HOST_MAKE_ENV), 傳給make的環境變量
$(TARGET_CC), $(TARGET_LD) CC,LD的選項.
$(TARGET_CROSS) 教程編譯工具鏈的前綴
$(TARGET_DIR), $(STAGING_DIR), $(BINARIES_DIR), $(HOST_DIR).
常用HOOK (用+=添加)
LIBFOO_POST_PATCH_HOOKS
LIBFOO_PRE_CONFIGURE_HOOKS
LIBFOO_POST_CONFIGURE_HOOKS
LIBFOO_POST_BUILD_HOOKS
LIBFOO_POST_INSTALL_HOOKS (for host packages only)
LIBFOO_POST_INSTALL_STAGING_HOOKS (for target packages only)
LIBFOO_POST_INSTALL_TARGET_HOOKS (for target packages only)
~~~
例程
~~~
#############################################################
# libfoo download from website
#############################################################
LIBFOO_VERSION = 1.0
LIBFOO_SOURCE = libfoo-$(LIBFOO_VERSION).tar.gz
LIBFOO_SITE = http://www.foosoftware.org/download
#LIBFOO_INSTALL_STAGING = YES # default NO
LIBFOO_DEPENDENCIES = host-libaaa libbbb
define LIBFOO_BUILD_CMDS
# $(@D) is pkg source folder
$(MAKE) CC=$(TARGET_CC) LD=$(TARGET_LD) -C $(@D) all
endef
#condition statement
#ifneq ($(BR2_PACKAGE_LIBFOO_TEST),y)
# LIBFOO_CONF_OPT += --enable-test
#endif
#define LIBFOO_INSTALL_STAGING_CMDS
# $(INSTALL) -D -m 0755 $(@D)/libfoo.a $(STAGING_DIR)/usr/lib/libfoo.a
# $(INSTALL) -D -m 0644 $(@D)/foo.h $(STAGING_DIR)/usr/include/foo.h
# $(INSTALL) -D -m 0755 $(@D)/libfoo.so* $(STAGING_DIR)/usr/lib
#endef
define LIBFOO_INSTALL_TARGET_CMDS
$(INSTALL) -D -m 0755 $(@D)/libfoo.so* $(TARGET_DIR)/usr/lib
$(INSTALL) -d -m 0755 $(TARGET_DIR)/etc/foo.d
endef
define LIBFOO_CLEAN_CMDS
-$(MAKE) -C $(@D) clean
endef
$(eval $(call GENTARGETS,package,libfoo)) # gen pkt, must the last line
~~~
GENTARGETS需要三個參數
1. 軟件包目錄前綴,一般是package,如果更深就是package/xxx
2. 小寫的包名,比如libfoo, .mk里的變量前綴就是LIBFOO_,
Config.in文件里的配置選項就是 BR2_PACKAGE_LIBFOO.
3. 可選,缺省是target,標識為host則為主機包
### autotools-based軟件包的mk寫法
~~~
#############################################################
# libfoo
#############################################################
LIBFOO_VERSION = 1.0
LIBFOO_SOURCE = libfoo-$(LIBFOO_VERSION).tar.gz
LIBFOO_SITE = http://www.foosoftware.org/download
LIBFOO_INSTALL_STAGING = YES
LIBFOO_INSTALL_TARGET = YES
LIBFOO_CONF_OPT = --enable-shared
LIBFOO_DEPENDENCIES = libglib2 host-pkg-config
$(eval $(call AUTOTARGETS,package,libfoo))
~~~
### CMake-based軟件包mk寫法
~~~
#############################################################
# libfoo
#############################################################
LIBFOO_VERSION = 1.0
LIBFOO_SOURCE = libfoo-$(LIBFOO_VERSION).tar.gz
LIBFOO_SITE = http://www.foosoftware.org/download
LIBFOO_INSTALL_STAGING = YES
LIBFOO_INSTALL_TARGET = YES
LIBFOO_CONF_OPT = -DBUILD_DEMOS=ON
LIBFOO_DEPENDENCIES = libglib2 host-pkg-config
$(eval $(call CMAKETARGETS,package,libfoo))
~~~
### <pkg>.mk寫法之本地軟件包
常用變量
~~~
LIBFOO_VERSION
LIBFOO_SOURCE
LIBFOO_SITE
LIBFOO_DIR 軟件包被配置和編譯的目錄,一般建在BUILD_DIR下
LIBFOO_BINARY 軟件包二進制文件名
LIBFOO_TARGET_BINARY 軟件包的目標文件系統的安裝目錄
~~~
本地軟件包的.mk更像正常的makefile,當做普通makefile看即可
~~~
##############################################################
# libfoo
#############################################################
LIBFOO_DIR:=$(BUILD_DIR)/libfoo
#這里 填獲取源代碼的方式,即本地拷貝文件
$(LIBFOO_DIR)/.source :
mkdir -pv $(LIBFOO_DIR) $(LIBFOO_HOST_DIR)
cp -rf package/libfoo/src/* $(LIBFOO_DIR)
touch $@ #create dummy file
#這里填配置編譯的操作
$(LIBFOO_DIR)/.configured: $(LIBFOO_DIR)/.source
touch $@
#compile
libfoo-binary: $(LIBFOO_DIR)/.configured
mkdir -pv $(HOST_DIR)/usr/bin
$(MAKE) BUILD_DIR=$(BUILD_DIR) CC="$(TARGET_CC)" -C $(LIBFOO_DIR)
#install
libfoo: libfoo-binary
$(MAKE) DESTDIR="$(TARGET_DIR)" -C $(LIBFOO_DIR) install
##############################################################
# Add our target
#############################################################
ifeq ($(BR2_PACKAGE_LIBFOO),y)
TARGETS += libfoo
endif
然后在src里加入對應的 源文件和makefile,示例如下
###########################################
#Makefile for simple programs
###########################################
INC=
LDLIBS += -lpthread
CFLAGS += -Wall
#CPPFLAGS +=
PRG=threadpooltest
OBJ=CThreadManage.o CThreadPool.o CThread.o CWorkerThread.o threadpooltest.o
$(PRG):$(OBJ)
$(CC) $(INC) $(LIB) -o $@ $(OBJ)
.SUFFIXES: .c .o .cpp
.cpp.o:
$(CC) $(CFLAGS ) $(INC) -c $*.cpp -o $*.o
.PRONY:clean
clean:
@echo "Removing linked and compiled files......"
rm -f $(OBJ) $(PRG)
SRCS := xxx.c
CFLAGS := -Wall
libfoo : $(SRCS)
$(CC) $(filter %.c, $(SRCS)) $(CFLAGS) -o fsck_msdos
clean:
rm libfoo
install:
cp fsck_msdos $(DESTDIR)/usr/bin/
~~~
//這個是manual makefile,也類似
~~~
#############################################################
# libfoo
#############################################################
LIBFOO_VERSION:=1.0
LIBFOO_SOURCE:=libfoo-$(LIBFOO_VERSION).tar.gz
LIBFOO_SITE:=http://www.foosoftware.org/downloads
LIBFOO_DIR:=$(BUILD_DIR)/foo-$(FOO_VERSION)
LIBFOO_BINARY:=foo
LIBFOO_TARGET_BINARY:=usr/bin/foo
#method to get source
$(DL_DIR)/$(LIBFOO_SOURCE):
$(call DOWNLOAD,$(LIBFOO_SITE),$(LIBFOO_SOURCE))
#target: .source extract source tar
$(LIBFOO_DIR)/.source: $(DL_DIR)/$(LIBFOO_SOURCE)
$(ZCAT) $(DL_DIR)/$(LIBFOO_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) -
touch $@
#target:.configured
$(LIBFOO_DIR)/.configured: $(LIBFOO_DIR)/.source
(cd $(LIBFOO_DIR); rm -rf config.cache; \
$(TARGET_CONFIGURE_OPTS) \
$(TARGET_CONFIGURE_ARGS) \
./configure \
--target=$(GNU_TARGET_NAME) \
--host=$(GNU_TARGET_NAME) \
--build=$(GNU_HOST_NAME) \
--prefix=/usr \
--sysconfdir=/etc \
)
touch $@
#target: binary file compile
$(LIBFOO_DIR)/$(LIBFOO_BINARY): $(LIBFOO_DIR)/.configured
$(MAKE) CC=$(TARGET_CC) -C $(LIBFOO_DIR)
#target: target binary file move to target,strip,remove manual
$(TARGET_DIR)/$(LIBFOO_TARGET_BINARY): $(LIBFOO_DIR)/$(LIBFOO_BINARY)
$(MAKE) DESTDIR=$(TARGET_DIR) -C $(LIBFOO_DIR) install-strip
rm -Rf $(TARGET_DIR)/usr/man
#dependencies
libfoo: uclibc ncurses $(TARGET_DIR)/$(LIBFOO_TARGET_BINARY)
#download before compile
libfoo-source: $(DL_DIR)/$(LIBFOO_SOURCE)
libfoo-clean:
$(MAKE) prefix=$(TARGET_DIR)/usr -C $(LIBFOO_DIR) uninstall
-$(MAKE) -C $(LIBFOO_DIR) clean
libfoo-dirclean:
rm -rf $(LIBFOO_DIR)
#############################################################
# Toplevel Makefile options
#############################################################
ifeq ($(BR2_PACKAGE_LIBFOO),y)
TARGETS+=libfoo
endif
~~~
- 前言
- 荔枝派TODO任務領取
- linux使用小貼士
- 入門篇
- 板卡介紹
- 開箱指南
- 燒錄啟動系統
- 聯網方法
- 鏡像使用
- 鏡像說明
- buildroot系統使用
- debian系統使用
- 外設操作
- 外設操作概覽
- 低速外設
- GPIO
- GPIO模擬低速接口
- UART
- PWM
- I2C
- SPI
- 高速接口
- SDIO
- USB
- EtherNet
- DVP CSI
- MIPI CSI
- 模擬外設
- CODEC
- LRADC
- 常見設備驅動
- USB攝像頭
- USB 3G/4G 網卡
- 舵機
- 開發篇
- UBOOT適配
- UBOOT編譯
- UBOOT配置
- UBOOT配置屏幕分辨率
- UBOOT配置SPI啟動
- Linux內核開發
- Linux內核編譯
- BSP Linux內核編譯.md
- Linux內核選項
- 外設驅動與設備樹
- RTL8723BS驅動
- 根文件系統定制
- buildroot定制系統
- buildroot添加軟件包
- openwrt定制系統
- emdebian定制系統
- camdriod開發
- camdriod編譯
- 主線Uboot引導Camdriod
- 系統鏡像打包
- XBOOT適配
- 荔枝運行XBOOT
- 應用篇
- 游戲機-基于EmulationStation
- 游戲機-gnuboy
- 語音識別-科大訊飛云
- GUI-QT5
- 語音識別-離線關鍵詞識別
- 路由器-Lichee Zero
- 投稿文章
- 荔枝派Zero開箱指南
- Zero i2c oled使用指南
- zero SPI LCD使用指南
- Zero u-boot編譯和使用指南
- TF WiFi使用方法
- Zero Ethernet使用指南
- Zero 移植Qt5.4.1
- ZeroSpiNorFlash啟動系統制作指南
- Visio-uboot-sunxi流程
- lichee 編譯踩坑記錄(ilichee ZERO)
- lichee_zero_外設GPIO接口
- TF WIFI 小白編
- 從零開始LicheePi Zero的開發
- 認識Zero的硬件
- 搭建Zero的開發環境
- 主線Uboot
- 主線kernel
- BSP kernel
- BSP內核啟動
- bsp內核的攝像頭使用
- BSP內核中的保留內存
- uboot啟動BSP內核常見錯誤
- BSP內核 FBTFT移植
- BSP內核啟動錯誤及警告解決
- buildroot 根文件系統
- emdebian 根文件系統
- SPI Flash 系統編譯
- sunxi-fel增加對16M 以上flash的支持
- overlayfs的使用
- jffs2系統掛載不上的常見原因
- JFFS2 文件系統簡介
- uboot對spi flash的識別
- bsp內核的SPI flash啟動
- Docker開發環境
- Docker 命令速查
- 基礎ubuntu系統配置
- docker離線鏡像
- Zero系統燒錄
- dd鏡像燒錄
- 分區鏡像燒錄
- SPI Flash系統燒錄
- 一鍵鏡像燒錄
- Zero外設把玩
- I2C操作
- PWM輸出
- CODEC的使用
- 以太網使用指南
- GPIO操作
- 文件IO方式
- C語言接口(mmap)
- Python操作GPIO
- pinctrl-sunxi介紹
- UART操作
- 點屏
- 點屏之RGB屏
- 點屏之SPI屏 ili9341
- 點屏之SPI OLED
- 點屏之I2C OLED
- 點屏之SPI屏 ili9488
- 點屏之MCU屏
- 點屏之觸摸屏驅動
- 點屏之simple-framebuffer
- 點屏之屏幕時序
- 時鐘控制器CCM
- 攝像頭
- BSP DVP攝像頭
- BSP MIPI 攝像頭
- 主線DVP攝像頭
- 主線 MIPI攝像頭
- SPI 操作
- 應用層開發
- 開機自啟動
- Segment Fault調試
- Zero通過OTG共享PC網絡
- USB攝像頭使用
- 基于QT的GUI開發
- 移植tslib
- 移植QT5.9.1
- 移植QT4.8.7
- QtCreator使用
- Qt5.x移植到Qt4.8
- Qt字體相關
- Qt移植總結
- Qt裁剪
- Qt去除鼠標指針顯示
- zero_imager使用
- 驅動開發
- 設備樹簡介
- GPU/DRM 顯示驅動
- sys下設備樹查看
- atmel觸摸屏驅動分析
- atmel觸摸屏中斷改輪詢
- uboot下gpio操作
- helloworld驅動編譯演示
- FBTFT分析
- 內核模塊靜態加載的順序
- SPI驅動分析
- SPI 驅動編寫
- Uboot開發
- 開機logo
- 看門狗的使用
- 關于系統reboot
- 內核printk等級設置