Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/windirstat/premake-4.x-stable.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Perkins <starkos@industriousone.com>2013-04-26 00:00:18 +0400
committerJason Perkins <starkos@industriousone.com>2013-04-26 00:00:18 +0400
commite1478cbb172cfb7bcb6220d154fc6f12d5e04bc6 (patch)
treeac1391a6b995b9ecc7805a12171c6a109c5ec2f2
parent826b24e1b01d969ba7206b7e1b38176bf639649a (diff)
Add support for Visual Studio 2012 (Oliver Schneider)
-rw-r--r--CHANGES.txt1
-rw-r--r--src/_manifest.lua15
-rw-r--r--src/actions/vstudio/_vstudio.lua120
-rw-r--r--src/actions/vstudio/vs2005_csproj.lua65
-rw-r--r--src/actions/vstudio/vs2005_solution.lua29
-rw-r--r--src/actions/vstudio/vs2010_vcxproj.lua4
-rw-r--r--src/actions/vstudio/vs2012.lua58
-rw-r--r--src/base/api.lua225
-rwxr-xr-xtests/actions/vstudio/cs2005/projectelement.lua15
-rwxr-xr-xtests/actions/vstudio/cs2005/projectsettings.lua29
-rwxr-xr-xtests/actions/vstudio/sln2005/header.lua16
-rw-r--r--tests/actions/vstudio/vc2010/test_config_props.lua65
-rw-r--r--tests/premake4.lua1
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")