summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2021-08-31 23:01:38 +0800
committerruki <[email protected]>2021-08-31 12:49:15 +0800
commit219f20a76c2fa40b83ffff7a5fb8967079ef8c7a (patch)
treef4288545ad72b1a5353596b19aa63b6d7de49e7a
parent1b8e4e472b6a7a1d1aeaf65a4a1e7193bcfdc499 (diff)
improve vala rules and add more vala tests
-rw-r--r--tests/projects/vala/sharedlib/src/main.vala6
-rw-r--r--tests/projects/vala/sharedlib/src/mymath.vala9
-rw-r--r--tests/projects/vala/sharedlib/xmake.lua18
-rw-r--r--tests/projects/vala/staticlib/src/main.vala6
-rw-r--r--tests/projects/vala/staticlib/src/mymath.vala9
-rw-r--r--tests/projects/vala/staticlib/xmake.lua18
-rw-r--r--xmake/rules/vala/xmake.lua83
7 files changed, 148 insertions, 1 deletions
diff --git a/tests/projects/vala/sharedlib/src/main.vala b/tests/projects/vala/sharedlib/src/main.vala
new file mode 100644
index 000000000..da9fd895e
--- /dev/null
+++ b/tests/projects/vala/sharedlib/src/main.vala
@@ -0,0 +1,6 @@
+using MyMath;
+
+public void main() {
+ stdout.printf("\n\t2 + 3 is %d", sum(2, 3));
+ stdout.printf("\n\t8 squared is %d\n", square(8));
+}
diff --git a/tests/projects/vala/sharedlib/src/mymath.vala b/tests/projects/vala/sharedlib/src/mymath.vala
new file mode 100644
index 000000000..4f4e761c5
--- /dev/null
+++ b/tests/projects/vala/sharedlib/src/mymath.vala
@@ -0,0 +1,9 @@
+namespace MyMath {
+ public int sum(int a, int b) {
+ return(a + b);
+ }
+
+ public int square(int a) {
+ return(a * a);
+ }
+}
diff --git a/tests/projects/vala/sharedlib/xmake.lua b/tests/projects/vala/sharedlib/xmake.lua
new file mode 100644
index 000000000..10c90c88b
--- /dev/null
+++ b/tests/projects/vala/sharedlib/xmake.lua
@@ -0,0 +1,18 @@
+add_rules("mode.release", "mode.debug")
+
+add_requires("glib")
+
+target("mymath")
+ set_kind("shared")
+ add_rules("vala")
+ add_files("src/mymath.vala")
+ add_values("vala.header", "mymath.h")
+ add_values("vala.vapi", "mymath-1.0.vapi")
+ add_packages("glib")
+
+target("test")
+ set_kind("binary")
+ add_deps("mymath")
+ add_rules("vala")
+ add_files("src/main.vala")
+ add_packages("glib")
diff --git a/tests/projects/vala/staticlib/src/main.vala b/tests/projects/vala/staticlib/src/main.vala
new file mode 100644
index 000000000..da9fd895e
--- /dev/null
+++ b/tests/projects/vala/staticlib/src/main.vala
@@ -0,0 +1,6 @@
+using MyMath;
+
+public void main() {
+ stdout.printf("\n\t2 + 3 is %d", sum(2, 3));
+ stdout.printf("\n\t8 squared is %d\n", square(8));
+}
diff --git a/tests/projects/vala/staticlib/src/mymath.vala b/tests/projects/vala/staticlib/src/mymath.vala
new file mode 100644
index 000000000..4f4e761c5
--- /dev/null
+++ b/tests/projects/vala/staticlib/src/mymath.vala
@@ -0,0 +1,9 @@
+namespace MyMath {
+ public int sum(int a, int b) {
+ return(a + b);
+ }
+
+ public int square(int a) {
+ return(a * a);
+ }
+}
diff --git a/tests/projects/vala/staticlib/xmake.lua b/tests/projects/vala/staticlib/xmake.lua
new file mode 100644
index 000000000..d37f1b974
--- /dev/null
+++ b/tests/projects/vala/staticlib/xmake.lua
@@ -0,0 +1,18 @@
+add_rules("mode.release", "mode.debug")
+
+add_requires("glib")
+
+target("mymath")
+ set_kind("static")
+ add_rules("vala")
+ add_files("src/mymath.vala")
+ add_values("vala.header", "mymath.h")
+ add_values("vala.vapi", "mymath-1.0.vapi")
+ add_packages("glib")
+
+target("test")
+ set_kind("binary")
+ add_deps("mymath")
+ add_rules("vala")
+ add_files("src/main.vala")
+ add_packages("glib")
diff --git a/xmake/rules/vala/xmake.lua b/xmake/rules/vala/xmake.lua
index a2ce76937..a0d5775d8 100644
--- a/xmake/rules/vala/xmake.lua
+++ b/xmake/rules/vala/xmake.lua
@@ -18,7 +18,7 @@
-- @file xmake.lua
--
-rule("vala")
+rule("vala.build")
set_extensions(".vala")
on_load(function (target)
-- only vala source files? we need patch c source kind for linker
@@ -26,6 +26,21 @@ rule("vala")
if #sourcekinds == 0 then
table.insert(sourcekinds, "cc")
end
+
+ -- we disable to build across targets in parallel, because the source files may depend on other target modules
+ target:set("policy", "build.across_targets_in_parallel", false)
+
+ -- get vapi file
+ local vapifile = target:data("vala.vapifile")
+ if not vapifile then
+ local vapiname = target:values("vala.vapi")
+ if vapiname then
+ vapifile = path.join(target:targetdir(), vapiname)
+ else
+ vapifile = path.join(target:targetdir(), target:name() .. ".vapi")
+ end
+ target:data_set("vala.vapifile", vapifile)
+ end
end)
before_buildcmd_file(function (target, batchcmds, sourcefile_vala, opt)
@@ -52,6 +67,21 @@ rule("vala")
table.insert(argv, package)
end
end
+ if target:is_binary() then
+ for _, dep in ipairs(target:orderdeps()) do
+ if dep:is_shared() or dep:is_static() then
+ local vapifile = dep:data("vala.vapifile")
+ if vapifile then
+ table.join2(argv, vapifile)
+ end
+ end
+ end
+ else
+ local vapifile = target:data("vala.vapifile")
+ if vapifile then
+ table.insert(argv, "--vapi=" .. vapifile)
+ end
+ end
table.insert(argv, sourcefile_vala)
batchcmds:vrunv(valac.program, argv)
batchcmds:compile(sourcefile_c, objectfile)
@@ -62,3 +92,54 @@ rule("vala")
batchcmds:set_depcache(target:dependfile(objectfile))
end)
+ after_install(function (target)
+ if target:is_shared() or target:is_static() then
+ local vapifile = target:data("vala.vapifile")
+ if vapifile then
+ local installdir = target:installdir()
+ if installdir then
+ local sharedir = path.join(installdir, "share")
+ os.mkdir(sharedir)
+ os.vcp(vapifile, sharedir)
+ end
+ end
+ end
+ end)
+
+ after_uninstall(function (target)
+ if target:is_shared() or target:is_static() then
+ local vapifile = target:data("vala.vapifile")
+ if vapifile then
+ local installdir = target:installdir()
+ if installdir then
+ os.rm(path.join(installdir, "share", path.filename(vapifile)))
+ end
+ end
+ end
+ end)
+
+rule("vala")
+
+ -- add build rules
+ add_deps("vala.build")
+
+ -- set compiler runtime, e.g. vs runtime
+ add_deps("utils.compiler.runtime")
+
+ -- inherit links and linkdirs of all dependent targets by default
+ add_deps("utils.inherit.links")
+
+ -- support `add_files("src/*.o")` and `add_files("src/*.a")` to merge object and archive files to target
+ add_deps("utils.merge.object", "utils.merge.archive")
+
+ -- we attempt to extract symbols to the independent file and
+ -- strip self-target binary if `set_symbols("debug")` and `set_strip("all")` are enabled
+ add_deps("utils.symbols.extract")
+
+ -- check targets
+ add_deps("utils.check.targets")
+
+ -- check licenses
+ add_deps("utils.check.licenses")
+
+