bcmbm-mrubyとadmbm-mrubyのビルドになにかのGPLアーカイブに入っていたgcc4のLinuxのELFをFreeBSDのLinuxエミュレーションで動かしていたのですが、どこにあったものかわからなくなったので、ネイティブで用意する方法を考えてみました。
gcc4は4.9.4が最終バージョンだったようです。
FreeBSD/i386 12Rのpkgにはarm用のgcc4はあるのですがmips用のgcc4はありません。mips-gccは現在6になっています。
自力でgccとbinutilsをビルドする方法もありますが、簡単にできる方法がないか考えてみみました。
調べてみるとpkgのmips-gccは元々492だったようです。このpkgはpowerpc64-gccがマスターになっていて、これのバージョンアップで6になってしまったようです。どういう経緯かわからないですが、powerpc64もmipsもgcc6のpkgが別にあるのでmips-gccは4のままにしておいたほうが良かったような気がします。
mips-gccは元々FreeBSD/mipsのバイナリを作るためにadrianさんが用意されたようです。gcc4の頃のmips-gccはホストもgccだったと思われ、現在はclangになっているので、古いportsをcheckoutしてみましたが、そのままではビルドできませんでした。
現在のportsの構成を見てみると、devel/arm-none-eabi-gcc492をマスターにして作るのが良さそうです。
devel/mips-gcc492を作り以下のMakefileを置きます。
PKGNAMEPREFIX= mips-
GCC_TARGET= mips
BU_PREFIX= ${PKGNAMEPREFIX}${OPSYS:tl}
PLIST= ${.CURDIR}/pkg-plist
BINARY_ALIAS= sed=${LOCALBASE}/bin/gsed
CONFIGURE_ENV= ac_cv_path_AR_FOR_TARGET=mips-freebsd-ar ac_cv_path_RANLIB_FOR_TARGET=mips-freebsd-ranlib
MASTERDIR= ${.CURDIR}/../arm-none-eabi-gcc492
.include "${MASTERDIR}/Makefile"
devel/arm-none-eabi-gcc492/files/に以下を追加します。
--- gcc/config/mips/mips.h.org
+++ gcc/config/mips/mips.h
@@ -2771,7 +2771,7 @@
#undef ASM_OUTPUT_SKIP
#define ASM_OUTPUT_SKIP(STREAM,SIZE) \
- fprintf (STREAM, "\t.space\t"HOST_WIDE_INT_PRINT_UNSIGNED"\n", (SIZE))
+ fprintf (STREAM, "\t.space\t" HOST_WIDE_INT_PRINT_UNSIGNED "\n", (SIZE))
/* This is how to output a string. */
#undef ASM_OUTPUT_ASCII
mips-binutilsは古いものをビルドしましたがpkgでいけるような気がします。
pkg-plistを調整して、make package-noinstallするとパッケージができ、このファイルをpkgコマンドでインストールできます。
出来上がったmips-gccなどでnewlibがビルドできました。
出来上がったmips-gccはデフォルトでビッグエンディアンなバイナリを出力しますが、-ELオプションをつけるとリトルエンディアンになります。ELなlibgcc.aも作るようにしてみました。
configureで--disable-multilibを指定するとTERGET(mips=big endian)以外のlibgcc.aを作らないのですが、指定しない場合はLittle Endianのlibgcc.aも作ります。
せっかくなのでレビューに入れてみました。 諦めました。
FreeBSD/amd64 13.0Rでもビルドしてみました。問題ありません。
armの方のgcc492はu-bootをビルドするために用意されているようです。
これに入れてあります。