交叉編譯場(chǎng)景分析(arm-linux)(一)
——
在linux下,絕大部分的軟件包都是用autoconf配置的。除此之外,比較有名的就是X11的imake配置方式,imake實(shí)際上有點(diǎn)過時(shí)了,用起來很不方便,所以xfree86已經(jīng)計(jì)劃向autoconf移植了。還有極少的直接使用Makefile編譯,通過環(huán)境變量或者不同的Makefile配置,當(dāng)然這只適用于簡(jiǎn)單的軟件包。
Autoconf是一個(gè)非常有用的配置工具,原理有點(diǎn)復(fù)雜,全面了解它要花不少時(shí)間,但使用很方便。這里簡(jiǎn)單介紹一下autoconf交叉編譯的基本知識(shí)。
下載軟件包無非兩種方式,一種是直接從cvs里取最新版本,另一種是取發(fā)布的穩(wěn)定版本。除非你想測(cè)試最新版本,否則后者是比較安全的方式。但有的軟件包不提供發(fā)布的版本,這時(shí)就只能退而求其次了-使用cvs版本了。
編譯cvs版本有一點(diǎn)不同,cvs版本通常不帶configure腳本的,自己要重新產(chǎn)生configure腳本。當(dāng)然這并不困難,多數(shù)開發(fā)人員都會(huì)在自己的軟件包里,放上一個(gè)autogen.sh或者bootstartup之類的腳本。利用這個(gè)腳本可以自動(dòng)產(chǎn)生configure腳本。下面是一個(gè)autogen.sh腳本示例,若軟件包里沒有提供這樣的文件,可以仿照寫一個(gè):
#!/bin/sh
# $Id: autogen.sh,v 1.3 2005/02/26 01:47:22 kergoth Exp $
autoreconf -f -i -I `pwd`/m4
exit $?
echo -n "Libtoolize..."
libtoolize --force --copy
echo "Done."
echo -n "Aclocal..."
aclocal
echo "Done."
echo -n "Autoheader..."
autoheader
echo "Done."
echo -n "Automake..."
automake --add-missing --copy
echo "Done."
echo -n "Autoconf..."
autoconf
echo "Done."
#./configure $*
echo "Now you can do ./configure, make, make install."
正式發(fā)布的軟件包里,已經(jīng)有做好的configure腳本了。接下來我們要做的就是利用configure進(jìn)行配置。對(duì)于交叉編譯來說,最重要的配置選項(xiàng)有以下幾個(gè):
--host:指定目標(biāo)機(jī)的平臺(tái)類型。一般格式為CPU類型-操作系統(tǒng)名稱。比如,目標(biāo)機(jī)的CPU為arm,操作系統(tǒng)為linux,可以這樣寫--host=arm-linux。
--prefix:這是安裝路徑的前綴,即編譯結(jié)果放置的位置。默認(rèn)值是/usr或者/usr/local,交叉編譯時(shí)不能使用默認(rèn)值,否則它會(huì)覆蓋你本機(jī)的文件,所以要指定一個(gè)路徑。比如,可以指定為--prefix=/work/cross/rootfs/usr。
配置完成后,運(yùn)行make編譯,運(yùn)行make install安裝。
(pkg-config也是一個(gè)非常重要的工具,關(guān)于pkg-config的使用,可以參考筆者另外一篇文章,這里不再多說。)
2. 文檔慣例及隱含前提:
交叉編譯器名稱:arm-linux-gcc
交叉編譯器版本:3.4.3
目標(biāo)操作系統(tǒng)版本:2.6.9
默認(rèn)依賴關(guān)系:依賴glibc
隱含環(huán)境變量:
WORK_DIR:工作目錄,設(shè)置為/work/cross
ROOTFS_DIR:編譯結(jié)果根目錄,設(shè)置為$WORK_DIR/rootfs
ARCH:目標(biāo)平臺(tái)的體系架構(gòu),設(shè)置為arm
建立一個(gè)腳本用于設(shè)置變量和建立必要的目錄,在編譯前,先運(yùn)行. corss.env。 其內(nèi)容如下:
cross.env
export WORK_DIR=/work/cross
export ROOTFS_DIR=$WORK_DIR/rootfs
export ARCH=arm
export PKG_CONFIG_PATH=$ROOTFS_DIR/usr/local/lib/pkgconfig:$ROOTFS_DIR/usr/lib/pkgconfig:$ROOTFS_DIR/usr/X11R6/lib/pkgconfig
if [ ! -e "$ROOTFS_DIR/usr/local/include" ]; then mkdir -p $ROOTFS_DIR/usr/local/include;fi;
if [ ! -e "$ROOTFS_DIR/usr/local/lib" ]; then mkdir -p $ROOTFS_DIR/usr/local/lib; fi;
if [ ! -e "$ROOTFS_DIR/usr/local/etc" ]; then mkdir -p $ROOTFS_DIR/usr/local/etc; fi;
if [ ! -e "$ROOTFS_DIR/usr/local/bin" ]; then mkdir -p $ROOTFS_DIR/usr/local/bin; fi;
if [ ! -e "$ROOTFS_DIR/usr/local/share" ]; then mkdir -p $ROOTFS_DIR/usr/local/share; fi;
if [ ! -e "$ROOTFS_DIR/usr/local/man" ]; then mkdir -p $ROOTFS_DIR/usr/local/man; fi;
if [ ! -e "$ROOTFS_DIR/usr/include" ]; then mkdir -p $ROOTFS_DIR/usr/include; fi;
if [ ! -e "$ROOTFS_DIR/usr/lib" ]; then mkdir -p $ROOTFS_DIR/usr/lib; fi;
if [ ! -e "$ROOTFS_DIR/usr/etc" ]; then mkdir -p $ROOTFS_DIR/usr/etc; fi;
if [ ! -e "$ROOTFS_DIR/usr/bin" ]; then mkdir -p $ROOTFS_DIR/usr/bin; fi;
if [ ! -e "$ROOTFS_DIR/usr/share" ]; then mkdir -p $ROOTFS_DIR/usr/share; fi;
if [ ! -e "$ROOTFS_DIR/usr/man" ]; then mkdir -p $ROOTFS_DIR/usr/man; fi;
顏色字體含義
顏色字體 表示錯(cuò)誤信息。
顏色字體 表示命令行腳本。
顏色字體 表示文件內(nèi)容。
文檔格局:
基本信息:
軟件名稱,功能簡(jiǎn)述,下載地址,軟件版本,依賴關(guān)系,前置條件
2 過程分析
構(gòu)建過程中遇到的問題分析。
3 構(gòu)建處方
通常是一個(gè)可用的Makefile,用它可以編譯這個(gè)模塊。或者一些patch文件。
評(píng)論