diff options
| author | ruki <[email protected]> | 2019-09-01 21:59:41 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2019-09-01 21:59:41 +0800 |
| commit | 80b583a69845241f61e142c99341c18583316171 (patch) | |
| tree | 1fcddf381b98e61b650270d1a454de91e9c3378d | |
| parent | 4e2efd1b22f337a94d9186eb213a1ba1bd76bc55 (diff) | |
add utils.merge.archive rule
| -rw-r--r-- | core/src/xmake/os/mtime.c | 2 | ||||
| -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.lua | 22 | ||||
| -rw-r--r-- | tests/projects/other/merge_static_library/xmake.lua | 38 | ||||
| -rw-r--r-- | xmake/rules/asm/xmake.lua | 2 | ||||
| -rw-r--r-- | xmake/rules/c++/xmake.lua | 2 | ||||
| -rw-r--r-- | xmake/rules/dlang/xmake.lua | 2 | ||||
| -rw-r--r-- | xmake/rules/objc++/xmake.lua | 2 | ||||
| -rw-r--r-- | xmake/rules/utils/merge_archive/xmake.lua | 74 | ||||
| -rw-r--r-- | xmake/rules/utils/merge_object/xmake.lua | 5 |
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) |
