星期三, 4月 19, 2006

reading makefile : toolchain : arm-elf-gcc, uclibc

每次都rebuild有點蠢,應該要看看是否有depency...

toolchain :
CCACHE_TARGET = ccache/ccache
BINUTILS_TARGET = bin/ld
GCC_TARGET = bin/arm-elf-gcc
UCLIBC_TARGET = libc.a,crt0.o, crt1.o, crti.o, crtn.o, gcrt1.o, libcrypt.a, libm.a, libnsl.a, libpthread.a, libthread.a, libresolv.a, libutil.a.
STLPORT_TARGET = libstdc++.a , .header_installed
BOOTPARM_TARGET = bin/bootparm
GENROMFS_TARGET = bin/genromfs
GENEXT2FS_TARGET = bin/genext2fs
GDB_TARGET = bin/arm-elf-gdb


ccache 的source 是ccache-2.3.tar.gz. - 這個不知道是要幹嘛的。
build的過程和一般package的動作是一樣的:
        CC=$(HOSTCC) CC_FOR_HOST=$(HOSTCC) CXX_FOR_HOST=$(HOSTCC) $(CCACHE_SRC_DIR)/configure        --host=$(GNU_HOST_NAME)        --prefix=$(STAGING_DIR)        --exec-prefix=$(STAGING_DIR)        -v;)

$(MAKE) -C $(CCACHE_DIR) all
.然後建link :
        mkdir -p $(@D)
mkdir -p $(CCACHE_DIR)
cp -f $< $@ ln -sf ccache $(@D)/$(TARGET)-gcc ln -sf ccache $(@D)/$(TARGET)-g++ ln -sf ccache $(@D)/gcc ln -sf ccache $(@D)/g++ ln -sf ccache $(@D)/cc
ccache好像是能減少build的時間,ref Debian Wiki的說明:

ccache 會 cache C/C++ compiler pre-processor 的輸出, 在編譯時自動判斷是否要重新編譯。如果原始碼沒有很好的 make dependency, 導致您每次都要用類似
make clean; make
的方式重新編譯整個 source tree 的話, ccache 能大幅縮短編譯所需的時間。
arm-elf-gcc:
        $(MAKE) -C $(GCC_BUILD_DIR) -w install-gcc LANGUAGES="$(TARGET_LANGUAGES)"
rm -rf $(TARGET_DIR)/info $(TARGET_DIR)/man $(TARGET_DIR)/share/doc $(TARGET_DIR)/share/locale
# patch gcc spec file
$(SOURCE_DIR)/patch-kernel.sh $(TARGET_DIR)/lib $(SOURCE_DIR) post-gcc-2.95.3-spec.patch
mv $(TARGET_DIR)/bin/cpp $(TARGET_DIR)/bin/$(TARGET_CROSS)cpp
...所以重點在gcc的Makefile..和spec.path.
Spec適用來傳遞給程式的選項清單。Spec中也能者定取代字串變數。
Spec的內容:
%command   : 執行command
*spec_name : 建立,刪除,修改 spec_name指定的spec字串
suffix :建立/修改suffix 規則
spec的command只有三種: include,include_noerr, rename。
..有點複雜.. ref : GCC 完全指南 p 116.

gcc 的 configure option:
         CC=$(HOSTCC)                                                $(GCC_DIR)/configure                                               --target=$(GNU_TARGET_NAME)                                 --host=$(GNU_HOST_NAME)                                     --build=$(GNU_HOST_NAME)                                    --prefix=$(STAGING_DIR)                                     --exec-prefix=$(STAGING_DIR)                                --bindir=$(STAGING_DIR)/bin                                 --sbindir=$(STAGING_DIR)/sbin                               --sysconfdir=$(STAGING_DIR)/etc                             --datadir=$(STAGING_DIR)/share                              --includedir=$(STAGING_DIR)/include                         --libdir=$(STAGING_DIR)/lib                                 --localstatedir=$(STAGING_DIR)/var                          --mandir=$(STAGING_DIR)/man                                 --infodir=$(STAGING_DIR)/info                               --with-local-prefix=$(STAGING_DIR)/usr/local                --oldincludedir=$(STAGING_DIR)/include                      --enable-languages=c,c++                                    --with-gnu-as -with-gnu-ld                                  --enable-multilib                                           --with-gxx-include-dir=$(STAGING_DIR)/include/stlport                $(EXTRA_GCC_CONFIG_OPTIONS)) 
uclibc的build 動作..
configure:
$(UCLIBC_DIR)/.configured: $(UCLIBC_DIR)/.patched $(LINUX_DIR)/.configured
sed -e 's,@KERNEL_SOURCE@,"$(LINUX_DIR)",' < $(ACTUAL_CONFIG_DIR)/uClibc-$(UCLIBC_VERSION).config \ > $(UCLIBC_DIR)/.config
$(MAKE) $(MFLAGS) -C $(UCLIBC_DIR) oldconfig
$(MAKE) $(MFLAGS) -C $(UCLIBC_DIR) headers install_dev;
cp -R $(UCLIBC_DIR)/_install/include/* $(STAGING_DIR)/$(TARGET)/include
make:
$(uclibc_arch_libs): $(UCLIBC_DIR)/.configured .staging_dir_made $(GCC_TARGET)
$(MAKE) $(MFLAGS) -C $(UCLIBC_DIR) clean
$(MAKE) $(MFLAGS) ARCH_CFLAGS="$(UCLIBC_ARCH_CFLAGS)" -C $(UCLIBC_DIR)
$(MAKE) $(MFLAGS) -C $(UCLIBC_DIR) install
cp $(patsubst %, $(UCLIBC_DIR)/_install/lib/%, $(uclibc_libs)) $(@D)
其中MFLAGS :
MFLAGS := TARGET_ARCH=$(ARCH) CROSS=$(TARGET_CROSS)
.

沒有留言:

網誌存檔