S.F. Page

Programming,Music,etc...

VS2013でnginx for windowsをビルドする。

Building nginx on the Win32 platform with Visual C

Windows版のnginxのビルド方法は「Building nginx on the Win32 platform with Visual C」に書いてある。

ビルドするには下記の環境が必要である。

Microsoft Visual C compiler.
2008から2010までのバージョンでビルドできるとのこと。今回はあえてVS2013 Express Desktop Previewで試してみる。
Mingw/MSYS
nginxは残念ながらVSのプロジェクトファイルは含まれていない。Mingw/MSYS上でconfigureスクリプトを走らせ、できたMakefileとnmakeを使ってビルドする。そのためにMingw/MSYS(Minimal SYStem)が必要である。
Active PerlもしくはStrawberry Perl
SSLをサポートするためのOpenSSLをビルドするために必要である。ビルドスクリプトを作るのにPerlを使用しているらしい。Mingw/MSYSをインストールするとPerlもインストールされるがこのバージョンは使用できない。必ずActive PerlもしくはStrawberry Perlをインストールし、それを優先して実行できるようPATH環境変数を調整する必要がある。そうしないと「この問題」が発生する。どうもビルトインのPerlだとEOLの処理に起因する問題が発生するらしい。
Mercurialクライアント
nginxはソースコード管理にMercurialクライアントが必要である。Windows用としてはTortoiseHgが使える。
PCRE, zlib and OpenSSL ライブラリ
Perl正規表現をサポートするためのPCRE、gzip圧縮をサポートするためのzlib、SSLをサポートするためのOpenSSLが必要である。

ハマった結果得たポイント

手順は「Building nginx on the Win32 platform with Visual C」の「Build steps」の通りなのだが、かなり大まかに記載してある。なのでハマる。ハマった結果得たポイントを書いておく。

Perl・Mercurial・MSYSのbinディレクトリ、VS2013環境へのPATHを通し、Active Perl/VS2013環境が優先的に実行されるようにする

このうちMercurial・MSYSについてはインストールすればbinディレクトリにPATHが通る。PerlについてはActive Perlの実行を優先させる必要があるため、MSYSのbinディレクトリよりも前にPATHを設定する必要がある。また手順にはないがVsDevCmd.batをMSYSを起動する前に実行しておく必要がある。でないとVS2013のコンパイラおよびリンカ、nmakeが実行できない。このバッチで設定されるPATHはMSYSで設定されるPATHよりも優先的に実行させるようにする必要がある。

この前知識でもってMSYSの環境をいじった。この前知識はいじった結果分かったことなので後知恵というのかな。いじった点は下記である。

  • MSYS.BATを編集し、@echo offの次くらいに「call "C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\VsDevCmd.bat"」行を追加する
  • MSYSのetc/profileのPATH設定部分を下記のように変更する。$PATHが一番後ろだったのをできる限り前に持ってきてVS2013環境を優先して実行するようにする。これはVS2013のlinkを優先して実行するために必要である。

    if [ $MSYSTEM == MINGW32 ]; then
      export PATH=".:$PATH:/usr/local/bin:/mingw/bin:/bin"
    else
      export PATH=".:$PATH:/usr/local/bin:/bin:/mingw/bin"
    fi
    

Active PerlのPATHは普通のDOSコマンドプロンプトでも使うかも?とも思ってOSのPATHを直接いじって追加した。

コンパイラの/WXオプションを外す

Windows 8.1以降ではGetVersion/GetVersionExはdeprecateとなった。そのためコンパイル中に警告が発生する。デフォルトでは/WXオプションがセットされているので警告はすべてエラーとなり、この部分でビルドがストップしてしまう。とりあえずはconfigureでできたMakefileをいじり、/WXオプションを削ってコンパイルを通した。本当はこのAPIを使っている部分のコードを修正しなくてはならない。/WXオプションは削るべきではない。

PCREのバージョンは8.32を使用する

8.33ではpcre_jit_test.cの110行目でC1060エラーが発生しビルドがストップする。原因はよくわからない。

ちょっと気になること

ビルドはnmake -f objs/Makefileとなっているけど、nmake -f Makefile installなんじゃないのかな。。

そういうことでなんとかコンパイルすることができた。さて次はどうしようかなと。ソースコードをいじってみようかな。