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.
252 lines
5.0 KiB
252 lines
5.0 KiB
local io = require "io"
|
|
io.stdout:setvbuf"no"
|
|
io.stderr:setvbuf"no"
|
|
|
|
function vc_version()
|
|
local VER = lake.compiler_version()
|
|
MSVC_VER = ({
|
|
[15] = '9';
|
|
[16] = '10';
|
|
})[VER.MAJOR] or ''
|
|
return MSVC_VER
|
|
end
|
|
|
|
if not L then
|
|
|
|
local function arkey(t)
|
|
assert(type(t) == 'table')
|
|
local keys = {}
|
|
for k in pairs(t) do
|
|
assert(type(k) == 'number')
|
|
table.insert(keys, k)
|
|
end
|
|
table.sort(keys)
|
|
return keys
|
|
end
|
|
|
|
local function ikeys(t)
|
|
local keys = arkey(t)
|
|
local i = 0
|
|
return function()
|
|
i = i + 1
|
|
local k = keys[i]
|
|
if k == nil then return end
|
|
return k, t[k]
|
|
end
|
|
end
|
|
|
|
local function expand(arr, t)
|
|
if t == nil then return arr end
|
|
|
|
if type(t) ~= 'table' then
|
|
table.insert(arr, t)
|
|
return arr
|
|
end
|
|
|
|
for _, v in ikeys(t) do
|
|
expand(arr, v)
|
|
end
|
|
|
|
return arr
|
|
end
|
|
|
|
function L(...)
|
|
return expand({}, {...})
|
|
end
|
|
|
|
end
|
|
|
|
J = J or path.join
|
|
|
|
IF = IF or lake.choose or choose
|
|
|
|
DIR_SEP = package.config:sub(1,1)
|
|
|
|
function prequire(...)
|
|
local ok, mod = pcall(require, ...)
|
|
if ok then return mod end
|
|
end
|
|
|
|
function clone(t, o)
|
|
o = o or {}
|
|
for k, v in pairs(t) do
|
|
if o[k] == nil then o[k] = v end
|
|
end
|
|
return o
|
|
end
|
|
|
|
function each_join(dir, list)
|
|
for i, v in ipairs(list) do
|
|
list[i] = path.join(dir, v)
|
|
end
|
|
return list
|
|
end
|
|
|
|
function run(file, cwd)
|
|
print()
|
|
print("run " .. file)
|
|
if not TESTING then
|
|
if cwd then lake.chdir(cwd) end
|
|
local status, code = utils.execute( LUA_RUNNER .. ' ' .. file )
|
|
if cwd then lake.chdir("<") end
|
|
print()
|
|
return status, code
|
|
end
|
|
return true, 0
|
|
end
|
|
|
|
function exec(file, cwd)
|
|
print()
|
|
print("exec " .. file)
|
|
if not TESTING then
|
|
if cwd then lake.chdir(cwd) end
|
|
local status, code = utils.execute( file )
|
|
if cwd then lake.chdir("<") end
|
|
print()
|
|
return status, code
|
|
end
|
|
return true, 0
|
|
end
|
|
|
|
local TESTS = {}
|
|
|
|
function run_test(name, params)
|
|
local test_dir = TESTDIR or J(ROOT, 'test')
|
|
local cmd = J(test_dir, name)
|
|
if params then cmd = cmd .. ' ' .. params end
|
|
local ok = run(cmd, test_dir)
|
|
|
|
table.insert(TESTS, {cmd = cmd, result = ok})
|
|
|
|
print("TEST " .. name .. (ok and ' - pass!' or ' - fail!'))
|
|
end
|
|
|
|
function exec_test(name, params)
|
|
local test_dir = TESTDIR or J(ROOT, 'test')
|
|
local cmd = J(test_dir, name)
|
|
if params then cmd = cmd .. ' ' .. params end
|
|
local ok = exec(cmd, test_dir)
|
|
|
|
table.insert(TESTS, {cmd = cmd, result = ok})
|
|
|
|
print("TEST " .. name .. (ok and ' - pass!' or ' - fail!'))
|
|
end
|
|
|
|
function test_summary()
|
|
local ok = true
|
|
print("")
|
|
print("------------------------------------")
|
|
print("Number of tests:", #TESTS)
|
|
for _, t in ipairs(TESTS) do
|
|
ok = ok and t.result
|
|
print((t.result and ' Pass' or ' Fail') .. " - TEST " .. t.cmd)
|
|
end
|
|
print("------------------------------------")
|
|
print("")
|
|
return ok
|
|
end
|
|
|
|
--[[spawn]] if WINDOWS then
|
|
function spawn(file, cwd)
|
|
local winapi = prequire "winapi"
|
|
if not winapi then
|
|
quit('needs winapi for spawn!')
|
|
return false
|
|
end
|
|
|
|
print("spawn " .. file)
|
|
if not TESTING then
|
|
if cwd then lake.chdir(cwd) end
|
|
assert(winapi.shell_exec(nil, LUA_RUNNER, file, cwd))
|
|
if cwd then lake.chdir("<") end
|
|
print()
|
|
end
|
|
return true
|
|
end
|
|
else
|
|
function spawn(file, cwd)
|
|
print("spawn " .. file)
|
|
if not TESTING then
|
|
assert(run(file .. ' &', cwd))
|
|
end
|
|
return true
|
|
end
|
|
end
|
|
|
|
function as_bool(v,d)
|
|
if v == nil then return not not d end
|
|
local n = tonumber(v)
|
|
if n == 0 then return false end
|
|
if n then return true end
|
|
return false
|
|
end
|
|
|
|
--- set global variables
|
|
-- LUA_NEED
|
|
-- LUA_DIR
|
|
-- LUA_RUNNER
|
|
-- ROOT
|
|
-- LUADIR
|
|
-- LIBDIR
|
|
-- TESTDIR
|
|
-- DOCDIR
|
|
-- DYNAMIC
|
|
function INITLAKEFILE()
|
|
if LUA_VER == '5.3' then
|
|
LUA_NEED = 'lua53'
|
|
LUA_DIR = ENV.LUA_DIR_5_3 or ENV.LUA_DIR
|
|
LUA_RUNNER = LUA_RUNNER or 'lua53'
|
|
elseif LUA_VER == '5.2' then
|
|
LUA_NEED = 'lua52'
|
|
LUA_DIR = ENV.LUA_DIR_5_2 or ENV.LUA_DIR
|
|
LUA_RUNNER = LUA_RUNNER or 'lua52'
|
|
elseif LUA_VER == '5.1' then
|
|
LUA_NEED = 'lua51'
|
|
LUA_DIR = ENV.LUA_DIR
|
|
LUA_RUNNER = LUA_RUNNER or 'lua'
|
|
else
|
|
LUA_NEED = 'lua'
|
|
LUA_DIR = ENV.LUA_DIR
|
|
LUA_RUNNER = LUA_RUNNER or 'lua'
|
|
end
|
|
ROOT = ROOT or J( LUA_DIR, 'libs', PROJECT )
|
|
LUADIR = LUADIR or J( ROOT, 'share' )
|
|
LIBDIR = LIBDIR or J( ROOT, 'share' )
|
|
TESTDIR = TESTDIR or J( ROOT, 'test' )
|
|
DOCDIR = DOCDIR or J( ROOT, 'doc' )
|
|
DYNAMIC = as_bool(DYNAMIC, false)
|
|
end
|
|
|
|
-----------------------
|
|
-- needs --
|
|
-----------------------
|
|
|
|
lake.define_need('lua53', function()
|
|
return {
|
|
incdir = J(ENV.LUA_DIR_5_3, 'include');
|
|
libdir = J(ENV.LUA_DIR_5_3, 'lib');
|
|
libs = {'lua53'};
|
|
}
|
|
end)
|
|
|
|
lake.define_need('lua52', function()
|
|
return {
|
|
incdir = J(ENV.LUA_DIR_5_2, 'include');
|
|
libdir = J(ENV.LUA_DIR_5_2, 'lib');
|
|
libs = {'lua52'};
|
|
}
|
|
end)
|
|
|
|
lake.define_need('lua51', function()
|
|
return {
|
|
incdir = J(ENV.LUA_DIR, 'include');
|
|
libdir = J(ENV.LUA_DIR, 'lib');
|
|
libs = {'lua5.1'};
|
|
}
|
|
end)
|
|
|
|
lake.define_need('pthread', function()
|
|
return {
|
|
libs = 'pthread';
|
|
}
|
|
end)
|