外貨・外為・為替サービスのドメインを売却します

メインコンテンツ | メニュー | リンクメニュー

Main Contents

Visual StudioでらくらくApacheモジュール開発

まともに使えるCの開発環境はMicrosoftのVisual Studioだけ、というヘタレながら、ただいまApacheのモジュール開発に挑戦中。

いくつか準備をすれば、Visual C++ 2003(以下VC++2003)でもApacheモジュールを開発することができる。

先生になった本が主にApache 1.3系を対象としているため、Apacheは1.3.33を対象にしている。

Apacheモジュール プログラミングガイド
小山 浩之
技術評論社 (2003/08/01)
売り上げランキング: 56,913
通常24時間以内に発送


おおまかな手順

  1. ActivePerlのインストール
  2. ソースコード付きパッケージのインストール
  3. ApacheをVC++2003でコンパイルしなおす
  4. VC++2003の環境設定
  5. モジュールのテンプレートコードの生成
  6. モジュールの実装
  7. httpd.confファイルの変更
  8. デバッグ
  9. リリース

ActivePerlのインストール

Apacheモジュールの開発ユーティリティであるapxsはPerlのプログラムなので(UNIXのも実はそうだったのか?)、ActivePerlをインストールしておく。


ActiveState - ActivePerl free Perl open source binary language distribution - Dynamic Tools for Dynamic Languages

ソースコード付きパッケージのインストール

まずはソースコード付きのパッケージ、

http://archive.apache.org/dist/httpd/binaries/win32/

にある

apache_1.3.33-win32-x86-src.msi

をインストール。
起動オプションは、サービスではなくRun when started manually, only for meを選ぶ。

Visual Studio 2003でApacheのコンパイル

Visual Studio 2003でのApacheモジュール開発でつまづいた点がひとつ。
fgetsやFILEポインタなど基本的なライブラリの扱いでコケてしまうのだ。

それはWin32 ApacheのバイナリをコンパイルしているのはVC++6で、VC++2003では、printfやfopenを初めとするCの基本的なライブラリの実装において、互換性が損なわれているからだ。
これはハマった。

[Python-Dev] PyRun_ with file name

これを解決するには、


  • VC++6でApacheモジュールを開発する

  • VC++2003でApacheをコンパイルしなおす


のいずれかしかないだろう。もちろんここでは後者。

  1. C:\Program Files\Apache Group\Apache\src\Apache.dswを開く。
  2. 「現在のVisual C++プロジェクト形式に変換されなければなりません・・・」と出るので、「すべてはい」としてソリューションのプロジェクトを全て新しい形式(..vcproj)に変換する。ただしそのままビルドしても最後のインストール用のMakeスクリプトでいくつかエラーがでる。
  3. pdb(デバッグ用のシンボルDBだっけ?)の出力のいくつかに_srcというサフィックスがついているにも関わらず、インストール用Makeスクリプトはそうなっていない。ちょっと強制的だけど、こういったソフトをつかって、"C:\Program Files\Apache Group\Apache\src"以下の"_src"を全て削除(空文字列に置換)。

    Devas(Windows95/98/Me/ユーティリティ)
  4. まずApacheプロジェクトをビルド。
  5. それからソリューションのビルド。32個のプロジェクトのビルドが成功すればOK。

ここでコンパイルされたApacheは、"C:\Apache"にインストールされ、実行ファイルはC:\Apache\Apache.exe、設定ファイルは"C:\Apache\conf\httpd.conf"となる。

Visual Studioの環境設定

Visual Studioにインクルードとライブラリのパスを通す。
ツール-オプション-プロジェクト-VC++ディレクトリ
で、インクルードファイルに

C:\Apache\include

ライブラリファイルに

C:\Apache\libexec

を追加。

モジュールのテンプレートコードを生成

モジュールの実装はまず、apxsでプロジェクト雛形を作る。
コマンドプロンプトで、

C:\Program Files\Apache Group\Apache\src\support

に移動し、

apxs.pl -g -n mymodule

を実行する(mymoduleは作成したいモジュール名に置き換えて)。
mymoduleフォルダと、その中にMakefile、mymodule.cが出来ていればOK。
次に、

VC++用プロジェクトファイル

をダウンロードして、mymoduleフォルダに入れる。
ファイル名をモジュール名にちなんだものに変更して、エディタで開き、mymodule→モジュール名に全置換。

Visual Studioからファイル-開く-プロジェクトを選び、準備した.vcprojファイルを開く。

モジュールの実装

実際にモジュールを実装し、ビルドしてみる。

C:\Apache\modules

に、

my_mymodule.so

ができているはず。

httpd.confの変更

Apacheがモジュールを読み込むようにhttpd.confを変更。次のディレクティブを追加。

LoadModule mymodule_module modules/mod_mymodule.so

AddModule mod_mymodule.c

とりあえず最初は


<Location /mymodule>
SetHandler mymodule
</Location>

として、/mymoduleにアクセスすることで起動するようにしておく。

デバッグ

プロジェクトの設定を開き、デバッグの設定において、コマンドラインを

C:\Apache\Apache.exe

引数に

-X

を設定する。

static int mymodule_handler(request_rec *r)

のいずれかのラインにブレークポイントを設定し、Visual Studioからデバッグを開始するとApache.exeが実行され、HTTP受付状態に。

http://localhost/mymodule

にアクセスし、ブレークポイントで止まることを確認。

Apache.exeはCtrl+Cで止めるのがお行儀がよいはずだが、なぜか例がが発生する。
pidファイルのクリーンナップができていないと、次回から毎回アラートが表示されるけど、とりあえずデバッガから強制終了するしかない。

リリース

あとはデバッグが完了すれば、UNIXに持って行って、apxsで制せされたMakefileをmakeしたりなんかすればOKでは。

まとめ

慣れた統合環境で作業できるのはらくらくだけど、準備はあまりらくらくじゃないな・・

TrackBacks

トラックバックURL:

Comments

Post a comment

コメントフォーム

Copyright © here.