セルフコンパイル環境の準備 Edit

  • 基本セットの導入
    landisk:/# apt-get install dpkg-dev binutils gcc g++ make libncurses5-dev
    
    etch版を選択した場合は、gcc-4.0系がインストールされます。
    ついでにkernelビルドに必要なgcc-3.4系もインストールしておきます。
    landisk:/# apt-get install gcc-3.4 g++-3.4
    
  • 次のデバッグツールが使用可能
    • strace … システムコールのトレーサ
    • gdb … 言わずと知れたソースコードレベルデバッガ

GNU Compiler Collection 3.4.3 Edit

  • gcc-3.4
    • hello.c
      #include<stdio.h>
      #include<stdlib.h>
      
      main()
      {
        printf("Hello world !!\n");
      }
      
    • コンパイルと実行
      landisk:~# gcc hello.c -o hello
      landisk:~# ./hello
      Hello world !!
      
  • g++-3.4
    • hello.cpp
      #include <iostream>
      
      main()
      {
          std::cout << "Hello C++ world !!\n";
      }
      
    • コンパイルと実行
      landisk:~# g++ hello.cpp -o hello_cpp
      landisk:~# ./hello_cpp
      Hello C++ world !!
      
  • gcj-3.4 (GNU Compiler for the Java)
    • インストール
      landisk:~# apt-get install gcj libgcj5-dev
      
  • hello.java
    public class hello {
        public static void main(String[] argv) {
            System.out.println("Hello Java World !!");
        }
    }
    
  • コンパイルと実行
    landisk:~# gcj hello.java -o hello_java --main=hello
    landisk:~# ./hello_java
    Hello Java World !!
    
  • その他
    試していませんが、下記の言語パッケージも使用可能かも!
    • Objective-C … gobjc
    • Fortran 77 … g77
    • Pascal … gpc

メモ … kernelのセルフビルド Edit

  • 概略
    kernel2.6では、ソースコード以外のディレクトリでビルドすることが可能になっています。
    ここでは、次のようなディレクトリ構成でカーネルをビルドする例を記します。
    /home/landisk/kernel/linux-2.6.11/      …… カーネルソース
    /home/landisk/kernel/build/             …… ビルドディレクトリ
    
  • ソースコードの取得
    次の場所等からソースコードを取得します。
    http://eggplant.ddo.jp/www/download/kernel26/

  • 展開
    〜/kernel/linux-2.6.11/....というディレクトリに展開されます。
    landisk:~/kernel$ tar vxfz linux-2.6.11-kogiidena-v0.1.src.tgz
    
  • build ディレクトリの作成
    buildディレクトリを作り、そこへ.configファイルを用意します。
    ( julian_defconfig があればそれを、なければ landisk_defconfig をコピーしてください。)
    landisk:~/kernel$ mkdir build 
    landisk:~/kernel$ cp linux-2.6.11/arch/sh/configs/julian_defconfig build/.config
    
  • Makefileの修正
    linux-2.6.11/Makefileの該当行を次のように修正します。
    CROSS_COMPILE	?=  
    HOSTCC  	= gcc
    HOSTCXX  	= g++
    
  • make menuconfig
    ビルドパラメータをお好みで応じて設定してください。
    (最初は触らないほうが無難ですが・・・)
    landisk:~/kernel$ cd linux-2.6.11
    landisk:~/kernel/linux-2.6.11$ make O=~/kernel/build menuconfig
    
  • make
    先ほど作成したbuildディレクトリにcdしてmakeします。
    (kernel2.6からmake depは不必要になりました。)
    landisk:~/kernel$ cd ~/kernel/build
    landisk:~/kernel/build$ make
    
  • ビルド終了
    zImageは、~/kernel/build/arch/sh/boot/zImage にできます。
    カーネルモジュールもこの段階でビルドされています。

  • カーネルmoduleのインストール
    landisk:~/kernel/build$ su         # suでrootになって、
    landisk:~/kernel/build$ make modules_install
    

メモ … gcc-3.4_3.4.3-13のビルド Edit

  • patch
    SH-Linuxのホームページのrpmパッケージから拝借しました。
    • debian/patchs/gcc-3.4.1-PR16665.dpatch
    • debian/patchs/gcc-3.4.1-sh-no-reorder-blocks.dpatch
    • debian/patchs/gcc-3.4.3-sh-GCfix.dpatch -- gcj(java)対策パッチ

  • debian/rules.patch
    # which patches should be applied?
    debian_patches = \
            cvs-updates \
            gcc-version \
            gcc-textdomain \
            rename-info-files \
            libstdc++-pic \
            libstdc++-doclink \
            amd64-specs \
            gccbug \
            gccbug-posix \
            hppa-toplevel hppa-libffi hppa-libjava hppa-libjava-update \
            fastjar-update \
            java-gui-branch \
            boehm-gc-nocheck \
            libltdl \
            m68k-update \
            gcc-3.4.1-PR16665 \
            gcc-3.4.1-sh-no-reorder-blocks \
            gcc-3.4.3-sh-GCfix \
    
  • debian/rules.defs
    with_common_pkgs := yes
    with_common_libs := yes
    with_ada := no
    with_check := no
    
  • debian/rules.d/binary-gcc.mk
    $(binary_stamp)-gcc: $(install_dependencies)
        dh_testdir
        dh_testroot
        mv $(install_stamp) $(install_stamp)-tmp
    
        rm -rf $(d_gcc)
        dh_installdirs -p$(p_gcc) $(dirs_gcc)
    
        mv $(d)/$(PF)/$(libdir)/libgcc_s.so $(d)/$(gcc_lib_dir)/libgcc_s.so
        # rm -f $(d)/$(PF)/$(libdir)/libgcc_s.so
        # ln -sf /$(libdir)/libgcc_s.so.$(GCC_SONAME) $(d)/$(gcc_lib_dir)/libgcc_s.so
    
  • debian/rules.d/binary-gcc-cross.mk
    $(binary_stamp)-gcc: $(install_dependencies)
        dh_testdir
        dh_testroot
        mv $(install_stamp) $(install_stamp)-tmp
    
        rm -rf $(d_gcc)
        dh_installdirs -p$(p_gcc) $(dirs_gcc)
    
        mv $(d)/$(PF)/$(DEB_TARGET_GNU_TYPE)/$(libdir)/libgcc_s.so $(d)/$(gcc_lib_dir)/libgcc_s.so
        # rm -f $(d)/$(PF)/$(libdir)/libgcc_s.so
        # ln -sf /$(PF)/$(DEB_TARGET_GNU_TYPE)/$(libdir)/libgcc_s.so.$(GCC_SONAME) $(d)/$(gcc_lib_dir)/libgcc_s.so
    
  • ビルド
    このような依存状態未解決の状態からビルドを開始しました。
    landisk:/share/src2/gcc-3.4/gcc-3.4-3.4.3# dpkg-checkbuilddeps 
    dpkg-checkbuilddeps: Unmet build dependencies: gnat-3.3 | gnat-3.4 
    g++-3.3 g77-3.3 gobjc-3.3
    
    landisk:/share/src2/gcc-3.4/gcc-3.4-3.4.3# ddpkg-buildpackage -d
    
    約24〜26時間くらいで、このようなパッケージが生成されます。 (この間ノーエラーで生成されました。)
    cpp-3.4-doc_3.4.3-13_all.deb      libg2c0-dev_3.4.3-13_sh4.deb
    cpp-3.4_3.4.3-13_sh4.deb          libg2c0_3.4.3-13_sh4.deb
    fastjar_3.4.3-13_sh4.deb          libgcc1_3.4.3-13_sh4.deb
    fixincludes_3.4.3-13_sh4.deb      libgcj-common_3.4.3-13_all.deb
    g++-3.4_3.4.3-13_sh4.deb          libgcj5-awt_3.4.3-13_sh4.deb
    g77-3.4-doc_3.4.3-13_all.deb      libgcj5-common_3.4.3-13_all.deb
    g77-3.4_3.4.3-13_sh4.deb          libgcj5-dev_3.4.3-13_sh4.deb
    gcc-3.4-base_3.4.3-13_sh4.deb     libgcj5_3.4.3-13_sh4.deb
    gcc-3.4-doc_3.4.3-13_all.deb      libobjc1_3.4.3-13_sh4.deb
    gcc-3.4_3.4.3-13_sh4.deb          libstdc++6-dbg_3.4.3-13_sh4.deb
    gcj-3.4_3.4.3-13_sh4.deb          libstdc++6-dev_3.4.3-13_sh4.deb
    gij-3.4_3.4.3-13_sh4.deb          libstdc++6-doc_3.4.3-13_all.deb
    gobjc-3.4_3.4.3-13_sh4.deb        libstdc++6-pic_3.4.3-13_sh4.deb
    gpc-2.1-3.4-doc_3.4.3-13_all.deb  libstdc++6_3.4.3-13_sh4.deb
    gpc-2.1-3.4_3.4.3-13_sh4.deb      protoize_3.4.3-13_sh4.deb
    libffi3-dev_3.4.3-13_sh4.deb      treelang-3.4_3.4.3-13_sh4.deb
    libffi3_3.4.3-13_sh4.deb
    
    • 補足
      ビルド最終段階のdoxygenにおいて、約2時間以上もコンソール出力が停止するため、
      ハングアップしてるよう感じます。バックでちゃんと動作しているので気長に待ちましょう!

メモ … glibc-2.3.5-6のビルド Edit

  • patch
    合計6個の追加パッチが必要です。
    最初の3個はSH-Linuxのホームページ glibc-2.3.3-27.12.src.rpm から拝借しました。
    • debian/patchs/glibc-2.3.2-sh-fpscr_values.dpatch
    • debian/patchs/glibc-2.3.3-sh-linux-fcntl_h.dpatch
    • debian/patchs/glibc-2.3.3-sh-nptl-multidir.dpach
    • debian/patchs/glibc-2.3.4-sh-dl-machine_h.dpatch
    • debian/patchs/glibc-2.3.5-sh-wordexp.dpatch
    • debian/patchs/glibc-2.3.5-sh-lowlevellock.dpatch

  • debian/patches/00list 下記をパッチリストの最終行へ追加
    glibc-2.3.2-sh-fpscr_values
    glibc-2.3.3-sh-linux-fcntl_h
    glibc-2.3.3-sh-nptl-multidir
    glibc-2.3.4-sh-dl-machine_h
    glibc-2.3.5-sh-wordexp
    glibc-2.3.5-sh-lowlevellock
    
  • debian/rules
    BUILD_CC = gcc
    
  • debian/rules.d/build.mk
    configparamsを追加。
        echo "LIBGD = no"		>> $(DEB_BUILDDIR)/configparms
        echo "sysconfdir = /etc"	>> $(DEB_BUILDDIR)/configparms
        echo "rootsbindir = /sbin"	>> $(DEB_BUILDDIR)/configparms
        echo "CFLAGS-rtld.os := -O -finline-limit=4800   ←↓改行しない
          --param max-inline-insns-single=4800" >> $(DEB_BUILDDIR)/configparms
        echo "no-z-defs=yes" 		>> $(DEB_BUILDDIR)/configparms
    ifneq ($(call xx,slibdir),)
         echo "slibdir = $(call xx,slibdir)" >> $(DEB_BUILDDIR)/configparms
    endif
    
  • debian/sysdeps/linux.mk
    ビルドオプションを少々変更
    nptl_extra_cflags = -g0 -O2 -fno-unit-at-a-time
    
  • debian/sysdeps/sh4.mk
    sh4用ビルド制御ファイルを以下の内容で作成
    (本来はこのファイルに全て記述するのが筋なんだろうけど、、)
    GLIBC_PASSES += nptl
    nptl_extra_cflags += -O2 
    
  • ビルド
    • dpkg-dev
      dpkg-dev 1.13.5 以上を導入する必要があります。

    • dpkg-checkbuilddeps
      正式には、gcc-4.0が必要ですが、gcc-3.4でビルドを強行します。
      dpkg-checkbuilddeps: Unmet build dependencies: gcc-4.0
      
    • dpkg-buildpackage -d
      約21時間後、このようなパッケージが生成される。
      glibc-doc_2.3.5-6_all.deb    libc6_2.3.5-6_sh4.deb
      libc6-dbg_2.3.5-6_sh4.deb    libnss-dns-udeb_2.3.5-6_sh4.udeb
      libc6-dev_2.3.5-6_sh4.deb    libnss-files-udeb_2.3.5-6_sh4.udeb
      libc6-pic_2.3.5-6_sh4.deb    locales_2.3.5-6_all.deb
      libc6-prof_2.3.5-6_sh4.deb   nscd_2.3.5-6_sh4.deb
      libc6-udeb_2.3.5-6_sh4.udeb
      
    • 補足
      NPTL対応/非対応版glibcの両方を生成しているため、ビルド時間が2倍かかっています。
      NPTL用だけ作成して、さらにLIBの動作テストを省略すると、この4分の1程度になるかも。。。


Counter: 16279, today: 4, yesterday: 2

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-10-25 (日) 10:06:59 (5460d)