summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2016-12-23 08:44:49 +0800
committerruki <[email protected]>2017-01-06 17:20:08 +0800
commit41b436bf13e65ea0a9eb3e826d944a626e387df2 (patch)
tree9c0b16f1a065e1a8429e20a5e5d68ab8d02672ee
parentb068b2c7639c75d3c599d1e4851de87b7bc70cfd (diff)
add api define for interpreter
-rw-r--r--xmake/core/base/interpreter.lua67
-rw-r--r--xmake/core/language/language.lua6
-rw-r--r--xmake/core/project/project.lua59
-rwxr-xr-xxmake/languages/c++/xmake.lua6
4 files changed, 80 insertions, 58 deletions
diff --git a/xmake/core/base/interpreter.lua b/xmake/core/base/interpreter.lua
index 2c7a23cf0..af21e9b82 100644
--- a/xmake/core/base/interpreter.lua
+++ b/xmake/core/base/interpreter.lua
@@ -1088,6 +1088,73 @@ function interpreter:api_register_add_pathes(scope_kind, ...)
self:_api_register_xxx_values(scope_kind, "add", implementation, ...)
end
+-- define apis
+--
+-- @code
+-- interp:api_define
+-- {
+-- values =
+-- {
+-- -- target.add_xxx
+-- "target.add_links"
+-- , "target.add_goflags"
+-- , "target.add_ldflags"
+-- , "target.add_arflags"
+-- , "target.add_shflags"
+-- -- option.add_xxx
+-- , "option.add_links"
+-- , "option.add_goflags"
+-- , "option.add_ldflags"
+-- , "option.add_arflags"
+-- , "option.add_shflags"
+-- }
+-- , pathes =
+-- {
+-- -- target.add_xxx
+-- "target.add_linkdirs"
+-- -- option.add_xxx
+-- , "option.add_linkdirs"
+-- }
+-- }
+-- @endcode
+--
+function interpreter:api_define(apis)
+
+ -- register language apis
+ for apitype, apifuncs in pairs(apis) do
+ for _, apifunc in ipairs(apifuncs) do
+
+ -- get api function
+ apifunc = apifunc:split('.')
+ local apiscope = apifunc[1]
+ local funcname = apifunc[2]
+ assert(apiscope and funcname)
+
+ -- get function prefix
+ local prefix = nil
+ for _, name in ipairs({"set", "add", "on", "before", "after"}) do
+ if funcname:startswith(name .. "_") then
+ prefix = name
+ break
+ end
+ end
+ assert(prefix)
+
+ -- get function name
+ funcname = funcname:sub(#prefix + 2)
+
+ -- get register
+ local register = self[string.format("api_register_%s_%s", prefix, apitype)]
+ if not register then
+ os.raise("interp:api_register_%s_%s() is unknown!", prefix, apitype)
+ end
+
+ -- register api
+ register(self, apiscope, funcname)
+ end
+ end
+end
+
-- the builtin api: add_subdirs()
function interpreter:api_builtin_add_subdirs(...)
diff --git a/xmake/core/language/language.lua b/xmake/core/language/language.lua
index 43b77898e..3800647cc 100644
--- a/xmake/core/language/language.lua
+++ b/xmake/core/language/language.lua
@@ -272,12 +272,12 @@ function language.apis()
-- load all languages
local languages, errors = language.load()
if not languages then
- return nil, errors
+ os.raise(errors)
end
-
+
-- merge apis for each language
local apis = {values = {}, pathes = {}}
- for _, instance in pairs(languages) do
+ for name, instance in pairs(languages) do
local instance_apis = instance:get("apis")
if instance_apis then
table.join2(apis.values, table.wrap(instance_apis.values))
diff --git a/xmake/core/project/project.lua b/xmake/core/project/project.lua
index fd42e661c..9caacffbc 100644
--- a/xmake/core/project/project.lua
+++ b/xmake/core/project/project.lua
@@ -299,11 +299,11 @@ function project._interpreter()
-- register api: target(), option() and task()
interp:api_register_scope("target", "option", "task")
--- table.dump(language.apis())
+ -- define apis for language
+ interp:api_define(language.apis())
-- register api: set_values() to target
interp:api_register_set_values("target", "kind"
- , "config_h_prefix"
, "version"
, "project"
, "strip"
@@ -315,35 +315,16 @@ function project._interpreter()
-- register api: add_values() to target
interp:api_register_add_values("target", "deps"
- , "links"
- , "cflags"
- , "cxflags"
- , "cxxflags"
- , "mflags"
- , "mxflags"
- , "mxxflags"
- , "ldflags"
- , "arflags"
- , "shflags"
, "options"
- , "defines"
- , "undefines"
- , "defines_h"
- , "undefines_h"
, "languages"
, "vectorexts")
-- register api: set_pathes() to target
- interp:api_register_set_pathes("target", "headerdir"
- , "targetdir"
- , "objectdir"
- , "config_h")
+ interp:api_register_set_pathes("target", "targetdir"
+ , "objectdir")
-- register api: add_pathes() to target
- interp:api_register_add_pathes("target", "files"
- , "headers"
- , "linkdirs"
- , "includedirs")
+ interp:api_register_add_pathes("target", "files")
-- register api: on_action() to target
@@ -380,36 +361,10 @@ function project._interpreter()
, "description")
-- register api: add_values() to option
- interp:api_register_add_values("option", "links"
- , "cincludes"
- , "cxxincludes"
- , "cfuncs"
- , "cxxfuncs"
- , "ctypes"
- , "cxxtypes"
- , "cflags"
- , "cxflags"
- , "cxxflags"
- , "mflags"
- , "mxflags"
- , "mxxflags"
- , "ldflags"
- , "arflags"
- , "shflags"
- , "vectorexts"
+ interp:api_register_add_values("option", "vectorexts"
, "bindings"
- , "rbindings"
- , "defines"
- , "defines_if_ok"
- , "defines_h_if_ok"
- , "undefines"
- , "undefines_if_ok"
- , "undefines_h_if_ok")
+ , "rbindings")
- -- register api: add_pathes() to option
- interp:api_register_add_pathes("option", "linkdirs"
- , "includedirs")
-
-- register api: add_cfunc() and add_cfuncs() to target
interp:api_register("target", "add_cfunc", project._api_add_cfunc)
interp:api_register("target", "add_cfuncs", project._api_add_cfuncs)
diff --git a/xmake/languages/c++/xmake.lua b/xmake/languages/c++/xmake.lua
index 20c2087bd..7854a6e98 100755
--- a/xmake/languages/c++/xmake.lua
+++ b/xmake/languages/c++/xmake.lua
@@ -38,8 +38,8 @@ language("c++")
_g.shflags = {}
-- init apis
- _g.api = {}
- _g.api.values =
+ _g.apis = {}
+ _g.apis.values =
{
-- target.set_xxx
"target.set_config_h_prefix"
@@ -76,7 +76,7 @@ language("c++")
, "option.add_undefines_if_ok"
, "option.add_undefines_h_if_ok"
}
- _g.api.pathes =
+ _g.apis.pathes =
{
-- target.set_xxx
"target.set_headerdir"