2016-03-26 15 views
0

最近、私はCMakeからPremake(v5.0.0-alpha8)に変更しました。私はPremakeで以下のことを達成する方法がはっきりしていません。私はこのような何かを行うことができますCMakeのではので、いくつかの依存関係を含めたいPremakeが依存関係を拾わない

:上記

target_link_libraries(${PROJECT_NAME} 
    ${YALLA_ABS_PLATFORM} 
    ${YALLA_LIBRARY}) 

は、コンパイラで「追加のインクルードディレクトリ」に、これらのライブラリー(DIR)のパスを追加し、それだろうリンカーの「Additional Dependencies」にもエントリ(lib)が追加されますので、特別な処理は必要ありません。target_link_librariesを呼び出してください。

だから、私はPremakeでこのような何かやっているときと予想さ:

links { 
    YALLA_LIBRARY 
} 

を、私は同じ結果を得るだろうが、私はしないでください。

は、私はまた、 libdirsを使用しようとしましたが、それは、私がライブラリディレクトリとそのサブディレクトリには、「追加のインクルードディレクトリ」としてコンパイラに渡さ見ることができないではない、本当に 仕事意味は(/ I)またはYalla .Library.libは "追加の依存関係"としてリンカーに渡されます。 プラットフォーム dirはとPremakeに定義されている

project(YALLA_LIBRARY) 
    kind "SharedLib" 

    files { 
     "utils/string-converter.hpp", 
     "utils/string-converter.cpp", 
     "defines.hpp" 
    } 

ライブラリ dirは次のようにPremakeに定義されている

. 
|-- src 
| |-- launcher 
| |-- library 
| | `-- utils 
| `-- platform 
|  |-- abstract 
|  `-- win32 
`-- tests 
    `-- platform 
     `-- win32 

:ここ

は、私が使用してディレクトリ構造であります続く:

project(YALLA_PLATFORM) 
    kind "SharedLib" 
    includedirs "abstract" 

    links { 
     YALLA_LIBRARY 
    } 

    if os.get() == "windows" then 
     include  "win32" 
    else 
     return -- OS NOT SUPPORTED 
    end 

win32の DIRは、以下のようPremakeで定義されています

files { 
    "event-loop.cpp", 
    "win32-exception.cpp", 
    "win32-exception.hpp", 
    "win32-window.cpp", 
    "win32-window.hpp", 
    "window.cpp" 
} 

そして最後にルートディレクトリで私は、次のPremakeファイルがあります。

PROJECT_NAME = "Yalla" 

-- Sets global constants that represents the projects' names 
YALLA_LAUNCHER = PROJECT_NAME .. ".Launcher" 
YALLA_LIBRARY = PROJECT_NAME .. ".Library" 
YALLA_ABS_PLATFORM = PROJECT_NAME .. ".AbstractPlatform" 
YALLA_PLATFORM = PROJECT_NAME .. ".Platform" 

workspace(PROJECT_NAME) 
    configurations { "Release", "Debug" } 
    flags   { "Unicode" } 

    startproject (YALLA_LAUNCHER) 
    location  ("../lua_build") 

    include   "src/launcher" 
    include   "src/library" 
    include   "src/platform" 

を私はおそらくどのように誤解していますPremakeは、経験が不足しているために動作します。

答えて

0

新しいグローバル関数を作成して解決し、includedepsと命名しました。

function includedeps(workspace, ...) 
    local workspace = premake.global.getWorkspace(workspace) 

    local args = { ... } 
    local args_count = select("#", ...) 
    local func = select(args_count, ...) 

    if type(func) == "function" then 
     args_count = args_count - 1 
     args = table.remove(args, args_count) 
    else 
     func = nil 
    end 

    for i = 1, args_count do 
     local projectName = select(i, ...) 
     local project = premake.workspace.findproject(workspace, projectName) 
     if project then 
      local topIncludeDir, dirs = path.getdirectory(project.script) 
      if func then 
       dirs = func(topIncludeDir) 
      else 
       dirs = os.matchdirs(topIncludeDir .. "/**") 
       table.insert(dirs, topIncludeDir) 
      end 
      includedirs(dirs) 
      if premake.project.iscpp(project) then 
       libdirs(dirs)  
      end 
      links(args) 
     else 
      error(string.format("project '%s' does not exist.", projectName), 3) 
     end 
    end 
end 

用途:

includedeps(PROJECT_NAME, YALLA_LIBRARY) 

または

includedeps(PROJECT_NAME, YALLA_PLATFORM, function(topIncludeDir) 
      return { path.join(topIncludeDir, "win32") } 
     end) 

更新:適切を動かすためには

あなたが必要あなたがincludeの依存関係を持っているときは、ディレクトリ構造の順番ではなく依存関係の順番に含まれていることを確認してください。

たとえば、次の依存グラフlauncher --> platform --> libraryがある場合は、次の順番でincludeにします。私の場合は以下の通りであるディレクトリ構造とは対照的に

include   "src/library" 
include   "src/platform" 
include   "src/launcher" 

src/launcher 
src/library 
src/platform 

あなたはそれらのディレクトリ構造によってそれらが含まれる場合、それは失敗し、あなたを教えてくれること「プロジェクトのYalla。プラットフォーム 'は存在しません。