premake/modules/vstudio/vs2010.lua
R. Blaine Whittle 777fadae95 Added os touchfile and a workaround for vs2010 reloading
vs2010 (and above) has an issue where if the vcxproj file
isn't modified but the.vcxproj.filters is modified during
premake, then VS doesn't notify the user that the project has
changed.  This can occur if the only change to a project is
with the vpaths.  Before this fix, the user would be need to
manually unload and reload the project to pick up the change.

This VS workaround checks for the case where the vcxproj.filters
file is modified but the .vcxproj file is not. At which point
premake preforms a touch on the .vcxproj file to trigger the IDE.
2017-06-20 09:53:43 -07:00

182 lines
5.4 KiB
Lua

--
-- actions/vstudio/vs2010.lua
-- Add support for the Visual Studio 2010 project formats.
-- Copyright (c) 2009-2015 Jason Perkins and the Premake project
--
local p = premake
p.vstudio.vs2010 = {}
local vs2010 = p.vstudio.vs2010
local vstudio = p.vstudio
local project = p.project
local tree = p.tree
---
-- Map Premake tokens to the corresponding Visual Studio variables.
---
vs2010.pathVars = {
["cfg.objdir"] = { absolute = true, token = "$(IntDir)" },
["prj.location"] = { absolute = true, token = "$(ProjectDir)" },
["prj.name"] = { absolute = false, token = "$(ProjectName)" },
["sln.location"] = { absolute = true, token = "$(SolutionDir)" },
["sln.name"] = { absolute = false, token = "$(SolutionName)" },
["wks.location"] = { absolute = true, token = "$(SolutionDir)" },
["wks.name"] = { absolute = false, token = "$(SolutionName)" },
["cfg.buildtarget.directory"] = { absolute = false, token = "$(TargetDir)" },
["cfg.buildtarget.name"] = { absolute = false, token = "$(TargetFileName)" },
["cfg.buildtarget.basename"] = { absolute = false, token = "$(TargetName)" },
["file.basename"] = { absolute = false, token = "%(Filename)" },
["file.abspath"] = { absolute = true, token = "%(FullPath)" },
["file.relpath"] = { absolute = false, token = "%(Identity)" },
["file.path"] = { absolute = false, token = "%(Identity)" },
["file.directory"] = { absolute = true, token = "%(RootDir)%(Directory)" },
["file.reldirectory"] = { absolute = false, token = "%(RelativeDir)" },
["file.extension"] = { absolute = false, token = "%(Extension)" },
}
---
-- Identify the type of project being exported and hand it off
-- the right generator.
---
function vs2010.generateProject(prj)
p.eol("\r\n")
p.indent(" ")
p.escaper(vs2010.esc)
if p.project.isdotnet(prj) then
p.generate(prj, ".csproj", vstudio.cs2005.generate)
-- Skip generation of empty user files
local user = p.capture(function() vstudio.cs2005.generateUser(prj) end)
if #user > 0 then
p.generate(prj, ".csproj.user", function() p.outln(user) end)
end
elseif p.project.isc(prj) or p.project.iscpp(prj) then
local projFileModified = p.generate(prj, ".vcxproj", vstudio.vc2010.generate)
-- Skip generation of empty user files
local user = p.capture(function() vstudio.vc2010.generateUser(prj) end)
if #user > 0 then
p.generate(prj, ".vcxproj.user", function() p.outln(user) end)
end
-- Only generate a filters file if the source tree actually has subfolders
if tree.hasbranches(project.getsourcetree(prj)) then
if p.generate(prj, ".vcxproj.filters", vstudio.vc2010.generateFilters) == true and projFileModified == false then
-- vs workaround for issue where if only the .filters file is modified, VS doesn't automaticly trigger a reload
p.touch(prj, ".vcxproj")
end
end
end
-- Skip generation of empty packages.config files
local packages = p.capture(function() vstudio.nuget2010.generatePackagesConfig(prj) end)
if #packages > 0 then
p.generate(prj, "packages.config", function() p.outln(packages) end)
end
-- Skip generation of empty NuGet.Config files
local config = p.capture(function() vstudio.nuget2010.generateNuGetConfig(prj) end)
if #config > 0 then
p.generate(prj, "NuGet.Config", function() p.outln(config) end)
end
end
---
-- Generate the .props, .targets, and .xml files for custom rules.
---
function vs2010.generateRule(rule)
p.eol("\r\n")
p.indent(" ")
p.escaper(vs2010.esc)
p.generate(rule, ".props", vs2010.rules.props.generate)
p.generate(rule, ".targets", vs2010.rules.targets.generate)
p.generate(rule, ".xml", vs2010.rules.xml.generate)
end
--
-- The VS 2010 standard for XML escaping in generated project files.
--
function vs2010.esc(value)
value = value:gsub('&', "&")
value = value:gsub('<', "&lt;")
value = value:gsub('>', "&gt;")
return value
end
---
-- Define the Visual Studio 2010 export action.
---
newaction {
-- Metadata for the command line and help system
trigger = "vs2010",
shortname = "Visual Studio 2010",
description = "Generate Visual Studio 2010 project files",
-- Visual Studio always uses Windows path and naming conventions
targetos = "windows",
-- The capabilities of this action
valid_kinds = { "ConsoleApp", "WindowedApp", "StaticLib", "SharedLib", "Makefile", "None", "Utility" },
valid_languages = { "C", "C++", "C#" },
valid_tools = {
cc = { "msc" },
dotnet = { "msnet" },
},
-- Workspace and project generation logic
onWorkspace = function(wks)
vstudio.vs2005.generateSolution(wks)
end,
onProject = function(prj)
vstudio.vs2010.generateProject(prj)
end,
onRule = function(rule)
vstudio.vs2010.generateRule(rule)
end,
onCleanWorkspace = function(wks)
vstudio.cleanSolution(wks)
end,
onCleanProject = function(prj)
vstudio.cleanProject(prj)
end,
onCleanTarget = function(prj)
vstudio.cleanTarget(prj)
end,
pathVars = vs2010.pathVars,
-- This stuff is specific to the Visual Studio exporters
vstudio = {
csprojSchemaVersion = "2.0",
productVersion = "8.0.30703",
solutionVersion = "11",
versionName = "2010",
targetFramework = "4.0",
toolsVersion = "4.0",
}
}