diff options
| author | ruki <[email protected]> | 2017-09-09 00:36:21 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2017-09-08 21:38:11 +0800 |
| commit | 7755ecd8b9b751cfec483bb16d30a4764f1aad14 (patch) | |
| tree | 7eda71dec5ddd5beb285806e4dc05e04f0581f7f | |
| parent | efd2ebdcc6c0e278068a9090e7b62af9c2727284 (diff) | |
impl optional package
| -rw-r--r-- | xmake/actions/require/install.lua | 7 | ||||
| -rw-r--r-- | xmake/actions/require/list.lua | 2 | ||||
| -rw-r--r-- | xmake/actions/require/package.lua | 74 | ||||
| -rw-r--r-- | xmake/core/base/interpreter.lua | 4 | ||||
| -rw-r--r-- | xmake/core/sandbox/modules/import/core/project/project.lua | 2 |
5 files changed, 44 insertions, 45 deletions
diff --git a/xmake/actions/require/install.lua b/xmake/actions/require/install.lua index 4c4c91901..37218ed67 100644 --- a/xmake/actions/require/install.lua +++ b/xmake/actions/require/install.lua @@ -70,7 +70,10 @@ end function main(requires) -- init requires - requires = requires or project.requires() + local requires_extra = nil + if not requires then + requires, requires_extra = project.requires() + end if not requires or #requires == 0 then return end @@ -85,7 +88,7 @@ function main(requires) end -- load packages - local packages = package.load_packages(requires) + local packages = package.load_packages(requires, requires_extra) -- fetch packages from local first local packages_remote = {} diff --git a/xmake/actions/require/list.lua b/xmake/actions/require/list.lua index 5409babec..67f85f723 100644 --- a/xmake/actions/require/list.lua +++ b/xmake/actions/require/list.lua @@ -32,7 +32,7 @@ function main() -- list all requires print("Tha package dependencies:") for packagename, requireinfo in pairs(package.load_requires(project.requires())) do - print(" %s %s %s", packagename, requireinfo.version, requireinfo.mode) + print(" %s %s %s", packagename, requireinfo.version, ifelse(requireinfo.optional, "optional", "")) end end diff --git a/xmake/actions/require/package.lua b/xmake/actions/require/package.lua index 1aefc858f..f20e4c9f5 100644 --- a/xmake/actions/require/package.lua +++ b/xmake/actions/require/package.lua @@ -42,7 +42,7 @@ import("repository") -- add_requires("https://github.com/tboox/[email protected] >=1.5.1") -- add_requires("tboox.tbox >=1.5.1 <1.6.0 optional") -- -function _parse_require(require_str) +function _parse_require(require_str, requires_extra) -- get it from cache first local requires = _g._REQUIRES or {} @@ -58,25 +58,6 @@ function _parse_require(require_str) -- get package info local packageinfo = splitinfo[1] - -- get mode at last position - -- - -- .e.g - -- - -- must - -- optional - -- - local mode = "must" - if #splitinfo > 1 then - - -- get mode - local modes = {must = true, optional = true} - local value = splitinfo[#splitinfo]:lower() - if modes[value] then - mode = value - table.remove(splitinfo) - end - end - -- get version -- -- .e.g @@ -118,10 +99,16 @@ function _parse_require(require_str) -- check package name assert(packagename, "require(\"%s\"): the package name not found!", require_str) + -- get require extra + local require_extra = {} + if requires_extra then + require_extra = requires_extra[require_str] or {} + end + -- init required item local required = {} required.packagename = packagename - required.requireinfo = {reponame = reponame, packageurl = packageurl, version = version, mode = mode} + required.requireinfo = {reponame = reponame, packageurl = packageurl, version = version, optional = require_extra.optional, option = require_extra.option} -- save this required item to cache requires[require_str] = required @@ -187,6 +174,11 @@ function _load_package(packagename, requireinfo) end end + -- no this package and optional? + if not instance and requireinfo.optional then + return + end + -- check assert(instance, "package(%s) not found!", packagename) @@ -212,7 +204,7 @@ function _sort_packagedeps(package) end -- load all required packages -function _load_packages(requires) +function _load_packages(requires, requires_extra) -- no requires? if not requires or #requires == 0 then @@ -221,7 +213,7 @@ function _load_packages(requires) -- load packages local packages = {} - for packagename, requireinfo in pairs(load_requires(requires)) do + for packagename, requireinfo in pairs(load_requires(requires, requires_extra)) do -- attempt to get project option about this package local packageopt = project.option(packagename) @@ -230,20 +222,24 @@ function _load_packages(requires) -- load package instance local package = _load_package(packagename, requireinfo) - -- load dependent packages and save them first of this package - local deps = package:get("deps") - if deps then - local packagedeps = {} - for _, dep in ipairs(_load_packages(deps)) do - table.insert(packages, dep) - packagedeps[dep:name()] = dep + -- maybe package not found and optional + if package then + + -- load dependent packages and save them first of this package + local deps = package:get("deps") + if deps then + local packagedeps = {} + for _, dep in ipairs(_load_packages(deps, package:get("__extra_deps"))) do + table.insert(packages, dep) + packagedeps[dep:name()] = dep + end + package._DEPS = packagedeps + package._ORDERDEPS = table.unique(_sort_packagedeps(package)) end - package._DEPS = packagedeps - package._ORDERDEPS = table.unique(_sort_packagedeps(package)) - end - -- save this package instance - table.insert(packages, package) + -- save this package instance + table.insert(packages, package) + end end end @@ -327,14 +323,14 @@ function cachedir() end -- load requires -function load_requires(requires) +function load_requires(requires, requires_extra) -- parse requires local requireinfos = {} for _, require_str in ipairs(requires) do -- parse require info - local packagename, requireinfo = _parse_require(require_str) + local packagename, requireinfo = _parse_require(require_str, requires_extra) -- save this required package requireinfos[packagename] = requireinfo @@ -345,10 +341,10 @@ function load_requires(requires) end -- load all required packages -function load_packages(requires) +function load_packages(requires, requires_extra) -- laod all required packages recursively - local packages = _load_packages(requires) + local packages = _load_packages(requires, requires_extra) -- add all urls to fasturl and prepare to sort them together for _, package in ipairs(packages) do diff --git a/xmake/core/base/interpreter.lua b/xmake/core/base/interpreter.lua index d5b122e22..abd5a3945 100644 --- a/xmake/core/base/interpreter.lua +++ b/xmake/core/base/interpreter.lua @@ -92,7 +92,7 @@ function interpreter._merge_root_scope(root, root_prev, override) local scope_values = root_prev[scope_kind_and_name] or {} local scope_root = root[scope_kind_and_name] or {} for name, values in pairs(scope_root) do - if not name:startswith("__") then + if not name:startswith("__override_") then if scope_root["__override_" .. name] then if override or scope_values[name] == nil then scope_values[name] = values @@ -124,7 +124,7 @@ function interpreter._fetch_root_scope(root) local scope_values = root[scope_kind .. "." .. scope_name] or {} local scope_root = root[scope_kind] or {} for name, values in pairs(scope_root) do - if not name:startswith("__") then + if not name:startswith("__override_") then if scope_root["__override_" .. name] then if scope_values[name] == nil then scope_values[name] = values diff --git a/xmake/core/sandbox/modules/import/core/project/project.lua b/xmake/core/sandbox/modules/import/core/project/project.lua index eb8aa4422..a1ee7c0fd 100644 --- a/xmake/core/sandbox/modules/import/core/project/project.lua +++ b/xmake/core/sandbox/modules/import/core/project/project.lua @@ -180,7 +180,7 @@ end -- get the project requires function sandbox_core_project.requires() - return project.get("requires") + return project.get("requires"), project.get("__extra_requires") end -- return module |
