premakeを使ってコマンドラインで開発(vcでもw)

premakeというのはプロジェクト管理ツールで、 define, includeパス, libraryパス, linkするライブラリ, 出力する実行ファイルやライブラリ,含まれるソースなどのプロジェクトの情報をluaスクリプトに書いておき、そこからコマンド一発でvcソリューションやMakefileを生成するというもの。
特にwxWidgetsとかでcrossplatformな開発をするときに相性がいいと思う。
Makefileを使うときでもDebugとReleaseの使い分けが簡単にできるのがいい。


VC2005 Express EditionとLinux, OSXで試してみてわりとよさげだったので使い方をメモしてみる。
(OSXではInfo.plistの自動化のやり方がわからなかったがluaで書けばなんとかなる)

とりあえずpremakeのバイナリをゲット

http://premake.sourceforge.net/download
パスの通ったところにでも展開しておく

プロジェクト(vcで言うところのsolution)を作る

適当にディレクトリを作ってpremake.luaを書く。
premake.lua

project.name = "sample_project" -- ソリューション名になる
project.configs = { "Debug", "Release" } -- コンフィグの種類を定義
project.config["Debug"].bindir   = "debug" -- デバッグ実行ファイルの出力先
project.config["Debug"].libdir   = "debug" -- デバッグライブラリの出力先
project.config["Release"].bindir = "release" -- リリース実行ファイルの出力先
project.config["Release"].libdir = "release" -- リリースライブラリの出力先

dopackage("src") -- サブディレクトリを指定

サブディレクトリのpremake.lua

src/premake.lua

package.name       = "sample" -- パッケージ名
package.kind       = "winexe" -- 種類
package.language   = "c++" -- 言語
package.target     = "main" -- 出力ファイル(拡張子やlib無し)

-- ソースとヘッダ
package.files = {
  matchfiles("*.cpp", "*.h"),
}

サブディレクトリ(src)にソースを作成する

src/main.cpp

#include<windows.h>

int WINAPI WinMain( HINSTANCE hInstance , HINSTANCE hPrevInstance , PSTR lpCmdLine , int nCmdShow )
{
  MessageBox(NULL , TEXT("sample") , TEXT("ぷりめいく") , MB_OK);
  return 0;
}

ここまでで準備完了。以降はビルド手順になる。

vcのソリューション生成

dosプロンプトでプロジェクトのディレクトに移動

> premake --target vs2005

これでカレントにsample_project.sln、サブディレクトリにsample.vcprojが生成される

ビルド

> "c:\Program Files\Microsoft Visual Studio 8\VC\vcvarsall.bat"
Setting environment for using Microsoft Visual Studio 2005 x86 tools.
> vcbuild sample_project.sln "Debug|Win32" /useenv

これでdebugディレクトリに実行ファイルが生成される。
(releaseにしたいときはvcbuildの引数で指定)

以上でした。
ビルドはslnをダブルクリックして普通に作業してもよし。
注意点としては、 vc上でプロジェクトの設定を変える必要があるときは、premake.luaの方を編集してソリューションを出力しなおすようにする。

掃除

premakeが作成したsln,vcprojやビルド時に生成されたファイルを削除する

> premake --clean

cygwinMakefile

まず、cygwinでプロジェクトディレクトリにcdする

$ premake --target gnu

これでMakefileが生成される。

$ make

Releaseを作るときはMakefileを見ればわかるとおり

$ make CONFIG=Release

これだけでcygwin版のビルド完了。

今回はwin32apiだったのであまり嬉しくないが、
クロスプラットフォームのツールキット(wxWidgetsとかgtkとかQt)を使うときとかに本領を発揮すると思う。
別のライブラリ(zlibとか)を含むときにも対応できるので便利。

premakeを使っているプロジェクト

http://www.wxjavascript.net/
(wxWidgetsspidermonkeyを仕込んでいる)