summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2026-01-27 16:01:43 +0800
committerGitHub <[email protected]>2026-01-27 16:01:43 +0800
commita217ee2dc800dc9d3a022003f493c01fdebe745c (patch)
treea6ddd3e99d38b115a73004636811dac365d95c60
parente4c2c271e71fb51efe6e3bf7908e61838a13b695 (diff)
parent17344133cb2b52d04c0ad26ca9b8d61b5280aae9 (diff)
Merge pull request #7268 from luadebug/nim-increment
add dependency file generation for Nim source files
-rw-r--r--xmake/rules/nim/build/target.lua42
1 files changed, 42 insertions, 0 deletions
diff --git a/xmake/rules/nim/build/target.lua b/xmake/rules/nim/build/target.lua
index 7db19a559..52599b74d 100644
--- a/xmake/rules/nim/build/target.lua
+++ b/xmake/rules/nim/build/target.lua
@@ -25,6 +25,45 @@ import("core.tool.compiler")
import("core.project.depend")
import("utils.progress")
+-- generate dependency info
+function _generate_dependinfo(compinst, compflags, sourcefiles, dependinfo)
+
+ -- generate dependency file (.deps)
+ local flags = {}
+ local nimcache
+ for _, flag in ipairs(compflags) do
+ table.insert(flags, flag)
+ if flag:startswith("--nimcache:") then
+ nimcache = flag:sub(12)
+ end
+ end
+ table.insert(flags, "--genScript")
+
+ -- run nim --genScript to generate .deps file
+ local program = compinst:program()
+ local argv = table.join("c", flags, sourcefiles)
+ os.runv(program, argv, {envs = compinst:runenvs()})
+
+ -- parse .deps file
+ if nimcache then
+ for _, sourcefile in ipairs(sourcefiles) do
+ local filename = path.basename(sourcefile)
+ local depsfile = path.join(nimcache, filename .. ".deps")
+ if os.isfile(depsfile) then
+ local depsdata = io.readfile(depsfile)
+ if depsdata then
+ for _, line in ipairs(depsdata:split("\n")) do
+ line = line:trim()
+ if #line > 0 then
+ table.insert(dependinfo.files, line)
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
-- build the source files
function build_sourcefiles(target, sourcebatch, opt)
@@ -66,6 +105,9 @@ function build_sourcefiles(target, sourcebatch, opt)
dependinfo.files = {}
assert(compinst:build(sourcefiles, targetfile, {target = target, dependinfo = dependinfo, compflags = compflags}))
+ -- generate dependency file (.deps)
+ _generate_dependinfo(compinst, compflags, sourcefiles, dependinfo)
+
-- update files and values to the dependent file
dependinfo.values = depvalues
table.join2(dependinfo.files, sourcefiles)