Lego Mindstorms NXTの開発をすることになったけどなんとなくこれまでMinGWで済んでたので今更Cygwin入れたくないマンが苦労した話です。
準備したもの
基本的にはCygwin用と同じでだいたい公式が配布しているので詳細は他の記事などに任せます。
- mingw-get-setup.exe・・・MinGWインストーラ
- bu-2.16.1_gcc-4.0.2-c-c++_nl-1.14.0_gi-6.4.exe・・・GNU ARMインストーラ、このバージョンじゃないとダメらしい。
- cygintl-3.dll・・・このdllがないとGNU ARMがコンパイル時にエラーを吐く
- nxtOSEK_v218.zip・・・nxtOSEK/JSPのカーネルやサンプルプログラムが入っている。
- NXT Fantom Drivers・・・NXTドライバインストーラ
- nexttool.exe・・・USB接続用ドライバ
- lms_arm_nbcnxc_107.rfw・・・ファームウェア
MinGWインストール
(元々入っていたけど念のため)
mingw-get-setup.exe
を起動してCドライブ直下にMinGWフォルダとしてインストール。
- mingw32-base
- mingw32-gcc-g++
- msys-base
にチェックをいれてApplyChangeした状態。
たぶんmakeだけ使えればいいのでgccとか入ってなくても動くかもしれない。
環境変数PATHに
- C:\MinGW\bin
- C:\MinGW\msys\1.0\bin
を追加する。
GNU ARMインストール
bu-2.16.1_gcc-4.0.2-c-c++_nl-1.14.0_gi-6.4.exe
を起動する。
インストール時の設定は
- DiriectoryをC:\cygwin\GNUARMに変更・・・※1
- Select ComponentsのFloating Point Unitを選択解除
- Select ComponentsのBig Endianを選択解除
- Select Additional TasksのInstall Cygwin DLLsは選択・・・※2
- Add the executable directory to the PATH variableも選択・・・※2
環境変数PATHに
・ C:\cygwin\GNUARM\bin
の追加を確認する。
その後 cygintl-3.dll をC:\cygwin\GNUARM\binに入れる。
※1:ビルド時に呼び出すライブラリがcygwinを想定してファイルパスを決め打ちしているのか、とりあえずcygwinという名前のフォルダを作ってその中にインストールしないとうまくいかない。
※2:結局ビルド時にCygwinの関数を呼び出すのでdllだけはおいておかないといけないという。
ドライバなどのファイルの展開と配置
あとは基本的にCygwin環境と同じようにファイルを配置していく。
- NXT Fantom Driversのsetup.exeを実行しNXT用ドライバインストール
- C:\cygwinにnextoolフォルダを作成する。
- lms_arm_nbcnxc_107.rfwをnextoolフォルダに配置
- nexttool.exeをnextoolフォルダに配置
- 適当な場所にnxtOSEK/JSPのzipを展開してnxtOSEKフォルダを配置
- nxtOSEKの中にサンプルがある。samples_jsp_c/helloworldなどでコマンドプロンプトからmake allしてみる。多分失敗する。
Makefileなどのパス修正
ビルドに失敗するのはサンプルのMakefileなどに書かれたルートパスなどがcygwin環境での実行を前提にしているので
/cygdrive/C/cygwin/GNUARM
のようになっているため。
全部のファイルの中身を対象に"cygdrive"で検索すると何箇所か見つかりますので以下のように適宜修正。
- nxtOSEK\ecrobot\tool_gcc.mak
- GNUARM_ROOT = /C/cygwin/GNUARM
- NEXTTOOL_ROOT = /C/cygwin/nexttool
(他にもあったような気もする)
以上で環境構築は終わりです。
先程のhelloworldフォルダでmake allすればおそらくうまくビルドされバイナリファイルなどが出力されると思います。
ただし単にmakeしたり、ソースコードの一部を修正してmake allすると
make.exe": *** No rule to make target `/cygdrive/c/cygwin/GNUARM/bin/../lib/gcc/arm-elf/4.0.2/include/limits.h', needed by `build/kernel/banner.o'. Stop.
のようにcygdriveの含んだパスのファイルを探しに行って参照エラーになってしまう問題があるようです。
これは私の知識が足りないのか未だに解決できていません…。
少し手間ですが毎回make cleanしてからmake allしましょう。