2019年1月31日木曜日

Renesas V850 GCC を 64bit Linux でビルドする

Renesas V850 64bit Linux版gccコンパイラ - Qiitaの追試をしようと思ったのだけど、前回の差分を見るに、特にコード修正しなくても対応できそうなので試した。

結果、コード修正なしでも athrill のサンプルがビルドできるものが出来上がった。

環境

  • OS: Windows 10 Pro
  • docker: Docker version 18.09.1, build 4c52b90
  • 使ったコンテナ: debian:buster-slim

ubuntu:bionic, ubuntu:xenial でも同じ手順でビルドできるはず。

コンテナ起動

docker run -it --rm -v "$(pwd)\athrill:/athrill" debian:buster-slim

動作確認用に athrill のディレクトリをマウントしておく。

V850 ツールチェインビルド環境をととのえる

apt-get update
apt-get -y upgrade
apt-get install -y build-essential libgmp-dev libmpfr-dev libmpc-dev texinfo wget

必要なソースコードのダウンロードと展開

mkdir /toolchain
cd /toolchain
wget https://gcc-renesas.com/downloads/d.php?f=v850/binutils/14.01/binutils-2.24_v850_v14.01.tar.bz2 -O binutils-2.24_v850_v14.01.tar.bz2
tar xfv binutils-2.24_v850_v14.01.tar.bz2
mv binutils-2.24 /binutils
wget https://gcc-renesas.com/downloads/d.php?f=v850/gcc/14.01/gcc-4.9.2_v850_v14.01.tar.bz2 -O gcc-4.9.2_v850_v14.01.tar.bz2
tar xfv gcc-4.9.2_v850_v14.01.tar.bz2
mv gcc-4.9.2 /gcc
wget https://gcc-renesas.com/downloads/d.php?f=v850/newlib/14.01/newlib-2.1.0_v850_v14.01.tar.bz2 -O newlib-2.1.0_v850_v14.01.tar.bz2
tar xfv newlib-2.1.0_v850_v14.01.tar.bz2
mv newlib-2.1.0 /newlib

最初は展開した場所を指定して configure したが、 make に失敗するのでルートに配置しなおすことにした。

binutils のビルド

mkdir -p /build/binutils
cd /build/binutils
../../binutils/configure --target=v850-elf --prefix=/usr/local --enable-soft-float
make CFLAGS="-Wno-cast-function-type -Wno-implicit-fallthrough -Wno-shift-negative-value -Wno-unused-value -Wno-pointer-compare"
make install

gcc のビルド

mkdir -p /build/gcc
cd /build/gcc
../../gcc/configure --target=v850-elf --prefix=/usr/local --enable-languages=c,c++ --disable-nls --disable-multilib --disable-libssp --with-newlib --with-headers=/newlib/newlib/libc/include
# xenial なら make のみで OK.
make CXXFLAGS="-std=c++03"
make install

c++11 から invalid になった構文(?)が使われているらしく、デフォルト設定だとビルドできないため、 -std=c++03 を指定。

newlib のビルド

mkdir -p /build/newlib
cd /build/newlib
../../newlib/configure --target=v850-elf --prefix=/usr/local
make
make install

動作確認

cd /athrill/sample/barmetal/step2
make clean all
../../../bin/linux/athrill -c1 -m memory.txt -d device_config.txt -t 500 test_main.elf

OK.

あとは docker のマルチステージビルドでバイナリだけコピーすればいい感じになるのではないでしょうか? これは後でやる。

参考資料

更新履歴

日付 更新内容
2019/1/29 新規作成
2019/3/11 gcc のビルド時、『s/--with-header/--with-headers/ で target-libstdc++-v3 のビルドエラーは解消できる』という指摘を反映

4 件のコメント:

  1. コンパイルフラグで解決できたんですね!
    素晴らしいです。情報展開ありがとうございます!

    返信削除
    返信
    1. コメントありがとうございます。
      とりあえずビルドが通ったというレベルですので、正しいバイナリが出力されるかは...。
      これから使っていって不具合が見つかるどうかというところです。

      削除
  2. `s/--with-header/--with-headers/` で target-libstdc++-v3 のビルドエラーは解消できるかなと。

    返信削除
    返信
    1. あら本当だ、オプション名間違えてますね...。
      指摘ありがとうございます!関連記事更新します!

      削除