winamp/Src/external_dependencies/openmpt-trunk/include/premake/src/tools/dotnet.lua

330 lines
8.5 KiB
Lua
Raw Normal View History

2024-09-24 12:54:57 +00:00
--
-- dotnet.lua
-- Interface for the C# compilers, all of which are flag compatible.
-- Copyright (c) 2002-2013 Jason Perkins and the Premake project
--
local p = premake
p.tools.dotnet = {}
local dotnet = p.tools.dotnet
local project = p.project
local config = p.config
--
-- Examine the file and project configurations to glean additional
-- information about a source code in a C# project.
--
-- @param fcfg
-- The file configuration to consider.
-- @return
-- A table containing the following keys:
--
-- action: the build action for the file; one of "Compile", "Copy",
-- "EmbeddedResource", or "None".
-- subtype: an additional categorization of the file type, or nil if
-- no subtype is required.
-- dependency: a related file name, (i.e. *.Designer.cs) if appropriate
-- for the file action and subtype.
--
function dotnet.fileinfo(fcfg)
local info = {}
if (fcfg == nil) then
return info
end
local fname = fcfg.abspath
local ext = path.getextension(fname):lower()
-- Determine the build action for the file, falling back to the file
-- extension if no explicit action is available.
if fcfg.buildaction == "Compile" or ext == ".cs" or ext == ".fs" then
info.action = "Compile"
elseif fcfg.buildaction == "Embed" or ext == ".resx" then
info.action = "EmbeddedResource"
elseif fcfg.buildaction == "Copy" or ext == ".asax" or ext == ".aspx" or ext == ".dll" or ext == ".tt" then
info.action = "Content"
elseif fcfg.buildaction == "Resource" then
info.action = "Resource"
elseif ext == ".xaml" then
if fcfg.buildaction == "Application" or path.getbasename(fname) == "App" then
if fcfg.project.kind == p.SHAREDLIB then
info.action = "None"
else
info.action = "ApplicationDefinition"
end
else
info.action = "Page"
end
else
info.action = "None"
end
-- Try to work out any subtypes, based on the files in the project
if info.action == "Compile" and fname:endswith(".cs") then
if fname:endswith(".Designer.cs") then
local basename = fname:sub(1, -13)
-- Look for associated files: .resx, .settings, .cs, .xsd
local testname = basename .. ".resx"
if project.hasfile(fcfg.project, testname) then
info.AutoGen = "True"
info.DependentUpon = testname
end
testname = basename .. ".settings"
if project.hasfile(fcfg.project, testname) then
info.AutoGen = "True"
info.DependentUpon = testname
info.DesignTimeSharedInput = "True"
end
testname = basename .. ".cs"
if project.hasfile(fcfg.project, testname) then
info.AutoGen = nil
info.SubType = "Dependency"
info.DependentUpon = testname
end
testname = basename .. ".xsd"
if project.hasfile(fcfg.project, testname) then
info.AutoGen = "True"
info.DesignTime = "True"
info.DependentUpon = testname
end
elseif fname:endswith(".xaml.cs") then
info.SubType = "Code"
info.DependentUpon = fname:sub(1, -4)
else
local basename = fname:sub(1, -4)
-- Is there a matching *.xsd?
testname = basename .. ".xsd"
if project.hasfile(fcfg.project, testname) then
info.DependentUpon = testname
end
-- Is there a matching *.Designer.cs?
testname = basename .. ".Designer.cs"
if project.hasfile(fcfg.project, testname) then
info.SubType = "Form"
end
testname = basename .. ".tt"
if project.hasfile(fcfg.project, testname) then
info.AutoGen = "True"
info.DesignTime = "True"
info.DependentUpon = testname
end
end
-- Allow C# object type build actions to override the default
if fcfg.buildaction == "Component" or
fcfg.buildaction == "Form" or
fcfg.buildaction == "UserControl"
then
info.SubType = fcfg.buildaction
end
-- This flag is deprecated, will remove eventually
if fcfg.flags and fcfg.flags.Component then
info.SubType = "Component"
end
end
if info.action == "Content" then
info.CopyToOutputDirectory = "PreserveNewest"
end
if info.action == "EmbeddedResource" and fname:endswith(".resx") then
local basename = fname:sub(1, -6)
-- Is there a matching *.cs file?
local testname = basename .. ".cs"
if project.hasfile(fcfg.project, testname) then
info.DependentUpon = testname
if project.hasfile(fcfg.project, basename .. ".Designer.cs") then
info.SubType = "DesignerType"
end
else
-- Is there a matching *.Designer.cs?
testname = basename .. ".Designer.cs"
if project.hasfile(fcfg.project, testname) then
info.SubType = "Designer"
local resourceAccessGenerator = "ResXFileCodeGenerator"
if fcfg.project.resourcegenerator then
if fcfg.project.resourcegenerator == "public" then
resourceAccessGenerator = "PublicResXFileCodeGenerator"
end
end
info.Generator = resourceAccessGenerator
info.LastGenOutput = path.getname(testname)
end
end
end
if info.action == "None" and fname:endswith(".settings") then
local testname = fname:sub(1, -10) .. ".Designer.cs"
if project.hasfile(fcfg.project, testname) then
info.Generator = "SettingsSingleFileGenerator"
info.LastGenOutput = path.getname(testname)
end
end
if info.action == "Content" and fname:endswith(".tt") then
local testname = fname:sub(1, -4) .. ".cs"
if project.hasfile(fcfg.project, testname) then
info.Generator = "TextTemplatingFileGenerator"
info.LastGenOutput = path.getname(testname)
info.CopyToOutputDirectory = nil
end
end
if info.action == "None" and fname:endswith(".xsd") then
local testname = fname:sub(1, -5) .. ".Designer.cs"
if project.hasfile(fcfg.project, testname) then
info.SubType = "Designer"
info.Generator = "MSDataSetGenerator"
info.LastGenOutput = path.getname(testname)
end
end
if info.action == "None" and (fname:endswith(".xsc") or fname:endswith(".xss")) then
local testname = fname:sub(1, -5) .. ".xsd"
if project.hasfile(fcfg.project, testname) then
info.DependentUpon = testname
end
end
if fname:endswith(".xaml") then
local testname = fname .. ".cs"
if project.hasfile(fcfg.project, testname) then
info.SubType = "Designer"
info.Generator = "MSBuild:Compile"
end
end
if info.DependentUpon then
info.DependentUpon = path.getname(info.DependentUpon)
end
return info
end
--
-- Retrieves the executable command name for a tool, based on the
-- provided configuration and the operating environment.
--
-- @param cfg
-- The configuration to query.
-- @param tool
-- The tool to fetch, one of "csc" for the C# compiler, or
-- "resgen" for the resource compiler.
-- @return
-- The executable command name for a tool, or nil if the system's
-- default value should be used.
--
function dotnet.gettoolname(cfg, tool)
local compilers = {
msnet = "csc",
mono = "mcs",
pnet = "cscc",
}
if tool == "csc" then
local toolset = _OPTIONS.dotnet or "msnet"
return compilers[toolset]
else
return "resgen"
end
end
--
-- Returns a list of compiler flags, based on the supplied configuration.
--
dotnet.flags = {
clr = {
Unsafe = "/unsafe",
},
flags = {
FatalWarning = "/warnaserror",
},
optimize = {
On = "/optimize",
Size = "/optimize",
Speed = "/optimize",
},
symbols = {
On = "/debug",
}
}
function dotnet.getflags(cfg)
local flags = config.mapFlags(cfg, dotnet.flags)
-- Tells the compiler not to include the csc.rsp response file which
-- it does by default and references all the assemblies shipped with
-- the .NET Framework. VS sets this flag by default for C# projects.
table.insert(flags, '/noconfig')
if cfg.project.icon then
local fn = project.getrelative(cfg.project, cfg.project.icon)
table.insert(flags, string.format('/win32icon:"%s"', fn))
end
if #cfg.defines > 0 then
table.insert(flags, table.implode(cfg.defines, "/d:", "", " "))
end
if cfg.csversion ~= nil then
table.insert(flags, '/langversion:' .. cfg.csversion)
end
return table.join(flags, cfg.buildoptions)
end
--
-- Translates the Premake kind into the CSC kind string.
--
function dotnet.getkind(cfg)
if (cfg.kind == "ConsoleApp") then
return "Exe"
elseif (cfg.kind == "WindowedApp") then
return "WinExe"
elseif (cfg.kind == "SharedLib") then
return "Library"
else
error("invalid dotnet kind " .. cfg.kind .. ". Valid kinds are ConsoleApp, WindowsApp, SharedLib")
end
end
--
-- Returns makefile-specific configuration rules.
--
function dotnet.getmakesettings(cfg)
return nil
end