summaryrefslogtreecommitdiff
path: root/xmake/core/project/template.lua
diff options
context:
space:
mode:
authorruki <[email protected]>2019-09-19 00:49:34 +0800
committerruki <[email protected]>2019-09-18 22:57:25 +0800
commitbb3455b845e0b776937283b3ddae4ae557eea52e (patch)
tree7625b08ec58620e048410017bfe18ff3fa536548 /xmake/core/project/template.lua
parent916078fdb2904340ef2003a46057d9232194511a (diff)
improve template
Diffstat (limited to 'xmake/core/project/template.lua')
-rw-r--r--xmake/core/project/template.lua304
1 files changed, 50 insertions, 254 deletions
diff --git a/xmake/core/project/template.lua b/xmake/core/project/template.lua
index 98593be24..13cf1076e 100644
--- a/xmake/core/project/template.lua
+++ b/xmake/core/project/template.lua
@@ -19,7 +19,8 @@
--
-- define module: template
-local template = template or {}
+local template = template or {}
+local _instance = _instance or {}
-- load modules
local os = require("base/os")
@@ -28,11 +29,36 @@ local path = require("base/path")
local table = require("base/table")
local utils = require("base/utils")
local string = require("base/string")
-local option = require("base/option")
-local sandbox = require("sandbox/sandbox")
-local project = require("project/project")
local interpreter = require("base/interpreter")
-local deprecated = require("base/deprecated")
+
+-- new an instance
+function _instance.new(name, info, scriptdir)
+ local instance = table.inherit(_instance)
+ instance._NAME = name
+ instance._INFO = info
+ instance._SCRIPTDIR = scriptdir
+ return instance
+end
+
+-- get the package name
+function _instance:name()
+ return self._NAME
+end
+
+-- get the package configure
+function _instance:get(name)
+
+ -- get it from info first
+ local value = self._INFO:get(name)
+ if value ~= nil then
+ return value
+ end
+end
+
+-- get the script directory
+function _instance:scriptdir()
+ return self._SCRIPTDIR
+end
-- the interpreter
function template._interpreter()
@@ -46,29 +72,18 @@ function template._interpreter()
local interp = interpreter.new()
assert(interp)
- -- define apis (only root scope)
+ -- define apis
interp:api_define
{
values =
{
- -- set_xxx
- "set_name"
- , "set_description"
- , "set_projectdir"
-- add_xxx
- , "add_macrofiles"
+ "template.add_configfiles"
}
, script =
{
-- on_xxx
- "on_create"
- }
- , dictionary =
- {
- -- set_xxx
- "set_macros"
- -- add_xxx
- , "add_macros"
+ "template.on_create"
}
}
@@ -79,32 +94,6 @@ function template._interpreter()
return interp
end
--- replace macros
-function template._replace(macros, macrofiles)
-
- -- check
- assert(macros and macrofiles)
-
- -- make all files
- local files = {}
- for _, macrofile in ipairs(table.wrap(macrofiles)) do
- local matchfiles = os.files(macrofile)
- if matchfiles then
- table.join2(files, matchfiles)
- end
- end
-
- -- replace all files
- for _, file in ipairs(files) do
- for macro, value in pairs(macros) do
- io.gsub(file, "%[" .. macro .. "%]", value)
- end
- end
-
- -- ok
- return true
-end
-
-- get the language list
function template.languages()
@@ -147,225 +136,32 @@ function template.templates(language)
os.raise(errors)
end
- -- load templates
- local results, errors = interp:make(nil, true, true)
+ -- load template
+ local results, errors = interp:make("template", true, true)
if not results then
- -- trace
os.raise(errors)
end
- -- save template directory
- results:set("_DIRECTORY", path.directory(templatefile))
-
- -- insert to templates
- table.insert(templates, results:info())
- end
- end
- return templates
-end
-
--- create project from template
-function template.create(language, templateid, targetname)
-
- -- check the language
- if not language then
- return false, "no language!"
- end
-
- -- check the template id
- if not templateid then
- return false, "no template id!"
- end
-
- -- get interpreter
- local interp = template._interpreter()
- assert(interp)
-
- -- get project directory
- local projectdir = path.absolute(option.get("project") or path.join(os.curdir(), targetname))
-
- -- set filter
- interp:filter():register("template", function (variable)
-
- -- init maps
- local maps =
- {
- targetname = targetname
- , projectdir = projectdir
- }
-
- -- map it
- local result = maps[variable]
- if result ~= nil then
- return result
- end
-
- -- ok?
- return variable
-
- end)
-
- -- load all templates for the given language
- local templates = template.templates(language)
-
- -- TODO: deprecated
- -- in order to be compatible with the old version template
- local templates_old = { quickapp_qt = "qt.quickapp",
- widgetapp_qt = "qt.widgetapp",
- console_qt = "qt.console",
- static_qt = "qt.static",
- shared_qt = "qt.shared",
- console_tbox = "tbox.console",
- static_tbox = "tbox.static",
- shared_tbox = "tbox.shared"}
- if templates_old[templateid] then
- deprecated.add("template(" .. templates_old[templateid] .. ")", "template(" .. templateid .. ")")
- templateid = templates_old[templateid]
- end
-
- -- get the given template module
- local module = nil
- if templates then
- for _, t in ipairs(templates) do
- if t.name == templateid then
- module = t
+ -- get the template name and info
+ local templatename = nil
+ local templateinfo = nil
+ for name, info in pairs(results) do
+ templatename = name
+ templateinfo = info
break
end
- end
- end
-
- -- load the template module
- if not module then
- return false, string.format("invalid template id: %s!", templateid)
- end
-
- -- enter the template directory
- if not module._DIRECTORY or not os.cd(module._DIRECTORY) then
- return false, string.format("not found template id: %s!", templateid)
- end
-
- -- check the template project
- if not module.projectdir or not os.isdir(module.projectdir) then
- return false, string.format("the template project not exists!")
- end
-
- -- ensure the project directory
- if not os.isdir(projectdir) then
- os.mkdir(projectdir)
- end
-
- -- copy the project files
- local ok, errors = os.cp(path.join(module.projectdir, "*"), projectdir)
- if not ok then
- return false, errors
- end
-
- -- enter the project directory
- if not os.cd(projectdir) then
- return false, string.format("can not enter %s!", projectdir)
- end
-
- -- replace macros
- if module.macros and module.macrofiles then
- ok, errors = template._replace(module.macros, module.macrofiles)
- if not ok then
- return false, errors
- end
- end
+ if not templateinfo then
+ return nil, string.format("%s: package not found!", templatefile)
+ end
- -- create project
- if module.create then
- local ok, errors = sandbox.load(module.create)
- if not ok then
- utils.error(errors)
- return false
- end
- end
+ -- new an instance
+ local instance = _instance.new(templatename, templateinfo, path.directory(templatefile))
- -- append FAQ to xmake.lua
- local projectfile = path.join(projectdir, "xmake.lua")
- if os.isfile(projectfile) then
- local file = io.open(projectfile, "a+")
- if file then
- file:print("")
- file:print(template.faq())
- file:close()
+ -- insert to templates
+ table.insert(templates, instance)
end
end
-
- -- generate .gitignore
- os.cp(path.join(os.programdir(), "scripts", "gitignore"), path.join(projectdir, ".gitignore"))
-
- -- ok
- return true
-end
-
--- get FAQ
-function template.faq()
- return [[
---
--- FAQ
---
--- You can enter the project directory firstly before building project.
---
--- $ cd projectdir
---
--- 1. How to build project?
---
--- $ xmake
---
--- 2. How to configure project?
---
--- $ xmake f -p [macosx|linux|iphoneos ..] -a [x86_64|i386|arm64 ..] -m [debug|release]
---
--- 3. Where is the build output directory?
---
--- The default output directory is `./build` and you can configure the output directory.
---
--- $ xmake f -o outputdir
--- $ xmake
---
--- 4. How to run and debug target after building project?
---
--- $ xmake run [targetname]
--- $ xmake run -d [targetname]
---
--- 5. How to install target to the system directory or other output directory?
---
--- $ xmake install
--- $ xmake install -o installdir
---
--- 6. Add some frequently-used compilation flags in xmake.lua
---
--- @code
--- -- add macro defination
--- add_defines("NDEBUG", "_GNU_SOURCE=1")
---
--- -- set warning all as error
--- set_warnings("all", "error")
---
--- -- set language: c99, c++11
--- set_languages("c99", "cxx11")
---
--- -- set optimization: none, faster, fastest, smallest
--- set_optimize("fastest")
---
--- -- add include search directories
--- add_includedirs("/usr/include", "/usr/local/include")
---
--- -- add link libraries and search directories
--- add_links("tbox", "z", "pthread")
--- add_linkdirs("/usr/local/lib", "/usr/lib")
---
--- -- add compilation and link flags
--- add_cxflags("-stdnolib", "-fno-strict-aliasing")
--- add_ldflags("-L/usr/local/lib", "-lpthread", {force = true})
---
--- @endcode
---
--- 7. If you want to known more usage about xmake, please see http://xmake.io/#/home
---
- ]]
+ return templates
end
-- return module: template