怎么导出buildroot 配置与搭建toolchain

buildroot 下载地址:https://buildroot.org/download.html
放在Linux文件下解压出来。
使用make menuconfig 进行配置相关的东西。
在使用这条命令之前,首先要安装相关的东西。
运行如下命令进行安装相关的库文件,我的是在Ubuntu14.04的环境下进行的。
sudo apt-get install libncurses5-dev
1. target options 这是相关的目标选项,有关architecture相关的配置在这里。
2. build options 这是创建的相关选项,一些基本的创建配置在这里。
3.Toolchain 这是有关编译工具。
4.kernel &顾名思义:kernel相关的东西。
5.target packages &这是一些其他的包,库相关的配置,很多软件,比如mysql,Python3, 还有一些你想要的软件,或许可以在里面找到。
6.filesystem images 文件系统的格式
7.bootloaders &顾名思义,bootloader的相关选项。
8。host utilities 这个没去看过。
9.legacy config options 这个也没研究过。
可以看出,buildroot 不仅可以定制文件系统,可以提供相关的软件配置,还可以定制bootloaders,kernel ,但是后面那两个暂时还没有用过。
最主要的几个点
1.target options&
2.Toolchain
3.system configuration
4.Target packages
首先来看看 target options
architecture 相关的东西都在这里,这里不做一一说明,基本上有点嵌入式知识的人都能看懂。
2.Toolchain&
选择外部的交叉编译器,以及选择你的版本。
也可以选择内部,但是操作我没有去研究过。
交叉编译器的下载地址在:  
buildroot-2016.05/output/build/.arago-2011.09-armv7a-linux-gnueabi-sdk.tar.bz2.QjFo6O/output
3.&System configuration
文件系统标志以及root登录密码以及相关一些配置。
4.Target packages
  这个东西就相当的强大了对于我来说
  里面有非常多你想要的服务以及软件以及库啊以及很多很多东西。
  mysql ,python,vim , git ,以及很多很多你都可以找到。
另外一项重要的基本配置是
    make&&busybox configuration
    这些是相关基础的配置,一般情况下不用修改。
阅读(...) 评论()Posts - 158,
Articles - 0,
Comments - 0
11:40 by nigaopeng, ... 阅读,
Linux系统的交叉编译工具链用来将源代码变成bin文件或者库文件的一个软件。一般大家默认工具链等于gcc或者arm-linux-gcc,但是实际上,gcc只是工具链的编译器部分,不是全部,制作一个工具链的原材料,除了gcc,还需要linux内核,libc库等一系列的软件包。所谓万事开头难,如何在Buildroot中使用自己的交叉编译工具链则是第一道难关。
Buildroot支持从零开始用原材料软件包自动构造工具链,也支持直接使用第三方制作好的工具链。
toolchain-buildroot 从零开始自动制作工具链
在make menuconfig –& Toolchain –&Toolchain type中,有2个选项,选择buildroot toolchain则是使用buildroot默认的自动化脚本从零开始制作交叉编译工具链,如果是选择externaltoolchain&则是使用外部制作好的工具链。
Figure 1& toolchain type 选项
在mini2440_defconfig的配置文件中,我们可以看到,它并没有toochain相关的选项,只是在cpu指令集部分选择了ARM920T& ,这种情况它会采用buildroot-toolchain也就是buildroot默认的自动化脚本,从零开始制作工具链。实际上,你只要make toolchain然后等待几分钟,Buildroot就会将制作好的全新工具链放到output/host/目录下了。
Figure 2 mini2440_defconfig配置部分截图
&&&&& 整个工具链自动化制作过程可以参考toolchain/ 目录下的toolchain-buildroot/ 、toolchain.mk、helpers.mk、toolchain-wrapper.mk等几个脚本,我就不详细说了。但是有几个关键点我还是强在下面列一下。总之制作过程还是很复杂的,所以如果是初学者,用手工方法从零开始做交叉编译工具链,将是多大的挑战。
a).& 从图3中我们可以看到制作交叉工具链大概需要的原材料软件包
Figure3 制作交叉工具链的原材料
工具链主要的原材料包括:gcc,、libc库,、linux内核头文件、binutils以及一系列自动构建打包工具如m4、gmp、mpc等。
另外要强调的是,从工具链的原材料可以知道为什么Linux内核、驱动以及应用软件要用同一个工具链编译,为什么内核版本要适配它的工具链。这是因为工具链本身的制作依赖于特定版本的Linux内核和libc库。
b). 从图1的makemenuconfig –& Toolchain这一系列选项可以看到,制作工具链还可以选择libc库(uclibc还是glibc,自己添加Android特有的Bionic libc),不同的libc性能,size,效率,稳定性以及GPL协议支持上有着一定的差异,需要使用者谨慎选择和测试。mini2440直接采用buildroot提供的默认的uclibc,不保证其稳定性和bug。
另外,toolchain后面还有Linux内核版本以及MMUsupport以及gcc版本的选择,可见如果需要定制特定的Linux内核(比如不带MMU的实时版),除了移植内核之外,还需要特别为其定制工具链。
c). make menuconfig –& Target option 中的选项也是与交叉工具链密切相关的。
其中芯片的CPU的大小端,是否编译成elf格式,指令集,ABI的类型(EABI是Embeded ABI的意思,EABIHF是采用硬浮点的ABI),以及软硬浮点特性(软浮点不会有编译兼容性问题,但是在支持硬浮点的高级嵌入式芯片,采用软浮点配置,很多性能会发挥不佳,但是ARM9这种低端平台用软浮点应该OK)等等选项,都是应该考虑的点。
Figure4 与交叉工具链相关的target option选项
toolchain-external 使用第三方现成工具链
这节用友善的Tiny4412开发板官方提供的工具链为例,介绍如何将外部第三方工具链移植到到Buildroot的编译环境。Tiny4412开发板用的SOC芯片的基于ARM-Cortex-A9内核的三星Exyons-4412 真四核SOC芯片,曾经是三星旗舰手机Galaxy-S3的主打SOC。
从友善官方提供的交叉编译工具链的包命名来看,工具链使用的gcc版本是4.5.1,有vfp则说明工具链支持应付点编译。V6应该是指令集是ARMV6,但是ARM-V6实际上是ARM11的指令集,Cortex-A9的应该是ArmV7才对, 这里应该是命名出错了,算是一个小漏洞吧。
Figure5& 友善官方提供的tiny4412交叉编译工具链
移植步骤如下:
1.&&&&&&为了不产生命名误导,我们将工具链的压缩包中4.5.1/* 目录下的所以内容拷贝出来,放到一个叫toolchain-tiny4412重新压缩成名字为arm-linux-gcc-4.5.1-tiny4412.tar.bz2的压缩包,将其cp到/mnt/sdb/3rd-pkg目录下,细心的朋友已经发现,根据前面一篇Buildroot快速入门的内容,这个文件夹是我保存第三方软件包的专门文件夹,待会Buildroot会用file的方法从该文件夹中把工具链cp到buildroot/dl/目录下的。
Figure6 保存在/mnt/sdb/3rd-pkg 目录下的工具链压缩包
2.&&&&&&在make menuconfig –& Toolchain –&Toolchain type中选中external toolchain,下面的Toolchain栏中的arm-linux-gcc-4.5.1for tiny4412选项,实际上原本是没有的,是我自己加上去的。
Figure7 Toolchain的选择
3.&&&&&&那么如何把自己的工具链加上去呢?cd buildroot/toolchain/toolchain-external/文件夹,根据前一篇文章快速上手的经验,要加自己的工具链,肯定是该配置,再改mk文件啦!
在该目录的Config.in文件的108行,有一个现成的第三方ARM cortex-A9 第三方交叉工具链的配置代码。
Figure8& buildroot/toolchain/toolchain-external/Config.in中的ARM Cortex-A9现成参考配置
我们可以参考模仿这段代码,稍微修改,在这段代码后面加入我们自己的配置代码:
注意,命名很重要,变量名一定是BR2_TOOLCHAIN_EXTERNAL_开头,后面加上自己的工具链名。
Figure9 Config.in中参考修改的tiny4412工具链配置代码
在我的修改中,出来提示字符串和help部分的相关注释和提示文字,主要是把主机gcc版本的最低要求降低到4.5,再去掉了内核头文件最低版本限制(这里其实是友善官方的疏忽,友善在制作工具链的时候,采用的Linux内核头文件版本很低,和编译的内核版本不匹配,导致头文件版本检查会报错,因而我去掉了最低版本的限制,这也是潜在漏洞之一吧)。
4.&&&&&&配置交叉工具链前缀名。在Config.in的690行左右,为刚才添加的BR2_TOOLCHAIN_EXTERNAL_TINY4412_ARM选择工具链前缀名。
前缀名的格式组成是这样的:目标cpu-厂商-操作系统-库和abi格式,我们参考之前模仿的配置,选择arm-nonelinux-gnueabi,
实际上,友善官方给的工具链就是以arm-nonelinux-gnueabi作为前缀命名的。
Figure10& 工具链前缀名配置
Figure11 tiny4412官方的工具链命名
5.&&&&&&修改toolchain-external.mk 文件,加入自己配置。在296行,仿照前面一个工具链的变量配置,为BR2_TOOLCHAIN_EXTERNAL_TINY4412_ARM的配置增加下载地址和压缩包的名字,压缩包名字在第一步已经做好。至于下载地址,直接抄过来就行了,友善提供的定制化工具链,网上下载不到的。
Figure12 为toolchain-external.mk 加入tiny4412工具链的配置
事实上,打开那个地址,我们可以看到由sourcery官方维护的很多现成制作好的工具链,所以嘛直接拿来用就好了,自己从零制作工具链多麻烦啊!当然这些工具链的稳定性还是需要自己测试一番。
Figure13 sourcery网上可下载的现成工具链
6.&&&&&&在menuconfig中设置下载的镜像地址。这个和前一篇文章一样,将本地保存工具链的地址,按照格式,设置为file的镜像地址。实际上,Buildroot的下载脚本,默认的规定是优先去本地的file镜像地址找软件包,找不到之后,才会走git或者网站下载等其它方法。当然网上肯定是下载不到的,但是先从本地找到就OK,这也是第一步为什么要保存工具链压缩包到该地址的原因。
关于Buildroot下载软件包的顺序,可以参考package/pkg-download.mk的脚本,在214行可以看到,只有在本地file路径找不到了,才会采用配置的(PKG)_SITE_METHOD方法去获取软件包。
Figure14& 工具链的下载镜像地址
Figure15 Buildroot自动下载脚本的下载过程
7.&&&&&&menuconfig中的几项配置。修改完配置脚本和编译构建mk脚本后,还得在menuconfig中把修改的东西配置进去。
在target Option的配置中,注意上一节提到的几点。但是这里有几个新的选项需要注意
a). CPU架构选择的是Cortex-A9
b) vfp友善官方给的工具链是支持的,所以这里可以打开,这样就能支持硬浮点了
c) NEON SIMD是CPU支持的高性能多媒体引擎的功能,这是4412这种级别的多媒体处理器的杀手级功能,但是我们现在并不了解它的特性,也不知道友善的工具链在制作的有没有把该功能加上去,因而暂时不打开。但是专业的工程师要去了解这项功能,以便发挥SOC和CPU的潜能。
d). VFP硬浮点的版本,这一项由于友善的资料不明确,暂时选VFPv3-D16版本,根据说明,Coretex-A9对这个版本都会支持的。
e). ABI的问题,根据图11的内容,友善的工具链应该只是用了EABI来做的,没有用EABIhf。这几项是什么意思呢?浮点选项其实有软浮点、硬浮点EABI(softfp)和硬浮点EABIhf三个。
软浮点就是用软件模拟浮点运算
硬浮点EABI就是用浮点指令,但是为了兼容旧版本的软浮点编译出来的库还是用整数寄存器传递浮点数,这样牺牲了一些效率,但是在工具链中存在旧的软浮点库时,是可以兼容并不会出现编译错误的。
硬浮点EABIhf则是使用纯粹的硬浮点指令和浮点寄存器来计算浮点数,这样效率会更高,但是不再兼容工具链中旧版的软浮点下编译出来的库,如果不重新制作硬浮点EABIhf的工具链,可能会出现编译问题。
EABIhf需要知道整个工具链的库的兼容特性,目前看起来友善官方工具链不支持这个选项,其工具链命名也是EABI,但是有支持vfp,因而我们选择硬浮点EABI的配置。具体要如何支持EABIhf,可以搜其它相关文章,这个可能需要重新制作整个工具链。
以上这些选项实际上都是编译toolchain-wrapper传递的,toolchain-wrapper是一个中间层,负责编译时,传递某些特定选项给工具链,以上这些选项确定后,都会被toolchain-wrapper以参数的时候在编译时传递给交叉工具链的。
Figure 16 menuconfig --&target option的配置
Figure 17 menuconfig --&toolchain的配置
在加入了tiny4412的配置后,最后在toolchani中选择自己的工具链,选上MMU功能,然后用pipe选项进行编译加速。
最后,make toolchain& ,你就可以看到Buildroot系统如何构建出tiny4412的工具链了。
整体而言,从零制作一个工具链,对嵌入式的知识掌握还是需要深入的掌握,另外,工具链对整个系统代码的稳定性有着极大的影响,所以直接用自动制作的工具链,一定要经过严格的压力测试,否则容易出现各种隐患。
因而,采用第三方制作好的,有专门公司维护的工具链,应该是一个更为有效的开发方式。
原文链接:http://blog.csdn.net/zhou_chenz/article/details/博客访问: 258376
博文数量: 66
博客积分: 3000
博客等级: 中校
技术积分: 606
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: LINUX
若想详细地了解buildroot可参考该文档
首先从此处 & 下载最新的buildroot
$ tar jxvf buildroot-snapshot.tar.bz2
$ cd buildroot
$ make menuconfig
配置项如下:Target
Architecture (arm)---à
&&&&&&&&&&&
Target Architecture variant (arm926t) --à
&&&&&&&&&&&
Target ABI (OABI) ---à
&&&&&&&&&&& Build
option --à&
此项中只作如下修改
(arm-linux-gnu) GNU build hostname suffix&&
其余都是默认的选项
&&&&&&&&&&&
Toolchain type (buildroot toolchain) --à
&&&&&&&&&&&
Toolchain Options ---à
&&&&&&&&&&&&& ---Kernel Header Options
&&&&&&&&&&&&&&& Kernel Headers (Linux 2.6.21.x
kernel headers) -à
&&&&&&&&&&&&& ----uClibc Options
&&&&&&&&&&&&&&& uClibc C library version
(uClinbc0.9.29) -à
&&&&&&&&&&&&&&&
(toolchain/uClibc/uClibc-0.9.29.config)
uClibc configuration files to
&&&&&&&&&&&&& [ ] Enable locale/gettext/i8n
&&&&&&&&&&&&&&& Thread library implementation
(linux threads (stable/old))--à
&&&&&&&&&&&&& [ ] Thread library debugging
&&&&&&&&&&&& &-----Binutils options
& &&&&&&&&&&&&&&&&Binutils version (binutils 2.17) --à
&&&&&&&&&&&&& () Additional binutils options
&&&&&&&&&&& &&-----Gcc options
&&&&&&&&&&&&&& &&GCC compiler version (gcc 3.4.6)
&&&&&&&&&&&&
&&&&[ ] Enable setjmp /longjmp exceptions?
&&&&&&&&&&&&
&&&&() Additional gcc options
&&&&&&&&&&&&
&&&&[ ]Build/install c++ compiler and libstdc++?
&&&&&&&&&&&&
&&&&[ ]Build/install Objective –C compiler and
&&&&&&&&&&&&
&&&&[ ]Build/install Fortran compiler and runtime?
&&&&&&&&&&&& &&&&[*]Build/install a shared libgcc?
&&&&&&&&& &&&&-------Ccache Options
&&&&&&&&&&&&& &&&&&[ ]Enable ccache support?
&&&&&&&& &&&&&--------Gdb Options
&&&&&&&&&&&&& &&&&&[ ]Build gdb debugger for the Target
&&&&&&&&&&&&
&&&&&&[ ]Build gdb server for the Target
&&&&&&&&&&&&& &&&&&[
]Build gdb for the Host
&&&&---------elf2flt 未配置该选项
&&&&&&&& &&&&&---------Common Toolchain Options& 未配置该选项
&&&&&(-Os –pipe) Target Optimizations
&&&&&&&&&&
&&&[*] Include target utils in
cross toolchain
Selection for the target --à
busybox另外编译,这里未配置
Target Options
-à [*] ext2 root filesystem 其他为默认配置
Board Support
Options ---à [*] Atmel Target 其他未配置
$ make all
编译结束后即可在staging_dir目录下看到如下文件:arm-linux arm-linux-uclibc bin include info lib libexec man usr& 其中bin中即为相应的交叉编译工具,arm-linux目录下的lib中即为相应的库。
为了验证该交叉编译工具是否可以正常工作,修改 .bash_profile文件中的内容,注释掉 export PATH=$PATH:/usr/local/arm/3.4.1/bin
PATH=$PATH:/home/yyl/project1/buildroot/build_arm/staging_dir/bin
重起系统,通过arm-linux-gcc
–version命令可检测到当前arm-linux-gcc版本为3.4.6
修改linux-2.6.21目录下的Makefile文件:
将&CROSS_COMPILE
=/usr/local/arm/3.4.1/bin/arm-linux-
改为:CROSS_COMPILE
=/home/yyl/project1/buildroot/build_arm/staging_dir/bin/arm-linux-
由于我使用的是AT91SAM9261EK板子,其他的编译步骤都可参考 文档linux2.6.21
kernel移植到AT91SAM9261EK
通过给文档的编译步骤可以得到uImage文件
最后使用新生成的交叉编译工具,编译busybox-1.00,在使用make menuconfig命令配置选项时,只需要修改 Build Options à[*] Do you want to build Busybox
with a Cross Compiler?
(/home/yyl/project1/buildroot/build_arm/staging_dir/bin/arm-linux-)
其他都采用该档Linux-2.6.20内核移植到AT91RM9200-EK
制作ramdisk的方法逐步进行,仅有如下步骤需要修改(用红色标记),其他都不用修改:
a.c.准备lib库文件
# mkdir lib
# cd &/home/yyl/project1/buildroot/build_arm/staging_dir
/arm-linux/lib
# for file in libc libcrypt libdl libm libpthread libresolv libutil
> cp $file-*.so /mnt/lib
> cp -d $file.so.[*0-9] /mnt/lib
# cp -d ld*.so* /mnt/lib
最后将uImage和ramdisk.gz 通过tftp下载到AT91SAM9261EK板子,启动系统,系统正常运行,可通过这里Linux version 2.6.21
(yyl@localhost.localdomain) (gcc version 3.4.6)看到gcc为3.4.6, 同时在lib目录下可以看到uClibc为0.9.29.
从而可以验证该交叉编译工具可以正常工作。到此交叉编译工具制作完成。
阅读(6117) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
请登录后评论。博客访问: 244724
博文数量: 91
博客积分: 1650
博客等级: 上尉
技术积分: 861
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: LINUX
大大简化了交叉编译工具链的制作,并且能为目标平台产生完整的根文件系统,还可以制作在目标平台上运行的本机编译(Native
Compile)工具链。
我花了大量的时间研究buildroot,基于2009.11的版本做了不少修改,使得它符合固件开发的要求。下面列出的是一些主要的改动:
增加了对2.6.12内核头文件的支持(编译uClibc需要)
增加了对uClibc-0.9.28的支持
增加了对busybox-1.15.3的支持
增加了对gcc 3.4.4和gcc 4.4.2的支持
增加了对nfs-utils-1.1.1的支持
为libiconv瘦身,只保留了unicode和简体中文的支持,编译出的动态库从900多K减小到200多K。(编译samba需要libiconv)
让libcurl和openssl只产生静态库。(编译transmission要用到)
准备编译环境(适用于Ubuntu或Debian。我用的是Ubuntu 9.10)
安装编译所需软件包:
$ sudo apt-get install build-essential libncurses5-dev bison flex texinfo zlib1g-dev gettext libssl-dev autoconf
buildroot用wget下载软件包源码,因此需要安装wget:
sudo apt-get install wget
Ubuntu默认的shell是dash,它跟buildroot的脚本有些不兼容。用下面的命令切换到bash:
sudo dpkg-reconfigure dash
下载buildroot-2009.11,放在HOME目录下,当然也可以放在其它目录。
$ wget http://buildroot.net/downloads/buildroot-2009.11.tar.bz2
$ tar jxf buildroot-2009.11.tar.bz2
3. 打补丁。我把我的所有修改都放在一个补丁里:
$ cd buildroot-2009.11
$ patch -p1 < ../buildroot-2009.11.patch
配置buildroot。buildroot采用了和Linux内核一样的配置工具,使用非常方便。建议第一次编译时只选择生成工具链,暂时不要选择额外的软件包。我的补丁已经设置好了适合于固件开发默认配置,因此你做配置时可以全部接受默认值。(C++默认是关闭的,如果需要可以打开)
$ make menuconfig
屏幕截图 - make
menuconfig:
退出配置时会生成一个“.config”文件。
编译buildroot。这可能会花几个小时,取决于你的Internet带宽以及CPU性能
编译好的工具链默认放在output/staging目录下,你可以在配置buildroot是指定到其它目录。我喜欢把它设为/opt/cross/gcc442-uc0928,表示gcc版本是4.4.2,uClibc版本是0.9.28。注意:指定的目录你一定要有写权限。如何设置:make
menuconfig& --> Build Options --> Toolchain and header file
屏幕截图 - 设置工具链位置:
如果成功编译了工具链,接下来可以重新用make menuconfig选择所需软件包,比如我一般会选择nfs-utils,
portmap, wireless-tool, wpa-supplicant,ipkg等等。选好软件包再次执行make。编译好的软件包会放在output/target目录下,这个目录拥有根文件系统的目录结构。
如果想要制作在目标平台运行的本机编译(Native
Compile)工具链,则在make
menuconfig时打开下面两个选项:
1. Build options子菜单下的development files in target
filesystem
屏幕截图 - development files in target filesystem:
2. Package Selection for the target子菜单下的native
toolchain in the target filesystem
屏幕截图 - native toolchain in the target
filesystem
当然,为了能在目标平台上进行本机编译,还需要在配置时选择一些必要的编译工具以及程序库,如: make,
autoconf, automake, bison, m4, flex, libz, libiconv 等等。
注:所谓本机编译(Native
Compile),是相对于交叉编译而言的。其实这是最常见的编译方式,即在本机编译程序用于在本机或与本机兼容的硬件平台上运行。
autoconf, automake等软件包依赖于microperl软件包。在编译microperl时可能会遇到找不到m4的错误,这时只须执行make
host-m4即可产生buildroot_dir/output/host/usr/bin/m4,然后再执行make,中断的编译将继续进行。
编译某些软件包需要pkg-config for host(在编译平台上运行而非在目标平台上运行),执行make
host-pkgconfig可编译产生buildroot_dir/output/host/usr/bin/pkg-config
阅读(1297) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
请登录后评论。

我要回帖

更多关于 buildroot 配置与搭建 的文章

 

随机推荐