2012年8月13日 星期一

Build ppl with Fedora 17 system ....

這幾天比較閒置一些 ,想說將 Desktop 由 Fedora 16 更換為 Fedora 17 好了 !!

Fedora 對我而言 , 主要還是 Coding , Compiler 的工作 , 所以先用 VMPlayer 模擬看看 Fedora 17 好不好用 , 當然也要確認 一些 Code 可以成功的 Compiler .

工作的 Source Code 因為是 Embedded System , 所以大部分都沒有問題 !!

這個 ARM-toolchain 卻出現一些問題 , 目前發現 ppl 在 make 時會出錯 !!
找了半天 , 發現是gcc 4.7.0 的問題 , 並且在 google 上找到修正方式 !!
在 c++ 的 flags 中要多 -fpermissive 的參數 , 為了讓這個 Source Tree 可以共用在 FC16 & FC17 之間 ,於是在 Makefile 中增加下列這段 , 先判別 gcc 是否為 4.7.0 , 如果是在 configure 時候將 CXXFLAGS 加 入 -fpermissive , 如果不是就不加入 .

...........

GCC_VERSION = $(shell gcc --version | grep GCC | awk '{print $$3}')

ifeq ($(GCC_VERSION),4.7.0)
EXT_CXXFLAGS = -fpermissive
else
EXT_CXXFLAGS =
endif

CONFIGURE = LDFLAGS= CXXFLAGS=$(EXT_CXXFLAGS) \
../$(SRC_VERSION)/configure \
..........................


2012/08/14:
Build 整個 ARM toolchain 過程中 ,eglibc 也出現一堆怪問題 !!
Google 了一些解答後發現都是 C++ fpermissive 參數問題 (參考下列網址 說明) !!


http://gcc.gnu.org/onlinedocs/gcc-4.0.4/gcc/C_002b_002b-Dialect-Options.html
-fpermissive
Downgrade some diagnostics about nonconformant code from errors to warnings. Thus, using -fpermissive will allow some nonconforming code to compile.
最後決定將 fpermissive 參數提前到最外的 Makefile , 讓build 過程 CXXFLAGS 都
有這個參數 !!


...........
GCC_VERSION = $(shell gcc --version | grep GCC | awk '{print $$3}')

ifeq ($(GCC_VERSION),4.7.0)
EXT_CXXFLAGS = -fpermissive
else
EXT_CXXFLAGS =
endif

export CXXFLAGS += $(EXT_CXXFLAGS)

...........


終於可以 成功的 build 完 , 接著試試看是否有問題 , build 一些Program 來試試 !!




2012年6月27日 星期三

The END ......

按照上面幾篇文章說明 就可以編譯出自己的 Toolchain 了 !!
不過因為沒有辦法說明的很詳細 , 並且我是用 Makefile 加一些
shell scrip 方式 來完成 ,文章中沒有辦法一行一行說明 !!

另外這個 toolchain 是在公司內編譯出來/ 使用 , 基於職業道德
沒有辦法公佈所有 Makefile 內容 , 不過可以將我有用到的 source package 的
版本/ 檔名列於下列 :

binutils-2.19.1.tar.bz2
cloog-ppl-0.15.3.tar.bz2
eglibc-2.10.1-20090726-r8632.tar.bz2
eglibc-2.10-r12477.tar.gz
eglibc-localedef-2.10.1-20090726-r8632.tar.bak
eglibc-localedef-2.10.1-20090726-r8632.tar.bz2
eglibc-ports-2.10.1-20090726-r8632.tar.bz2
gcc-4.4.1.tar.bz2
gcc-4.4.2.tar.bz2
gdb-6.8.tar.bz2
glibc-2.10.1.tar.bz2
gmp-4.3.1.tar.bz2
insight-6.8-1.tar.bz2
linux-2.6.21.7.tar.bz2
linux-2.6.27.58.tar.bz2
linux-2.6.35.13.tar.bz2
linux-3.2.15.tar.bz2
mpfr-2.4.1.tar.bz2
newlib-1.18.0.tar.gz
ppl-0.10.2.tar.bz2

Building final GCC Cross Compiler ....

終於.... 最後一的動作了 .... 編譯好這個....就完成了 !!
這個 Toolchain 就可以去編譯其他 lib or packages 了 (busybox , zlib 等) !!

一樣 , 我們採用 在 source tree 外部編譯 , mkdir 一個新的資料夾 .
進入資料夾並開始執行 configure.

LDFLAGS="-Wl,-rpath=${PREFIX}/$(TOOLCHAIN_DIR)/lib" \
$(SRC_VERSION)/configure \
--prefix=$(PREFIX)/$(TOOLCHAIN_DIR) \
--build=$(CLFS_HOST) --host=$(CLFS_HOST) --target=$(CLFS_TARGET) \
--with-sysroot=$(SYSROOT_PATH) \
--with-gmp=$(PREFIX)/$(TOOLCHAIN_DIR) \
--with-mpfr=$(PREFIX)/$(TOOLCHAIN_DIR) \
--with-ppl=$(PREFIX)/$(TOOLCHAIN_DIR) \
--with-cloog=$(PREFIX)/$(TOOLCHAIN_DIR) \
--disable-nls --disable-multilib \
--enable-c99 --enable-long-long --enable-threads=posix \
--enable-__cxa_atexit \
--enable-languages="c,c++"


這時候 GCC 會使用 eglibc 的一些基本 lib , 為了可攜 , 所以不要忘記 -rpath 指令.

這次就直接 make 了 , 不用只make 一部分 ...
一樣直接 make install .....

不過因為有些 AP 在執行的時候會需要 libgcc_s.so 和 libstdc++.so , 所以多複製一份
這兩個 library 到 lib 資料夾中 , 可以在Makefile 中執行下列段落 !!


final_install:
$(Q)cp -d $(PREFIX)/$(TOOLCHAIN_DIR)/$(CLFS_TARGET)/lib/libgcc_s.so* $(PREFIX)/lib
$(Q)cp -d $(PREFIX)/$(TOOLCHAIN_DIR)/$(CLFS_TARGET)/lib/libstdc++.so* $(PREFIX)/usr/lib
$(Q)cp -d $(PREFIX)/$(TOOLCHAIN_DIR)/$(CLFS_TARGET)/lib/libstdc++.so* $(PREFIX)/lib




Building localedef packages .....

接著我們為了讓 eglibc 可以支援一些語系的 , 所以多編譯 eglibc-localedef .
我採用的是 eglibc-localedef-2.10.1-20090726-r8632.tar.bz2 !!

untar 後直接進行 configure.

../$(SRC_VERSION)/configure \
--prefix=$(PREFIX)/usr \
--with-glibc=$(WORK_DIR)/eglibc_src



完畢後直接 make !!

Install 過程會很久很久 , 所以我只挑選幾個語系來 install .
在make file 中 , 執行 下列 local_install 段 .

local_install:
$(Q)echo -e "\E[1m""\E[32m## Make install [$(VERSION)] \E[0m ";\
if [ ! -e $(PKG_INST_TCH_FILE) ]; then \
cd $(VERSION) ; \
make SUPPORTED-LOCALES="de_DE.UTF-8/UTF-8 de_DE/ISO-8859-1 de_DE@euro/ISO-8859-15 \
en_HK.UTF-8/UTF-8 en_HK/ISO-8859-1 \
en_PH.UTF-8/UTF-8 en_PH/ISO-8859-1 \
en_US.UTF-8/UTF-8 en_US/ISO-8859-1 \
es_MX.UTF-8/UTF-8 es_MX/ISO-8859-1 \
fa_IR/UTF-8 \
fr_FR.UTF-8/UTF-8 fr_FR/ISO-8859-1 fr_FR@euro/ISO-8859-15 \
it_IT.UTF-8/UTF-8 it_IT/ISO-8859-1 \
ja_JP.EUC-JP/EUC-JP ja_JP.UTF-8/UTF-8" install-locales || exit 1;\
cd - ;\
touch $(PKG_INST_TCH_FILE) ;\
fi

這樣 , 語系安裝就完成了 !!

Building EGLIBC

接著開始 eglibc 編譯 . 一樣我們也採用在 source code 外部編譯 !!
先 mkdir 一個 空的資料夾 , 並且在這個資料夾中先產生conifg.cache 和 configparms.
可以執行下列的 shell scrip !!

if [ ! -e $(VERSION)/config.cache ];then \
cd $(VERSION) ;\
echo -e "\E[1m""\E[32m## Create config.cache file ...\E[0m " ; \
echo "libc_cv_forced_unwind=yes" > config.cache;\
echo "libc_cv_c_cleanup=yes" >> config.cache;\
echo "libc_cv_gnu89_inline=yes" >> config.cache;\
cd - ;\
fi ; \
if [ ! -e $(VERSION)/configparms ];then \
cd $(VERSION) ;\
echo -e "\E[1m""\E[32m## Create configparms file ...\E[0m " ; \
echo "install_root=$(PREFIX)" > configparms ;\
cd - ;\
fi ;\


接著可以進行 configure 了 .

BUILD_CC=gcc CC=$(CLFS_TARGET)-gcc AR=$(CLFS_TARGET)-ar \
CXX=$(CLFS_TARGET)-g++ RANLIB=$(CLFS_TARGET)-ranlib \
$(SRC_VERSION)/configure \
--prefix=/usr \
--host=$(CLFS_TARGET) --build=$(CLFS_HOST) \
--disable-profile \
--enable-add-ons \
--with-headers=$(PREFIX)/usr/include \
--without-gd --without-cvs


執行完畢後接著 make . make 沒有錯誤可以接著進行 install 動作 , 執行

make install install_root=$(PREFIX)
大功告成 ..... !!
進行下一個步驟 ....... !!

2012年6月20日 星期三

Building GCC Stage 2

再次的 build GCC , 稱為 Stage 2 , 這次主要是更換 eglibc 的 header .

A. 一樣進行 configure .

AR=ar LDFLAGS="-Wl,-rpath=${PREFIX}/$(TOOLCHAIN_DIR)/lib" \
$(SRC_VERSION)/configure \
--prefix=$(PREFIX)/$(TOOLCHAIN_DIR) \
--build=$(CLFS_HOST) --host=$(CLFS_HOST) --target=$(CLFS_TARGET) \
--with-sysroot=$(SYSROOT_PATH) \
--with-gmp=$(PREFIX)/$(TOOLCHAIN_DIR) \
--with-mpfr=$(PREFIX)/$(TOOLCHAIN_DIR) \
--with-ppl=$(PREFIX)/$(TOOLCHAIN_DIR) \
--with-cloog=$(PREFIX)/$(TOOLCHAIN_DIR) \
--disable-multilib --disable-nls --disable-decimal-float \
--disable-libgomp --disable-libmudflap --disable-libssp \
--disable-shared --disable-threads \
--enable-languages="c"

B. make all-gcc all-target-libgcc

C. Install
make install-gcc install-target-libgcc

完成 gcc stage 2 的動作 , 下一個就是要編譯 eglibc 了 ! ~~~

2012年6月18日 星期一

Build eglibc header file ....

接著我們需要先安裝 eglibc 的 header , 讓 GCC stage 2 可以正確的使用 Eglibc 的 head file.
前一個步驟 我們已經準備好 eglibc 的 source tree 了 (包含 patch ) .
相同的 , 我也使用在 eglibc source tree 外的方式來進行 make .

首先 , 先產生一個 config.cache & configparms file . 內容如下(Makefile 的一部分) :

modify_patch:
$(Q)if [ ! -e $(PKG_MODIFY_TCH_FILE) ]; then \
if [ ! -e $(VERSION)/config.cache ];then \
cd $(VERSION) ;\
echo -e "\E[1m""\E[32m## Create config.cache file ...\E[0m " ; \
echo "libc_cv_forced_unwind=yes" > config.cache;\
echo "libc_cv_c_cleanup=yes" >> config.cache;\
echo "libc_cv_gnu89_inline=yes" >> config.cache;\
cd - ;\
fi ; \
if [ ! -e $(VERSION)/configparms ];then \
cd $(VERSION) ;\
echo -e "\E[1m""\E[32m## Create configparms file ...\E[0m " ; \
echo "install_root=$(PREFIX)" > configparms ;\
cd - ;\
fi ;\
touch $(PKG_MODIFY_TCH_FILE) ; \
fi



進行 configure. 這時候要注意 BUILD_CC, CC , AR , CXX & RANLIB 的路徑和名稱 ,
我們要使用 gcc stage 1 build 出了的 cross compiler .

BUILD_CC=gcc CC=$(CLFS_TARGET)-gcc AR=$(CLFS_TARGET)-ar \
CXX=$(CLFS_TARGET)-g++ RANLIB=$(CLFS_TARGET)-ranlib \
$(SRC_VERSION)/configure \
--prefix=/usr \
--host=$(CLFS_TARGET) --build=$(CLFS_HOST) \
--disable-profile \
--enable-add-ons \
--with-headers=$(PREFIX)/usr/include \
--without-gd --without-cvs


Configure 結束後 接著進行 make 動作 , 因為我們只需要 header , 所以 指令如下 :
make install-headers install_root=$(PREFIX) install-bootstrap-headers=yes csu/subdir_lib

make 結束後 , 接著我們用手動修改幾個項目 :

A. 複製幾個 .o file 到lib 目錄.
mkdir -p $(PREFIX)/usr/lib ;
cp -f $(VERSION)/csu/crt1.o $(VERSION)/csu/crti.o $(VERSION)/csu/crtn.o $(PREFIX)/usr/lib


B: 用 Cross Compiler 產生空的 libc.so file .
$(TOOLCHAIN_BIN)/$(CLFS_TARGET)-gcc -nostdlib -nostartfiles -shared -x c /dev/null -o $(PREFIX)/usr/lib/libc.so

這樣 , Eglibc 的 header 就完成了 .... 下一個步驟 .... 進行 GCC Stage 2 .