Добавление к командам сборки в premake

Я использую предварительный проект makefile с конфигурациями: {"VulkanDebug", "VulkanRelease", "OpenGLDebug", "OpenGLRelease"} и хочу передать токены DEBUG / RELEASE и VULKAN / OPENGL сценарию в buildCommands.

Например, если конфигурация равна 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.bat, VULKAN и RELEASE.

У меня есть несколько обходных путей, но все они кажутся мне уродливыми. Во-первых, передать полное имя конфигурации в качестве аргумента сценарию и проанализировать его там. Не особо люблю собирать аргументы в кучу. Во-вторых, создать аргументы командной строки для сценария предварительной сборки для VULKAN или OPENGL и иметь только DEBUG и RELEASE в качестве конфигураций. Насколько я знаю, это создаст отдельные файлы проекта для Vulkan и OpenGL, что кажется излишним. Наконец, я мог предоставить полную команду сборки для каждой конфигурации. Этот третий вариант кажется лучшим, но он сделает скрипт длиннее, когда я добавлю больше конфигураций (и всех возможных перестановок).

Так что, если у premake есть поддержка добавления, а я не знаю об этом, то это не проблема! В противном случае может быть более чистый способ сделать это, о котором я не знаю. Спасибо за чтение.


person Petwoip    schedule 01.09.2017    source источник


Ответы (1)


Вероятно, самый чистый подход, который вы можете использовать прямо сейчас, — это предоставить вспомогательную функцию в сценарии вашего проекта, которую вы затем вызываете из встроенного токена. Может быть, что-то вроде:

-- 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)}"
person J. Perkins    schedule 12.09.2017