Premakeで「追加の依存ファイル」を設定する

# Premake
cmakeみたいな自動プロジェクトファイル構成システム
https://github.com/premake/premake-core/wiki

参考：
[ビルドツールpremakeの紹介](http://qiita.com/ousttrue/items/6d837d6daba47b51bd8e)

# 環境
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 の記述内容

```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に追加する。

```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 が追加される

```