VisualStudio 2013でlibcurlをbuildしてみる
VisualStudio 2013を入れたので、libcurlをビルドしてみようと思います。
VisualStudio 2013のインストールの話は、既にこちらでやりました。
Visual Studio Community 2013をインストールしてみる - 白烏のチラ裏
libcurlとは
libcurlとは色々な通信プロトコルに対応した、クライアント組み込み用のURL転送ライブラリである。C言語で書かれている為、C++からの利用が可能である。
開発元は、スウェーデンのDaniel Stenberg。ライセンス形式は、MIT。
単独コマンドとして、cURLが存在する。こちらは馴染みがある人も多いのでは?
MITライセンス について
MITライセンス は、オープンソースであるかないかに関わらず再利用を認めている。
GPLに比べれば、かなり利用者に優しいライセンス形式だとも言える。
ただし、ライセンス部分に使っていることを明示することと、自己責任で使うことが条件である。
さて、このlibcurlをVisualStudio 2013でビルドしてみましょう。
ただ、ビルドへの道のりは地味に長いです。
1.Perlのインストール
いきなりですが、Perlをインストールします。
Windows環境なので、ActivePerlをインストールします。
私は、v5.18.2を入れました。
尚、コマンドラインからperlコマンドを使用したいので、PATHを通しておく必要があります。
PATHが通っていれば、コマンドプロンプト上で、perl -v が有効なはずです。
2.nasmのインストール
Intel記法のx86アセンブラです。こいつも必要になるので、インストールします。
私が確認した時は v2.11.06 が一番新しかったので、これをインストールします。
こちらのバージョンのWindows用インストーラは、こちらにあります。
私は、C:\nasm にインストールを行いました。
尚、こちらもコマンドラインから使用したいので、PATHを通しておきます。
PATHが通っていれば、コマンドプロンプト上で、nasm -v が有効なはずです。
3.ビルド準備
ビルドの為の準備として、開発用ディレクトリを切ります。
私は、任意ディレクトリに[libcurl-build]ディレクトリを作成しました。
今後は、全てこのカレントディレクトリ上で作業を行ったものとします。
./libcurl-build
4.OpenSSLのビルド
第一段階到達です。
コードを取得します。コードは以下で公開されています。
私が確認した時は、openssl-1.0.1j が最新版でしたので、こちらを利用します。
カレントディレクトリに [openssl] ディレクトリを作成し、そこに展開するものとします。
./libcurl-build
└ [openssl]
カレントディレクトリに openssl_autobuild.bat を以下の内容で作成してください。
./libcurl-build
├ [openssl]
└ openssl_autobuild.bat
openssl_autobuild.bat
@echo off
rem VisualStudio
set VS_DIR=%ProgramFiles(x86)%\Microsoft Visual Studio 12.0
set VC_DIR=%VS_DIR%\VC
set VC_BAT_PATH=%VC_DIR%\vcvarsall.bat
set CUR=%~dp0
rem x86
call "%VC_BAT_PATH%" x86
rem x64
rem CALL "%VC_BAT_PATH%" x86_amd64
rem build start
cd openssl
perl Configure VC-WIN32 --prefix=%CUR%openssl
rem do nasm
call ms\do_nasm
rem edit *.mak file
perl -i.bak -p -e "s/\/MD/\/MT/g;" ms\ntdll.mak
rem nmake
nmake -f ms\ntdll.mak
nmake -f ms\ntdll.mak test
rem go back cur
cd %CUR%
echo ------------------------------------------------------------
echo opensslのout32dll配下に libeay32.dll と ssleay32.dll が出来たはずです
pause
途中、perlのワンライナーでntdll.makで/MDを/MTに書き換えているのは、VC++のライブラリがなくても動くようにするためです。
これをカレントディレクトリ上で実行します。
5.zlibのビルド
次は、zlibをビルドします。
コードを取得します。コードは以下で公開されています。
私が確認した時は、1.2.8 が最新版でしたので、こちらを利用します。
カレントディレクトリに [zlib] ディレクトリを作成し、そこに展開するものとします。
./libcurl-build
├ [openssl]
├ [zlib]
└ openssl_autobuild.bat
カレントディレクトリに zlib_autobuild.bat を以下の内容で作成してください。
./libcurl-build
├ [openssl]
├ [zlib]
├ openssl_autobuild.bat
└ zlib_autobuild.bat
zlib_autobuild.bat
@echo off
rem VisualStudio
set VS_DIR=%ProgramFiles(x86)%\Microsoft Visual Studio 12.0
set VC_DIR=%VS_DIR%\VC
set VC_BAT_PATH=%VC_DIR%\vcvarsall.bat
set CUR=%~dp0
rem x86
call "%VC_BAT_PATH%" x86
rem x64
rem CALL "%VC_BAT_PATH%" x86_amd64
rem build start
cd zlib
rem edit *.msc file
perl -i.bak -p -e "s/-MD/-MT/g;" .\win32\Makefile.msc
rem nmake by assembly lang
nmake -f .\win32\Makefile.msc LOC="-DASMV -DASMINF" OBJA="match686.obj inffas32.obj"
rem go back cur
cd %CUR%
echo アセンブリコードでコンパイル完了
pause
途中、perlのワンライナーでntdll.makで/MDを/MTに書き換えているのは、VC++のライブラリがなくても動くようにするためです。
また、高速化する為にnmake実行時にアセンブラコードを利用するようにしています。
これをカレントディレクトリ上で実行します。
6.libcurlのビルド
ここまで長かったです。本丸のlibcurlをビルドします。
コードを取得します。コードは以下で公開されています。
私が確認した時は、v7.39.0 が最新版でしたので、こちらを利用します。
カレントディレクトリに [curl] ディレクトリを作成し、そこに展開するものとします。
./libcurl-build
├ [curl]
├ [openssl]
├ [zlib]
├ openssl_autobuild.bat
└ zlib_autobuild.bat
カレントディレクトリに curl_autobuild.bat を以下の内容で作成してください。
./libcurl-build
├ [curl]
├ [openssl]
├ [zlib]
├ curl_autobuild.bat
├ openssl_autobuild.bat
└ zlib_autobuild.bat
curl_autobuild.bat
@echo off
rem VisualStudio
set VS_DIR=%ProgramFiles(x86)%\Microsoft Visual Studio 12.0
set VC_DIR=%VS_DIR%\VC
set VC_BAT_PATH=%VC_DIR%\vcvarsall.bat
set CUR=%~dp0
rem set OpenSSL
set OPENSSL_PATH=%CUR%openssl
rem set zlib
set ZLIB_PATH=%CUR%zlib
rem x86
call "%VC_BAT_PATH%" x86
rem x64
rem CALL "%VC_BAT_PATH%" x86_amd64
rem check openssl lib files
if exist %OPENSSL_PATH%\out32 goto skip_copy
rem coopy
mkdir %OPENSSL_PATH%\out32
copy %OPENSSL_PATH%\out32dll\* %OPENSSL_PATH%\out32
:skip_copy
rem Makefile Conv
set LibMakeFilePath=%CUR%curl\lib\Makefile.vc12
set SrcMakeFilePath=%CUR%curl\src\Makefile.vc12
copy %CUR%curl\lib\Makefile.vc6 %LibMakeFilePath% >nul
copy %CUR%curl\src\Makefile.vc6 %SrcMakeFilePath% >nul
perl -i.bak -p -e "s/vc6/vc12/g" %LibMakeFilePath%
perl -i.bak -p -e "s/VC6/VC12/g" %LibMakeFilePath%
perl -i.bak -p -e "s/\/GZ/\/RTC1/g" %LibMakeFilePath%
perl -i.bak -p -e "s/\/GX \/DWIN32 \/YX/\/EHsc \/DWIN32/g" %LibMakeFilePath%
del /f %LibMakeFilePath%.bak
perl -i.bak -p -e "s/vc6/vc12/g" %SrcMakeFilePath%
perl -i.bak -p -e "s/VC6/VC12/g" %SrcMakeFilePath%
perl -i.bak -p -e "s/\/GZ/\/RTC1/g" %SrcMakeFilePath%
perl -i.bak -p -e "s/\/GX \/DWIN32 \/YX/\/EHsc \/DWIN32/g" %SrcMakeFilePath%
del /f %SrcMakeFilePath%.bak
rem build start
cd curl
rem nmake
cd lib
nmake /f Makefile.vc12 RTLIBCFG=static cfg=release-ssl-zlib
cd ..\src
nmake /f Makefile.vc12 RTLIBCFG=static cfg=release-ssl-zlib
cd %CUR%
pause
nmake vc-ssl-zlib VC=vc12 RTLIBCFG=static
とコマンドを打てば、こんなまどろっこしいことをせずに済むのですが、その場合はsedが動くことが前提条件となります。
それを避けるため、PerlのワンライナーでVisualStudio 2013用のMakefileを作成するようにしてみました。
また、ワンライナーで書き換えた後はnmakeを個別に実行しています。その時の RTLIBCFGをstaticにするとMakefile内の条件判定式で、コンパイラのスイッチの/MDを/MTに書き換えてくれるからです。
このbatファイルをカレントディレクトリ上で実行すると、lib配下にlibcurl.libが、src配下にcurl.exeが生成されます。
これで、libcurlのVisualStudio 2013でのビルドは完了です。
お疲れ様でした。
試行錯誤しながら夜中に細々と調査してたら、たったこれだけに数日を要してしまいました。いやはや、なかなか難しいもんですね。
ではでは。