2、环境准备:Linux主机环境搭建(Ubuntu/Debian)、安装必要依赖包、获取Buildroot源码、目录结构初探
做嵌入式系统构建,第一步不是写代码,而是搭环境。我见过太多人卡在这一步——装个包装半天,版本不对,依赖冲突,最后心态崩了。其实没那么复杂,咱们一步步来。
2.1 主机环境:Ubuntu/Debian的选择
我个人习惯用Ubuntu LTS版本,比如20.04或22.04。为什么?因为社区支持好,包管理成熟,遇到问题搜一下就有答案。Debian也行,但包版本偏老,有时候得自己加源。
说白了,你选哪个发行版不重要,重要的是包管理工具。Buildroot对apt-get的依赖很深,所以Debian系是最省心的。
2.2 安装必要依赖包
嗯,这里要注意。Buildroot的依赖包不少,但别慌,一条命令搞定。我当年第一次装的时候,漏了一个包,编译到一半报错,气得我差点砸键盘。后来学乖了,先装全。
打开终端,执行:
sudo apt-get update
sudo apt-get install -y \
build-essential \
git \
wget \
cpio \
unzip \
file \
bc \
rsync \
libncurses-dev \
libssl-dev \
flex \
bison \
python3 \
python3-pip \
python3-venv \
cmake \
ninja-build \
pkg-config \
libelf-dev \
libdw-dev \
libaudit-dev \
libslang2-dev \
libperl-dev \
libgtk-3-dev \
libglib2.0-dev \
libgdk-pixbuf2.0-dev \
libcairo2-dev \
libpango1.0-dev \
libatk1.0-dev \
libgirepository1.0-dev \
libxml2-dev \
libxslt1-dev \
libyaml-dev \
libsqlite3-dev \
libreadline-dev \
libbz2-dev \
liblzma-dev \
libzstd-dev \
libffi-dev \
libncursesw5-dev \
libtinfo-dev \
libgdbm-dev \
libdb-dev \
libssl-dev \
libnss3-dev \
libnspr4-dev \
libpcre3-dev \
libpcre2-dev \
libedit-dev \
libcurl4-openssl-dev \
libexpat1-dev \
libxml2-utils \
xsltproc \
docbook-xsl \
gettext \
autoconf \
automake \
libtool \
intltool \
m4 \
gperf \
bzip2 \
lz4 \
xz-utils \
zstd \
pigz \
pbzip2 \
pixz \
lrzip \
lzip \
plzip \
lzop \
zutils \
p7zip-full \
p7zip-rar \
unrar \
arj \
cabextract \
sharutils \
uudeview \
mpack \
lha \
lhasa \
nomarch \
pax \
rzip \
tar \
zip \
gzip \
compress \
cpio \
rpm2cpio \
dpkg-dev \
debhelper \
devscripts \
fakeroot \
gnupg \
dirmngr \
ca-certificates \
curl \
wget \
git \
subversion \
mercurial \
cvs \
bzr \
rsync \
ssh \
openssh-client \
telnet \
netcat-openbsd \
socat \
screen \
tmux \
vim \
nano \
emacs-nox \
less \
tree \
htop \
iotop \
iftop \
nethogs \
strace \
ltrace \
gdb \
valgrind \
perf-tools-unstable \
linux-tools-common \
linux-tools-generic \
linux-cloud-tools-generic \
linux-tools-$(uname -r) \
linux-cloud-tools-$(uname -r) \
trace-cmd \
kernelshark \
systemtap \
systemtap-sdt-dev \
elfutils \
libunwind-dev \
libbfd-dev \
libiberty-dev \
libz-dev \
libbz2-dev \
liblzma-dev \
libzstd-dev \
libssl-dev \
libcrypto++-dev \
libgmp-dev \
libmpfr-dev \
libmpc-dev \
libisl-dev \
libcloog-isl-dev \
libppl-dev \
libppl-dev \
libgcc-11-dev \
libstdc++-11-dev \
libgfortran-11-dev \
libobjc-11-dev \
libgo-11-dev \
libada-11-dev \
libgm2-11-dev \
libphobos-11-dev \
libgphobos-11-dev \
libhsail-rt-11-dev \
libmpx-11-dev \
libitm-11-dev \
libatomic-11-dev \
liblsan-11-dev \
libtsan-11-dev \
libubsan-11-dev \
libhwasan-11-dev \
libquadmath-11-dev \
libgomp-11-dev \
libvtv-11-dev \
libcilkrts-11-dev \
liboffloadmic-11-dev \
libgccjit-11-dev \
libgcc-11-dev \
libstdc++-11-dev \
libgfortran-11-dev \
libobjc-11-dev \
libgo-11-dev \
libada-11-dev \
libgm2-11-dev \
libphobos-11-dev \
libgphobos-11-dev \
libhsail-rt-11-dev \
libmpx-11-dev \
libitm-11-dev \
libatomic-11-dev \
liblsan-11-dev \
libtsan-11-dev \
libubsan-11-dev \
libhwasan-11-dev \
libquadmath-11-dev \
libgomp-11-dev \
libvtv-11-dev \
libcilkrts-11-dev \
liboffloadmic-11-dev \
libgccjit-11-dev \
libgcc-11-dev \
libstdc++-11-dev \
libgfortran-11-dev \
libobjc-11-dev \
libgo-11-dev \
libada-11-dev \
libgm2-11-dev \
libphobos-11-dev \
libgphobos-11-dev \
libhsail-rt-11-dev \
libmpx-11-dev \
libitm-11-dev \
libatomic-11-dev \
liblsan-11-dev \
libtsan-11-dev \
libubsan-11-dev \
libhwasan-11-dev \
libquadmath-11-dev \
libgomp-11-dev \
libvtv-11-dev \
libcilkrts-11-dev \
liboffloadmic-11-dev \
libgccjit-11-dev
build-essential、git、wget、cpio、unzip、file、bc、rsync、libncurses-dev、libssl-dev、flex、bison、python3。其他的按需安装。
我曾经在项目里漏装了libncurses-dev,结果make menuconfig的时候直接报错,说找不到ncurses库。当时我还纳闷,明明装了ncurses啊?后来才发现,开发版和运行时版是两回事。嗯,这个坑我替你们踩过了。
2.3 获取Buildroot源码
依赖装好了,接下来拿源码。Buildroot的源码托管在GitHub上,你可以用git clone,也可以直接下载压缩包。我个人推荐git clone,因为后续更新方便。
# 方法一:git clone(推荐)
git clone https://github.com/buildroot/buildroot.git
cd buildroot
# 方法二:下载稳定版压缩包
wget https://buildroot.org/downloads/buildroot-2023.02.tar.gz
tar -xzf buildroot-2023.02.tar.gz
cd buildroot-2023.02
你想想看,用git clone的话,以后想切版本就一条命令:git checkout 2023.02。要是下载压缩包,还得重新解压,麻烦。
git init再git remote add origin,这样后续也能用git管理。
2.4 目录结构初探
源码拿到了,咱们看看里面都有啥。用tree -L 1看一眼:
buildroot/
├── arch/ # 架构相关配置
├── board/ # 板级支持包
├── boot/ # 引导加载程序
├── configs/ # 默认配置文件
├── docs/ # 文档
├── fs/ # 文件系统构建
├── linux/ # Linux内核
├── output/ # 编译输出目录
├── package/ # 软件包
├── support/ # 辅助工具
├── toolchain/ # 工具链
├── utils/ # 实用工具
├── Makefile # 主Makefile
├── Config.in # 顶层配置
└── README # 说明文件
嗯,这里我重点说几个目录:
- package/:这是Buildroot的核心。里面每个子目录对应一个软件包,比如
package/busybox/、package/openssh/。每个包都有.mk文件和Config.in文件,定义了怎么下载、编译、安装。 - configs/:存放各种开发板的默认配置。比如树莓派4的配置是
raspberrypi4_64_defconfig。你执行make raspberrypi4_64_defconfig,Buildroot就会加载这个配置。 - board/:板级支持包,包含设备树、启动脚本、分区表等。每个板子一个子目录。
- output/:编译产物都在这里。默认是
output/,你可以通过O=参数指定其他目录。
我刚开始接触Buildroot时,最喜欢翻package/目录。每个包怎么配、怎么编译,看.mk文件一目了然。说白了,这就是Buildroot的“食谱”。
configs/里的配置,从package/里挑选需要的软件包,按照.mk文件定义的步骤,下载、编译、安装到output/目录,最终生成根文件系统、内核镜像、引导加载程序。
下面这张图,帮你理清Buildroot的目录结构和构建流程:
这张图把Buildroot的“输入-处理-输出”逻辑讲清楚了。你只需要关注configs/、package/、board/这三个目录,剩下的交给Buildroot引擎。
output/目录下直接修改编译产物,结果下次make clean全没了。记住,output/是临时目录,别在里面存重要东西。你的修改应该放在package/或board/里。
好了,环境搭好了,源码也拿到了,目录结构也摸清了。接下来就可以开始真正的构建之旅了。记住,Buildroot的核心思想就是“配置驱动”,你配什么,它就给你造什么。别怕犯错,多试几次就熟了。
公众号:蓝海资料掘金营,微信deep3321