--- -- vs2010_rules_xml.lua -- Generate a Visual Studio 201x custom rules XML file. -- Copyright (c) Jason Perkins and the Premake project -- local p = premake p.vstudio.vs2010.rules.xml = {} local m = p.vstudio.vs2010.rules.xml m.elements = {} --- -- Entry point; generate the root element. --- m.elements.project = function(r) return { m.projectSchemaDefinitions, m.rule, m.ruleItem, m.fileExtension, m.contentType, } end function m.generate(r) p.xmlUtf8() p.callArray(m.elements.project, r) p.out('') end --- -- Generate the main element. --- m.elements.rule = function(r) return { m.dataSource, m.categories, m.inputs, m.properties, m.commandLineTemplate, m.beforeTargets, m.afterTargets, m.outputs, m.executionDescription, m.additionalDependencies, m.additionalOptions, } end function m.rule(r) p.push('') p.callArray(m.elements.rule, r) p.pop('') end --- -- Generate the list of categories. --- function m.categories(r) local categories = { [1] = { name="General" }, } local propCategory = {} local defs = r.propertydefinition for i = 1, #defs do local def = defs[i] local cat = def.category if cat then if type(cat) == "string" and cat ~= "Command Line" and cat ~= "General" then if not propCategory[cat] then table.insert(categories, { name=cat }) propCategory[cat] = true end else def.category = nil end end end table.insert(categories, { name="Command Line", subtype="CommandLine" }) p.push('') for i = 1, #categories do m.category(categories[i]) end p.pop('') end function m.category(cat) local attribs = p.capture(function() p.push() p.w('Name="%s"', cat.name) if cat.subtype then p.w('Subtype="%s"', cat.subtype) end p.pop() end) p.push('') p.push('') p.w('%s', cat.name) p.pop('') p.pop('') end --- -- Generate the list of property definitions. --- function m.properties(r) local defs = r.propertydefinition for i = 1, #defs do local def = defs[i] if def.kind == "boolean" then m.boolProperty(def) elseif def.kind == "list" then m.stringListProperty(def) elseif type(def.values) == "table" then m.enumProperty(def) elseif def.kind and def.kind:startswith("list:") then m.stringListProperty(def) else m.stringProperty(def) end end end function m.baseProperty(def, suffix) local c = p.capture(function () p.w('Name="%s"', def.name) p.w('HelpContext="0"') p.w('DisplayName="%s"', def.display or def.name) if def.description then p.w('Description="%s"', def.description) end if def.category then p.w('Category="%s"', def.category) end end) if suffix then c = c .. suffix end p.outln(c) end function m.boolProperty(def) p.push('') p.pop() end function m.enumProperty(def) p.push('') local values = def.values local switches = def.switch or {} local keys = table.keys(def.values) table.sort(keys) for _, key in pairs(keys) do p.push('') p.pop() end p.pop('') end function m.stringProperty(def) p.push('') p.pop() end function m.stringListProperty(def) p.push('') p.pop() end --- -- Implementations of individual elements. --- function m.additionalDependencies(r) p.push('') p.pop() end function m.additionalOptions(r) p.push('') p.push('') p.w('Additional Options') p.pop('') p.push('') p.w('Additional Options') p.pop('') p.pop('') end function m.afterTargets(r) p.push('') p.push('') p.w('Execute After') p.pop('') p.push('') p.w('Specifies the targets for the build customization to run after.') p.pop('') p.push('') p.push('', r.name) p.pop() p.pop('') p.push('') p.push('') p.pop() p.pop('') p.pop('') end function m.beforeTargets(r) p.push('') p.push('') p.w('Execute Before') p.pop('') p.push('') p.w('Specifies the targets for the build customization to run before.') p.pop('') p.push('') p.push('', r.name) p.pop() p.pop('') p.push('') p.push('') p.pop() p.pop('') p.pop('') end function m.commandLineTemplate(r) p.push('') p.pop() end function m.contentType(r) p.push('', r.name) p.pop() end function m.dataSource(r) p.push('') p.push('', r.name) p.pop() p.pop('') end function m.executionDescription(r) p.push('') p.pop() end function m.fileExtension(r) for _, v in ipairs(r.fileextension) do p.push('', r.name) p.pop() end end function m.inputs(r) p.push('') p.push('') p.push('') p.pop() p.pop('') p.pop('') end function m.outputs(r) p.push('') p.pop() end function m.ruleItem(r) p.push('', r.display or r.name) p.pop() end function m.projectSchemaDefinitions(r) p.push('') end