轉自:https://blog.csdn.net/shengnan_wu/article/details/8149466
1.獲取Buildroot路徑:
1)所有的發行版可以在以下官網下載 :
http://buildroot.net/downloads/
2)最新版可以在以下鏈接下載 :
http://buildroot.net/downloads/snapshots/buildroot-snapshot.tar.bz2
3)先前老版本的可以在以下鏈接下載 :
http://buildroot.net/downloads/snapshots/
2.buildroot提供了一個很不錯的類似配置Linux內核的配置工具,在啟動配置工具之前,需要安裝如下某些包:
1)libncurses5-dev包 : 用於使用menuconfig 配置界面.
2)libqt4-dev包 : 用於使用xconfig配置界面.
3)libglib2.0-dev,
libgtk2.0-dev,
libglade2-dev : 用於使用gconfig配置界面.
3.解壓buildroot壓縮包
# tar jxvf /mnt/buildroot-snapshot.tar.bz2 -C ./
4.啟動配置工具的3個不同配置接口 :
1)make menuconfig
2)make xconfig
3)make gconfig
5.配置完成后,配置工具會產生一個 .config文件 包含了所有我們配置的信息.這個文件將被用於Makefile, 使用make進行編譯:
1)make
這里不能使用make-jN,因為Buildroot不支持top-levelparallel make , 反之 , 使用BR2_JLEVEL選項來告訴Buildroot運行編譯每一個package使用make -JN.
使用make命令之后會執行下面幾個步驟:
①下載源文件(所要求的)
②配置,編譯和安裝cross-compiling toolchain(如果使用內部工具鏈),或者輸出一個toolchain(如果一個外部工具鏈使用)
③構建/安裝杯選擇的目標包
④構建內核鏡像(如果有選擇)
⑤構建啟動代碼鏡像(如果有選擇)
⑥創建一個選擇好格式的根文件系統
2)make source
當我們現在是離線的時候並且只是想使用之前配置下載了的sources,可以使用這個命令 , 這樣就可以不用上網或者從我們的dl目錄直接拷貝內容來構建.
6.使用out-of-tree構建
make menuconfig O=/tmp/build
或者
cd /tmp/build; makemenuconfig O=$PWD -C path/to/buildroot
當想把配置和編譯輸出文件都放在Buildroot樹外面的話,可以在配置命令添加上如上選項O=...,-C...,這樣輸出的文件就會被被放置在/tmp/build目錄下.
使用out-of-tree構建時, .config和臨時文件也被存放在我們指定的輸出目錄.這就意味着我們能夠安全地並行執行多個編譯通過使用同一個相同的源碼樹,只要他們使用各自獨立的輸出目錄.
在第一次make menuconfig使用了上面選項之后,第二次make就不需要加上上述選項了.
7.輸出目錄output/ ; 這個目錄下還有幾個子目錄:
· images/ : 存放編譯后產生的所有鏡像文件( 內核鏡像 , 加載引導鏡像 和 根文件系統鏡像)
· build/ : 存放所有的組件除了構建交叉編譯工具鏈的組件 , 在這個目錄里面每一個功能對應一個子目錄存放他們各自的組件.
· staging/ : 包含一個類似於根文件系統等級層次的層級 . 這個目錄包含了 安裝的交叉編譯工具鏈 和 所有被選擇用於目標板的所有用戶空間包.
· target/ : 包含了幾乎所有的用於目標板的完整的根文件系統 除了 /dev/里面的驅動文件 , 所以這個目錄是不能用於你的開發板的 . 取而代之,我們應該使用構建在 images/ 里的鏡像. 假如你需要使用一個選出的根文件系統鏡像通過NFS來引導,那么使用產生在images/里面的壓縮鏡像並引出它作為根引導.
· host/ : 包含了編譯給主機的安裝工具,比如cross-compilationtoolchain.
· toolchain/ : 包含了用於構建交叉編譯工具鏈的各種組件的目錄.
有了以上的一些了解之后 , 就可以開始使用Buildroot來制作交叉編譯工具鏈了:
1.下載buildroot源碼包,安裝啟動配置工具所需的包(不演示)
2.在/opt/創建工作目錄,解壓源碼包到工作目錄里,進入工作目錄並創建一個build目錄用於放置編譯產生的文件,命令如下:
# make buildroot
# tar jxvf/mnt/buildroot-snapshot.tar.bz2 -C ./
# mkdir bulid
執行之后buildroot目錄內容如下:
3.進入build目錄,啟動配置工具,執行命令如下:
# cd build/
# make menuconfigO=$PWD -C ../buildroot/
執行完上面命令后出現下面配置界面,這個跟配置linux內核很像:
根據之前對交叉編譯工具鏈的介紹,我們大致可以知道,重點在以下幾個選擇:
1)Linux headers (Toolchain--> Kernel Headers選項)
2)binary utilities (Toolchain-->BinutilsVersion選項)
3)the C library (Toolchain-->uClibcC library Version選項)
4)the bootstrap compiler
5)the fullcompiler 4,5都需要用到GCC (Toolchain-->GCC compiler Version)
簡單解釋幾個比較重要的選項:
Target Architecture ---> 用於選擇目標的架構,我這里選擇ARM (little endian)(s3c2440可以運行在小端模式和大端模式,默認是小端模式)
Target Architecture Variant ---> 內核類型, 這里我的是(arm920t)
Target ABI (EABI) ---> 目標使用的應用程序二進制接口,其中有兩個選擇
①EABI(Embedded ABI)
②OABI(Old ABI)
這里我選擇默認的EABI.具體區別可以百度上查看.
Build options ---> 主要是一些編譯時用到的選項,比如dl的路徑,下載代碼包使用的路徑,同時運行多個編譯的上限,是否使能編譯器緩沖區等等,這里按照默認就行了.
Toolchain ---> 工具鏈選項
Toolchain type (Buildroottoolchain) ---> 工具鏈類型,這里我們沒使用外部Buildroot,也不使用crosstool-ng的工具鏈,默認使用Buildroottoolchain就行 .
*** Kernel Header Options *** 選擇使用的哪個版本的內核頭文件
Kernel Headers (Linux 3.6.x kernel headers) ---> 我選擇了里面的最新版
***uClibc Options ***
uClibc C library Version (uClibc 0.9.33.x) ---> 選擇里面最新版
(toolchain/uClibc/uClibc-0.9.33.config)uClibc configuration file
[ ] Threadlibrary debugging
[ ] Compileand install uClibc tests
*** Binutils Options ***
Binutils Version (binutils 2.21.1) ---> 選擇binutils版本
() Additional binutilsoptions
*** GCCOptions ***
GCC compiler Version (gcc 4.6.x) ---> 選擇GCC版本
() Additional gcc options
[ ] Build/install Objective-C compiler and runtime?
[ ] Build/install Fortran compiler and runtime?
[*] Build/install a shared libgcc?
[ ] Enable compiler OpenMP support
*** Gdb Options ***
*** Gdbdebugger for the target needs WCHAR support in toolchain ***
[ ] Build gdb server for the Target
[ ] Build gdb for the Host
[ ] Purge unwanted locales
() Generate locale data
[*]Enable MMU support
[*] Usesoftware floating point by default
(-pipe)Target Optimizations
() Target linker options
*** Toolchain Options*** (以下是選擇一些工具鏈的選項)
[] Enable large file (files > 2 GB) support
[] Enable IPv6 support
[] Enable RPC support
[] Enable WCHAR support
[] Enable toolchain locale/i18n support
[*] Enable C++ support (選擇是否提供C++功能)
[] Enable stack protection support
Thread library implementation(linuxthreads (stable/old)) --->
[ ] Enable elf2flt support? (選擇是否提供elf2flt選項功能)
Buildroot2012.11-git Configuration 下其它的配置就不屬於配置工具鏈的范疇了,如下:
Systemconfiguration --->
PackageSelection for the target --->
Hostutilities --->
Filesystemimages --->
Bootloaders --->
4.配置保存好后, 通過ls -la命令可以看到.config文件已經生成了,Makefile也生成了,如下圖:
5.執行最后一次編譯
# make
可惜在編譯過程中出現了一個錯誤如下錯誤信息:
從上面用紅線圈起來的地方,我們可以了解到,ucbilc庫是不支持大文件的,估計在按照linux頭文件的那部分時,對應linux內核版本或者在gcc的被用到的庫里支持了大文件的,也就是定義了_FILE_OFFSET_BITS ,這里我找了一段時間,找不到這個宏在哪個文件定義了,最后我是直接在上面提到的features.h頭文件里把_FILE_OFFSET_BITS取消了宏定義.
修改如下:
之后重新make一下,通過了.
我們可以在host/usr/bin/里面看到很多我們需要的二進制文件,如下所示:
# cd host/usr/bin/
在使用命令ls -l來看一下:我們可以發現其實藍色的命令只是鏈接文件連接到對應的綠色二進制文件,如下所示:
6.接下來把路徑加到PATH環境變量里面,可以在/etc/profile文件里加入:
# vim/etc/profile
添加上:
exportPATH=$PATH:/opt/Buildroot/build/host/usr/bin
保存之后,執行以下命令使其生效:
# source/etc/profile
7.在Buildroot/buildroot/dl目錄下我們可以看到,整個編譯過程使用到被下載了的文件及版本如下:
mpc,mpfr和gmp,都是用於安裝gcc時用到的庫,其中mpfr和mpc都依賴於gmp.所以在安裝gcc之前 , gmp , mpfr和mpc這3個庫都會被先安裝了.
GNU M4 :
m4 是 POSIX 標准中的一部分,所有版本的 UNIX下都可用。雖然這種語言可以單獨使用,但大多數人需要 m4 僅僅是因為 GNU autoconf 中的“configure” 腳本依賴它。 宏處理器(或預處理器)一般用作文本替換工具。最終用戶經常會用它來處理要反復使用的文本模板,典型的是用於編程工具,還會用於文本編輯和文字處理工具
GNU Autoconf:
Autoconf是一個用於生成可以自動地配置軟件源代碼包以適應多種Unix類系統的shell腳本的工具。由Autoconf生成的配置腳本在運行的時候與Autoconf是無關的, 就是說配置腳本的用戶並不需要擁有Autoconf。
GNU Automake:
GNU Automake是一種編程工具,可以產生供make程式使用的Makefile,用來編譯程式。它是自由軟件基金會所所制作的GNU程式的其中一項,作為GNU建構系統的一部分。automake所產生的Makefile符合GNU編程標准。
automake是由Perl語言所寫的,必須和GNUautoconf一並使用 .
GNU libtool :
GNU libtool是一個通用庫支持腳本,將使用動態庫的復雜性隱藏在統一、可移植的接口中。
親測此工具鏈可用