summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2017-09-09 00:36:21 +0800
committerruki <[email protected]>2017-09-08 21:38:11 +0800
commit7755ecd8b9b751cfec483bb16d30a4764f1aad14 (patch)
tree7eda71dec5ddd5beb285806e4dc05e04f0581f7f
parentefd2ebdcc6c0e278068a9090e7b62af9c2727284 (diff)
impl optional package
-rw-r--r--xmake/actions/require/install.lua7
-rw-r--r--xmake/actions/require/list.lua2
-rw-r--r--xmake/actions/require/package.lua74
-rw-r--r--xmake/core/base/interpreter.lua4
-rw-r--r--xmake/core/sandbox/modules/import/core/project/project.lua2
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