2010年3月13日土曜日

Windows で AVRDUDE ビルド

前回の宿題。

WinAVR に同梱されている AVRDUDE は USB Support を有効にしてのビルドがされていない。実行すると、

C:\WinAVR-20100110\bin>avrdude -pm328p -cjtag2isp -Pusb
avrdude was compiled without usb support.
avrdude: ser_send(): write error: sorry no info avail

みたいな感じで取り付く島もない。

前回の記事ではyukiさんビルドのAVRDUDEを使わせていただきましたが、頼ってばかりじゃだめなので、一からビルドする方法、まとめてみました。


1. MinGW/MSYS のインストール
Cygwin だと make 時の "-mno-cygwin" オプションではじかれてしまうため、MinGW/MSYS を利用する。
まずは、MinGW。
HOWTO Install the MinGW (GCC) Compiler Suite | MinGW を参考にダウンロード、インストール。なお、ここの記事中にもある通り、以後、configureする際は、

../path/to/configure --prefix=/mingw

もしくは、

../path/to/configure --prefix=`cd /mingw; pwd -W`

のようなprefix指定が必須になる。

MSYS は MSYS | MinGW を参考にダウンロード、インストール。


2. Cygwin のインストール
make 中に yacc やら bison やら必要になるが、それらを MinGW/MSYS 上でインストールしていくのは非常に骨が折れるため、Cygwin で利用できるものは利用する。
Cygwin Information and Installation を参考にダウンロード、インストール。インストール後、Cygwin の bin へパスを通ため、MSYS で /etc/profile (C:\msys\1.0\etc\profile) を好きなエディタで開き(※改行コードは LF なので注意)、

export HOME LOGNAME MSYSTEM HISTFILE

のすぐ下辺りに、

export PATH=$PATH:/c/cygwin/bin

を追記、保存。


3. LibUsb-Win32 のインストール
USB Support を有効にするためには、LibUsb-Win32 のヘッダファイルやライブラリの Static Link が必要になる。LibUsb-Win32 からダウンロードし、Cドライブ直下等にインストールしておく。


4. AVRDUDE のビルド
AVR Downloader/UploaDEr - Summary [Savannah] からソースコードをダウンロード。順にコマンドを叩いていく。

user@COMPUTER ~/user
$ tar zxvf avrdude-5.8.tar.gz 

avrdude-5.8
avrdude-5.8/README
avrdude-5.8/configure.ac
~(中略)~
avrdude-5.8/doc/texinfo.tex
avrdude-5.8/doc/avrdude.texi
avrdude-5.8/doc/avrdude.info

user@COMPUTER ~/user
$ cd avrdude-5.8

user@COMPUTER ~/user/avrdude-5.8
$ export CPPFLAGS="-I/c/LibUSB-Win32/include"

user@COMPUTER ~/user/avrdude-5.8
$ export CFLAGS="-I/c/LibUSB-Win32/include"

user@COMPUTER ~/user/avrdude-5.8
$ export LDFLAGS="-L/c/LibUSB-Win32/lib/gcc"

user@COMPUTER ~/user/avrdude-5.8
$ ./configure --prefix=/mingw

checking build system type... i686-pc-mingw32
checking host system type... i686-pc-mingw32
checking target system type... i686-pc-mingw32
~(中略)~
config.status: creating avrdude.conf.tmp
config.status: creating ac_cfg.h
config.status: executing depfiles commands

user@COMPUTER ~/user/avrdude-5.8
$ make

make  all-recursive
make[1]: Entering directory `/home/user/avrdude-5.8'
Making all in windows
make[2]: Entering directory `/home/user/avrdude-5.8/windows'
gcc -DHAVE_CONFIG_H -I. -I..   -I/c/LibUSB-Win32/include  -I/c/LibUSB-Win32/include -mno-cygwin -DWIN32NATIVE -MT loaddrv.o -MD -MP -MF .deps/loaddrv.Tpo -c -o loaddrv.o loaddrv.c
mv -f .deps/loaddrv.Tpo .deps/loaddrv.Po
gcc  -I/c/LibUSB-Win32/include -mno-cygwin -DWIN32NATIVE -mno-cygwin -L/c/LibUSB-Win32/lib/gcc -static -o loaddrv.exe loaddrv.o  
make[2]: Leaving directory `/home/user/avrdude-5.8/windows'
make[2]: Entering directory `/home/user/avrdude-5.8'
/bin/sh ./ylwrap config_gram.y y.tab.c config_gram.c y.tab.h config_gram.h y.output config_gram.output -- bison -y  -d
cygwin warning:
  MS-DOS style path detected: C:/msys/1.0/home/user/avrdude-5.8/config_gram.y
  Preferred POSIX equivalent is: /cygdrive/c/msys/1.0/home/user/avrdude-5.8/config_gram.y
  CYGWIN environment variable option "nodosfilewarning" turns off this warning.
  Consult the user's guide for more details about POSIX paths:
    http://cygwin.com/cygwin-ug-net/using.html#using-pathnames
updating config_gram.h
~(中略)~
ar cru libavrdude.a libavrdude_a-config_gram.o libavrdude_a-lexer.o libavrdude_a-arduino.o libavrdude_a-avr.o libavrdude_a-avr910.o libavrdude_a-avrpart.o libavrdude_a-bitbang.o libavrdude_a-butterfly.o libavrdude_a-config.o libavrdude_a-confwin.o libavrdude_a-crc16.o libavrdude_a-fileio.o libavrdude_a-jtagmkI.o libavrdude_a-jtagmkII.o libavrdude_a-lists.o libavrdude_a-par.o libavrdude_a-pgm.o libavrdude_a-ppi.o libavrdude_a-ppiwin.o libavrdude_a-safemode.o libavrdude_a-serbb_posix.o libavrdude_a-serbb_win32.o libavrdude_a-ser_avrdoper.o libavrdude_a-ser_posix.o libavrdude_a-ser_win32.o libavrdude_a-stk500.o libavrdude_a-stk500v2.o libavrdude_a-stk500generic.o libavrdude_a-usbasp.o libavrdude_a-usb_libusb.o libavrdude_a-usbtiny.o libavrdude_a-update.o 
ranlib libavrdude.a
gcc -DHAVE_CONFIG_H -I.  -DCONFIG_DIR=\"/mingw/etc\" -I/c/LibUSB-Win32/include -Wall -I/c/LibUSB-Win32/include -mno-cygwin -DWIN32NATIVE -MT avrdude-main.o -MD -MP -MF .deps/avrdude-main.Tpo -c -o avrdude-main.o `test -f 'main.c' || echo './'`main.c
mv -f .deps/avrdude-main.Tpo .deps/avrdude-main.Po
gcc -DHAVE_CONFIG_H -I.  -DCONFIG_DIR=\"/mingw/etc\" -I/c/LibUSB-Win32/include -Wall -I/c/LibUSB-Win32/include -mno-cygwin -DWIN32NATIVE -MT avrdude-term.o -MD -MP -MF .deps/avrdude-term.Tpo -c -o avrdude-term.o `test -f 'term.c' || echo './'`term.c
mv -f .deps/avrdude-term.Tpo .deps/avrdude-term.Po
gcc -Wall -I/c/LibUSB-Win32/include -mno-cygwin -DWIN32NATIVE  -L/c/LibUSB-Win32/lib/gcc -static -o avrdude.exe avrdude-main.o avrdude-term.o ./libavrdude.a -lusb -lhid -lsetupapi -lm 
make[2]: Leaving directory `/home/user/avrdude-5.8'
make[1]: Leaving directory `/home/user/avrdude-5.8'



5. 元の WinAVR の AVRDUDE と入れ替え
ビルドでできた「avrdude.conf」「avrdude.exe」を WinAVR の AVRDUDE と入れ替える。これで実行すれば、

C:\WinAVR-20100110\bin>avrdude -pm328p -cjtag2isp -Pusb
avrdude: usbdev_open(): did not find any USB device "usb"

のように USB を探しに行ってくれる。


ちなみに MinGW/MSYS は Windows の環境変数設定の影響を結構受けるので、仮想マシンなどでクリーンなビルド環境が用意できると、変なところで悩まずに済みます。(^_^;)←