2009年1月7日水曜日

Compile error of Rockbox's sendfirm.c with libmtp0.3[Ubuntu8.10][libmtp0.3]

作業環境はUbuntu8.10。検索で来たWindowsユーザはこの記事見ても無意味だと思います。悪しからず。

gigabeatSにRockboxをインストールするには、現時点(20090107)では全て手動でコンパイル〜ファームウェア書き込みを行わなければいけないみたい。同じgigabeatでも、FやXシリーズは解析/開発されきってインストールユーティリティのソフトが用意されているのだけど、まだSシリーズは開発途上。

まだ実際にgigabeatSにRockboxをインストールした訳ではないのだけれど、作業時に必要になるsendfirmプログラムをコンパイルする時点で躓いたのでちょっと書いておく。

sendfirmにはlibmtpが必要になるので、
$ sudo apt-get install libmtp-dev
こんな感じでlibmtpのdevelopmentパッケージをインストールしておく。

http://www.rockbox.org/twiki/bin/view/Main/GigabeatSInstallation#A_Compile_the_sendfirm_utility
Rockbox wikiのgigabeatSへのインストール指南に書かれている通りに、現行ビルド一覧ページ(http://build.rockbox.org/)からソースコードをDL。
アーカイブを展開し、端末でその中のutils/MTPディレクトリに入りmakeすると、sendfirmがコンパイルされる。
rockbox-3.1/utils/MTP$ make
gcc -Wall -lmtp -o sendfirm sendfirm.c
sendfirm.c: In function ‘sendfile_function’:
sendfirm.c:94: error: too many arguments to function ‘LIBMTP_Send_File_From_File’
make: *** [sendfirm] エラー 1
$

LIBMTP_Send_File_From_File関数への引数が多すぎるとエラーを吐かれてしまった。

これはどういうことだろうと思い、ソースを見てみる。
エラーが出ているsendfirm.cの94行め付近は
ret = LIBMTP_Send_File_From_File(device, from_path, genfile, progress,
NULL, parent_id);
となっていて、6つ引数が与えられているのが分かる。
で、Ubuntuのリポジトリから落ちてくるlibmtpのver0.3のソースを見てみる。
http://libmtp.sourcearchive.com/documentation/0.3.0/group__files_g552e760a429b0e47a593b8ade20bb763.html#g552e760a429b0e47a593b8ade20bb763
int LIBMTP_Send_File_From_File(
LIBMTP_mtpdevice_t * device,
char const *const path,
LIBMTP_file_t *const filedata,
LIBMTP_progressfunc_t const callback,
void const *const data
)
与えるべき引数の数は5つだ。そりゃエラーになる筈。

今度はver0.2系のソースを見てみる。
http://libmtp.sourcearchive.com/documentation/0.2.1/group__files_gfaf21159580eef716b24da3a257b3060.html#gfaf21159580eef716b24da3a257b3060
int LIBMTP_Send_File_From_File(
LIBMTP_mtpdevice_t * device,
char const *const path,
LIBMTP_file_t *const filedata,
LIBMTP_progressfunc_t const callback,
void const *const data,
uint32_t const parenthandle
)
こっちは6つになってる。
つまり、libmtpのver0.2系(0.1系も引数は6つだった)を考えて書かれたソースだったのね。

んでまぁ、libmtpの0.2系を持ってきてやるのが正当なんだろうけど、面倒なのでいらなそうな6つ目の引数を削除してみる。sendfirm.cの94行め付近「device, from_path, genfile, progress,NULL, parent_id」となってる箇所からparent_idを抜いて、「device, from_path, genfile, progress, NULL」としてから、改めてmake。
rockbox-3.1/utils/MTP$ make
gcc -Wall -lmtp -o sendfirm sendfirm.c
sendfirm.c: In function ‘sendfile_function’:
sendfirm.c:67: 警告: unused variable ‘parent_id’
$
警告出たけど、案の定parent_idが宣言されたけど一度も使われてないよ、ということなのでキニシナイ。

まぁ、肝心のこっから先をやってないんだけどね。

0 件のコメント: