2017-09-01 50 views
0

我使用的是premake生成文件的項目與配置:{"VulkanDebug", "VulkanRelease", "OpenGLDebug", "OpenGLRelease"}並想通過DEBUG/RELEASEVULKAN/OPENGL令牌中的腳本buildCommands追加到buildcommands在premake

例如,配置爲VulkanRelease時,生成命令爲script.bat VULKAN RELEASE,腳本負責決定如何處理這些令牌。

我的理想解決方案(使用無效邏輯):

buildcommands { "script.bat" } 

    filter "configurations:*Vulkan*" 
     buildcommands.append(" VULKAN") 
     rebuildcommands.append(" VULKAN") 

    filter "configurations:*OpenGL*" 
     buildcommands.append(" OPENGL") 
     rebuildcommands.append(" OPENGL") 

    filter "configurations:*Debug*" 
     buildcommands.append(" DEBUG") 
     rebuildcommands.append(" DEBUG") 

    filter "configurations:*Release*" 
     buildcommands.append(" RELEASE") 
     rebuildcommands.append(" RELEASE") 

如果我使用buildcommands正常的方式,Visual Studio會認爲這是三個獨立的命令來執行:script.batVULKAN,並RELEASE

我有幾個解決方法,但他們都覺得對我來說很醜。首先是將整個配置名稱作爲參數傳遞給腳本並在那裏解析它。並非真正把這樣的爭論聚集在一起。第二種是爲VULKANOPENGL創建預製腳本的命令行參數,並且只有DEBUGRELEASE作爲配置。據我所知,這將爲Vulkan和OpenGL生成單獨的項目文件,這似乎是過度殺傷性的。最後,我可以爲每個配置提供完整的構建命令。這第三個選項似乎是最好的,但一旦我添加更多配置(以及所有可能的排列組合),它將使腳本更長。

所以,如果premake有附加支持,我不知道它,那麼非問題!否則,可能會有一種更清晰的方式來做到這一點,但我不知道。謝謝閱讀。

回答

0

今天你可以使用的最簡潔的方法可能是在你的項目腳本中提供一個輔助函數,然後你可以從一個內聯標記中調用它。可能是這樣的:

-- Helper function to assemble the arguments 
function buildArguments(cfg) 
    local args = {} 

    if cfg.name:find("VULKAN") then 
     table.insert(args, "VULKAN") 
    end 

    if cfg.name:find("OpenGL") then 
     table.insert(args, "OPENGL") 
    end 

    if cfg.name:find("Debug") then 
     table.insert(args, "DEBUG") 
    end 

    if cfg.name:find("Release") then 
     table.insert(args, "RELEASE") 
    end 

    return table.concat(args, " ") 
end 

-- Use it like this 
buildcommands "SomeCmd.exe %{buildArguments(cfg)}"