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アセンブラです。こいつも必要になるので、インストールします。

nasm - download

私が確認した時は v2.11.06 が一番新しかったので、これをインストールします。

こちらのバージョンのWindowsインストーラは、こちらにあります。

私は、C:\nasm にインストールを行いました。

尚、こちらもコマンドラインから使用したいので、PATHを通しておきます。

 

PATHが通っていれば、コマンドプロンプト上で、nasm -v が有効なはずです。

 

3.ビルド準備

ビルドの為の準備として、開発用ディレクトリを切ります。

私は、任意ディレクトリに[libcurl-build]ディレクトリを作成しました。

今後は、全てこのカレントディレクトリ上で作業を行ったものとします。

./libcurl-build 

 

4.OpenSSLのビルド

 第一段階到達です。

コードを取得します。コードは以下で公開されています。

OpenSSL: Source, Tarballs

私が確認した時は、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をビルドします。

コードを取得します。コードは以下で公開されています。

zlib Home Site

私が確認した時は、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をビルドします。

コードを取得します。コードは以下で公開されています。

 

cURL - Download

私が確認した時は、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

Makefile

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でのビルドは完了です。

お疲れ様でした。

 

試行錯誤しながら夜中に細々と調査してたら、たったこれだけに数日を要してしまいました。いやはや、なかなか難しいもんですね。

 

ではでは。