diff options
| author | ruki <[email protected]> | 2019-09-19 00:49:34 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2019-09-18 22:57:25 +0800 |
| commit | bb3455b845e0b776937283b3ddae4ae557eea52e (patch) | |
| tree | 7625b08ec58620e048410017bfe18ff3fa536548 /xmake/core/project/template.lua | |
| parent | 916078fdb2904340ef2003a46057d9232194511a (diff) | |
improve template
Diffstat (limited to 'xmake/core/project/template.lua')
| -rw-r--r-- | xmake/core/project/template.lua | 304 |
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 |
