トップ 検索 一覧 ヘルプ RSS ログイン

今更MinGW 2009.06(8) wgetの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!!今更MinGW 2009.06(8) wget

wgetは猫研パックツールキットでも使用している''http/ftpダウンロードツール''だ。オプションを指定することで、かなり細かな制御も行える。猫研パックでは--max-redirectのオプションを使用するためにMinGWに用意されているバージョンは使用しなかったが、wgetは''mingwPORTに必要であり、wget自身のmingwPORTも存在する''のでビルド・インストール方法を紹介する。

!!ソースの入手

*[GNU Wget|http://www.gnu.org/software/wget/]
**ftp://ftp.gnu.org/gnu/wget/wget-1.9.1.tar.gz
*[User Contributed: mingwPORT|http://sourceforge.net/project/showfiles.php?group_id=2435&package_id=233332] / [Current Releases|http://sourceforge.net/project/showfiles.php?group_id=2435&package_id=233332&release_id=511579]
**[wget-1.9.1-mingwPORT.tar.bz2|http://sourceforge.net/project/downloading.php?group_id=2435&filename=wget-1.9.1-mingwPORT.tar.bz2]

各アーカイブは/srcに展開しよう。

!!ビルド

GCC4系でビルドをする場合、wgetのソースが''行儀の悪い書き方をしている部分がある''ので、それを修正する必要がある。src/mswindows.cの331〜332行目で
GCC4系でビルドをする場合、wgetのソースが行儀の悪い書き方をしている部分があるので、それを修正する必要がある。src/mswindows.cの331〜332行目で
      (void *)_SetThreadExecutionState
        = GetProcAddress ((HINSTANCE)mod, "SetThreadExecutionState");
となっている箇所を
     _SetThreadExecutionState = (DWORD (WINAPI *)(DWORD))GetProcAddress ((HINSTANCE)mod, "SetThreadExecutionState");
に書き換えよう。なお、猫研パックではこの修正はパッチで行っている。
に書き換えよう。これは''cast-as-lvalue''と呼ばれる記法で、修正前のコードは_SetThreadExecutionStateをvoid*と見なすことでGetProcAddressの戻り値を適切な関数ポインタ型でキャストせずとも代入できるようにしている。大量にGetProcAddressする場合にはいちいち関数ポインタ型を気にしなくてよいので楽なのだが、よい書き方ではないのでGCC4からは弾かれるようになった。

なお、猫研パックではこの修正はパッチで行っている。

あとは今更MinGW2008年春版の[[今更MinGW(2)]]で解説しているとおりにすればビルドは可能だが、ここではmingwPORTに任せっきりにせず、自分でビルドコマンドを打ってみる。

 pushd wget-1.9.1
 patch -p1 -N < mingwPORT/mingwPORT.patch
 ./configure --prefix=/mingw --disable-nls
 BLDDIR=.
 . mingwPORT/mingwPORT.afterconfigure
 make LIBS=-lws2_32 exeext=.exe CFLAGS="-O3 -s -mms-bitfields -march=i686"
 make install exeext=.exe
 popd

コマンドはmingwPORTから抜き出したものだ。LIBS=-lws2_32はwinsock2のライブラリをリンクする指示で、exeext=.exeは実行ファイルのサフィックスを指定している。CFLAGSの-mms-bitfieldsは''C言語のビットフィールドをマイクロソフト流に配置する''、という意味だ。mingwport.afterconfigureが行っているのはMinGW向けの修正で、src/config.hに追加の#defineを行っている。