262 lines
7.0 KiB
Markdown
262 lines
7.0 KiB
Markdown
|
|
# xmake
|
||
|
|
|
||
|
|
## option
|
||
|
|
|
||
|
|
```lua
|
||
|
|
-- core/base/task.lua
|
||
|
|
function task.common_options()
|
||
|
|
if not task._COMMON_OPTIONS then
|
||
|
|
task._COMMON_OPTIONS =
|
||
|
|
{
|
||
|
|
{'q', "quiet", "k", nil, "Quiet operation." }
|
||
|
|
, {'y', "yes", "k", nil, "Input yes by default if need user confirm." }
|
||
|
|
, {nil, "confirm", "kv", nil, "Input the given result if need user confirm."
|
||
|
|
, values = function ()
|
||
|
|
return {"yes", "no", "def"}
|
||
|
|
end }
|
||
|
|
, {'v', "verbose", "k", nil, "Print lots of verbose information for users." }
|
||
|
|
, {nil, "root", "k", nil, "Allow to run xmake as root." }
|
||
|
|
, {'D', "diagnosis", "k", nil, "Print lots of diagnosis information (backtrace, check info ..) only for developers."
|
||
|
|
, "And we can append -v to get more whole information."
|
||
|
|
, " e.g. $ xmake -vD" }
|
||
|
|
, {nil, "version", "k", nil, "Print the version number and exit." }
|
||
|
|
, {'h', "help", "k", nil, "Print this help message and exit." }
|
||
|
|
, {}
|
||
|
|
, {'F', "file", "kv", nil, "Read a given xmake.lua file." }
|
||
|
|
, {'P', "project", "kv", nil, "Change to the given project directory."
|
||
|
|
, "Search priority:"
|
||
|
|
, " 1. The Given Command Argument"
|
||
|
|
, " 2. The Envirnoment Variable: XMAKE_PROJECT_DIR"
|
||
|
|
, " 3. The Current Directory" }
|
||
|
|
, {category = "action"}
|
||
|
|
}
|
||
|
|
end
|
||
|
|
return task._COMMON_OPTIONS
|
||
|
|
end
|
||
|
|
```
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
```lua
|
||
|
|
-- core/base/option.lua
|
||
|
|
-- parse arguments with the given options
|
||
|
|
function option.parse(argv, options, opt)
|
||
|
|
-- run parser
|
||
|
|
local pargs = cli.parsev(argv, flags)
|
||
|
|
--...
|
||
|
|
end
|
||
|
|
```
|
||
|
|
|
||
|
|
## task
|
||
|
|
|
||
|
|
- build
|
||
|
|
- config
|
||
|
|
-
|
||
|
|
|
||
|
|
```lua
|
||
|
|
-- core/base/task.lua
|
||
|
|
-- the menu
|
||
|
|
function task.menu(tasks)
|
||
|
|
-- make menu
|
||
|
|
local menu = {}
|
||
|
|
for taskname, taskinst in pairs(tasks) do
|
||
|
|
|
||
|
|
-- has task menu?
|
||
|
|
local taskmenu = taskinst:get("menu")
|
||
|
|
-- main?
|
||
|
|
if taskinst:get("category") == "main" then
|
||
|
|
|
||
|
|
-- delay to load main menu
|
||
|
|
menu.main = function ()
|
||
|
|
|
||
|
|
-- translate main menu
|
||
|
|
local mainmenu, errors = task._translate_menu(taskmenu)
|
||
|
|
if not mainmenu then
|
||
|
|
os.raise(errors)
|
||
|
|
end
|
||
|
|
|
||
|
|
-- make tasks for the main menu
|
||
|
|
mainmenu.tasks = {}
|
||
|
|
for name, inst in pairs(tasks) do
|
||
|
|
-- has menu?
|
||
|
|
local m = inst:get("menu")
|
||
|
|
-- add task
|
||
|
|
mainmenu.tasks[name] =
|
||
|
|
{
|
||
|
|
category = inst:get("category"),
|
||
|
|
shortname = m.shortname,
|
||
|
|
description = m.description
|
||
|
|
}
|
||
|
|
end
|
||
|
|
-- ok
|
||
|
|
return mainmenu
|
||
|
|
end
|
||
|
|
-- delay to load task menu
|
||
|
|
menu[taskname] = function ()
|
||
|
|
local taskmenu, errors = task._translate_menu(taskmenu)
|
||
|
|
return taskmenu
|
||
|
|
end
|
||
|
|
end
|
||
|
|
-- ok?
|
||
|
|
return menu
|
||
|
|
end
|
||
|
|
```
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
## config
|
||
|
|
|
||
|
|
- global
|
||
|
|
- "C:\Users\ouczbs\AppData\Local\.xmake\xmake.conf"
|
||
|
|
- local
|
||
|
|
- D:\ZEngine\.xmake\windows\x64
|
||
|
|
|
||
|
|
```lua
|
||
|
|
-- core/base/global.lua
|
||
|
|
-- get the configure file
|
||
|
|
function global.filepath()
|
||
|
|
return path.join(global.directory(), xmake._NAME .. ".conf")
|
||
|
|
end
|
||
|
|
-- load the global configuration
|
||
|
|
function global.load()
|
||
|
|
-- load configure from the file first
|
||
|
|
local filepath = global.filepath()
|
||
|
|
-- load configs
|
||
|
|
local results, errors = io.load(filepath)
|
||
|
|
|
||
|
|
-- merge the configure
|
||
|
|
for name, value in pairs(results) do
|
||
|
|
if global.get(name) == nil then
|
||
|
|
global.set(name, value)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
```
|
||
|
|
|
||
|
|
## theme
|
||
|
|
|
||
|
|
```lua
|
||
|
|
-- core/base/theme.lua
|
||
|
|
|
||
|
|
-- load the given theme
|
||
|
|
function theme.load(name)
|
||
|
|
-- find the theme script path
|
||
|
|
local scriptpath = nil
|
||
|
|
if name then
|
||
|
|
for _, dir in ipairs(theme.directories()) do
|
||
|
|
scriptpath = path.join(dir, name, "xmake.lua")
|
||
|
|
if os.isfile(scriptpath) then
|
||
|
|
break
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
-- not exists? uses the default theme
|
||
|
|
if not scriptpath or not os.isfile(scriptpath) then
|
||
|
|
scriptpath = path.join(os.programdir(), "themes", "default", "xmake.lua")
|
||
|
|
end
|
||
|
|
|
||
|
|
-- get interpreter
|
||
|
|
local interp = theme._interpreter()
|
||
|
|
|
||
|
|
-- load script
|
||
|
|
local ok, errors = interp:load(scriptpath)
|
||
|
|
if not ok then
|
||
|
|
return nil, errors
|
||
|
|
end
|
||
|
|
|
||
|
|
-- load theme
|
||
|
|
local results, errors = interp:make("theme", true, false)
|
||
|
|
if not results and os.isfile(scriptpath) then
|
||
|
|
return nil, errors
|
||
|
|
end
|
||
|
|
|
||
|
|
-- get result
|
||
|
|
local result = results[name]
|
||
|
|
if not result then
|
||
|
|
return nil, string.format("the theme %s not found!", name)
|
||
|
|
end
|
||
|
|
|
||
|
|
-- new an instance
|
||
|
|
local instance, errors = _instance.new(name, result, interp:rootdir())
|
||
|
|
if not instance then
|
||
|
|
return nil, errors
|
||
|
|
end
|
||
|
|
|
||
|
|
-- save the current theme instance
|
||
|
|
theme._THEME = instance
|
||
|
|
return instance
|
||
|
|
end
|
||
|
|
```
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
## main
|
||
|
|
|
||
|
|
```lua
|
||
|
|
--core/_xmake_main.lua
|
||
|
|
-- load modules
|
||
|
|
local main = require("main")
|
||
|
|
|
||
|
|
-- the main function
|
||
|
|
function _xmake_main()
|
||
|
|
return main.entry()
|
||
|
|
end
|
||
|
|
```
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
```lua
|
||
|
|
--core/main.lua
|
||
|
|
function main.entry()
|
||
|
|
-- init
|
||
|
|
local ok, errors = main._init()
|
||
|
|
--[[
|
||
|
|
-- core/base/option.lua
|
||
|
|
-- parse options
|
||
|
|
option.parse(xmake._COMMAND_ARGV, task.common_options(), { allow_unknown = true })
|
||
|
|
|
||
|
|
-- core/base/task.lua
|
||
|
|
--load task
|
||
|
|
option._translate(menu)
|
||
|
|
task.menu(xmake._COMMAND_ARGV, task.common_options(), { allow_unknown = true })
|
||
|
|
]]
|
||
|
|
-- load global configuration
|
||
|
|
ok, errors = global.load()
|
||
|
|
--[[
|
||
|
|
-- core/base/global.lua
|
||
|
|
-- load config
|
||
|
|
global.load()
|
||
|
|
]]
|
||
|
|
-- load theme
|
||
|
|
local theme_inst = theme.load(os.getenv("XMAKE_THEME") or global.get("theme")) or theme.load("default")
|
||
|
|
colors.theme_set(theme_inst)
|
||
|
|
|
||
|
|
-- init option
|
||
|
|
ok, errors = option.init(menu)
|
||
|
|
--[[
|
||
|
|
-- core/base/global.lua
|
||
|
|
-- load config
|
||
|
|
task.menu()
|
||
|
|
option.parse(xmake._COMMAND_ARGV, options, { populate_defaults = false })
|
||
|
|
]]
|
||
|
|
|
||
|
|
-- show help?
|
||
|
|
if main._show_help() then
|
||
|
|
return main._exit(true)
|
||
|
|
end
|
||
|
|
|
||
|
|
-- get task instance
|
||
|
|
local taskname = option.taskname() or "build"
|
||
|
|
local taskinst = task.task(taskname) or project.task(taskname)
|
||
|
|
|
||
|
|
-- run task
|
||
|
|
scheduler:enable(true)
|
||
|
|
scheduler:co_start_named("xmake " .. taskname, function ()
|
||
|
|
local ok, errors = taskinst:run()
|
||
|
|
end)
|
||
|
|
ok, errors = scheduler:runloop()
|
||
|
|
end
|
||
|
|
```
|
||
|
|
|