summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2019-09-01 21:59:41 +0800
committerruki <[email protected]>2019-09-01 21:59:41 +0800
commit80b583a69845241f61e142c99341c18583316171 (patch)
tree1fcddf381b98e61b650270d1a454de91e9c3378d
parent4e2efd1b22f337a94d9186eb213a1ba1bd76bc55 (diff)
add utils.merge.archive rule
-rw-r--r--core/src/xmake/os/mtime.c2
-rw-r--r--tests/projects/other/merge_archive/src/add.c (renamed from tests/projects/other/merge_static_library/src/add.c)0
-rw-r--r--tests/projects/other/merge_archive/src/mul.c (renamed from tests/projects/other/merge_static_library/src/mul.c)0
-rw-r--r--tests/projects/other/merge_archive/src/sub.c (renamed from tests/projects/other/merge_static_library/src/sub.c)0
-rw-r--r--tests/projects/other/merge_archive/test.lua (renamed from tests/projects/other/merge_static_library/test.lua)0
-rw-r--r--tests/projects/other/merge_archive/xmake.lua22
-rw-r--r--tests/projects/other/merge_static_library/xmake.lua38
-rw-r--r--xmake/rules/asm/xmake.lua2
-rw-r--r--xmake/rules/c++/xmake.lua2
-rw-r--r--xmake/rules/dlang/xmake.lua2
-rw-r--r--xmake/rules/objc++/xmake.lua2
-rw-r--r--xmake/rules/utils/merge_archive/xmake.lua74
-rw-r--r--xmake/rules/utils/merge_object/xmake.lua5
13 files changed, 105 insertions, 44 deletions
diff --git a/core/src/xmake/os/mtime.c b/core/src/xmake/os/mtime.c
index 690ba46c1..dc9d70a22 100644
--- a/core/src/xmake/os/mtime.c
+++ b/core/src/xmake/os/mtime.c
@@ -44,7 +44,7 @@ tb_int_t xm_os_mtime(lua_State* lua)
// done os.mtime(path)
tb_file_info_t info = {0};
- if (tb_file_info(path, &info) && (info.type == TB_FILE_TYPE_FILE))
+ if (tb_file_info(path, &info))
lua_pushinteger(lua, (lua_Integer)info.mtime);
else lua_pushinteger(lua, 0);
diff --git a/tests/projects/other/merge_static_library/src/add.c b/tests/projects/other/merge_archive/src/add.c
index be1e084fc..be1e084fc 100644
--- a/tests/projects/other/merge_static_library/src/add.c
+++ b/tests/projects/other/merge_archive/src/add.c
diff --git a/tests/projects/other/merge_static_library/src/mul.c b/tests/projects/other/merge_archive/src/mul.c
index c4292f9aa..c4292f9aa 100644
--- a/tests/projects/other/merge_static_library/src/mul.c
+++ b/tests/projects/other/merge_archive/src/mul.c
diff --git a/tests/projects/other/merge_static_library/src/sub.c b/tests/projects/other/merge_archive/src/sub.c
index b151ec4bc..b151ec4bc 100644
--- a/tests/projects/other/merge_static_library/src/sub.c
+++ b/tests/projects/other/merge_archive/src/sub.c
diff --git a/tests/projects/other/merge_static_library/test.lua b/tests/projects/other/merge_archive/test.lua
index b76241be2..b76241be2 100644
--- a/tests/projects/other/merge_static_library/test.lua
+++ b/tests/projects/other/merge_archive/test.lua
diff --git a/tests/projects/other/merge_archive/xmake.lua b/tests/projects/other/merge_archive/xmake.lua
new file mode 100644
index 000000000..81b22c5e0
--- /dev/null
+++ b/tests/projects/other/merge_archive/xmake.lua
@@ -0,0 +1,22 @@
+add_rules("mode.debug", "mode.release")
+
+target("add")
+ set_kind("static")
+ add_files("src/add.c")
+ set_targetdir("$(buildir)/merge_archive")
+
+target("sub")
+ set_kind("static")
+ add_files("src/sub.c")
+ set_targetdir("$(buildir)/merge_archive")
+
+target("mul")
+ set_kind("static")
+ add_deps("add", "sub")
+ add_files("src/mul.c")
+ if is_plat("windows") then
+ add_files("$(buildir)/merge_archive/*.lib")
+ else
+ add_files("$(buildir)/merge_archive/*.a")
+ end
+
diff --git a/tests/projects/other/merge_static_library/xmake.lua b/tests/projects/other/merge_static_library/xmake.lua
deleted file mode 100644
index 729648ca2..000000000
--- a/tests/projects/other/merge_static_library/xmake.lua
+++ /dev/null
@@ -1,38 +0,0 @@
--- add rules
-add_rules("mode.debug", "mode.release")
-
--- add target
-target("add")
-
- -- set kind
- set_kind("static")
-
- -- add files
- add_files("src/add.c")
-
--- add target
-target("sub")
-
- -- set kind
- set_kind("static")
-
- -- add files
- add_files("src/sub.c")
-
--- add target
-target("mul")
-
- -- set kind
- set_kind("static")
-
- -- add deps
- add_deps("add", "sub")
-
- -- add files
- add_files("src/mul.c")
- add_files("build/libadd.a")
- add_files("build/libsub.a")
-
- -- add link directory
- add_linkdirs("$(buildir)")
-
diff --git a/xmake/rules/asm/xmake.lua b/xmake/rules/asm/xmake.lua
index 57d399c94..3a7e85f59 100644
--- a/xmake/rules/asm/xmake.lua
+++ b/xmake/rules/asm/xmake.lua
@@ -27,4 +27,4 @@ rule("asm.build")
-- define rule: asm
rule("asm")
- add_deps("asm.build", "utils.merge.object")
+ add_deps("asm.build", "utils.merge.object", "utils.merge.archive")
diff --git a/xmake/rules/c++/xmake.lua b/xmake/rules/c++/xmake.lua
index c839f9f4b..1330fbfca 100644
--- a/xmake/rules/c++/xmake.lua
+++ b/xmake/rules/c++/xmake.lua
@@ -48,4 +48,4 @@ rule("cpp.build")
-- define rule: cpp
rule("cpp")
- add_deps("cpp.build", "c.build", "utils.merge.object")
+ add_deps("cpp.build", "c.build", "utils.merge.object", "utils.merge.archive")
diff --git a/xmake/rules/dlang/xmake.lua b/xmake/rules/dlang/xmake.lua
index 6b73b5e2b..27f06c432 100644
--- a/xmake/rules/dlang/xmake.lua
+++ b/xmake/rules/dlang/xmake.lua
@@ -27,4 +27,4 @@ rule("dlang.build")
-- define rule: dlang
rule("dlang")
- add_deps("dlang.build", "utils.merge.object")
+ add_deps("dlang.build", "utils.merge.object", "utils.merge.archive")
diff --git a/xmake/rules/objc++/xmake.lua b/xmake/rules/objc++/xmake.lua
index 824034705..986e3d1a3 100644
--- a/xmake/rules/objc++/xmake.lua
+++ b/xmake/rules/objc++/xmake.lua
@@ -36,4 +36,4 @@ rule("objc++.build")
-- define rule: objc
rule("objc++")
- add_deps("objc++.build", "objc.build", "utils.merge.object")
+ add_deps("objc++.build", "objc.build", "utils.merge.object", "utils.merge.archive")
diff --git a/xmake/rules/utils/merge_archive/xmake.lua b/xmake/rules/utils/merge_archive/xmake.lua
new file mode 100644
index 000000000..ee72530d5
--- /dev/null
+++ b/xmake/rules/utils/merge_archive/xmake.lua
@@ -0,0 +1,74 @@
+--!A cross-platform build utility based on Lua
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+-- Copyright (C) 2015 - 2019, TBOOX Open Source Group.
+--
+-- @author ruki
+-- @file xmake.lua
+--
+
+-- define rule: utils.merge.archive
+rule("utils.merge.archive")
+
+ -- set extensions
+ set_extensions(".a", ".lib")
+
+ -- on build file
+ on_build_file(function (target, sourcefile_lib, opt)
+
+ -- imports
+ import("core.base.option")
+ import("core.theme.theme")
+ import("core.project.depend")
+ import("core.tool.extractor")
+ import("core.project.target", {alias = "project_target"})
+
+ -- get object directory of the archive file
+ local objectdir = target:objectfile(sourcefile_lib) .. ".dir"
+
+ -- add objectfiles
+ local objectfiles = os.files(path.join(objectdir, "**" .. project_target.filename("", "object")))
+ table.join2(target:objectfiles(), objectfiles)
+
+ -- load dependent info
+ local dependfile = target:dependfile(objectdir)
+ local dependinfo = option.get("rebuild") and {} or (depend.load(dependfile) or {})
+
+ -- need build this object?
+ if not depend.is_changed(dependinfo, {lastmtime = os.mtime(objectdir)}) then
+ return
+ end
+
+ -- trace progress info
+ cprintf("${color.build.progress}" .. theme.get("text.build.progress_format") .. ":${clear} ", opt.progress)
+ if option.get("verbose") then
+ cprint("${dim color.build.object}inserting.$(mode) %s", sourcefile_lib)
+ print("extracting %s to %s", sourcefile_lib, objectdir)
+ else
+ cprint("${color.build.object}inserting.$(mode) %s", sourcefile_lib)
+ end
+
+ -- flush io buffer to update progress info
+ io.flush()
+
+ -- extract the archive library
+ os.tryrm(objectdir)
+ extractor.extract(sourcefile_lib, objectdir)
+
+ -- update files to the dependent file
+ dependinfo.files = {}
+ table.insert(dependinfo.files, sourcefile_lib)
+ depend.save(dependinfo, dependfile)
+ end)
+
diff --git a/xmake/rules/utils/merge_object/xmake.lua b/xmake/rules/utils/merge_object/xmake.lua
index 4978752ac..1918631a9 100644
--- a/xmake/rules/utils/merge_object/xmake.lua
+++ b/xmake/rules/utils/merge_object/xmake.lua
@@ -30,7 +30,6 @@ rule("utils.merge.object")
-- imports
import("core.base.option")
import("core.theme.theme")
- import("core.project.config")
import("core.project.depend")
-- get object file
@@ -52,10 +51,14 @@ rule("utils.merge.object")
cprintf("${color.build.progress}" .. theme.get("text.build.progress_format") .. ":${clear} ", opt.progress)
if option.get("verbose") then
cprint("${dim color.build.object}inserting.$(mode) %s", sourcefile_obj)
+ print("copying %s to %s", sourcefile_obj, objectfile)
else
cprint("${color.build.object}inserting.$(mode) %s", sourcefile_obj)
end
+ -- flush io buffer to update progress info
+ io.flush()
+
-- insert this object file
os.cp(sourcefile_obj, objectfile)