1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-02-03 00:40:05 +08:00
SpaceVim/bundle/xmake.vim/autoload/spy.lua
2023-03-28 12:14:51 +08:00

153 lines
4.0 KiB
Lua

import 'core.project.project'
import 'core.project.config'
import 'core.base.global'
local help_content = [==[
xmake lua spy.lua [OPTION] ACTION
OPTION:
-o FILE output the content to FILE
ACTION:
config get a config
global get a global config
getenv ... get some ENVIRONMENTs
project get all project's configuration
]==]
-- table of action's procedures(functions)
local actions = {}
local outfile = nil
-- main
function main(...)
local args = {...}
local action = args[1]
if action == '-o' then
outfile = args[2]
action = args[3]
args = table.slice(args, 3)
end
if action then
local func = actions[action]
if func then func(args) end
else
print(help_content)
end
end
-- convert the value 't' to JSON string, in a line
local function tojson(t)
if type(t) == 'table' then
local list = {}
if t[1] then
for i = 1, #t do
list[i] = tojson(t[i])
end
return table.concat({'[', table.concat(list, ','), ']'})
else
for k, v in pairs(t) do
table.insert(list, tojson(k) .. ':' .. tojson(v))
end
return table.concat({'{', table.concat(list, ','), '}'})
end
end
local tt = type(t)
if tt == 'string' then
-- t = t:gsub('[\\\n\r\t"]', {
-- ['\\'] = '\\\\', ['\n'] = '\\n',
-- ['\t'] = '\\t', ['"'] = '\\"', ['\r'] = '\\r'
-- })
-- return '"' .. t .. '"'
return string.format('%q', t)
elseif tt == 'nil' then
return 'null'
else -- number or boolean
return tostring(t)
end
end
function output(t)
local t = tojson(t)
if outfile then
local file = io.open(outfile, 'w')
if not file then
print('can not open file to write:', outfile)
return
end
file:write(t)
file:close()
else
print(t)
end
end
-- Action: config ----- get the current configuration
actions.config = function(args)
config.load()
local list = {}
for i = 2,#args do
list[i-1] = config.get(args[i]) or ''
end
output(list)
end
-- Action: global ----- get the global configuration
actions.global = function(args)
global.load()
local list = {}
for i = 2,#args do
list[i-1] = global.get(args[i]) or ''
end
output(list)
end
-- Action: getenv ------ get environment variables inside xmake
actions.getenv = function(args)
local list = {}
for i = 2,#args do
list[i-1] = os.getenv(args[i]) or ''
end
output(list)
end
actions.incdirs = function(args)
config.load()
for name, target in pairs(project.targets()) do
print(target:get('includedirs'))
end
print(os.getenv('INCLUDE'))
end
-- Action: project ----- get the project's configuration
actions.project = function(args)
config.load()
-- os.cd(project.directory())
-- project's configuration
local xconfig = {
config = {
arch = config:arch(),
plat = config:plat(),
mode = config:mode(),
cc = config.get('cc'),
cxx = config.get('cxx')
},
-- project's name
name = project.name() or '<unamed>',
-- project's version
version = project.version(),
-- project's targets
targets = {}
}
-- read the configuration of all targets
for tname, target in pairs(project.targets()) do
local tcfg = {}
try { function ()
tcfg.name = target:name()
tcfg.targetkind = target:targetkind() or ''
tcfg.sourcefiles = target:sourcefiles() or {}
tcfg.headerfiles = target:headerfiles() or {}
tcfg.targetfile = target:targetfile() or '' end,
catch { function(err)
print(err)
end}}
xconfig.targets[tname] = tcfg
end
-- output
output(xconfig)
end