Attribute System

ジャンク奇行。 ときどき ラクガキ。

広告

※このエリアは、60日間投稿が無い場合に表示されます。記事を投稿すると、表示されなくなります。

MPLAB C30 をクロスビルドするまで

2013-12-29 11:50:31 | 研究&TIPS

○はじめに。

 こんにちはヌキヲです。
今回は念願だった PIC24・dsPIC シリーズの
コンパイラ MPLAB C30 の野良ビルドに挑戦です。

とは言ってもすでにネット上に有用な情報がたくさんあるので、
いまさら私が出しゃばる必要もない気もします。

そして、草稿の段階で放置していたら、
情報がすっかり古くなってしまいました。
いえね、検証を取ってからとか思ってたら先延ばしになってしまって(汗


さて、先に確認しておくと、
最適化オプションは-O1までフリーバージョンにて対応しております。
時々-O0までと誤解している方もいらっしゃるみたいですが
この-O1で事足りる方はこの作業は全く必要ありませんです。

え、私?
私はただ-Osじゃないと気持ち悪いってだけだったので
それこそ必要なかったのですが(汗、
試行錯誤ののち完動してしまったので感動してしまいました。
その時の手順を備忘録を兼ねて残してみます。


ではシナリオを決めましょう。
今回は Linux環境 にて Windowsバイナリー のクロスコンパイルをします。

Linux は Ubuntu 10.04 LTS をメモリーカードから起動して使いました。
Cygwin や MSYS でも作れそうな予感はしますが未確認です。
フォルダはホームディレクトリにC30/324フォルダを作ってその中で行いました。
インストール先も同じくホームディレクトリの C30 以下にします。
これにより sudo での作業が減らせます。

MPLAB C30 のバージョンは v3.24 です。
すでに古いですが、現バージョンでも参考になるのではないでしょうか?
v3.30 から printf にヒープを使わなくなったらしいですね。
そして v3.31 で打ち止めされ、mplab xc16 に移行してしまってます。
そちらの方は目下奮闘中ということでご容赦ください。


○手順1 事前準備

●ファイル

・mplabalc30v3_24.tar.gz
・mplabc30v3_24.tar.gz

●Linux環境

以下で示すようにパッケージが必要なので入れます。
というかむしろこれしか必要ありません。
便利な世の中になりましたね。

$ sudo apt-get install build-essential
$ sudo apt-get install mingw32
$ sudo apt-get install tofrodos


●展開

ファイルを展開します。
リソースファイルがバッティングしますが
同じ内容なので、上書きしてしまってOKでした。

$ mkdir c30
$ cd c30
$ mkdir 324
$ cd 324
$ tar xfvz ../../ダウンロード/mplabalc30v3_24.tar.gz
$ tar xfvz ../../ダウンロード/mplabc30v3_24.tar.gz

気になるリソースファイルなのですが、acme と gcc で同じ内容の様なので
上書きしてしまって OK でした。

どうでもいいですが、Linuxの日本語環境でフォルダ名が日本語になってしまうのは
コマンドを打つ場合にとても不便だと思うのですorz

そういう場合は以下のおまじないで対処できるそうです。
$ LANG=C xdg-user-dirs-gtk-update


ではこのまま改行コードも変換してしまいましょう。

$ find . -type f -exec fromdos '{}' ';'

○手順2 ソースの修正 binutils

申し訳ないのですが、行番号はその近辺ということで
適宜読み替えてください。

●acme/libiberty/Makefile.in


106 #SUBDIRS = testsuite 

おなじみコメントアウトします。


○手順3 ソースの修正 gcc

●gcc-4.0.2/gcc-4.0.2/libiberty/Makefile.in


105 #SUBDIRS = testsuite 

こちらも同じくコメントアウト


●gcc-4.0.2/gcc-4.0.2/libiberty/make-relative-prefix.c


- 324 if (prog_num <= 0 || i == bin_num)
+ 324 if (prog_num <= 0 ) 

この辺未検証です。


●gcc-4.0.2/gcc-4.0.2/gcc/config/pic30/t-pic30


- 1 LIBGCC1 = libgcc1.null
- 2 CROSS_LIBGCC1 = libgcc1.null
- 3 
- 4 # forget the libgcc1...
- 5 LIBGCC1_TEST =
- 6 
- 7 LIBGCC2 = libgcc1.null

+ 1 LIBGCC =
+ 2 INSTALL_LIBGCC = 

ビルド環境上の pic30 コンパイラがないのでコケます。
ライブラリーを作らない設定に変更。


●gcc-4.0.2/gcc-4.0.2/gcc/config/pic30/pic30.h


- 291 #define STANDARD_BINDIR_PREFIX "/bin/bin"
+ 291 #define STANDARD_BINDIR_PREFIX "/bin"

実行ファイルのサーチパス。
この辺りは下手にコメントアウトすると
実行ファイルのパスがおかしくなり、見つからなくなります。


- 325 extern char * pic30_default_include_path(void) __attribute__((weak));
+ 325 extern char * pic30_default_include_path(void); 

私の環境の Mingw32コンパイラは gcc拡張を上手くリンクできず、
結果不正なポインタ(NULL)の操作でセグメントフォルトするので修正します。


●gcc-4.0.2/gcc-4.0.2/gcc/config/pic30/pic30.c


+ 74 #ifdef LICENSE_MANAGER
  75 #include "../../../../../pic30-lm/include/pic30-lm.h"
+ 76 #endif

  2303 #endif
+ 2304 #ifdef LICENSE_MANAGER
  2305   if (pic30_license_valid < 0) {

  2456    #undef NULLIFY
  2457  }
+ 2458  #endif
  2459  if (pic30_it_option) { 

これはMicrochip側のミス。

- 2697   prog_ptr_type = make_node(POINTER_TYPE);
+ 2697 /*   prog_ptr_type = make_node(POINTER_TYPE); */
+ 2698   prog_ptr_type = make_node(INTEGER_TYPE);

- 2713   pmp_ptr_type = make_node(POINTER_TYPE);
+ 2713 /*   pmp_ptr_type = make_node(POINTER_TYPE); */
+ 2714   pmp_ptr_type = make_node(INTEGER_TYPE);

- 2728   ext_ptr_type = make_node(POINTER_TYPE);
+ 2728 /*  ext_ptr_type = make_node(POINTER_TYPE); */
+ 2729   ext_ptr_type = make_node(INTEGER_TYPE);

- 2743   eds_ptr_type = make_node(POINTER_TYPE);
+ 2743 /*   eds_ptr_type = make_node(POINTER_TYPE); */
+ 2744   eds_ptr_type = make_node(INTEGER_TYPE);

これらはこのあと TYPE_MIN_VALUE TYPE_MAX_VALUE で値のチェックをしているのですが、
そもそも TYPE_MIN_VALUE TYPE_MAX_VALUE 内で INTEGER_TYPE であるかの確認もしています。
それに POINTER_TYPE を突っ込んだらまずいでしょうということです。
Linux / Cygwin 環境では問題なく動くみたいですが
やはり Mingw32 でビルドし Windows に持ってくるとセグメントフォルトします。


●gcc-4.0.2/gcc-4.0.2/gcc/gcc.c


エディターの置換機能で編集します。
本来 gcc.c は編集しないはずのソースだと思うのですが、
Microchip 側でバリバリに編集してあるので、
こちらも思いっきり編集しちゃいましょうw

検索する文字列 "-omf=%(omf)"
置換後の文字列 " "

pic30-cc1 がこのオプションを受けて
pic30-coff-cc1 と pic30-elf-cc1 を呼び分けている部分です。
pic30-cc1 が存在しないので"出力名が2度指定されている"旨のエラーになります。

検索する文字列 "%(program_prefix)"
置換後の文字列 "%(program_prefix)%(omf)-"

config.gcc ファイルにて %(program_prefix) が pic30- になっています。
pic30-cc1 など -omf=%(omf) を解釈するプログラムが存在しないので
実行ファイル名に埋め込んでしまったらどうか?という実験です。

どちらも13箇所くらい置換されたら成功です。


○手順4 ビルド binutils

●configur


$ cd acme
$ mkdir build
$ cd build
$ CFLAGS+="-DMCHP_VERSION=v3.24" ../configure \
--prefix=/home/username/c30/mplabc30-324-mingw32 \
--host=i586-mingw32msvc --build=i686-pc-linux-gnu --target=pic30-coff 

username だけ自分のユーザ名に変えて実行します。
~/ チルダルートとかは使わない方が吉です。


● make


$ make

● install


$ make install


○手順5 ビルド gcc

●cofigure


$ cd gcc-4.0.2
$ mkdir build $ cd build $ CFLAGS+="-DMCHP_VERSION=v3.24" ../gcc-4.0.2/configure \ --prefix=/home/username/c30/mplabc30-324-mingw32 \ --host=i586-mingw32msvc --build=i686-pc-linux-gnu --target=pic30-coff \ --enable-languages=c

やはり username は自分のユーザ名に置き変えて実行してください。


●make


$ make; make; make

途中で終了してしまうので無理やり3回分 make します。
これで終わるまで放置できますね。

●install


$ make install
$ cp gcc/pic30-coff-cc1 /usr/local/mplab/bin/
$ cd /home/username/c30/mplabc30-324-mingw32/bin
$ mv pic30-coff-pic30-coff-cpp.exe pic30-coff-cpp.exe
$ mv pic30-coff-pic30-coff-gcc.exe pic30-coff-gcc.exe
$ mv pic30-coff-pic30-coff-gcov.exe pic30-coff-gcov.exe
$ mv pic30-coff-pic30-coff-gccbug pic30-coff-gccbug


●最後に持ち出しです。


$ cd ~/c30
$ tar zcvf mplabc30-324-mingw32.tar.gz mplabc30-324-mingw32/

がしかし、最初数回はよかったのですが、
途中から圧縮ファイル中のファイルサイズが 0 になってしまう
ファイルが出現してしまいました。

もしかしたら make install でシンボリックリンクを貼っているのかもしれませんが、
よく分からないし、仕方がないので
GUI のアーカイブマネージャで zip 形式にて圧縮して難を逃れました。

あとは FTP なり Windows のファイル共有なりでコピーすれば終わりです。
適宜フリーバージョンのファイルと組み合わせてください。
c30_device.info や support 以下のファイルが重要です。
お疲れ様でした。


○おわりに。

試行錯誤であちこち修正して、ワケワカメ状態で、
やはりブログに載せる以上もう一度クリーンな環境で検証が必要かな?
とか思ってたらすっかり旬を逃してしまった感が否めません。

コメント   この記事についてブログを書く
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« ロボフェスタ2013出展しました。 | トップ | MPLAB XC32 をクロスビルドし... »
最新の画像もっと見る

コメントを投稿

研究&TIPS」カテゴリの最新記事