You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
3.2 KiB
98 lines
3.2 KiB
3 years ago
|
require "sys"
|
||
|
require "filesystem"
|
||
|
require "util"
|
||
|
|
||
|
local root = fs.ydwe_path():parent_path():remove_filename():remove_filename() / "Component"
|
||
|
if not fs.exists(root) then
|
||
|
root = fs.ydwe_path()
|
||
|
end
|
||
|
|
||
|
wave = {}
|
||
|
wave.path = fs.ydwe_path() / "plugin" / "wave"
|
||
|
wave.exe_path = wave.path / "Wave.exe"
|
||
|
wave.sys_include_path = wave.path / "include"
|
||
|
wave.plugin_include_path = fs.ydwe_path() / "plugin"
|
||
|
wave.jass_include_path = root / "jass"
|
||
|
wave.force_file_path = wave.sys_include_path / "WaveForce.i"
|
||
|
|
||
|
local function pathstring(path)
|
||
|
local str = path:string()
|
||
|
if str:sub(-1) == '\\' then
|
||
|
return '"' .. str .. ' "'
|
||
|
else
|
||
|
return '"' .. str .. '"'
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- 预处理代码
|
||
|
-- op.input - 输入文件路径
|
||
|
-- op.option - 预处理选项,table,支持的值有
|
||
|
-- runtime_version - 表示魔兽版本
|
||
|
-- enable_jasshelper_debug - 布尔值,是否是调试模式
|
||
|
-- enable_yd_trigger - 布尔值,是否启用YD触发器
|
||
|
-- 返回:number, info, path - 子进程返回值;预处理输出信息;输出文件路径
|
||
|
function wave:do_compile(op)
|
||
|
local cmd = ''
|
||
|
cmd = cmd .. '--autooutput '
|
||
|
cmd = cmd .. string.format('--sysinclude=%s ', pathstring(self.sys_include_path))
|
||
|
cmd = cmd .. string.format('--sysinclude=%s ', pathstring(self.plugin_include_path))
|
||
|
cmd = cmd .. string.format('--include=%s ', pathstring(op.map_path:parent_path()))
|
||
|
cmd = cmd .. string.format('--include=%s ', pathstring(self.jass_include_path))
|
||
|
cmd = cmd .. string.format('--define=WARCRAFT_VERSION=%d ', 100 * op.option.runtime_version.major + op.option.runtime_version.minor)
|
||
|
cmd = cmd .. string.format('--define=YDWE_VERSION_STRING=\\"%s\\" ', tostring(ydwe_version))
|
||
|
if op.option.enable_jasshelper_debug then
|
||
|
cmd = cmd .. '--define=DEBUG=1 '
|
||
|
end
|
||
|
if tonumber(global_config["ScriptInjection"]["Option"]) == 0 then
|
||
|
cmd = cmd .. "--define=SCRIPT_INJECTION=1 "
|
||
|
end
|
||
|
if not op.option.enable_yd_trigger then
|
||
|
cmd = cmd .. '--define=DISABLE_YDTRIGGER=1 '
|
||
|
end
|
||
|
if fs.exists(self.force_file_path) then
|
||
|
cmd = cmd .. string.format('--forceinclude=%s ', self.force_file_path:filename():string())
|
||
|
end
|
||
|
cmd = cmd .. "--extended --c99 --preserve=2 --line=0 "
|
||
|
|
||
|
local command_line = string.format('%s %s %s', pathstring(self.exe_path), cmd, pathstring(op.input))
|
||
|
-- 启动进程
|
||
|
local proc, out_rd, err_rd, in_wr = sys.spawn_pipe(command_line, nil)
|
||
|
if proc then
|
||
|
local out = out_rd:read("*a")
|
||
|
local err = err_rd:read("*a")
|
||
|
local exit_code = proc:wait()
|
||
|
proc:close()
|
||
|
proc = nil
|
||
|
return exit_code, out, err
|
||
|
else
|
||
|
return -1, nil, nil
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function wave:compile(op)
|
||
|
log.trace("Wave compilation start.")
|
||
|
|
||
|
local map_script_file = io.open(op.input, "a+b")
|
||
|
if map_script_file then
|
||
|
map_script_file:write("/**/\r\n")
|
||
|
map_script_file:close()
|
||
|
end
|
||
|
|
||
|
-- 输出路径
|
||
|
op.output = op.input:parent_path() / (op.input:stem():string() .. ".i")
|
||
|
|
||
|
local exit_code, out, err = self:do_compile(op)
|
||
|
|
||
|
-- 退出码0代表成功
|
||
|
if exit_code ~= 0 then
|
||
|
if out and err then
|
||
|
gui.error_message(nil, _("Preprocessor failed with message:\nstdout:%s\nstderr: %s"), out, err)
|
||
|
else
|
||
|
gui.error_message(nil, _("Cannot start preprocessor process."))
|
||
|
end
|
||
|
return false
|
||
|
end
|
||
|
|
||
|
return true
|
||
|
end
|