2015-05-07 4 views
1

Я использую premake5 с Visual Studio 2013 и пытаюсь связать стороннюю библиотеку с моим проектом. Отладочная версия этой библиотеки имеет суффикс «d», как обычно. Это пример сценария.Специализация переменной по типу конфигурации в premake

solution "MySln" 
    language "C++" 
    configurations { "debug", "release" } 

    d = "" 

    configuration "debug" 
     d = "d" 

    configuration "release" 
     d = "" 

    libicu = { "icuin%{d}", "icuuc%{d}" } 

project "core" 
    kind "SharedLib" 
    location "core" 
    links(libicu) 
    files { "core/**.h", "core/**.cpp" } 

Но этот скрипт ссылки в обеих конфигурациях (отладки и выпуска) icuin.lib и icuuc.lib. Если я удалю d = "" присвоение в конфигурации "release" блок, тогда обе конфигурации связывают библиотеки icuind.lib и icuucd.lib. Похоже, что premake использует последнее увиденное определение переменной при разрешении% {d} placeholder. Как я могу изменить свой скрипт, чтобы получить правильное поведение? Благодаря!

ответ

0

Вы не можете смешивать назначения переменных (которые оцениваются во время оценки скрипта) и предварительные конфигурации (которые собираются после запуска всех сценариев проекта).

Одним из решений может быть:

solution "MySln" 
    language "C++" 
    configurations { "debug", "release" } 

    filter "configurations:debug" 
     targetextension "d" 

project "core" 
    kind "SharedLib" 
    location "core" 
    files { "core/**.h", "core/**.cpp" } 

    filter "configurations:debug" 
     links { "icuind", "icuucd" } 
    filter "configurations:release" 
     links { "icuin", "icuuc" } 

Если у вас есть много библиотек или делать это часто вы можете использовать функцию для этого:

project "core" 
    links_d { "icuin", "icuuc" } 

function links_d(value) 
    filter("configurations:debug") 
    for i = 1, #value do 
     links (value[i] .. "d") 
    end 
    filter("configurations:release") 
    links (value) 
    filter("*") 
end