交叉編譯場景分析(Arm-Linux)

交叉編譯場景分析(arm-linux)--序
 
去年花了一個多月時間,爲arm-linux平臺編譯程序庫,其中包括zlib、readline、ncurses、tslib、TinyX、libpng、jpeg、cairo、pango、glib、atk、gtk+、match系列、SCIM、GPE系列。由於之前沒有經驗,走了不少彎路,雖然從中學到了一些知識,大部分時間都浪費了。最近一些同事和朋友常問我一些關於交叉編譯的問題,我想有必要總結一下,和大家分享一些心得。
 
什麼是交叉編譯呢?在回答這個問題前,我們先解釋兩個概念:
 
  機:運行編譯過程的計算機。
目標機:運行編譯結果(可執行文件)的計算機。
 
一般情況下,主機和目標機是同一類型的計算機,這就是正常的編譯,沒有什麼好說的。所謂交叉編譯就是在主機上爲目標機編譯,比如在PC上編譯,然後在手機上運行,這種編譯就叫交叉編譯。
 
交叉編譯需要交叉編譯器,不同的目標機(主要是看芯片類型)需要不同的交叉編譯器,比如我們這裏要介紹的arm-linux交叉編譯,所用的交叉編譯器就是arm-linux-gcc系列。
 
構建一個交叉編譯器(toolchain),說簡單也簡單,說複雜也複雜。原理上很簡單,實際情況常常比較複雜,原因是編譯器一直處於開發狀態,你要了解某個版本的穩定性,要去找patch。有時候還要看你的運氣好不好,折騰一個星期才搞定也是很常見的。
 
網上已經有不少已經構建好了的交叉編譯器(toolchain),除非你想了解如何構建交叉編譯器,否則直接下載一個來用是比較明智的做法。這裏不打算介紹如何構建交叉編譯器的知識。
 
在做交叉編譯前,你最好了解autoconf系統工具的用法,遇到問題時,可以快速定位。先找一本autoconf的書看看,可以說是磨刀不識砍柴功,否則後面會浪費更多的時間。
交叉編譯場景分析(arm-linux)(一)--基本知識
 
1.         基本知識
在linux下,絕大部分的軟件包都是用autoconf配置的。除此之外,比較有名的就是X11的imake配置方式,imake實際上有點過時了,用起來很不方便,所以xfree86已經計劃向autoconf移植了。還有極少的直接使用Makefile編譯,通過環境變量或者不同的Makefile配置,當然這隻適用於簡單的軟件包。
 
Autoconf是一個非常有用的配置工具,原理有點複雜,全面瞭解它要花不少時間,但使用很方便。這裏簡單介紹一下autoconf交叉編譯的基本知識。
 
下載軟件包無非兩種方式,一種是直接從cvs裏取最新版本,另一種是取發佈的穩定版本。除非你想測試最新版本,否則後者是比較安全的方式。但有的軟件包不提供發佈的版本,這時就只能退而求其次了-使用cvs版本了。
 
編譯cvs版本有一點不同,cvs版本通常不帶configure腳本的,自己要重新產生configure腳本。當然這並不困難,多數開發人員都會在自己的軟件包裏,放上一個autogen.sh或者bootstartup之類的腳本。利用這個腳本可以自動產生configure腳本。下面是一個autogen.sh腳本示例,若軟件包裏沒有提供這樣的文件,可以仿照寫一個:
 
#!/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."
 
正式發佈的軟件包裏,已經有做好的configure腳本了。接下來我們要做的就是利用configure進行配置。對於交叉編譯來說,最重要的配置選項有以下幾個:
 
--host指定目標機的平臺類型。一般格式爲CPU類型-操作系統名稱。比如,目標機的CPU爲arm,操作系統爲linux,可以這樣寫--host=arm-linux。
--prefix這是安裝路徑的前綴,即編譯結果放置的位置。默認值是/usr或者/usr/local,交叉編譯時不能使用默認值,否則它會覆蓋你本機的文件,所以要指定一個路徑。比如,可以指定爲--prefix=/work/cross/rootfs/usr。
 
配置完成後,運行make編譯,運行make install安裝。
 
(pkg-config也是一個非常重要的工具,關於pkg-config的使用,可以參考筆者另外一篇文章,這裏不再多說。)
 
2.         文檔慣例及隱含前提:
 
交叉編譯器名稱:arm-linux-gcc
交叉編譯器版本:3.4.3
目標操作系統版本:2.6.9
默認依賴關係:依賴glibc
 
隱含環境變量:
WORK_DIR:工作目錄,設置爲/work/cross
ROOTFS_DIR:編譯結果根目錄,設置爲$WORK_DIR/rootfs
ARCH:目標平臺的體系架構,設置爲arm
 
建立一個腳本用於設置變量和建立必要的目錄,在編譯前,先運行. corss.env。 其內容如下:
 
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;
 
顏色字體含義
顏色字體表示錯誤信息。
顏色字體 表示命令行腳本。
顏色字體 表示文件內容。
 
文檔格局:
 
1.         基本信息:

軟件名稱
 
功能簡述
 
下載地址
 
軟件版本
 
依賴關係
 
前置條件
 
 
2.         過程分析
構建過程中遇到的問題分析。
3.         構建處方
通常是一個可用的Makefile,用它可以編譯這個模塊。或者一些patch文件。
交叉編譯場景分析(arm-linux)(二)--編譯tslib
 
1.         基本信息:

軟件名稱
tslib
功能簡述
tslib是一個觸摸屏的庫,它提供諸如濾波、去抖、校準之類的功能,爲不同的觸摸屏提供了一個統一的接口。
下載地址
export CVSROOT=:pserver:[email protected]:/mnt/src/cvsroot
cvs login
cvs co tslib
軟件版本
2006-3-28 cvs版本
依賴關係
默認
前置條件
源文件位置:$(WORK_DIR)/tslib
 
2.         過程分析
因爲是cvs版本,所以先要生成configure腳本,tslib提供了一個autogen.sh文件,自然是用autogen.sh去產生了。運行:
[root@linux tslib]# ./autogen.sh
 
出現瞭如下錯誤:
: bad interpreter: No such file or directory
 
打開autogen.sh文件,發現了沒有任何錯誤,猜想可能是一些不可見的非法字符引起的,用二進制方式打開該文件,發現它是dos格式的。需要轉換成unix格式的。
 
索性用dos2unix把整個目錄都轉一遍。另外發現沒有NEWS README AUTHORS 三個文件,爲了避免出錯,產生三個空文件:
[root@linux tslib]# touch NEWS README AUTHORS
 
重新運行:
[root@linux tslib]# ./autogen.sh
 
一切OK!
 
現在來做真正的配置:
[root@linux tslib]# ./configure --host=$ARCH-linux --prefix=$ROOTFS_DIR/usr
 
配置成功,但make時,出現下列錯誤:
ts_test.o(.text+0x218): In function `main':
: undefined reference to `rpl_malloc'
 
在當前目錄查找了rpl_malloc,發現configure裏有#define malloc rpl_malloc一行。分析configure 腳本相關的代碼,原來是ac_cv_func_malloc_0_nonnull引起的,OK我們不讓它檢查了,產生一個cache文件arm-linux.cache,欺騙configure:
[root@linux tslib]# echo "ac_cv_func_malloc_0_nonnull=yes" >$ ARCH -linux.cache
[root@linux tslib]# ./configure --prefix=$(ROOTFS_DIR)/usr --host=$ ARCH -linux --cache-file=$ ARCH -linux.cache
 
配置成功後,重新編譯一下,OK!
 
3.         構建處方
l         tslib.mk
TSLIB_DIR="tslib"
 
all: clean config build
 
config:
    @cd $(TSLIB_DIR) && find * -exec dos2unix {} /; && /
    touch NEWS README AUTHORS && /
    ./autogen.sh && /
    echo "ac_cv_func_malloc_0_nonnull=yes" >$$ARCH-linux.cache && /
    ./configure --prefix=$$ROOTFS_DIR/usr --host=$$ARCH-linux --cache-file=$$ARCH-linux.cache && /
    echo "config done"
 
build:
    @cd $(TSLIB_DIR) && /
    make && make install && /
    echo "build done"
clean:
    @cd $(TSLIB_DIR) && /
    if [ -e Makefile ]; then make distclean; fi && /
echo "clean done"
交叉編譯場景分析(arm-linux)(三)--編譯zlib
 
1.         基本信息:

軟件名稱
zlib
功能簡述
zlib 一個壓縮解壓程序庫
下載地址
http://www.zlib.net/
軟件版本
zlib-1.2.3.tar.gz
依賴關係
默認
前置條件
源文件位置:$(WORK_DIR)/zlib
 
2.         過程分析
下載的穩定版本,configure已經存在,直接進行配置:
[root@linux zlib-1.2.3]# ./configure --host=$ARCH-linux --prefix=$ROOTFS_DIR/usr
 
出現瞭如下錯誤:
usage:
 configure [--shared] [--prefix=PREFIX] [--exec_prefix=EXPREFIX]
[--libdir=LIBDIR] [--includedir=INCLUDEDIR]
 
看來此configure非彼configure也,打開一看,果然不是autoconf系列的,又是一個貌合神離的東東。OK,按它的用法說明做吧,但問題是如何指定交叉編譯器呢,按照慣例,設置環境變量CC試試看:
[root@linux zlib-1.2.3]# export CC=$ARCH-linux-gcc
[root@linux zlib-1.2.3]# ./configure -shared --prefix=$ROOTFS_DIR/usr
 
OK,配置成功,編譯:
[root@linux zlib-1.2.3]# make && make install
 
OK,編譯成功。
 
3.         構建處方
l         zlib.mk
 
ZLIB_DIR="zlib-1.2.3"
 
all: clean config build
 
config:
    @cd $(ZLIB_DIR) && /
    export CC=$$ARCH-linux-gcc && /
    ./configure --prefix=$$ROOTFS_DIR/usr/local --shared && /
    echo "config done"
   
build:
    @cd $(ZLIB_DIR) && /
    make && make install && /
    echo "build done"
 
clean:
    @cd $(ZLIB_DIR) && /
    if [ -e Makefile ]; then make distclean; fi && /
echo "clean done"
交叉編譯場景分析(arm-linux)(四)--編譯readline和ncurses
 
1.         基本信息:

軟件名稱
readline
功能簡述
readline一個命令行編輯程序庫
下載地址
http://directory.fsf.org/readline.html
軟件版本
readline-5.1.tar.gz
依賴關係
默認
前置條件
源文件位置:$(WORK_DIR)/ readline-5.1
 
2.         過程分析
下載的穩定版本,configure已經存在,直接進行配置:
[root@linux readline-5.1]# ./configure --host=$ARCH-linux --prefix=$ROOTFS_DIR/usr
 
OK,配置成功,編譯:
[root@linux readline-5.1]# make && make install
 
OK,編譯成功。少有的順利
 
3.         構建處方
l         readline.mk
 
READLINE_DIR="readline-5.1"
 
all: clean config build
 
config:
    @cd $(READLINE_DIR) && /
    ./configure --prefix=$$ROOTFS_DIR/usr --host=$$ARCH-linux && /
    echo "config done"
   
build:
    @cd $(READLINE_DIR) && /
    make && make install && /
    echo "build done"
   
clean:
    @cd $(READLINE_DIR) && /
    if [ -e Makefile ]; then make distclean; fi && /
    echo "clean done"
 
交叉編譯場景分析(arm-linux)()--編譯readlinencurses
1.         基本信息:

軟件名稱
ncurses
功能簡述
ncurses一個文本界面的圖形程序庫
下載地址
http://directory.fsf.org/ncurses.html
軟件版本
ncurses-5.5.tar.gz
依賴關係
默認
前置條件
源文件位置:$(WORK_DIR)/ ncurses-5.5
 
2.         過程分析
下載的穩定版本,configure已經存在,直接進行配置:
[root@linux ncurses-5.5]# ./configure --host=$ARCH-linux --prefix=$ROOTFS_DIR/usr
 
OK,配置成功,編譯:
[root@linux ncurses-5.5]# make && make install
                
OK,編譯成功。少有的順利!
 
3.         構建處方
l         ncurses.mk
NCURSES_DIR="ncurses-5.5"
 
all: clean config build
 
config:
    @cd $(NCURSES_DIR) && /
    ./configure --prefix=$$ROOTFS_DIR/usr --host=$$ARCH-linux && /
    echo "config done"
   
build:
    @cd $(NCURSES_DIR) && /
    make && make install && /
    echo "build done"
   
clean:
    @cd $(NCURSES_DIR) && /
    if [ -e Makefile ]; then make distclean; fi && /
echo "clean done"
交叉編譯場景分析(arm-linux)(五)--編譯libjpeg和libpng
 
1.         基本信息:
軟件名稱
libjpeg
功能簡述
libjpeg一個jpeg圖形編碼解碼程序庫
下載地址
http://www.photopost.com/jpegsrc.v6b.tar.gz
軟件版本
jpegsrc.v6b.tar.gz
依賴關係
默認
前置條件
源文件位置:$(WORK_DIR)/ jpeg-6b
 
2.         過程分析
下載的穩定版本,configure已經存在,直接進行配置:
[root@linux jpeg-6b]# ./configure --host=$ARCH-linux --prefix=$ROOTFS_DIR/usr
 
OK,配置成功,編譯:
[root@linux jpeg-6b]# make && make install
 
哦,不對,怎麼還是用gcc編譯的,而不是用arm-linux-gcc編譯的呢?看來--host沒有生效,還是試試老方法-設置CC環境變量吧:
[root@linux jpeg-6b]# export CC=arm-linux-gcc
[root@linux jpeg-6b]# ./configure --host=$ARCH-linux --prefix=$ROOTFS_DIR/usr
 
OK,配置成功,編譯:
[root@linux jpeg-6b]# make && make install
 
OK,編譯成功。
 
3.         構建處方
l         jpeg.mk
 
JPEG_DIR="jpeg-6b"
 
all: clean config build
 
config:
    @cd $(JPEG_DIR) && /
    export CC=arm-linux-gcc && /
    ./configure --prefix=$$ROOTFS_DIR/usr && /
    echo "config done"
   
build:
    @cd $(JPEG_DIR) && /
    make && make install && /
    echo "build done"
   
clean:
    @cd $(JPEG_DIR) && /
    if [ -e Makefile ]; then make distclean; fi && /
    echo "clean done"
 
1.         基本信息:
軟件名稱
libpng
功能簡述
libpng一個png圖形編碼解碼程序庫
下載地址
http://www.libpng.org/pub/png/libpng.html
軟件版本
libpng-1.2.8-config.tar.gz
依賴關係
默認
zlib
前置條件
源文件位置:$(WORK_DIR)/ libpng-1.2.8-config
 
2.         過程分析
下載的穩定版本,configure已經存在,直接進行配置:
[root@linux libpng-1.2.8-config]# ./configure --host=$ARCH-linux --prefix=$ROOTFS_DIR/usr
                
出現瞭如下錯誤:
configure: error: ZLib not installed
 
奇怪,zlib已經編譯過了啊。爲什麼configure找不到zlib呢?設置一下環境變量CFLAGS和LDFLAGS試試,Makefile一般都通過CFLAGS來設置額外的編譯選項,通過LDFLAGS來設置額外的連接選項,configure大概也遵循這個規則吧。
[root@linux libpng-1.2.8-config]# export LDFLAGS=-L$ROOTFS_DIR/usr/local/lib
[root@linux libpng-1.2.8-config]# export CFLAGS=-I$ROOTFS_DIR/usr/local/include
[root@linux libpng-1.2.8-config]# ./configure --host=$ARCH-linux --prefix=$ROOTFS_DIR/usr
 
OK,配置成功,編譯:
[root@linux libpng-1.2.8-config]# make && make install
                
OK,編譯成功。
 
3.         構建處方
l         png.mk
 
PNG_DIR="libpng-1.2.8-config"
 
all: clean config build
 
config:
    @cd $(PNG_DIR) && /
    export LDFLAGS=-L$$ROOTFS_DIR/usr/local/lib && /
    export CFLAGS=-I$$ROOTFS_DIR/usr/local/include && /
    ./configure --host=$$ARCH-linux --prefix=$$ROOTFS_DIR/usr && /
    echo "config done"
   
build:
    @cd $(PNG_DIR) && /
    make && make install && /
    echo "build done"
   
clean:
    @cd $(PNG_DIR) && /
    if [ -e Makefile ]; then make distclean; fi && /
echo "clean done"
交叉編譯場景分析(arm-linux)(六)--編譯TinyX
 
轉載時請註明出處:http://blog.csdn.net/absurd
 
1.         基本信息:

軟件名稱
TinyX
功能簡述
TinyX是一個針對嵌入式系統設計的X Window,相對PC版的X Window而言,它佔用的資源要少很多,服務器程序僅700多K,客戶端的動態庫約2M(看你需要而定)多。
下載地址
http://www.xfree86.org
軟件版本
XFree86-4.5.0-src-1.tgz
XFree86-4.5.0-src-2.tgz
XFree86-4.5.0-src-3.tgz
XFree86-4.5.0-src-4.tgz
XFree86-4.5.0-src-5.tgz
XFree86-4.5.0-src-6.tgz
XFree86-4.5.0-src-7.tgz
依賴關係
默認
readline
zlib
ncurses
前置條件
源文件位置:$(WORK_DIR)/xc
 
2.         過程分析
TinyX並不是一個獨立的軟件包,而是X Window的一種編譯配置。X Window採用的imake配置方式,與autoconf不一樣,你先要手工編譯配置文件。在xc/config/cf/README文件裏,有對各種選項詳細的介紹。
 
修改這些配置文件是一種比較繁瑣的事情,特別對於新手來說,往往要經歷修改配置文件-編譯-失敗-再修改配置文件這個循環好幾次。即使是對於有經驗的人來說,一次搞定也並非那麼容易。這個過程講起來比較冗長,這裏就不再多說,具體的配置文件可以參考構建處方。
 
按照BUILD.txt裏的建議,我們決定建立一個臨時目錄,在這個臨時目錄裏編譯,避免破壞原始文件。實踐證明這個建議很有用,因爲很少第一次編譯成功,重新編譯時不用再去解壓軟件包,可以節省不少時間。
[root@linux cross]# cd xc/config/util/
[root@linux util]# make lndir
[root@linux util]# cp lndir /usr/local/bin/
[root@linux util]# cd -
[root@linux cross]# mkdir armtinyx
[root@linux cross]# cd armtinyx
[root@linux armtinyx]# lndir ../xc/
 
現在我們把配置文件和patch文件拷貝進來:
[root@linux armtinyx]# cp ../armtinyx.patch/* . -rf
 
編譯:
[root@linux armtinyx] make World DESTDIR=$ROOTFS_DIR
 
出現下列錯誤:
/usr/local/arm-linux/lib/gcc/arm-linux/3.4.2/../../../../arm-linux/sys-include/sys/io.h:38: error: conflicting types for 'inb'
../../../../../programs/Xserver/hw/xfree86/common/compiler.h:1452: error: previous definition of 'inb' was here
/usr/local/arm-linux/lib/gcc/arm-linux/3.4.2/../../../../arm-linux/sys-include/sys/io.h:39: error: conflicting types for 'inw'
 
編輯armtinyx/programs/Xserver/hw/xfree86/common/compiler.h,刪除outb之類的空函數。
重新編譯:
[root@linux armtinyx] make
 
出現下列錯誤:
arm-linux-gcc: os/tiny/lbxio.o: No such file or directory
 
[root@linux armtinyx] cd programs/Xserver/os/tiny
[root@linux armtinyx] make lbxio.o
[root@linux armtinyx] cd -
[root@linux armtinyx] make
[root@linux armtinyx] make install DESTDIR=$ROOTFS_DIR
 
編譯成功!
 
其它說明:
l         若是2.6的內核,你可能要修改NR_KEYS的值爲128,否則programs/Xserver/hw/tinyx/linux/keyboard.c裏有內存越界問題,造成無法運行。
l         若運行時,發現觸摸屏不能使用,修改programs/Xserver/hw/tinyx/linux/tslib.c的數組TsNames,加入你使用的觸摸屏設備文件。若還是不行,檢查一下tslib需要的環境變量是否設置正確。
 
 
3.         構建處方
l         armtinyx.mk
ARMTINYX_PATCH_DIR=armtinyx.patch
XC_DIR=xc
 
all: clean config build
 
config:
    cd xc/config/util && make lndir && cp -f lndir /usr/bin
    rm -rf $(ARMTINYX_DIR)
    mkdir $(ARMTINYX_DIR)
    cd $(ARMTINYX_DIR) && lndir ../xc
    cp -rvf $(ARMTINYX_PATCH_DIR)/* $(ARMTINYX_DIR)
    echo "config done"
   
build:
    @cd $(ARMTINYX_DIR) && /
    make World DESTDIR=$$ROOTFS_DIR && make install && /
    cd programs/Xserver/os/tiny && make lbxio.o && cd - && /
    make && /
    make install && /
    echo "build done"
 
clean:
    rm -rf $(ARMTINYX_DIR)
    echo "clean done"
l         armtinyx.patch/config/cf/cross.def
#undef Arm32Architecture
#undef i386Architecture
#undef Arm32Architecture
#undef Arm32Architecture
 
#define Arm32Architecture
 
#undef OptimizedCDebugFlags
 
#define OptimizedCDebugFlags    -Os
#define ServerCDebugFlags   -Os
#undef StandardDefines
#define StandardDefines     -Dlinux -D__arm__ -D_POSIX_SOURCE -D_BSD_SOURCE -D_GNU_SOURCE /
     -DX_LOCALE -DUSE_DYNAMIC_LC -DUSE_UTF8_LOADER -DUSE_DYNAMIC_LOADER
 
#define PreIncDir
#undef PostIncDir
#undef CcCmd
#define CcCmd arm-linux-gcc -I$(ROOTFS_DIR)/usr/include/ncurses -I$(ROOTFS_DIR)/usr/include
#undef HasCplusplus
#define HasCplusplus NO
#undef CplusplusCmd
#define CplusplusCmd NO
#define DoRanlibCmd YES
#define RanlibCmd arm-linux-ranlib
#undef ExtraLoadFlags
#define ExtraLoadFlags
#define FbNoPixelAddrCode
#undef TermcapLibrary
#define TermcapLibrary -L$(ROOTFS_DIR)/usr/lib -lncurses
#define NCursesLibName -L$(ROOTFS_DIR)/usr/lib -lncurses
#undef LdPostLib
#undef LdCmd
#define LdCmd arm-linux-ld
 
#undef ExtensionOSDefines
#define ExtensionOSDefines
 
#define ServerXdmcpDefines
 
#define GzipLibrary -L$(ROOTFS_DIR)/usr/local/lib -lz
 
#include <cross.rules>
 
l         armtinyx.patch/config/cf/host.def
#define KDriveXServer       YES
#define TinyXServer     YES    
#define XfbdevServer        YES
#define CrossCompiling      YES
#define ProjectRoot             /usr/X11R6
#define NothingOutsideProjectRoot   YES
 
#define HasFreetype2        NO 
#define HasFontconfig       NO
#define HasLibpng       NO     
#define HasZlib         NO     
 
#define HasExpat        NO     
#define BuildXprintClients NO
#define TouchScreen     YES
#define HasTsLib        YES   
#define BuildDocs       NO    
#define BuildXF86DRI        NO
#define BuildGlxExt     NO    
#define BuildOSMesaLib      NO
#define BuildLowMem     NO    
#define BuildIPv6       NO    
 
#define HasMTRRSupport          NO
#define UseX86Emu               NO
#define XF86INT10_BUILD         X86INT10_STUB
#define BuildAppgroup           NO
#define BuildDBE                NO
#define BuildLBX                NO
#define HasMTRRSupport          NO
#define UseX86Emu               NO
#define XF86INT10_BUILD         X86INT10_STUB
#define BuildAppgroup           NO
#define BuildDBE                NO
#define BuildLBX                NO
 
#define BuildFonts              YES
#undef BuildXF86RushExt
#define BuildXF86RushExt        NO
#undef BuildRender
#define BuildRender             YES
#define UseRgbTxt               YES
#define BuildFontServer         NO
#define BuildClients            NO
#define BuildFonts              YES
#undef BuildXF86RushExt
#define BuildXF86RushExt        NO
#undef BuildRender
#define BuildRender             YES
#define UseRgbTxt               YES
#define BuildFontServer         NO
#define OmitSnfSupport          YES
#define XdecMultiDepthServer NO
#define XsunServer            NO
#define Xsun24Server          NO
#define XsunMonoServer        NO
#define XsunLynxServer        NO
#define XSavageServer         NO
#define XIgsServer            NO
#define XTridentServer        NO
#define XchipsServer          NO
#define Xmach64Server         NO
#define Xi810Server           NO
#define XSis530Server         NO
#define XTrioServer           NO
#define XipaqServer           NO
#define XTS300Server          NO
#define XItsyServer           NO
#define XvesaServer           NO
#define XDarwinServer         NO
 
#define XF86CardDrivers         fbdev
#define XInputDrivers       mouse keyboard
交叉編譯場景分析(arm-linux)(七)--編譯sqlite
 
轉載時請註明出處:http://blog.csdn.net/absurd
 
1.         基本信息:
軟件名稱
sqlite
功能簡述
sqlite是一個針對嵌入式系統設計的數據庫管理系統(DBMS),實現了SQL92的基本功能,ARM版的可執行文件約300K.
下載地址
http://www.sqlite.org/
軟件版本
sqlite-3.3.4.tar.gz
依賴關係
默認
readline
前置條件
源文件位置:$(WORK_DIR)/ sqlite-3.3.4
 
2.         過程分析
下載的穩定版本,configure已經存在,直接進行配置:
[root@linux sqlite-3.3.4]# ./configure --host=$ARCH-linux --prefix=$ROOTFS_DIR/usr
                
出現瞭如下錯誤:
configure: error: unable to find a compiler for building build tools
 
前面檢查arm-linux-gcc都通過了,怎麼還說沒有找到編譯器呢?花了點時間看configure的腳本,太複雜了,又結合configure.ac看了一下。原來是要設置config_TARGET_CC和config_BUILD_CC兩個環境變量。config_TARGET_CC是交叉編譯器,config_BUILD_CC是主機編譯器。重來:
[root@linux sqlite-3.3.4]# export config_BUILD_CC=gcc
[root@linux sqlite-3.3.4]# export config_TARGET_CC=arm-linux-gcc
[root@linux sqlite-3.3.4]# ./configure --host=$ARCH-linux --prefix=$ROOTFS_DIR/usr
 
出現瞭如下錯誤:
checking for /usr/include/readline.h... configure: error: cannot check for file existence when cross compiling
 
readline我們已經編譯過了,readline.h是肯定存在,沒有必要檢查。還是施展我們欺騙大法吧,在cache文件裏設置ac_cv_header_readline_h=yes,騙過configure腳本:
[root@linux sqlite-3.3.4]# echo ac_cv_header_readline_h=yes >$ARCH-linux.cache
[root@linux sqlite-3.3.4]#./configure --host=$ARCH-linux --prefix=$ROOTFS_DIR/usr --cache-file=$ARCH-linux.cache
 
這回配置成功了,編譯:
[root@linux sqlite-3.3.4]# make && make install
 
有的機器上會出現下列錯誤:
libtool: compile: unable to infer tagged configuration
libtool: compile: specify a tag with `--tag'
 
這時檢查一下libtool裏的CC變量是否設置爲arm-linux-gcc,如果不是,可以手工改過來,或者設置環境變量lt_compiler=arm-linux-gcc,重新配置一下。
 
OK,經過幾番周折,終於編譯過去了。
 
3.         構建處方
l         sqlite.mk
SQLITE_DIR="sqlite-3.3.4"
 
all: clean config build
 
config:
    @cd $(SQLITE_DIR) && /
    export config_BUILD_CC=gcc && /
    export config_TARGET_CC=arm-linux-gcc && /
    echo ac_cv_header_readline_h=yes >$$ARCH-linux.cache && /
    ./configure --host=$$ARCH-linux --prefix=$$ROOTFS_DIR/usr --cache-file=$$ARCH-linux.cache && /
    echo "config done"
   
build:
    @cd $(SQLITE_DIR) && /
    make && make install && /
    echo "build done"
   
clean:
    @cd $(SQLITE_DIR) && /
    if [ -e Makefile ]; then make distclean; fi && /
echo "clean done"
交叉編譯場景分析(arm-linux)(八)--編譯glib
 
轉載時請註明出處:http://blog.csdn.net/absurd
 
1.         基本信息:
軟件名稱
glib
功能簡述
Glib是GNOME的一個基礎庫,提供基本的容器、算法、對象系統、OSAPI的適配器等。
下載地址
http://www.gtk.org
軟件版本
glib-2.8.0.tar.gz
依賴關係
默認
前置條件
源文件位置:$(WORK_DIR)/ glib-2.8.0
 
2.         過程分析
下載的穩定版本,configure已經存在,直接進行配置:
[root@linux glib-2.8.0]# ./configure --host=$ARCH-linux --prefix=$ROOTFS_DIR/usr
                
出現瞭如下錯誤:
checking for growing stack pointer... configure: error: cannot run test program while cross compiling
 
原來configure不能爲交叉編譯檢查glib_cv_stack_grows,glib_cv_stack_grows表示堆棧的增長方向。configure無法在目標機上運行測試程序,自然無法檢查,只好手工指定。順便看一下還哪些相關的變量不能檢查的,一起寫到cache文件中,並重新配置:
[root@linux glib-2.8.0]# echo ac_cv_type_long_long=yes>$ARCH-linux.cache
[root@linux glib-2.8.0]# echo glib_cv_stack_grows=no>>$ARCH-linux.cache
[root@linux glib-2.8.0]# echo glib_cv_uscore=no>>$ARCH-linux.cache
[root@linux glib-2.8.0]# echo ac_cv_func_posix_getpwuid_r=yes>>$ARCH-linux.cache
[root@linux glib-2.8.0]# ./configure --host=$ARCH-linux --prefix=$ROOTFS_DIR/usr --cache-file=$ARCH-linux.cache
 
這回配置成功了,編譯:
[root@linux glib-2.8.0]# make && make install
 
編譯成功!
 
3.         構建處方
l         glib.mk
GLIB_DIR="glib-2.8.0"
 
all: clean config build
 
config:
    @cd $(GLIB_DIR) && /
    echo ac_cv_type_long_long=yes>$$ARCH-linux.cache && /
    echo glib_cv_stack_grows=no>>$$ARCH-linux.cache && /
    echo glib_cv_uscore=no>>$$ARCH-linux.cache && /
    echo ac_cv_func_posix_getpwuid_r=yes>>$$ARCH-linux.cache &&/
    ./configure --host=$$ARCH-linux --prefix=$$ROOTFS_DIR/usr --cache-file=$$ARCH-linux.cache && /
    echo "config done"
   
build:
    @cd $(GLIB_DIR) && /
    make && make install && /
    echo "build done"
   
clean:
    @cd $(GLIB_DIR) && /
    if [ -e Makefile ]; then make distclean; fi && /
echo "clean done"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章