OpenSSLビルドメモ

cURLで必要だったので、openssl-1.0.1cをVisual Studio 2010で32ビット向けにソースビルドした。
概ねのインストール方法はINSTALL.W32に記載されているが、いくつか注意点も含めて以下に纏めておく。

0.事前にActivePerlをインストールしておく。
1.Visual Studio 2010のコマンドプロンプトを開く(通常のコマンドプロンプトではないので注意[ターゲットのVisual Studioでビルドされるようにするため。また、標準pathにないnmake.exeを実行するため])。
2.NASMを使わないビルド方法を選択。バッチファイル「build_win32_vs10.bat」を作成し、「perl Configure VC-WIN32 no-asm --prefix=T:\library\OpenSSL\VER101c\lib」とする(--prefixは適切なインストール場所を設定)。
3.バッチファイル「build_win32_vs10.bat」を実行。
4.「ms\do_ms」を実行。
5.ビルド
  ==> DLLビルドをしたい場合、「nmake -f ms\ntdll.mak」を実行。
  ==> スタティックビルドをしたい場合、「nmake -f ms\nt.mak」を実行。
6.インストール
  ==> DLLビルドをしたい場合、「nmake -f ms\ntdll.mak install」
  ==> スタティックビルドをしたい場合、「nmake -f ms\nt.mak install」

私の場合はcURLを(スタティックライブラリではなく)dllでビルドしたかったので、ntdll.makを使用した。

http://www.openssl.org/

cURLビルドメモ

ver.7.25.0をソースからビルドを行う。
WindowsSolarisMac OS Xのビルド済のものはあるのだが、一部バージョンが古かったりするので、ソースから行う。

cURLは、様々なビルド構成が選択できる。
デバッグ版、リリース版
・DLLビルド、スタティックビルド
SSLなし、あり
・zlibなし、あり
sshなし、あり
・OpenSSLにするか、SSPIにするか(Windowsのみ)

Windowsの場合、VC6.0用のプロジェクトをアップグレードして、Visual Studio 2010のIDEからビルドすることもできるが、さまざまなビルドオプションが指定でき、バッチビルドが行えるコンソールビルドを行った。

<Makefileの変更点(私の場合)>
[ Makefile ]
# modified by mizoguchi
# vc6 -> vc10
VC=vc10

[ lib\Makefile.vc10 ]
# modified by mizoguchi
# OpenSSLのライブラリ構成を見ながら、適切なインクルードパスに変更(int32 -> include)(環境依存)
CFLAGSSSL  = /DUSE_SSLEAY /I "$(OPENSSL_PATH)/include" /I "$(OPENSSL_PATH)/include/openssl"

# OpenSSLのライブラリ構成を見ながら、ライブラリのパスを適切に設定(環境依存)
SSLLIBS    = $(OPENSSL_PATH)/lib/libeay32.lib $(OPENSSL_PATH)/lib/ssleay32.lib

そして各種ライブラリのパスを指定するために、以下のようなバッチファイルを作成。
(私の場合はOpenSSLを採用しSSPIは使用しなかったが、参考のために掲載しておく)

[ build_vc10.bat ]
set ZLIB_PATH=C:\Users\mizop\git_repository\GameServer\library\zlib\Windows
set OPENSSL_PATH=C:\Users\mizop\git_repository\GameServer\library\OpenSSL
set WINDOWS_SDK_PATH="C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A"

以下に、Visual Studio 2010で、全ビルドをバッチ実行する手順を記載する。

[ビルド手順]
(1)Visual Studio 2010のコマンドプロンプトを立ち上げる
(2)cURLのルートフォルダにcd
(3)上記で作成した build_vc10.bat を実行
(4)「nmake vc-all」と打つ
     ==> vcの全ビルド、つまり以下が実行される
	nmake -f Makefile.$(VC) cfg=release
	nmake -f Makefile.$(VC) cfg=release-ssl
	nmake -f Makefile.$(VC) cfg=release-zlib
	nmake -f Makefile.$(VC) cfg=release-ssl-zlib
	nmake -f Makefile.$(VC) cfg=release-ssl-dll
	nmake -f Makefile.$(VC) cfg=release-zlib-dll
	nmake -f Makefile.$(VC) cfg=release-ssl-dll-zlib-dll
	nmake -f Makefile.$(VC) cfg=release-dll
	nmake -f Makefile.$(VC) cfg=release-dll-ssl-dll
	nmake -f Makefile.$(VC) cfg=release-dll-zlib-dll
	nmake -f Makefile.$(VC) cfg=release-dll-ssl-dll-zlib-dll
	nmake -f Makefile.$(VC) cfg=debug
	nmake -f Makefile.$(VC) cfg=debug-ssl
	nmake -f Makefile.$(VC) cfg=debug-zlib
	nmake -f Makefile.$(VC) cfg=debug-ssl-zlib
	nmake -f Makefile.$(VC) cfg=debug-ssl-dll
	nmake -f Makefile.$(VC) cfg=debug-zlib-dll
	nmake -f Makefile.$(VC) cfg=debug-ssl-dll-zlib-dll
	nmake -f Makefile.$(VC) cfg=debug-dll
	nmake -f Makefile.$(VC) cfg=debug-dll-ssl-dll
	nmake -f Makefile.$(VC) cfg=debug-dll-zlib-dll
	nmake -f Makefile.$(VC) cfg=debug-dll-ssl-dll-zlib-dll

    私は実験のためにすべてをビルドしたが、もちろん自分に必要なビルドだけ行うのでもよい。

私はcURLを利用するアプリケーションがcURLのDLLを利用しているため、最終的に「debug-dll-ssl-dll」ビルドを採用した。ここでひとつ注意点だが、 ==> cURLをdllビルドした場合は、ビルドコンフィグの名前から類推できるように、OpenSSLやZlibなどもDLLビルドされていなければならない。OpenSSLなどがスタティックビルドされていると、アプリケーションがうまく立ち上がらなかった(私は数時間ハマり)。
またもし、cURLを利用するアプリケーションがスタティックビルドのライブラリを利用する場合は、#include の前にスタティックライブラリを利用する旨の CURL_STATICLIB を定義しておく必要があるかもしれない(未検証)。

ちなみに、cURLのビルドのために用意したOpenSSLライブラリは、始め自分でビルドしたものを採用していたが、最終的には「http://slproweb.com/products/Win32OpenSSL.html」にある「Win32OpenSSL-1_0_1c.exe」との相性が良かったので、これを利用させてもらってビルドを行った。

http://curl.haxx.se/

ACEバージョン比較

※随時アップデート予定

説明
5.5.0 旧vcをサポート => プロジェクトのアップグレードでvc8、vc9でも可であることを確認、vc10だとマクロでワーニングが大量に出るのでお勧めしない
5.7.9 vc8、vc9をサポート => プロジェクトのアップグレードでvc10も可であることを確認(※現在これを使用中)
5.8.0 vc8、vc9をサポート、ACE_LIB_TEXTなどの定義がなくなった
5.8.2 vc8、vc9をサポート
5.8.3 vc8、vc9、vc10をサポート、ace/OS.h が無い
6.0.0 ace/OS.h が無い、構造が変更された(ACE_RANDR_TYPEなどの定義がなくなった)
6.1.0 ace/OS.h がある

boost1.49.0のビルド、boost1.39.0のビルド

5年ぶりにboostのバージョン更新のためにビルドを実施しました。
当時はバージョンも1.33.1で、Visual Studio 2005、Solaris8、Solaris10の3環境のためにビルドして使用していたが、
今回はバージョン1.49.0で、Visual Studio 2005、Visual Studio 2008、Visual Studio 2010、Solaris10の4環境向けである。
(※Visual Studio 2005、Visual Studio 2008、Visual Studio 2010の3環境で利用する場合、boostのライブラリはWindowsで一回だけビルドすればよいというものではない。boostのライブラリ名を見るとわかるように、vc80、vc90、vc100とそれぞれの環境に応じて使用されるライブラリは異なるので注意)

こちらのサイトを参考にさせていただきながら、b2.exeでビルドを行う。
http://sites.google.com/site/boostjp/howtobuild

このサイトには記載されていないが、デフォルトだと「$(boostのルートディレクトリ)\release」にインストールされるので、「install --prefix=.\」などとしてインストールパスを変更。

b2 toolset=msvc-10.0 install --prefix=.\ link=static,shared

============================
(追記)
1.49.0だと昔作った自分のライブラリで色々と調整が必要とわかったので、1.3系の最後のバージョンである1.39.0のboostをひとまず利用することにした。ただし、Visual Studio 2008やVisual Studio 2010でビルドするにはひと工夫必要である。いかに手順を示す。

(1)ビルドツールが古いので、
   ・boost.orgから最新のboost-jam(バイナリ版:boost-jam-x.x.xx-x-ntx86.zip)をダウンロードするか、
   ・最新のboost一式を落として「bootstrap.bat」を実行してできあがる「bjam.exe」(最近のバージョンは「b2.exe」も作成される)を
   1.39.0のルートフォルダに上書きコピーする。

(2)ビルドしたい方(2008 / 2010)の、Visual Studioコマンドプロンプトを開く(普通のコマンドプロンプトではダメ[Visual Studio 2005ならOK])。
   1.39.0のルートフォルダにチェンジディレクトリ。
(3)bjam.exeあるいは、b2.exeを実行する。
   私の場合、static link(runtime shared)のビルドが欲しいので、以下の様にパラメータを指定している。

bjam --prefix=.\ --toolset=msvc-10.0 link=static runtime-link=shared release debug install --build-type=complete
bjam --prefix=.\ --toolset=msvc-9.0  link=static runtime-link=shared release debug install --build-type=complete

上記のパラメータでは、以下のようなライブラリが作成される。

libboost_date_time-vc100-mt-*-*.lib
libboost_date_time-vc90-mt-*-*.lib

※ひとつ注意点としては、boost1.39.0だとVisual Studio 2008では警告止まりでビルドができるが、
Visual Studio 2010だとエラーになるものがある(regexが使えない)。
 従って、現状は正常にビルドできたものだけ利用できるといったところか。
 現時点ではこれで使うとしても、最新の方が新しい機能を利用できるし、数多くのバグフィックスがなされているので、なるべく最新のビルドバージョンを使う方向でいくようにはしたい。<参考>
http://stackoverflow.com/questions/10356112/how-to-compile-boost-1-39-in-vs2010

Visual Studio

現在、社内PCには、わけあってVisual Studio 2010 pro、2008 pro、2005 standardの3つのバージョンがインストールされている。
だが、今でも私はVisual Studio 2005を愛用している。理由は2005で開発したプログラム資産をそのまま使いたいからだ(さまざまなライブラリを使用しているのだが、全部を後継バージョン用に自動的に問題なくアップグレードできればいいのだが、いろいろとビルドエラーが発生することがわかった)。2005/2008用のツール(Visual Assist XやVimEmu)もそのまま使えるのも大きい。特別な理由がない限り、しばらくは2005メインでいこうと思う(UScript+nFringeは2008メイン)。

Visual Studio 2005をWindows7 64bitで利用するのには、
Visual Studio 2005 Service Pack1 KB926602-X86-JPN.exe
のインストールの後、
Visual Studio 2005 Service Pack1 Update for Windows Vista(VS80sp1-KB932236-X86-JPN.exe)
をインストールする必要がある(そうしないと互換性の問題でビルドしたプログラムをIDE上で実行すると動作不安定になる)。
またWindows7 64bitで起動する際に、「管理者として実行する」にチェックを入れておくこと。

Visual Studio 2008は、カスタムインストールを選び、Visual C++ > X64コンパイラおよびツール のチェックを入れること(デフォルトではオフになっている)。

Visual Studio 2010はSQL Server CompactでIntellicenseを管理しているので、これをアンインストールしないように注意。

/MDで製作されているライブラリを/MTのアプリケーションで利用しようとするとLIBCMT.libが二重定義になるんだとか
プロパティ-->構成のプロパティ-->C/C++-->コード生成-->ランタイムライブラリ

最初は
Debug:マルチスレッドデバッグ(/MTd)
Release:マルチスレッド(/MT)

になっていると思うが、そこを以下の方に変更する。

Debug:マルチスレッドデバッグDLL(/MDd)
Release:マルチスレッドDLL(/MD)

CとPerlの連携

先日、C言語からPerlプログラムの活用を行った。
が1日ハマったので記載しておく。
===============
私がPerlを徹底的に使っていたのは2007年だが、そのころはPerl5.8だった。WindowsもXP 32bit/Solaris10で併用していた。
現在のPC環境はWindows7 64bitで、かつてのバージョンを使った方がバージョンによる差異がなくていいかと思いきや、Windows7 64bitではPerl5.8 x86版は不安定動作することがわかった(perl_destructでハングする)。バージョンが古すぎると新しいOSへの対応ができていないせいだろう。
現在最新のPerl5.14であればx86、x64共に正常動作した。

スマートフォン向けソリューションをPCで利用する

現在、あるサービスの評価を行っている。そのサービスはその会社のクラウドにあるサーバーにアクセスするクライアント - サーバー型ソリューションである。このライセンス形態がスマホ向けなら無料、他のプラットフォームの場合は有料(数カ月単位に支払い)となっているため、スマホを経由して目的のプラットフォームへ流すことを検討した。
iOSAndroidWindows Phone 7のどれにするか悩んだが、このサービスの評価をPC上のあるソフトで使いたかったため、同じPC上で動作可能で無償で開発できるWindows Phone 7を選択した(iOSが一番開発に慣れているが、MacとPCで2台稼働体制になってしまうし、Androidはオーバーヘッドがあり過ぎるので敬遠)。

Windows Phone 7の開発は初めてだったし、幾つかの些細なぼやきはあったものの、開発はなかなか面白かった。

<開発>
・メインのソフトとWindows Phone 7 EmulatorをHTTP通信で情報のやり取りを行う形をとり、メインソフトが間接的にそのサービスが利用できるようにする。
ー>メインソフト側では、Webサーバーを稼働させておき、通信をレシーブしたらイベント起動。POSTでパラメータを取得して目的の処理を行う。
ー>Windows Phone 7では、そのサービス利用するサーバーに対してまず通信を行い、任意の結果を得た後で、適切な文字コードに変換し、HTTP通信(POST)を使ってメインソフトへ情報を送りつける。

(参考)
・HTTP通信
http://d.hatena.ne.jp/bs-wp7/20110910/1315626559
http://studentguru.gr/b/vangos/archive/2011/05/17/an-http-post-request-client-for-windows-phone-7.aspx

===============
<小さなぼやき>
いささかWindows Phone 7 SDKインストール時に不思議だったのが、Visual Studio 2010 Professionalがインストールされているにも関わらず、Windows Phone 7 SDKはそんなことはお構いなしにVisual Studio 2010 Expressをインストールしてしまったことである。あんな巨大なソフトが2つも入っているのはちょっといただけない。無償開発は嬉しいが、そこはMicrosoftさんフレキシブルに対応して欲しかったところである。
あとVisual Studio 2010 Professionalを起動したままで、Windows Phone 7 SDKをインストールするとエラーでハングし、それ以降の再実行は同じ言語版だとできなかった。なので仕方なく英語版を入れている。
またWindows Phone 7用のソリューションファイル(.sln)をダブルクリックしても、Visual Studio 2010 Expressが起動しないので、わざわざショートカットを作成して対応している。
Windows PhoneってSiriみたいな機能も付いてるんですね、知らなかったです。