Premake
cmakeみたいな自動プロジェクトファイル構成システム
https://github.com/premake/premake-core/wiki
参考:
ビルドツールpremakeの紹介
環境
Windows 7
Visual Studio 2012
Premake 5.0 alpha 9
Premakeの基本的な使い方
├─ src
│ ├─ main.cpp
│ └─ sample.cpp
├─ include
│ └─ sample.h
├─ premake5.exe
└─ premake5.lua
上のような感じでソースファイルとヘッダファイルを用意。
このディレクトリでコマンドラインから以下のように実行。
premake5.exe vs2012
すると、build_premake(premake5.luaで指定したディレクトリ)が追加され、
中に ソリューションファイル(.sln)やプロジェクトファイル(.vcxproj)が作成される。
premake5.lua の記述内容
premake5.lua
-- includeexternal("extra.lua") -- 他のluaファイルを開く
workspace "sample"
location "build_premake"
configurations { "Debug", "Release" }
externalproject "sampleLib" -- 外部プロジェクト
location "../sampleLib/build_premake/" -- 相対パスで.vcxprojがあるディレクトリを指定
kind "StaticLib"
language "C++"
project "sample"
kind "ConsoleApp" -- .libは"StaticLib"、.dllは"SharedLib"
language "C++"
targetdir "build_premake/%{cfg.buildcfg}" -- %{cfg.buildcfg} は Debug or Release
defines { "NOMINMAX" } -- プリプロセッサ
disablewarnings { "4100", "4200" } -- C4100,C4200の警告を表示しないように
files { "src/**.h", "src/**.cpp", }
includedirs { "include" } -- 追加のインクルードディレクトリ
--libdirs { "lib" } -- 追加のライブラリディレクトリ(必要であれば)
--links { "hoge.lib" } -- 追加の依存ファイル(必要であれば)
links { "sampleLib" } -- 外部プロジェクトとリンク
filter "configurations:Debug" -- 以下Debugの設定
targetsuffix "_d" -- exeファイルのサフィックス(sample_d.exeのようになる)
defines { "DEBUG" }
flags { "Symbols" } -- シンボル情報作成
optimize "OFF" -- 最適化無し
filter "configurations:Release" -- 以下Releaseの設定
optimize "Speed" -- 速度重視で最適化
filter {} -- フィルタのクリア
追加の依存ファイルを設定する方法
.libファイルを作成する場合(kind "StaticLib")で、
「追加の依存ファイル」を設定する場合、上記のようにlinksを指定してもうまくいかない。
以下のような処理をpremake5.luaに追加する。
premake5.lua
local p = premake
function myAdditionalStaticDependencies(cfg)
-- **.lib のようなものだけ追加
local links = p.config.getlinks(cfg, "system", "fullpath")
if #links > 0 then
links = path.translate(table.concat(links, ";"))
p.x('<AdditionalDependencies>%s;%%(AdditionalDependencies)</AdditionalDependencies>', links)
end
local dirs = p.config.getlinks(cfg, "system", "directory")
if #dirs > 0 then
dirs = path.translate(table.concat(dirs, ";"))
p.x('<AdditionalLibraryDirectories>%s;</AdditionalLibraryDirectories>', dirs)
end
end
p.override(p.vstudio.vc2010.elements, "lib", function(base, cfg, explicit)
local calls = base(cfg, explicit)
if cfg.kind == p.STATICLIB then
table.insert(calls, myAdditionalStaticDependencies)
end
return calls
end)
-- 以降がビルドの定義
workspace "sample"
location "build_premake"
configurations { "Debug", "Release" }
project "sampleLib"
kind "StaticLib" -- .libファイルを作成
language "C++"
targetdir "build_premake/%{cfg.buildcfg}"
files { "src/**.h", "src/**.cpp", }
libdirs { "lib" } -- 追加のライブラリディレクトリ
links { "additional.lib" } -- ライブラリアン > 追加の依存ファイルに additional.lib が追加される