Improved handling of architecture and .NET projects in VS solution configurations

This commit is contained in:
Jason Perkins 2012-09-24 11:16:27 -04:00
parent 72d4331f65
commit 1bdf2f2e31
5 changed files with 118 additions and 148 deletions

View File

@ -6,6 +6,7 @@
premake.vstudio = { }
local vstudio = premake.vstudio
local solution = premake.solution
local project = premake5.project
@ -192,6 +193,8 @@
function vstudio.architecture(cfg)
local arch
-- allow add-ons to override the architecture for VS2010 specifically
if _ACTION >= "vs2010" then
arch = vstudio.vs2010_architectures[cfg.architecture] or
vstudio.vs2010_architectures[cfg.system]
@ -216,6 +219,56 @@
end
--
-- Returns the Visual Studio solution configuration identifier corresponding
-- to the given Premake configuration.
--
-- @param cfg
-- The configuration to query.
-- @return
-- A solution configuration identifier of the format BuildCfg|Platform,
-- corresponding to the Premake values of the same names. If no platform
-- was specified by the script, the architecture is used instead.
--
function vstudio.solutionconfig(cfg)
local platform = cfg.platform
-- if no platform name was specified, use the architecture instead;
-- since architectures are defined in the projects and not at the
-- solution level, need to poke around to figure this out
if not platform then
local hascpp = false
local hasdotnet = false
for prj in premake.solution.eachproject_ng(cfg.solution) do
if premake.iscppproject(prj) then
hascpp = true
elseif premake.isdotnetproject(prj) then
hasdotnet = true
end
-- map the solution config to the corresponding project cfg
local prjcfg = project.getconfig(prj, cfg.buildcfg, cfg.platform)
if prjcfg then
if prjcfg.architecture then
platform = vstudio.architecture(prjcfg)
end
end
end
-- use a default if no other architecture was specified
if hascpp and hasdotnet then
platform = "Mixed Platforms"
else
platform = platform or iif(hascpp, "Win32", "Any CPU")
end
end
return string.format("%s|%s", cfg.buildcfg, platform)
end
--
-- Returns the full, absolute path to the Visual Studio project file
-- corresponding to a particular project object.
@ -398,15 +451,6 @@
--
-- Given a project configuration, return a Visual Studio compatible platform name.
--
function vstudio.platform(cfg)
return cfg.platform or "Win32"
end
--
-- Returns the project platform name for a specified configuration. Each build
-- configuration/platform pairing set in the solution gets mapped to a project

View File

@ -93,10 +93,8 @@
function sln2005.solutionConfigurationPlatforms(sln)
_p(1,'GlobalSection(SolutionConfigurationPlatforms) = preSolution')
for cfg in solution.eachconfig(sln) do
local platforms = sln2005.getcfgplatforms(sln, cfg)
for _, platform in ipairs(platforms) do
_p(2,'%s|%s = %s|%s', cfg.buildcfg, platform, cfg.buildcfg, platform)
end
local ident = vstudio.solutionconfig(cfg)
_p(2,'%s = %s', ident, ident)
end
_p(1,'EndGlobalSection')
end
@ -113,12 +111,12 @@
for slncfg in solution.eachconfig(sln) do
local prjcfg = project.getconfig(prj, slncfg.buildcfg, slncfg.platform)
if prjcfg then
local slnplatform = vstudio.platform(slncfg)
local slnident = vstudio.solutionconfig(slncfg)
local prjplatform = vstudio.projectplatform(prjcfg)
local architecture = vstudio.architecture(prjcfg)
_p(2,'{%s}.%s|%s.ActiveCfg = %s|%s', prj.uuid, slncfg.buildcfg, slnplatform, prjplatform, architecture)
_p(2,'{%s}.%s|%s.Build.0 = %s|%s', prj.uuid, slncfg.buildcfg, slnplatform, prjplatform, architecture)
_p(2,'{%s}.%s.ActiveCfg = %s|%s', prj.uuid, slnident, prjplatform, architecture)
_p(2,'{%s}.%s.Build.0 = %s|%s', prj.uuid, slnident, prjplatform, architecture)
end
end
end
@ -137,50 +135,6 @@
end
--
-- Return a list of required platforms for a specific configuration.
-- Depending on mix of languages used by the solution, a configuration
-- may need multiple platforms listed.
--
-- @param sln
-- The current solution.
-- @param cfg
-- The configuration to query.
-- @return
-- A array of one or more platform identifiers.
--
function sln2005.getcfgplatforms(sln, cfg)
local r = {}
local hasdotnet = solution.hasdotnetproject(sln)
local hascpp = solution.hascppproject(sln)
local is2010 = _ACTION > "vs2008"
if hasdotnet then
if not hascpp or not is2010 then
table.insert(r, "Any CPU")
end
if hascpp or is2010 then
table.insert(r, "Mixed Platforms")
end
end
if cfg.platform then
table.insert(r, cfg.platform)
else
if hascpp or not is2010 then
table.insert(r, "Win32")
end
if hasdotnet and is2010 then
table.insert(r, "x86")
end
end
return r
end
-----------------------------------------------------------------------------
-- Everything below this point is a candidate for deprecation

View File

@ -123,6 +123,7 @@
-- fill in any calculated values
for _, cfg in ipairs(configs) do
cfg.solution = sln
premake5.config.bake(cfg)
end

View File

@ -29,11 +29,10 @@
--
-- Check the basic form of C++ solutions: only the specified build configurations
-- should be listed, and the architecture should default to Win32.
-- If no platforms are specified, the architecture should be used as a default.
--
function suite.buildCfgAndWin32Used_onNoPlatformsSet()
function suite.useArchAsPlatform_onCppAndNoArch()
prepare()
test.capture [[
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -43,12 +42,56 @@
]]
end
function suite.useArchAsPlatform_onCppAnd32()
architecture "x32"
prepare()
test.capture [[
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
]]
end
function suite.useArchAsPlatform_onCppAnd64()
architecture "x64"
prepare()
test.capture [[
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Release|x64 = Release|x64
EndGlobalSection
]]
end
function suite.useArchAsPlatform_onCs()
prepare("C#")
test.capture [[
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
]]
end
function suite.useArchAsPlatform_onMixedLanguage()
project("MyProject2")
language "C++"
prepare("C#")
test.capture [[
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Mixed Platforms = Debug|Mixed Platforms
Release|Mixed Platforms = Release|Mixed Platforms
EndGlobalSection
]]
end
--
-- When a platform is specified, it should be listed instead of the default Win32.
-- When a platform is specified, it should be listed instead of the architecture default.
--
function suite.buildCfgAndPlatformUsed_onPlatformsSet()
function suite.buildCfgAndPlatformUsed_onPlatformsSet_onCpp()
platforms { "Static" }
prepare()
test.capture [[
@ -59,6 +102,17 @@
]]
end
function suite.buildCfgAndPlatformUsed_onPlatformsSet_onCs()
platforms { "Static" }
prepare("C#")
test.capture [[
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Static = Debug|Static
Release|Static = Release|Static
EndGlobalSection
]]
end
--
-- When multiple platforms are provided, the sort order should match Visual Studio.
@ -77,85 +131,3 @@
]]
end
--
-- When the only project language is C#, the Any CPU configuration should be added.
--
function suite.addsAnyCPU_onCsOnly()
prepare("C#")
test.capture [[
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|Win32 = Debug|Win32
Release|Any CPU = Release|Any CPU
Release|Win32 = Release|Win32
EndGlobalSection
]]
end
--
-- If projects in the solution use both C# and C++, the Mixed Platforms
-- configuration should be added.
--
function suite.addsMixedPlatforms_onMixedLanguages()
project("MyProject2")
language "C#"
prepare()
test.capture [[
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|Mixed Platforms = Debug|Mixed Platforms
Debug|Win32 = Debug|Win32
Release|Any CPU = Release|Any CPU
Release|Mixed Platforms = Release|Mixed Platforms
Release|Win32 = Release|Win32
EndGlobalSection
]]
end
--
-- Visual Studio 2010 does things a little differently: x86 instead of
-- Win32, and Mixed Platforms are always listed.
--
function suite.onCsharpAndVs2010()
_ACTION = "vs2010"
prepare("C#")
test.capture [[
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|Mixed Platforms = Debug|Mixed Platforms
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|Mixed Platforms = Release|Mixed Platforms
Release|x86 = Release|x86
EndGlobalSection
]]
end
--
-- On mixed language projects, Visual Studio 2010 lists both x86 and
-- Win32 architectures by default.
--
function suite.onMixedLanguageAndVs2010()
_ACTION = "vs2010"
project("MyProject2")
language "C#"
prepare()
test.capture [[
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Mixed Platforms = Debug|Mixed Platforms
Debug|Win32 = Debug|Win32
Debug|x86 = Debug|x86
Release|Mixed Platforms = Release|Mixed Platforms
Release|Win32 = Release|Win32
Release|x86 = Release|x86
EndGlobalSection
]]
end

View File

@ -115,7 +115,6 @@
-- Visual Studio 2005-2010 solutions
dofile("actions/vstudio/sln2005/test_dependencies.lua")
dofile("actions/vstudio/sln2005/test_header.lua")
dofile("actions/vstudio/sln2005/projectplatforms.lua")
dofile("actions/vstudio/sln2005/test_projects.lua")
dofile("actions/vstudio/sln2005/test_project_platforms.lua")
dofile("actions/vstudio/sln2005/test_solution_platforms.lua")