Hey! Some team members on my project are having an issue where linking sometimes (seemingly at random) fails because the .o files that were supposed to be produced by the Nim compiler aren't there.
An example of what this looks like:
The missing files in this case are ones whose .c sources have been {.compile.}'d into the app. But I don't think there's anything special about those particular files, I seem to recall it has happened for regular Nim modules in the past too.
My nimscript task to compile looks like this:
task rom, "compile the GBA rom":
let args = commandLineParams()[1..^1].join(" ")
cd thisDir()
try:
rmFile("main_linkerArgs.txt")
selfExec "c " & args & " -o:" & name & ".elf " & main
except CatchableError as e:
if fileExists("main_linkerArgs.txt"):
let linkerPath = get "gcc.path"
let linkerExe = get "gcc.linkerexe"
echo "LINK FAILED, RETRYING"
when defined(Windows): exec "timeout 1"
else: exec "sleep 1"
exec linkerPath / linkerExe & " @main_linkerArgs.txt"
else:
raise e
Initially I suspected it was some sort of race condition and we just needed to wait for the files to become visible. So I added code to retry the linking step, as you can see above (using the <project>_linkerArgs.txt that the Nim compiler produces during linking).
What I found was that this doesn't help at all, and in fact sometimes more files have gone missing by the time we try linking again.
We tried setting an exclusion on the nimcache dir in Windows Defender in case that was it, but no difference.
We have a Linux-using teammate who it happened for occasionally, but apparently only when they modified source files when the game was building? (but I am doing that all the time and it's never happened to me!)
We also have another Windows-using teammate who it used to happen for but no longer does, and we have no idea why.
I'm absolutely at my wit's end as to what could be causing this, so I figured it's time to ask here if anyone has ideas, or suggestions for how to narrow down the problem.
Thanks.