summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2022-09-27 00:42:29 +0800
committerruki <[email protected]>2022-09-27 00:42:29 +0800
commit411e455ba256d4f67289a267f62a74930212c8f9 (patch)
tree37f7de08a517453c1370fa5541d880690598fa1b
parent76bced915dfb870a34528270a02236a3f5f6ff4e (diff)
add set_base to rules
-rw-r--r--tests/apis/rules_override_cxx/src/main.xx6
-rw-r--r--tests/apis/rules_override_cxx/xmake.lua26
-rw-r--r--tests/apis/rules_override_order/src/main.cc6
-rw-r--r--tests/apis/rules_override_order/xmake.lua15
-rw-r--r--tests/projects/c++/unity_build/src/test.cpp8
-rw-r--r--xmake/core/project/project.lua4
-rw-r--r--xmake/core/project/rule.lua22
7 files changed, 85 insertions, 2 deletions
diff --git a/tests/apis/rules_override_cxx/src/main.xx b/tests/apis/rules_override_cxx/src/main.xx
new file mode 100644
index 000000000..d612d8782
--- /dev/null
+++ b/tests/apis/rules_override_cxx/src/main.xx
@@ -0,0 +1,6 @@
+#include <stdio.h>
+
+int main(int argc, char** argv)
+{
+ return 0;
+}
diff --git a/tests/apis/rules_override_cxx/xmake.lua b/tests/apis/rules_override_cxx/xmake.lua
new file mode 100644
index 000000000..0dc2261ca
--- /dev/null
+++ b/tests/apis/rules_override_cxx/xmake.lua
@@ -0,0 +1,26 @@
+rule("xx.build")
+ set_base("c++.build")
+ set_extensions(".xx")
+ on_load(function (target)
+ local sourcebatch = target:sourcebatches()["xx.build"]
+ sourcebatch.sourcekind = "cxx"
+ sourcebatch.objectfiles = {}
+ sourcebatch.dependfiles = {}
+ for _, sourcefile in ipairs(sourcebatch.sourcefiles) do
+ local objectfile = target:objectfile(sourcefile)
+ local dependfile = target:dependfile(objectfile)
+ table.insert(sourcebatch.objectfiles, objectfile)
+ table.insert(sourcebatch.dependfiles, dependfile)
+ end
+ target:add("cxxflags", "-x c++")
+ end)
+
+rule("xx")
+ set_base("c++")
+ add_deps("xx.build")
+
+target("test")
+ set_kind("binary")
+ add_rules("xx")
+ add_files("src/*.xx")
+
diff --git a/tests/apis/rules_override_order/src/main.cc b/tests/apis/rules_override_order/src/main.cc
new file mode 100644
index 000000000..d612d8782
--- /dev/null
+++ b/tests/apis/rules_override_order/src/main.cc
@@ -0,0 +1,6 @@
+#include <stdio.h>
+
+int main(int argc, char** argv)
+{
+ return 0;
+}
diff --git a/tests/apis/rules_override_order/xmake.lua b/tests/apis/rules_override_order/xmake.lua
new file mode 100644
index 000000000..61b42a943
--- /dev/null
+++ b/tests/apis/rules_override_order/xmake.lua
@@ -0,0 +1,15 @@
+rule("cppfront")
+ set_extensions(".cpp2")
+ on_build_files(function (target, batchjobs, sourcebatch, opt)
+ print("on_build_files")
+ end, {batch = true, distcc = true})
+
+rule("xx")
+ set_base("c++")
+ add_deps("cppfront", {order = true})
+
+target("test")
+ set_kind("binary")
+ add_rules("xx")
+ add_files("src/*.cc")
+
diff --git a/tests/projects/c++/unity_build/src/test.cpp b/tests/projects/c++/unity_build/src/test.cpp
new file mode 100644
index 000000000..27d41ee50
--- /dev/null
+++ b/tests/projects/c++/unity_build/src/test.cpp
@@ -0,0 +1,8 @@
+#include "header.h"
+
+int main(int argc, char** argv)
+{
+ std::string s("xmake");
+ printf("hello %s!\n", s.c_str());
+ return 0;
+}
diff --git a/xmake/core/project/project.lua b/xmake/core/project/project.lua
index f48a45205..3c4c39232 100644
--- a/xmake/core/project/project.lua
+++ b/xmake/core/project/project.lua
@@ -326,6 +326,10 @@ function project._load_rules()
for _, instance in pairs(instances) do
instance._DEPS = instance._DEPS or {}
instance._ORDERDEPS = instance._ORDERDEPS or {}
+ local base = instance:get("base")
+ if base then
+ instance._BASE = instances[base]
+ end
project._load_deps(instance, instances, instance._DEPS, instance._ORDERDEPS, {instance:name()})
end
return rules
diff --git a/xmake/core/project/rule.lua b/xmake/core/project/rule.lua
index 599294a45..841203c9d 100644
--- a/xmake/core/project/rule.lua
+++ b/xmake/core/project/rule.lua
@@ -150,6 +150,7 @@ function rule.apis()
"rule.set_extensions"
, "rule.set_sourcekinds"
, "rule.set_kind"
+ , "rule.set_base"
-- rule.add_xxx
, "rule.add_deps"
, "rule.add_imports"
@@ -214,14 +215,31 @@ function rule.new(name, info)
return instance
end
+-- get the base rule
+function rule:base()
+ return self._BASE
+end
+
-- get the rule info
function rule:get(name)
- return self._INFO:get(name)
+ local value = self._INFO:get(name)
+ if value == nil and self:base() then
+ value = self:base():get(name)
+ end
+ if value ~= nil then
+ return value
+ end
end
-- get the extra configuration
function rule:extraconf(name, item, key)
- return self._INFO:extraconf(name, item, key)
+ local value = self._INFO:extraconf(name, item, key)
+ if value == nil and self:base() then
+ value = self:base():extraconf(name)
+ end
+ if value ~= nil then
+ return value
+ end
end
-- get the rule name