2017/09/23

gcc 7.2.0 の巻

これまで、gcc2 (Haiku 公式)、gcc5 (Haiku 公式)、gcc6.4.0(手製)、gcc SVN版 (手製) でHaikuをクロスビルドしてましたが、SVN 版コンパイラが更新の影響でビルドできなくなったので、新たに gcc7 のクロスコンパイラを作ってみました。

残念ながら、HaikuPorts の patchset ではそのまま動かなかったので、手製の gcc 6.4.0 から作成した差分パッチを gcc 6.3.0 にバックポートし、その後 gcc の差分パッチで、gcc7.1.0gcc 7.2.0 へとアップデートしました。できた gcc 7.2.0 を buildtools/gcc に配置し (既存のgccツリーは事前に名前を変えておく)、gmp、mpc、mpfr を既存のクロスコンパイラからコピーしました。そのままコンパイラをクロスビルドすると TARGET_USE_JCR_SECTION あたりでエラーが出るので、gcc/config/haiku.h を 7.1.0 patchset から、gcc/defaults.h を gcc7.2.0 からそれぞれ置き換えました。

patch for gcc 7.2.0 (tested x86 32bit only)

クロスコンパイラはできましたが、Haiku ビルドを通すために、さらに以下を修正します。
  • Haiku ビルドツリー内の libgcc は gcc 5.4.0 由来のため、__divmoddi4 未定義参照エラーが出ます。対策として、gcc/config/i386/i386.c を変更して、__divmoddi4 を使わないようにします (Haiku公式が gcc7 になるまでの仮対応です)。
    --- 52261,52271 ----
      #undef TARGET_ADDR_SPACE_ZERO_ADDRESS_VALID
      #define TARGET_ADDR_SPACE_ZERO_ADDRESS_VALID ix86_addr_space_zero_address_valid
     
    ! /* #undef TARGET_INIT_LIBFUNCS
      #define TARGET_INIT_LIBFUNCS ix86_init_libfuncs
     
      #undef TARGET_EXPAND_DIVMOD_LIBFUNC
    ! #define TARGET_EXPAND_DIVMOD_LIBFUNC ix86_expand_divmod_libfunc */

     
      #undef TARGET_MAX_NOCE_IFCVT_SEQ_COST
  • -WError を抑えるために、以下のフラグを build/jam/ArchitectureRules に追加します。
    @@ -41,6 +41,10 @@ rule ArchitectureSetup architecture
             gccBaseFlags += -Wno-array-bounds ;
         }

    +     if $(gccVersion[1]) >= 7 {
    +        gccBaseFlags += -Wno-nonnull-compare -Wno-format-overflow -Wno-format-truncation -Wno-builtin-declaration-mismatch -Wno-int-in-bool-context ;
    +     }
    +     local cpu = $(HAIKU_CPU_$(architecture)) ;
  • src/libs/iconv/iconv.c の __inline でリンクエラーが出るので、コメントアウトします。
    @@ -161,7 +161,7 @@ static const struct alias sysdep_aliases[] = {
     #undef S
     };
     #if defined(__GNUC__) && !defined(DEBUG)
    -__inline
    +/* __inline */
     #endif
     const struct alias *
これで、Haiku を gcc 7.2.0 でクロスビルドできるようになりました。
SVN版へのパッチはそのうち…

English (short ver.)
Building Haiku with gcc 7.2.0:
  •  Patch to gcc 7.2.0, then copy gmp, mpc and mpfr from original Haiku gcc5
  •  Haiku's libgcc is from gcc 5.4.0, so modify gcc/config/i386/i386.c to suppress using _divmodi
  •  To suppress -WError, add gccBaseFlags to build/jam/ArchitectureRules.
  •  Modify /libs/iconv/iconv.c to fix link error.
  •  Enjoy!

0 件のコメント:

コメントを投稿