Add per-file build options and forced includes to VC'2010
This commit is contained in:
parent
f4f688e77c
commit
96cfdf5acc
@ -347,6 +347,7 @@
|
|||||||
vc2010.customBuildFilesGroup(prj)
|
vc2010.customBuildFilesGroup(prj)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
function vc2010.simplefilesgroup(prj, group)
|
function vc2010.simplefilesgroup(prj, group)
|
||||||
local files = vc2010.getfilegroup(prj, group)
|
local files = vc2010.getfilegroup(prj, group)
|
||||||
if #files > 0 then
|
if #files > 0 then
|
||||||
@ -358,6 +359,7 @@
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
function vc2010.compilerfilesgroup(prj)
|
function vc2010.compilerfilesgroup(prj)
|
||||||
local files = vc2010.getfilegroup(prj, "ClCompile")
|
local files = vc2010.getfilegroup(prj, "ClCompile")
|
||||||
if #files > 0 then
|
if #files > 0 then
|
||||||
@ -368,18 +370,14 @@
|
|||||||
local condition = vc2010.condition(cfg)
|
local condition = vc2010.condition(cfg)
|
||||||
|
|
||||||
local filecfg = config.getfileconfig(cfg, file.abspath)
|
local filecfg = config.getfileconfig(cfg, file.abspath)
|
||||||
if not filecfg or filecfg.flags.ExcludeFromBuild then
|
vc2010.excludedFromBuild(cfg, filecfg)
|
||||||
_p(3,'<ExcludedFromBuild %s>true</ExcludedFromBuild>', condition)
|
if filecfg then
|
||||||
|
vc2010.objectFileName(filecfg)
|
||||||
|
vc2010.forceIncludes(filecfg, condition)
|
||||||
|
vc2010.precompiledHeader(cfg, filecfg, condition)
|
||||||
|
vc2010.additionalCompileOptions(filecfg, condition)
|
||||||
end
|
end
|
||||||
|
|
||||||
local objectname = project.getfileobject(prj, file.abspath)
|
|
||||||
if objectname ~= path.getbasename(file.abspath) then
|
|
||||||
_p(3,'<ObjectFileName %s>$(IntDir)\\%s.obj</ObjectFileName>', condition, objectname)
|
|
||||||
end
|
|
||||||
|
|
||||||
if cfg.pchsource == file.abspath and not cfg.flags.NoPCH then
|
|
||||||
_p(3,'<PrecompiledHeader %s>Create</PrecompiledHeader>', condition)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
_p(2,'</ClCompile>')
|
_p(2,'</ClCompile>')
|
||||||
end
|
end
|
||||||
@ -387,6 +385,7 @@
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
function vc2010.customBuildFilesGroup(prj)
|
function vc2010.customBuildFilesGroup(prj)
|
||||||
local files = vc2010.getfilegroup(prj, "CustomBuild")
|
local files = vc2010.getfilegroup(prj, "CustomBuild")
|
||||||
if #files > 0 then
|
if #files > 0 then
|
||||||
@ -413,6 +412,7 @@
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
function vc2010.getfilegroup(prj, group)
|
function vc2010.getfilegroup(prj, group)
|
||||||
-- check for a cached copy before creating
|
-- check for a cached copy before creating
|
||||||
local groups = prj.vc2010_file_groups
|
local groups = prj.vc2010_file_groups
|
||||||
@ -480,29 +480,6 @@
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Format and return a Visual Studio Condition attribute.
|
|
||||||
--
|
|
||||||
|
|
||||||
function vc2010.condition(cfg)
|
|
||||||
return string.format('Condition="\'$(Configuration)|$(Platform)\'==\'%s\'"', premake.esc(vstudio.projectConfig(cfg)))
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Map Premake's project kinds to Visual Studio configuration types.
|
|
||||||
--
|
|
||||||
|
|
||||||
function vc2010.configType(cfg)
|
|
||||||
local map = {
|
|
||||||
SharedLib = "DynamicLibrary",
|
|
||||||
StaticLib = "StaticLibrary",
|
|
||||||
ConsoleApp = "Application",
|
|
||||||
WindowedApp = "Application"
|
|
||||||
}
|
|
||||||
return map[cfg.kind]
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
---------------------------------------------------------------------------
|
---------------------------------------------------------------------------
|
||||||
--
|
--
|
||||||
@ -548,6 +525,13 @@
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
function vc2010.additionalCompileOptions(cfg, condition)
|
||||||
|
if #cfg.buildoptions > 0 then
|
||||||
|
local opts = table.concat(cfg.buildoptions, " ")
|
||||||
|
vc2010.element(3, "AdditionalOptions", condition, '%s %%(AdditionalOptions)', opts)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
function vc2010.additionalLinkOptions(cfg)
|
function vc2010.additionalLinkOptions(cfg)
|
||||||
if #cfg.linkoptions > 0 then
|
if #cfg.linkoptions > 0 then
|
||||||
local opts = table.concat(cfg.linkoptions, " ")
|
local opts = table.concat(cfg.linkoptions, " ")
|
||||||
@ -656,6 +640,13 @@
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
function vc2010.excludedFromBuild(cfg, filecfg)
|
||||||
|
if not filecfg or filecfg.flags.ExcludeFromBuild then
|
||||||
|
_p(3,'<ExcludedFromBuild %s>true</ExcludedFromBuild>', vc2010.condition(cfg))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
function vc2010.floatingPointModel(cfg)
|
function vc2010.floatingPointModel(cfg)
|
||||||
if cfg.flags.FloatFast then
|
if cfg.flags.FloatFast then
|
||||||
_p(3,'<FloatingPointModel>Fast</FloatingPointModel>')
|
_p(3,'<FloatingPointModel>Fast</FloatingPointModel>')
|
||||||
@ -665,13 +656,13 @@
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
function vc2010.forceIncludes(cfg)
|
function vc2010.forceIncludes(cfg, condition)
|
||||||
if #cfg.forceincludes > 0 then
|
if #cfg.forceincludes > 0 then
|
||||||
local includes = project.getrelative(cfg.project, cfg.forceincludes)
|
local includes = path.translate(project.getrelative(cfg.project, cfg.forceincludes))
|
||||||
_x(3,'<ForcedIncludeFiles>%s</ForcedIncludeFiles>', table.concat(includes, ';'))
|
vc2010.element(3, "ForcedIncludeFiles", condition, table.concat(includes, ';'))
|
||||||
end
|
end
|
||||||
if #cfg.forceusings > 0 then
|
if #cfg.forceusings > 0 then
|
||||||
local usings = project.getrelative(cfg.project, cfg.forceusings)
|
local usings = path.translate(project.getrelative(cfg.project, cfg.forceusings))
|
||||||
_x(3,'<ForcedUsingFiles>%s</ForcedUsingFiles>', table.concat(usings, ';'))
|
_x(3,'<ForcedUsingFiles>%s</ForcedUsingFiles>', table.concat(usings, ';'))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -794,6 +785,14 @@
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
function vc2010.objectFileName(filecfg)
|
||||||
|
local objectname = project.getfileobject(filecfg.project, filecfg.abspath)
|
||||||
|
if objectname ~= path.getbasename(filecfg.abspath) then
|
||||||
|
_p(3,'<ObjectFileName %s>$(IntDir)\\%s.obj</ObjectFileName>', vc2010.condition(filecfg.config), objectname)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
function vc2010.omitFramePointers(cfg)
|
function vc2010.omitFramePointers(cfg)
|
||||||
if cfg.flags.NoFramePointer then
|
if cfg.flags.NoFramePointer then
|
||||||
_p(3,'<OmitFramePointers>true</OmitFramePointers>')
|
_p(3,'<OmitFramePointers>true</OmitFramePointers>')
|
||||||
@ -844,12 +843,18 @@
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
function vc2010.precompiledHeader(cfg)
|
function vc2010.precompiledHeader(cfg, filecfg, condition)
|
||||||
if not cfg.flags.NoPCH and cfg.pchheader then
|
if filecfg then
|
||||||
_p(3,'<PrecompiledHeader>Use</PrecompiledHeader>')
|
if cfg.pchsource == filecfg.abspath and not cfg.flags.NoPCH then
|
||||||
_x(3,'<PrecompiledHeaderFile>%s</PrecompiledHeaderFile>', path.getname(cfg.pchheader))
|
vc2010.element(3, 'PrecompiledHeader', condition, 'Create')
|
||||||
|
end
|
||||||
else
|
else
|
||||||
_p(3,'<PrecompiledHeader>NotUsing</PrecompiledHeader>')
|
if not cfg.flags.NoPCH and cfg.pchheader then
|
||||||
|
_p(3,'<PrecompiledHeader>Use</PrecompiledHeader>')
|
||||||
|
_x(3,'<PrecompiledHeaderFile>%s</PrecompiledHeaderFile>', path.getname(cfg.pchheader))
|
||||||
|
else
|
||||||
|
_p(3,'<PrecompiledHeader>NotUsing</PrecompiledHeader>')
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -965,3 +970,67 @@
|
|||||||
end
|
end
|
||||||
_p(3,'<WarningLevel>Level%d</WarningLevel>', w)
|
_p(3,'<WarningLevel>Level%d</WarningLevel>', w)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
---------------------------------------------------------------------------
|
||||||
|
--
|
||||||
|
-- Support functions
|
||||||
|
--
|
||||||
|
---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Format and return a Visual Studio Condition attribute.
|
||||||
|
--
|
||||||
|
|
||||||
|
function vc2010.condition(cfg)
|
||||||
|
return string.format('Condition="\'$(Configuration)|$(Platform)\'==\'%s\'"', premake.esc(vstudio.projectConfig(cfg)))
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Map Premake's project kinds to Visual Studio configuration types.
|
||||||
|
--
|
||||||
|
|
||||||
|
function vc2010.configType(cfg)
|
||||||
|
local map = {
|
||||||
|
SharedLib = "DynamicLibrary",
|
||||||
|
StaticLib = "StaticLibrary",
|
||||||
|
ConsoleApp = "Application",
|
||||||
|
WindowedApp = "Application"
|
||||||
|
}
|
||||||
|
return map[cfg.kind]
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Output an individual project XML element, with an optional configuration
|
||||||
|
-- condition.
|
||||||
|
--
|
||||||
|
-- @param depth
|
||||||
|
-- How much to indent the element.
|
||||||
|
-- @param name
|
||||||
|
-- The element name.
|
||||||
|
-- @param condition
|
||||||
|
-- An optional configuration condition, formatted with vc2010.condition().
|
||||||
|
-- @param value
|
||||||
|
-- The element value, which may contain printf formatting tokens.
|
||||||
|
-- @param ...
|
||||||
|
-- Optional additional arguments to satisfy any tokens in the value.
|
||||||
|
--
|
||||||
|
|
||||||
|
function vc2010.element(depth, name, condition, value, ...)
|
||||||
|
if select('#',...) == 0 then
|
||||||
|
value = premake.esc(value)
|
||||||
|
end
|
||||||
|
|
||||||
|
local format
|
||||||
|
if condition then
|
||||||
|
format = string.format('<%s %s>%s</%s>', name, condition, value, name)
|
||||||
|
else
|
||||||
|
format = string.format('<%s>%s</%s>', name, value, name)
|
||||||
|
end
|
||||||
|
|
||||||
|
_x(depth, format, ...)
|
||||||
|
end
|
||||||
|
@ -551,7 +551,7 @@
|
|||||||
<ClCompile>
|
<ClCompile>
|
||||||
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
<ForcedIncludeFiles>stdafx.h;include/sys.h</ForcedIncludeFiles>
|
<ForcedIncludeFiles>stdafx.h;include\sys.h</ForcedIncludeFiles>
|
||||||
]]
|
]]
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -562,7 +562,7 @@
|
|||||||
<ClCompile>
|
<ClCompile>
|
||||||
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
<ForcedUsingFiles>stdafx.h;include/sys.h</ForcedUsingFiles>
|
<ForcedUsingFiles>stdafx.h;include\sys.h</ForcedUsingFiles>
|
||||||
]]
|
]]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -164,3 +164,47 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
]]
|
]]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Check handling of per-file forced includes.
|
||||||
|
--
|
||||||
|
|
||||||
|
function suite.forcedIncludeFiles()
|
||||||
|
language "C++"
|
||||||
|
files { "hello.cpp" }
|
||||||
|
configuration "**.cpp"
|
||||||
|
forceincludes { "../include/force1.h", "../include/force2.h" }
|
||||||
|
|
||||||
|
prepare()
|
||||||
|
test.capture [[
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="hello.cpp">
|
||||||
|
<ForcedIncludeFiles Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\include\force1.h;..\include\force2.h</ForcedIncludeFiles>
|
||||||
|
<ForcedIncludeFiles Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\include\force1.h;..\include\force2.h</ForcedIncludeFiles>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
]]
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Check handling of per-file command line build options.
|
||||||
|
--
|
||||||
|
|
||||||
|
function suite.additionalOptions()
|
||||||
|
language "C++"
|
||||||
|
files { "hello.cpp" }
|
||||||
|
configuration "**.cpp"
|
||||||
|
buildoptions { "/Xc" }
|
||||||
|
|
||||||
|
prepare()
|
||||||
|
test.capture [[
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="hello.cpp">
|
||||||
|
<AdditionalOptions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">/Xc %(AdditionalOptions)</AdditionalOptions>
|
||||||
|
<AdditionalOptions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">/Xc %(AdditionalOptions)</AdditionalOptions>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
]]
|
||||||
|
end
|
||||||
|
Reference in New Issue
Block a user