Files
OpenRA/interpreters/moai.lua

102 lines
3.9 KiB
Lua

-- Copyright 2011-13 Paul Kulchenko, ZeroBrane LLC
local moai
local win = ide.osname == "Windows"
return {
name = "Moai",
description = "Moai mobile platform",
api = {"baselib", "moai"},
frun = function(self,wfilename,rundebug)
moai = moai or ide.config.path.moai -- check if the path is configured
if not moai then
local sep = win and ';' or ':'
local default =
win and ([[C:\Program Files\moai]]..sep..[[D:\Program Files\moai]]..sep..
[[C:\Program Files (x86)\moai]]..sep..[[D:\Program Files (x86)\moai]]..sep)
or ''
local path = default
..(os.getenv('PATH') or '')..sep
..(os.getenv('MOAI_BIN') or '')..sep
..(os.getenv('HOME') and os.getenv('HOME') .. '/bin' or '')
local paths = {}
for p in path:gmatch("[^"..sep.."]+") do
moai = moai or GetFullPathIfExists(p, win and 'moai.exe' or 'moai')
table.insert(paths, p)
end
if not moai then
DisplayOutput("Can't find moai executable in any of the folders in PATH or MOAI_BIN: "
..table.concat(paths, ", ").."\n")
return
end
end
local file
local epoints = ide.config.moai and ide.config.moai.entrypoints
if epoints then
epoints = type(epoints) == 'table' and epoints or {epoints}
for _,entry in pairs(epoints) do
file = GetFullPathIfExists(self:fworkdir(wfilename), entry)
if file then break end
end
if not file then
DisplayOutput("Can't find any of the specified entry points ("
..table.concat(epoints, ", ")
..") in the current project; continuing with the current file...\n")
end
end
if rundebug then
-- start running the application right away
DebuggerAttachDefault({startwith = file,
runstart = ide.config.debugger.runonstart ~= false})
local code = (
[[xpcall(function()
io.stdout:setvbuf('no')
require("mobdebug").moai() -- enable debugging for coroutines
%s
end, function(err) print(debug.traceback(err)) end)]]):format(rundebug)
local tmpfile = wx.wxFileName()
tmpfile:AssignTempFileName(".")
file = tmpfile:GetFullPath()
local f = io.open(file, "w")
if not f then
DisplayOutput("Can't open temporary file '"..file.."' for writing\n")
return
end
f:write(code)
f:close()
-- add mobdebug as the first path to LUA_PATH to provide a workaround
-- for a MOAI issue: https://github.com/pkulchenko/ZeroBraneStudio/issues/96
local mdb = MergeFullPath(GetPathWithSep(ide.editorFilename), "lualibs/mobdebug/?.lua")
local _, path = wx.wxGetEnv("LUA_PATH")
if path and path:find(mdb, 1, true) ~= 1 then
wx.wxSetEnv("LUA_PATH", mdb..";"..path)
end
end
file = file or wfilename:GetFullPath()
-- try to find a config file: (1) MOAI_CONFIG, (2) project directory,
-- (3) folder with the current file, (4) folder with moai executable
local config = GetFullPathIfExists(os.getenv('MOAI_CONFIG') or self:fworkdir(wfilename), 'config.lua')
or GetFullPathIfExists(wfilename:GetPath(wx.wxPATH_GET_VOLUME), 'config.lua')
or GetFullPathIfExists(wx.wxFileName(moai):GetPath(wx.wxPATH_GET_VOLUME), 'config.lua')
local cmd = config and ('"%s" "%s" "%s"'):format(moai, config, file)
or ('"%s" "%s"'):format(moai, file)
-- CommandLineRun(cmd,wdir,tooutput,nohide,stringcallback,uid,endcallback)
return CommandLineRun(cmd,self:fworkdir(wfilename),true,false,nil,nil,
function() ide.debugger.pid = nil if rundebug then wx.wxRemoveFile(file) end end)
end,
fprojdir = function(self,wfilename)
return wfilename:GetPath(wx.wxPATH_GET_VOLUME)
end,
fworkdir = function(self,wfilename)
return ide.config.path.projectdir or wfilename:GetPath(wx.wxPATH_GET_VOLUME)
end,
hasdebugger = true,
fattachdebug = function(self) DebuggerAttachDefault() end,
scratchextloop = true,
}