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; }
ここまでで準備完了。以降はビルド手順になる。
ビルド
> "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
cygwinでMakefile
$ premake --target gnu
これでMakefileが生成される。
$ make
Releaseを作るときはMakefileを見ればわかるとおり
$ make CONFIG=Release
これだけでcygwin版のビルド完了。
今回はwin32apiだったのであまり嬉しくないが、
クロスプラットフォームのツールキット(wxWidgetsとかgtkとかQt)を使うときとかに本領を発揮すると思う。
別のライブラリ(zlibとか)を含むときにも対応できるので便利。
premakeを使っているプロジェクト
http://www.wxjavascript.net/
(wxWidgetsとspidermonkeyを仕込んでいる)