DeerEngine/vendor/premake-vscode/vscode_workspace.lua

105 lines
2.5 KiB
Lua

local p = premake
local project = p.project
local workspace = p.workspace
local tree = p.tree
local vscode = p.modules.vscode
vscode.workspace = {}
vscode.workspace.tasks = {}
local m = vscode.workspace
function m.generate(wks)
p.utf8()
p.push('{')
p.push('"folders": [')
-- Project List
tree.traverse(workspace.grouptree(wks), {
onleaf = function(n)
local prj = n.project
local prjpath = path.getrelative(prj.workspace.location, prj.location)
p.push('{')
p.w('"path": "%s"', prjpath)
p.pop('},')
end,
})
-- HACK(Peter): Hack around the tasks not being picked up when workspace is opened
local prjpath = path.getrelative(wks.location, "Tasks")
p.push('{')
p.w('"path": "%s"', prjpath)
p.pop('}')
p.pop(']')
p.pop('}')
end
local tasks = vscode.workspace.tasks
function tasks.buildSolutionTask(wks)
local solutionFile = p.filename(wks, ".sln")
local enablePreReleases = _OPTIONS["enable_prereleases"]
local vswhere = '"C:\\Program Files (x86)\\Microsoft Visual Studio\\Installer\\vswhere.exe" -latest';
if enablePreReleases then
vswhere = vswhere .. ' -prerelease'
end
vswhere = vswhere .. ' -find MSBuild'
local msBuildPath, err = os.outputof(vswhere)
msBuildPath = path.normalize(path.join(msBuildPath, "Current", "Bin", "MSBuild.exe"))
for cfg in workspace.eachconfig(wks) do
p.push('{')
p.w('"type": "shell",')
p.w('"label": "Build All (%s)",', cfg.name)
p.w('"command": "%s",', msBuildPath)
p.w('"args": ["%s", "-p:Configuration=%s"],', solutionFile, cfg.name)
p.w('"problemMatcher": "$msCompile",')
p.w('"group": "build"')
p.pop('},')
end
end
function tasks.buildMakefileTask(wks)
for cfg in workspace.eachconfig(wks) do
p.push('{')
p.w('"type": "shell",')
p.w('"label": "Build All (%s)",', cfg.name)
p.w('"command": "make",')
p.w('"args": ["-j$((`nproc` - 1))", "config=%s"],', cfg.name)
p.w('"problemMatcher": "$gcc",')
p.w('"group": "build"')
p.pop('},')
end
end
tasks.buildTasks = function(wks)
if _TARGET_OS == "windows" then
return {
tasks.buildSolutionTask
}
else
return {
tasks.buildMakefileTask
}
end
end
function tasks.generate(wks)
p.push('{')
p.w('"version": "2.0.0",')
p.push('"tasks": [')
p.callArray(tasks.buildTasks, wks)
p.pop(']')
p.pop('}')
end