diff options
author | Jason Perkins <starkos@industriousone.com> | 2013-04-26 00:00:18 +0400 |
---|---|---|
committer | Jason Perkins <starkos@industriousone.com> | 2013-04-26 00:00:18 +0400 |
commit | e1478cbb172cfb7bcb6220d154fc6f12d5e04bc6 (patch) | |
tree | ac1391a6b995b9ecc7805a12171c6a109c5ec2f2 | |
parent | 826b24e1b01d969ba7206b7e1b38176bf639649a (diff) |
Add support for Visual Studio 2012 (Oliver Schneider)
-rw-r--r-- | CHANGES.txt | 1 | ||||
-rw-r--r-- | src/_manifest.lua | 15 | ||||
-rw-r--r-- | src/actions/vstudio/_vstudio.lua | 120 | ||||
-rw-r--r-- | src/actions/vstudio/vs2005_csproj.lua | 65 | ||||
-rw-r--r-- | src/actions/vstudio/vs2005_solution.lua | 29 | ||||
-rw-r--r-- | src/actions/vstudio/vs2010_vcxproj.lua | 4 | ||||
-rw-r--r-- | src/actions/vstudio/vs2012.lua | 58 | ||||
-rw-r--r-- | src/base/api.lua | 225 | ||||
-rwxr-xr-x | tests/actions/vstudio/cs2005/projectelement.lua | 15 | ||||
-rwxr-xr-x | tests/actions/vstudio/cs2005/projectsettings.lua | 29 | ||||
-rwxr-xr-x | tests/actions/vstudio/sln2005/header.lua | 16 | ||||
-rw-r--r-- | tests/actions/vstudio/vc2010/test_config_props.lua | 65 | ||||
-rw-r--r-- | tests/premake4.lua | 1 |
13 files changed, 420 insertions, 223 deletions
diff --git a/CHANGES.txt b/CHANGES.txt index 9007bcf..20a01bc 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -71,6 +71,7 @@ * Improve processing of ld.so.conf (Cameron Hart) * Patch 154: Fix .def file support for VS2010 (Riccardo Ghetta) * Patch 159: Validate all values passed to options (Moi_ioM) +* Pull 11: Add support for Visual Studio 2012 (Oliver Schneider) ------- diff --git a/src/_manifest.lua b/src/_manifest.lua index c64f971..a9ed645 100644 --- a/src/_manifest.lua +++ b/src/_manifest.lua @@ -33,23 +33,23 @@ "base/validate.lua", "base/help.lua", "base/premake.lua", - + -- CodeBlocks action "actions/codeblocks/_codeblocks.lua", "actions/codeblocks/codeblocks_workspace.lua", "actions/codeblocks/codeblocks_cbp.lua", - + -- CodeLite action "actions/codelite/_codelite.lua", "actions/codelite/codelite_workspace.lua", "actions/codelite/codelite_project.lua", - + -- GNU make action "actions/make/_make.lua", "actions/make/make_solution.lua", "actions/make/make_cpp.lua", "actions/make/make_csharp.lua", - + -- Visual Studio actions "actions/vstudio/_vstudio.lua", "actions/vstudio/vs2002_solution.lua", @@ -63,15 +63,16 @@ "actions/vstudio/vs2005_csproj_user.lua", "actions/vstudio/vs2010_vcxproj.lua", "actions/vstudio/vs2010_vcxproj_filters.lua", - + "actions/vstudio/vs2012.lua", + -- Xcode action "actions/xcode/_xcode.lua", "actions/xcode/xcode_common.lua", "actions/xcode/xcode_project.lua", - + -- Xcode4 action "actions/xcode/xcode4_workspace.lua", - + -- Clean action "actions/clean/_clean.lua", } diff --git a/src/actions/vstudio/_vstudio.lua b/src/actions/vstudio/_vstudio.lua index 236d8af..4976508 100644 --- a/src/actions/vstudio/_vstudio.lua +++ b/src/actions/vstudio/_vstudio.lua @@ -13,18 +13,18 @@ -- Studio specific "any" and "mixed" to make solution generation easier. -- - vstudio.platforms = { - any = "Any CPU", - mixed = "Mixed Platforms", + vstudio.platforms = { + any = "Any CPU", + mixed = "Mixed Platforms", Native = "Win32", x86 = "x86", - x32 = "Win32", + x32 = "Win32", x64 = "x64", PS3 = "PS3", Xbox360 = "Xbox 360", } - + -- -- Returns the architecture identifier for a project. @@ -42,8 +42,8 @@ return "Win32" end end - - + + -- -- Process the solution's list of configurations and platforms, creates a list @@ -52,7 +52,7 @@ function vstudio.buildconfigs(sln) local cfgs = { } - + local platforms = premake.filterplatforms(sln, vstudio.platforms, "Native") -- Figure out what's in this solution @@ -65,7 +65,7 @@ if hasdotnet and (_ACTION > "vs2008" or hascpp) then table.insert(platforms, 1, "mixed") end - + -- "Any CPU" is added to solutions with .NET projects. Starting in -- VS2010, only pure .NET solutions get this option. if hasdotnet and (_ACTION < "vs2010" or not hascpp) then @@ -97,11 +97,11 @@ local entry = { } entry.src_buildcfg = buildcfg entry.src_platform = platform - + -- PS3 is funky and needs special handling; it's more of a build -- configuration than a platform from Visual Studio's point of view. -- This has been fixed in VS2010 as it now truly supports 3rd party - -- platforms, so only do this fixup when not in VS2010 + -- platforms, so only do this fixup when not in VS2010 if platform ~= "PS3" or _ACTION > "vs2008" then entry.buildcfg = buildcfg entry.platform = vstudio.platforms[platform] @@ -112,17 +112,17 @@ -- create a name the way VS likes it entry.name = entry.buildcfg .. "|" .. entry.platform - + -- flag the "fake" platforms added for .NET entry.isreal = (platform ~= "any" and platform ~= "mixed") - + table.insert(cfgs, entry) end end - + return cfgs end - + -- @@ -137,7 +137,7 @@ premake.clean.file(sln, "%%.userprefs") premake.clean.file(sln, "%%.usertasks") end - + function vstudio.cleanproject(prj) local fname = premake.project.getfilename(prj, "%%") @@ -162,8 +162,8 @@ os.remove(name .. ".vshost.exe") os.remove(name .. ".exe.manifest") end - - + + -- -- Assemble the project file name. @@ -181,7 +181,7 @@ fname = path.join(prj.location, fname) return fname end - + -- -- Returns the Visual Studio tool ID for a given project type. @@ -205,11 +205,11 @@ shortname = "Visual Studio 2002", description = "Generate Microsoft Visual Studio 2002 project files", os = "windows", - + valid_kinds = { "ConsoleApp", "WindowedApp", "StaticLib", "SharedLib" }, - + valid_languages = { "C", "C++", "C#" }, - + valid_tools = { cc = { "msc" }, dotnet = { "msnet" }, @@ -218,7 +218,7 @@ onsolution = function(sln) premake.generate(sln, "%%.sln", vstudio.sln2002.generate) end, - + onproject = function(prj) if premake.isdotnetproject(prj) then premake.generate(prj, "%%.csproj", vstudio.cs2002.generate) @@ -228,10 +228,12 @@ premake.generate(prj, "%%.vcproj.user", vstudio.vc200x.generate_user) end end, - + oncleansolution = premake.vstudio.cleansolution, oncleanproject = premake.vstudio.cleanproject, - oncleantarget = premake.vstudio.cleantarget + oncleantarget = premake.vstudio.cleantarget, + + vstudio = {} } @@ -246,9 +248,9 @@ os = "windows", valid_kinds = { "ConsoleApp", "WindowedApp", "StaticLib", "SharedLib" }, - + valid_languages = { "C", "C++", "C#" }, - + valid_tools = { cc = { "msc" }, dotnet = { "msnet" }, @@ -257,7 +259,7 @@ onsolution = function(sln) premake.generate(sln, "%%.sln", vstudio.sln2003.generate) end, - + onproject = function(prj) if premake.isdotnetproject(prj) then premake.generate(prj, "%%.csproj", vstudio.cs2002.generate) @@ -267,10 +269,12 @@ premake.generate(prj, "%%.vcproj.user", vstudio.vc200x.generate_user) end end, - + oncleansolution = premake.vstudio.cleansolution, oncleanproject = premake.vstudio.cleanproject, - oncleantarget = premake.vstudio.cleantarget + oncleantarget = premake.vstudio.cleantarget, + + vstudio = {} } @@ -285,9 +289,9 @@ os = "windows", valid_kinds = { "ConsoleApp", "WindowedApp", "StaticLib", "SharedLib" }, - + valid_languages = { "C", "C++", "C#" }, - + valid_tools = { cc = { "msc" }, dotnet = { "msnet" }, @@ -296,7 +300,7 @@ onsolution = function(sln) premake.generate(sln, "%%.sln", vstudio.sln2005.generate) end, - + onproject = function(prj) if premake.isdotnetproject(prj) then premake.generate(prj, "%%.csproj", vstudio.cs2005.generate) @@ -306,12 +310,16 @@ premake.generate(prj, "%%.vcproj.user", vstudio.vc200x.generate_user) end end, - + oncleansolution = vstudio.cleansolution, oncleanproject = vstudio.cleanproject, - oncleantarget = vstudio.cleantarget - } + oncleantarget = vstudio.cleantarget, + vstudio = { + productVersion = "8.0.50727", + solutionVersion = "9", + } + } -- -- Register Visual Studio 2008 @@ -324,9 +332,9 @@ os = "windows", valid_kinds = { "ConsoleApp", "WindowedApp", "StaticLib", "SharedLib" }, - + valid_languages = { "C", "C++", "C#" }, - + valid_tools = { cc = { "msc" }, dotnet = { "msnet" }, @@ -335,7 +343,7 @@ onsolution = function(sln) premake.generate(sln, "%%.sln", vstudio.sln2005.generate) end, - + onproject = function(prj) if premake.isdotnetproject(prj) then premake.generate(prj, "%%.csproj", vstudio.cs2005.generate) @@ -345,28 +353,34 @@ premake.generate(prj, "%%.vcproj.user", vstudio.vc200x.generate_user) end end, - + oncleansolution = vstudio.cleansolution, oncleanproject = vstudio.cleanproject, - oncleantarget = vstudio.cleantarget + oncleantarget = vstudio.cleantarget, + + vstudio = { + productVersion = "9.0.21022", + solutionVersion = "10", + toolsVersion = "3.5", + } } - + -- -- Register Visual Studio 2010 -- - newaction + newaction { trigger = "vs2010", shortname = "Visual Studio 2010", - description = "Generate Visual Studio 2010 project files", + description = "Generate Microsoft Visual Studio 2010 project files", os = "windows", valid_kinds = { "ConsoleApp", "WindowedApp", "StaticLib", "SharedLib" }, - + valid_languages = { "C", "C++", "C#"}, - + valid_tools = { cc = { "msc" }, dotnet = { "msnet" }, @@ -375,7 +389,7 @@ onsolution = function(sln) premake.generate(sln, "%%.sln", vstudio.sln2005.generate) end, - + onproject = function(prj) if premake.isdotnetproject(prj) then premake.generate(prj, "%%.csproj", vstudio.cs2005.generate) @@ -386,9 +400,15 @@ premake.generate(prj, "%%.vcxproj.filters", vstudio.vc2010.generate_filters) end end, - oncleansolution = premake.vstudio.cleansolution, oncleanproject = premake.vstudio.cleanproject, - oncleantarget = premake.vstudio.cleantarget - }
\ No newline at end of file + oncleantarget = premake.vstudio.cleantarget, + + vstudio = { + productVersion = "8.0.30703", + solutionVersion = "11", + targetFramework = "4.0", + toolsVersion = "4.0", + } + } diff --git a/src/actions/vstudio/vs2005_csproj.lua b/src/actions/vstudio/vs2005_csproj.lua index c5ec9b5..c4fc815 100644 --- a/src/actions/vstudio/vs2005_csproj.lua +++ b/src/actions/vstudio/vs2005_csproj.lua @@ -16,10 +16,10 @@ --
-- Figure out what elements a particular source code file need in its item
-- block, based on its build action and any related files in the project.
---
-
+--
+
local function getelements(prj, action, fname)
-
+
if action == "Compile" and fname:endswith(".cs") then
if fname:endswith(".Designer.cs") then
-- is there a matching *.cs file?
@@ -61,18 +61,18 @@ end
end
end
-
+
if action == "Content" then
return "CopyNewest"
end
-
+
return "None"
end
--
-- Return the Visual Studio architecture identification string. The logic
--- to select this is getting more complicated in VS2010, but I haven't
+-- to select this is getting more complicated in VS2010, but I haven't
-- tackled all the permutations yet.
--
@@ -125,16 +125,17 @@ --
function cs2005.projectelement(prj)
- local toolversion = {
- vs2005 = '',
- vs2008 = ' ToolsVersion="3.5"',
- vs2010 = ' ToolsVersion="4.0"',
- }
+ local action = premake.action.current()
+
+ local toolversion = ''
+ if action.vstudio.toolsVersion then
+ toolversion = string.format(' ToolsVersion="%s"', action.vstudio.toolsVersion)
+ end
if _ACTION > "vs2008" then
_p('<?xml version="1.0" encoding="utf-8"?>')
end
- _p('<Project%s DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">', toolversion[_ACTION])
+ _p('<Project%s DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">', toolversion)
end
@@ -143,33 +144,38 @@ --
function cs2005.projectsettings(prj)
- local version = {
- vs2005 = '8.0.50727',
- vs2008 = '9.0.21022',
- vs2010 = '8.0.30703',
- }
-
_p(' <PropertyGroup>')
_p(' <Configuration Condition=" \'$(Configuration)\' == \'\' ">%s</Configuration>', premake.esc(prj.solution.configurations[1]))
_p(' <Platform Condition=" \'$(Platform)\' == \'\' ">%s</Platform>', cs2005.arch(prj))
- _p(' <ProductVersion>%s</ProductVersion>', version[_ACTION])
- _p(' <SchemaVersion>2.0</SchemaVersion>')
+
+ local action = premake.action.current()
+ if action.vstudio.productVersion then
+ _p(' <ProductVersion>%s</ProductVersion>', action.vstudio.productVersion)
+ end
+
+ if _ACTION < "vs2012" then
+ _p(' <SchemaVersion>2.0</SchemaVersion>')
+ end
+
_p(' <ProjectGuid>{%s}</ProjectGuid>', prj.uuid)
_p(' <OutputType>%s</OutputType>', premake.dotnet.getkind(prj))
_p(' <AppDesignerFolder>Properties</AppDesignerFolder>')
_p(' <RootNamespace>%s</RootNamespace>', prj.buildtarget.basename)
_p(' <AssemblyName>%s</AssemblyName>', prj.buildtarget.basename)
- local framework = prj.framework or iif(_ACTION == "vs2010", "4.0", nil)
+ local framework = prj.framework or action.vstudio.targetFramework
if framework then
_p(' <TargetFrameworkVersion>v%s</TargetFrameworkVersion>', framework)
end
- if _ACTION == "vs2010" then
- _p(' <TargetFrameworkProfile>Client</TargetFrameworkProfile>')
+ if _ACTION == 'vs2010' then
+ _p(' <TargetFrameworkProfile></TargetFrameworkProfile>')
+ end
+
+ if _ACTION >= "vs2010" then
_p(' <FileAlignment>512</FileAlignment>')
end
-
+
_p(' </PropertyGroup>')
end
@@ -194,6 +200,11 @@ io.eol = "\r\n"
cs2005.projectelement(prj)
+
+ if _ACTION > "vs2010" then
+ _p(' <Import Project="$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props" Condition="Exists(\'$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\')" />')
+ end
+
cs2005.projectsettings(prj)
for cfg in premake.eachconfig(prj) do
@@ -235,7 +246,9 @@ cs2005.files(prj)
_p(' </ItemGroup>')
- _p(' <Import Project="$(MSBuildBinPath)\\Microsoft.CSharp.targets" />')
+ local msbuild = iif(_ACTION < "vs2012", "Bin", "Tools")
+ _p(' <Import Project="$(MSBuild%sPath)\\Microsoft.CSharp.targets" />', msbuild)
+
_p(' <!-- To modify your build process, add your task inside one of the targets below and uncomment it.')
_p(' Other similar extension points exist, see Microsoft.Common.targets.')
_p(' <Target Name="BeforeBuild">')
@@ -244,6 +257,6 @@ _p(' </Target>')
_p(' -->')
_p('</Project>')
-
+
end
diff --git a/src/actions/vstudio/vs2005_solution.lua b/src/actions/vstudio/vs2005_solution.lua index a5bbd70..d5b0298 100644 --- a/src/actions/vstudio/vs2005_solution.lua +++ b/src/actions/vstudio/vs2005_solution.lua @@ -7,14 +7,14 @@ premake.vstudio.sln2005 = { } local vstudio = premake.vstudio local sln2005 = premake.vstudio.sln2005 - + function sln2005.generate(sln) io.eol = '\r\n' -- Precompute Visual Studio configurations sln.vstudio_configs = premake.vstudio.buildconfigs(sln) - + -- Mark the file as Unicode _p('\239\187\191') @@ -37,13 +37,8 @@ -- function sln2005.header(sln) - local version = { - vs2005 = 9, - vs2008 = 10, - vs2010 = 11 - } - - _p('Microsoft Visual Studio Solution File, Format Version %d.00', version[_ACTION]) + local action = premake.action.current() + _p('Microsoft Visual Studio Solution File, Format Version %d.00', action.vstudio.solutionVersion) _p('# Visual Studio %s', _ACTION:sub(3)) end @@ -55,7 +50,7 @@ function sln2005.project(prj) -- Build a relative path from the solution file to the project file local projpath = path.translate(path.getrelative(prj.solution.location, vstudio.projectfile(prj)), "\\") - + _p('Project("{%s}") = "%s", "%s", "{%s}"', vstudio.tool(prj), prj.name, projpath, prj.uuid) sln2005.projectdependencies(prj) _p('EndProject') @@ -90,8 +85,8 @@ end _p('\tEndGlobalSection') end - - + + -- -- Write out the contents of the ProjectConfigurationPlatforms section, which maps @@ -102,8 +97,8 @@ _p('\tGlobalSection(ProjectConfigurationPlatforms) = postSolution') for prj in premake.solution.eachproject(sln) do for _, cfg in ipairs(sln.vstudio_configs) do - - -- .NET projects always map to the "Any CPU" platform (for now, at + + -- .NET projects always map to the "Any CPU" platform (for now, at -- least). For C++, "Any CPU" and "Mixed Platforms" map to the first -- C++ compatible target platform in the solution list. local mapped @@ -125,14 +120,14 @@ end _p('\tEndGlobalSection') end - - + + -- -- Write out contents of the SolutionProperties section; currently unused. -- - function sln2005.properties(sln) + function sln2005.properties(sln) _p('\tGlobalSection(SolutionProperties) = preSolution') _p('\t\tHideSolutionNode = FALSE') _p('\tEndGlobalSection') diff --git a/src/actions/vstudio/vs2010_vcxproj.lua b/src/actions/vstudio/vs2010_vcxproj.lua index f78920e..43bb2bf 100644 --- a/src/actions/vstudio/vs2010_vcxproj.lua +++ b/src/actions/vstudio/vs2010_vcxproj.lua @@ -79,6 +79,10 @@ _p(2,'<UseDebugLibraries>%s</UseDebugLibraries>', iif(optimisation(cfg) == "Disabled","true","false")) _p(2,'<CharacterSet>%s</CharacterSet>',iif(cfg.flags.Unicode,"Unicode","MultiByte")) + if _ACTION > "vs2010" then + _p(2,'<PlatformToolset>%s</PlatformToolset>', "v110") + end + if cfg.flags.MFC then _p(2,'<UseOfMfc>%s</UseOfMfc>', iif(cfg.flags.StaticRuntime, "Static", "Dynamic")) end diff --git a/src/actions/vstudio/vs2012.lua b/src/actions/vstudio/vs2012.lua new file mode 100644 index 0000000..f0f34e4 --- /dev/null +++ b/src/actions/vstudio/vs2012.lua @@ -0,0 +1,58 @@ +-- +-- vs2012.lua +-- Baseline support for Visual Studio 2012. +-- Copyright (c) 2013 Jason Perkins and the Premake project +-- + + premake.vstudio.vc2012 = {} + local vc2012 = premake.vstudio.vc2012 + local vstudio = premake.vstudio + + +--- +-- Register a command-line action for Visual Studio 2012. +--- + + newaction + { + trigger = "vs2012", + shortname = "Visual Studio 2012", + description = "Generate Microsoft Visual Studio 2012 project files", + os = "windows", + + valid_kinds = { "ConsoleApp", "WindowedApp", "StaticLib", "SharedLib" }, + + valid_languages = { "C", "C++", "C#"}, + + valid_tools = { + cc = { "msc" }, + dotnet = { "msnet" }, + }, + + onsolution = function(sln) + premake.generate(sln, "%%.sln", vstudio.sln2005.generate) + end, + + onproject = function(prj) + if premake.isdotnetproject(prj) then + premake.generate(prj, "%%.csproj", vstudio.cs2005.generate) + premake.generate(prj, "%%.csproj.user", vstudio.cs2005.generate_user) + else + premake.generate(prj, "%%.vcxproj", premake.vs2010_vcxproj) + premake.generate(prj, "%%.vcxproj.user", premake.vs2010_vcxproj_user) + premake.generate(prj, "%%.vcxproj.filters", vstudio.vc2010.generate_filters) + end + end, + + + oncleansolution = premake.vstudio.cleansolution, + oncleanproject = premake.vstudio.cleanproject, + oncleantarget = premake.vstudio.cleantarget, + + vstudio = { + solutionVersion = "12", + targetFramework = "4.5", + toolsVersion = "4.0", + } + } + diff --git a/src/base/api.lua b/src/base/api.lua index 86e8fb2..c11056f 100644 --- a/src/base/api.lua +++ b/src/base/api.lua @@ -9,15 +9,15 @@ -- Here I define all of the getter/setter functions as metadata. The actual -- functions are built programmatically below. -- - - premake.fields = + + premake.fields = { basedir = { kind = "path", scope = "container", }, - + buildaction = { kind = "string", @@ -29,14 +29,14 @@ "None" } }, - + buildoptions = { kind = "list", scope = "config", }, - configurations = + configurations = { kind = "list", scope = "solution", @@ -47,44 +47,44 @@ kind = "list", scope = "config", }, - + debugdir = { kind = "path", scope = "config", }, - debugenvs = + debugenvs = { kind = "list", scope = "config", }, - + defines = { kind = "list", scope = "config", }, - + deploymentoptions = { kind = "list", scope = "config", usagecopy = true, }, - + excludes = { kind = "filelist", scope = "config", }, - + files = { kind = "filelist", scope = "config", }, - + flags = { kind = "list", @@ -92,7 +92,7 @@ isflags = true, usagecopy = true, allowed = function(value) - + local allowed_flags = { ATL = 1, DebugEnvsDontMerge = 1, @@ -128,12 +128,12 @@ Unsafe = 1, WinMain = 1 } - + local englishToAmericanSpelling = { optimise = 'optimize', optimisesize = 'optimizesize', - optimisespeed = 'optimizespeed', + optimisespeed = 'optimizespeed', } local lowervalue = value:lower() @@ -141,12 +141,12 @@ for v, _ in pairs(allowed_flags) do if v:lower() == lowervalue then return v - end + end end return nil, "invalid flag" end, }, - + framework = { kind = "string", @@ -157,59 +157,60 @@ "2.0", "3.0", "3.5", - "4.0" + "4.0", + "4.5", } }, - - imagepath = + + imagepath = { kind = "path", scope = "config", }, - + imageoptions = { kind = "list", scope = "config", }, - + implibdir = { kind = "path", scope = "config", }, - + implibextension = { kind = "string", scope = "config", }, - + implibname = { kind = "string", scope = "config", }, - + implibprefix = { kind = "string", scope = "config", }, - + implibsuffix = { kind = "string", scope = "config", }, - + includedirs = { kind = "dirlist", scope = "config", usagecopy = true, }, - + kind = { kind = "string", @@ -221,7 +222,7 @@ "SharedLib" } }, - + language = { kind = "string", @@ -232,20 +233,20 @@ "C#" } }, - + libdirs = { kind = "dirlist", scope = "config", linkagecopy = true, }, - + linkoptions = { kind = "list", scope = "config", }, - + links = { kind = "list", @@ -259,116 +260,116 @@ end, linkagecopy = true, }, - + location = { kind = "path", scope = "container", }, - + makesettings = { kind = "list", scope = "config", }, - + objdir = { kind = "path", scope = "config", }, - + pchheader = { kind = "string", scope = "config", }, - + pchsource = { kind = "path", scope = "config", }, - platforms = + platforms = { kind = "list", scope = "solution", allowed = table.keys(premake.platforms), }, - + postbuildcommands = { kind = "list", scope = "config", }, - + prebuildcommands = { kind = "list", scope = "config", }, - + prelinkcommands = { kind = "list", scope = "config", }, - + resdefines = { kind = "list", scope = "config", }, - + resincludedirs = { kind = "dirlist", scope = "config", }, - + resoptions = { kind = "list", scope = "config", }, - + targetdir = { kind = "path", scope = "config", }, - + targetextension = { kind = "string", scope = "config", }, - + targetname = { kind = "string", scope = "config", }, - + targetprefix = { kind = "string", scope = "config", }, - + targetsuffix = { kind = "string", scope = "config", }, - + trimpaths = { kind = "dirlist", scope = "config", }, - + uuid = { kind = "string", @@ -390,14 +391,14 @@ return value:upper() end }, - + uses = { kind = "list", scope = "config", }, - - vpaths = + + vpaths = { kind = "keypath", scope = "container", @@ -409,11 +410,11 @@ -- -- End of metadata -- - - - + + + -- --- Check to see if a value exists in a list of values, using a +-- Check to see if a value exists in a list of values, using a -- case-insensitive match. If the value does exist, the canonical -- version contained in the list is returned, so future tests can -- use case-sensitive comparisions. @@ -447,13 +448,13 @@ function premake.getobject(t) local container - + if (t == "container" or t == "solution") then container = premake.CurrentContainer else container = premake.CurrentConfiguration end - + if t == "solution" then if type(container) == "project" then container = container.solution @@ -462,7 +463,7 @@ container = nil end end - + local msg if (not container) then if (t == "container") then @@ -473,12 +474,12 @@ msg = "no active solution, project, or configuration" end end - + return container, msg end - + -- -- Adds values to an array field of a solution/project/configuration. `ctype` -- specifies the container type (see premake.getobject) for the field. @@ -511,21 +512,21 @@ if (value) then doinsert(value, 5) end - + return container[fieldname] end - + -- --- Adds values to an array-of-directories field of a solution/project/configuration. +-- Adds values to an array-of-directories field of a solution/project/configuration. -- `ctype` specifies the container type (see premake.getobject) for the field. All -- values are converted to absolute paths before being stored. -- local function domatchedarray(ctype, fieldname, value, matchfunc) local result = { } - + function makeabsolute(value, depth) if (type(value) == "table") then for _, item in ipairs(value) do @@ -541,20 +542,20 @@ error("Invalid value in list: expected string, got " .. type(value), depth) end end - + makeabsolute(value, 3) return premake.setarray(ctype, fieldname, result) end - + function premake.setdirarray(ctype, fieldname, value) return domatchedarray(ctype, fieldname, value, os.matchdirs) end - + function premake.setfilearray(ctype, fieldname, value) return domatchedarray(ctype, fieldname, value, os.matchfiles) end - - + + -- -- Adds values to a key-value field of a solution/project/configuration. `ctype` -- specifies the container type (see premake.getobject) for the field. @@ -565,7 +566,7 @@ if not container then error(err, 4) end - + if not container[fieldname] then container[fieldname] = {} end @@ -573,9 +574,9 @@ if type(values) ~= "table" then error("invalid value; table expected", 4) end - + local field = container[fieldname] - + for key,value in pairs(values) do if not field[key] then field[key] = {} @@ -586,7 +587,7 @@ return field end - + -- -- Set a new value for a string field of a solution/project/configuration. `ctype` -- specifies the container type (see premake.getobject) for the field. @@ -598,37 +599,37 @@ if (not container) then error(err, 4) end - + -- if a value was provided, set it if (value) then value, err = premake.checkvalue(value, allowed) - if (not value) then + if (not value) then error(err, 4) end - + container[fieldname] = value end - - return container[fieldname] + + return container[fieldname] end - - - + + + -- -- The getter/setter implemention. -- - local function accessor(name, value) + local function accessor(name, value) local kind = premake.fields[name].kind local scope = premake.fields[name].scope local allowed = premake.fields[name].allowed - + if (kind == "string" or kind == "path") and value then if type(value) ~= "string" then error("string value expected", 3) end end - + if kind == "string" then return premake.setstring(scope, name, value, allowed) elseif kind == "path" then @@ -650,13 +651,13 @@ -- -- Build all of the getter/setter functions from the metadata above. -- - + for name,_ in pairs(premake.fields) do _G[name] = function(value) return accessor(name, value) end end - + -- @@ -667,18 +668,18 @@ if not terms then return premake.CurrentConfiguration end - + local container, err = premake.getobject("container") if (not container) then error(err, 2) end - + local cfg = { } cfg.terms = table.flatten({terms}) - + table.insert(container.blocks, cfg) premake.CurrentConfiguration = cfg - + -- create a keyword list using just the indexed keyword items. This is a little -- confusing: "terms" are what the user specifies in the script, "keywords" are -- the Lua patterns that result. I'll refactor to better names. @@ -693,18 +694,18 @@ cfg[name] = { } end end - + return cfg end - + local function createproject(name, sln, isUsage) local prj = {} - + -- attach a type setmetatable(prj, { __type = "project", }) - + -- add to master list keyed by both name and index table.insert(sln.projects, prj) if(isUsage) then @@ -726,17 +727,17 @@ sln.projects[name] = prj end - + prj.solution = sln prj.name = name prj.basedir = os.getcwd() prj.uuid = os.uuid() prj.blocks = { } prj.usage = isUsage; - + return prj; end - + function usage(name) if (not name) then --Only return usage projects. @@ -744,14 +745,14 @@ if(not premake.CurrentContainer.usage) then return nil end return premake.CurrentContainer end - + -- identify the parent solution local sln if (type(premake.CurrentContainer) == "project") then sln = premake.CurrentContainer.solution else sln = premake.CurrentContainer - end + end if (type(sln) ~= "solution") then error("no active solution", 2) end @@ -764,13 +765,13 @@ premake.CurrentContainer = iff(sln.projects[name].usage, sln.projects[name], sln.projects[name].usageProj) end - + -- add an empty, global configuration to the project configuration { } - + return premake.CurrentContainer end - + function project(name) if (not name) then --Only return non-usage projects @@ -778,28 +779,28 @@ if(premake.CurrentContainer.usage) then return nil end return premake.CurrentContainer end - + -- identify the parent solution local sln if (type(premake.CurrentContainer) == "project") then sln = premake.CurrentContainer.solution else sln = premake.CurrentContainer - end + end if (type(sln) ~= "solution") then error("no active solution", 2) end - + -- if this is a new project, or the old project is a usage project, create it if((not sln.projects[name]) or sln.projects[name].usage) then premake.CurrentContainer = createproject(name, sln) else premake.CurrentContainer = sln.projects[name]; end - + -- add an empty, global configuration to the project configuration { } - + return premake.CurrentContainer end @@ -812,7 +813,7 @@ return premake.CurrentContainer end end - + premake.CurrentContainer = premake.solution.get(name) if (not premake.CurrentContainer) then premake.CurrentContainer = premake.solution.new(name) @@ -820,7 +821,7 @@ -- add an empty, global configuration configuration { } - + return premake.CurrentContainer end diff --git a/tests/actions/vstudio/cs2005/projectelement.lua b/tests/actions/vstudio/cs2005/projectelement.lua index fda6061..1d2a61f 100755 --- a/tests/actions/vstudio/cs2005/projectelement.lua +++ b/tests/actions/vstudio/cs2005/projectelement.lua @@ -10,15 +10,15 @@ -- --- Setup +-- Setup -- local sln, prj - + function suite.setup() sln = test.createsolution() end - + local function prepare() premake.bake.buildconfigs() prj = premake.solution.getproject(sln, 1) @@ -54,3 +54,12 @@ <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> ]] end + + function suite.On2012() + _ACTION = "vs2012" + prepare() + test.capture [[ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + ]] + end diff --git a/tests/actions/vstudio/cs2005/projectsettings.lua b/tests/actions/vstudio/cs2005/projectsettings.lua index 2e2e242..f30559f 100755 --- a/tests/actions/vstudio/cs2005/projectsettings.lua +++ b/tests/actions/vstudio/cs2005/projectsettings.lua @@ -10,17 +10,17 @@ --
--- Setup
+-- Setup
--
local sln, prj
-
+
function suite.setup()
sln = test.createsolution()
language "C#"
- uuid "AE61726D-187C-E440-BD07-2556188A6565"
+ uuid "AE61726D-187C-E440-BD07-2556188A6565"
end
-
+
local function prepare()
premake.bake.buildconfigs()
prj = premake.solution.getproject(sln, 1)
@@ -85,7 +85,26 @@ <RootNamespace>MyProject</RootNamespace>
<AssemblyName>MyProject</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
- <TargetFrameworkProfile>Client</TargetFrameworkProfile>
+ <TargetFrameworkProfile></TargetFrameworkProfile>
+ <FileAlignment>512</FileAlignment>
+ </PropertyGroup>
+ ]]
+ end
+
+
+ function suite.OnVs2012()
+ _ACTION = "vs2012"
+ prepare()
+ test.capture [[
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProjectGuid>{AE61726D-187C-E440-BD07-2556188A6565}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <RootNamespace>MyProject</RootNamespace>
+ <AssemblyName>MyProject</AssemblyName>
+ <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
]]
diff --git a/tests/actions/vstudio/sln2005/header.lua b/tests/actions/vstudio/sln2005/header.lua index 727bb4a..5eb02e3 100755 --- a/tests/actions/vstudio/sln2005/header.lua +++ b/tests/actions/vstudio/sln2005/header.lua @@ -10,15 +10,15 @@ -- --- Setup +-- Setup -- local sln, prj - + function suite.setup() sln = test.createsolution() end - + local function prepare() premake.bake.buildconfigs() sln2005.header() @@ -57,3 +57,13 @@ Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 ]] end + + + function suite.On2012() + _ACTION = "vs2012" + prepare() + test.capture [[ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 + ]] + end diff --git a/tests/actions/vstudio/vc2010/test_config_props.lua b/tests/actions/vstudio/vc2010/test_config_props.lua new file mode 100644 index 0000000..3aef357 --- /dev/null +++ b/tests/actions/vstudio/vc2010/test_config_props.lua @@ -0,0 +1,65 @@ +-- +-- tests/actions/vstudio/vc2010/test_config_props.lua +-- Validate generation of the configuration property group. +-- Copyright (c) 2011-2013 Jason Perkins and the Premake project +-- + + T.vstudio_vs2010_config_props = { } + local suite = T.vstudio_vs2010_config_props + local vc2010 = premake.vstudio.vc2010 + local project = premake.project + + +-- +-- Setup +-- + + local sln, prj + + function suite.setup() + sln, prj = test.createsolution() + end + + local function prepare(platform) + premake.bake.buildconfigs() + sln.vstudio_configs = premake.vstudio.buildconfigs(sln) + local cfginfo = sln.vstudio_configs[1] + local cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform) + vc2010.configurationPropertyGroup(cfg, cfginfo) + end + + +-- +-- Check the structure with the default project values. +-- + + function suite.structureIsCorrect_onDefaultValues() + prepare() + test.capture [[ + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + ]] + end + + + + +-- +-- Visual Studio 2012 adds a platform toolset. +-- + + function suite.structureIsCorrect_onDefaultValues() + _ACTION = "vs2012" + prepare() + test.capture [[ + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <CharacterSet>MultiByte</CharacterSet> + <PlatformToolset>v110</PlatformToolset> + </PropertyGroup> + ]] + end diff --git a/tests/premake4.lua b/tests/premake4.lua index 2f64d7f..b0ebde9 100644 --- a/tests/premake4.lua +++ b/tests/premake4.lua @@ -103,6 +103,7 @@ dofile("actions/vstudio/vc200x/test_mfc.lua") -- Visual Studio 2010 C/C++ projects + dofile("actions/vstudio/vc2010/test_config_props.lua") dofile("actions/vstudio/vc2010/test_debugdir.lua") dofile("actions/vstudio/vc2010/test_header.lua") dofile("actions/vstudio/vc2010/test_files.lua") |