summaryrefslogtreecommitdiff
path: root/xmake/modules/core/project
diff options
context:
space:
mode:
authorruki <[email protected]>2020-10-03 21:28:05 +0800
committerruki <[email protected]>2020-10-03 21:28:05 +0800
commit1609e5e293dab647a7a892d3efb5ceffdf411fd2 (patch)
tree6dc2c0510e39bebc0990c97e48207303a1c0271f /xmake/modules/core/project
parentc1f1db8e3358255e95afb22b5f16da683ec696e2 (diff)
add depend.on_changed
Diffstat (limited to 'xmake/modules/core/project')
-rw-r--r--xmake/modules/core/project/depend.lua54
1 files changed, 54 insertions, 0 deletions
diff --git a/xmake/modules/core/project/depend.lua b/xmake/modules/core/project/depend.lua
index df50c40d6..cdc0a25f7 100644
--- a/xmake/modules/core/project/depend.lua
+++ b/xmake/modules/core/project/depend.lua
@@ -19,6 +19,7 @@
--
-- imports
+import("core.base.option")
import("private.tools.cl.parse_deps", {alias = "parse_deps_cl"})
import("private.tools.cl.parse_deps_json", {alias = "parse_deps_cl_json"})
import("private.tools.rc.parse_deps", {alias = "parse_deps_rc"})
@@ -131,3 +132,56 @@ function is_changed(dependinfo, opt)
end
end
end
+
+-- on changed for the dependent files and values
+--
+-- e.g.
+--
+-- depend.on_changed(function (dependinfo)
+-- -- do some thing
+-- -- ..
+--
+-- -- maybe need update dependent files
+-- dependinfo.files = {""}
+--
+-- -- return new dependinfo (optional)
+-- return {files = {}, ..}
+--
+-- end, {dependfile = "/xx/xx",
+-- values = {compinst:program(), compflags},
+-- files = {sourcefile, ...}})
+--
+function on_changed(callback, opt)
+
+ -- get files
+ opt = opt or {}
+ assert(opt.files, "depend.on_changed(): please set files list!")
+
+ -- get dependfile
+ local dependfile = opt.dependfile
+ if not dependfile then
+ dependfile = os.tmpfile(table.concat(table.wrap(opt.files), ""))
+ end
+
+ -- load dependent info
+ local dependinfo = option.get("rebuild") and {} or (load(dependfile) or {})
+
+ -- need build this object?
+ -- @note we use mtime(dependfile) instead of mtime(objectfile) to ensure the object file is is fully compiled.
+ -- @see https://github.com/xmake-io/xmake/issues/748
+ if not is_changed(dependinfo, {lastmtime = opt.lastmtime or os.mtime(dependfile), values = opt.values}) then
+ return
+ end
+
+ -- do callback if changed and maybe files and values will be updated
+ dependinfo = callback() or {}
+
+ -- update files and values to the dependent file
+ dependinfo.files = dependinfo.files or {}
+ table.join2(dependinfo.files, opt.files)
+ if opt.values then
+ dependinfo.values = dependinfo.values or {}
+ table.join2(dependinfo.values, opt.values)
+ end
+ save(dependinfo, dependfile)
+end