diff options
author | ringabout <43030857+ringabout@users.noreply.github.com> | 2024-10-01 02:55:47 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-30 20:55:47 +0200 |
commit | 4974baf7fa74b3f439672f2f319df588774b1a85 (patch) | |
tree | 8ef95f786d734d5e52728fdbc97f00656d63607f | |
parent | b82ff5a87bfb19c7c6a2a7cbf8d860acdadbe877 (diff) | |
download | Nim-4974baf7fa74b3f439672f2f319df588774b1a85.tar.gz |
fixes #24008; triggers a recompilation on output executables changes when switching release/debug modes (#24193)
fixes #24008 The old logic didn't check the contents of the output executables, when it switched release->debug->release, it picked up the Json files used in the first release building, the content of which didn't change. So it mistook the executables which are built by the second debug building as the functioning one. `changeDetectedViaJsonBuildInstructions` needs a way to distinguish the executables generated by different buildings.
-rw-r--r-- | compiler/extccomp.nim | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/compiler/extccomp.nim b/compiler/extccomp.nim index a8b6489b8..e66746fbb 100644 --- a/compiler/extccomp.nim +++ b/compiler/extccomp.nim @@ -1000,10 +1000,11 @@ proc jsonBuildInstructionsFile*(conf: ConfigRef): AbsoluteFile = # works out of the box with `hashMainCompilationParams`. result = getNimcacheDir(conf) / conf.outFile.changeFileExt("json") -const cacheVersion = "D20210525T193831" # update when `BuildCache` spec changes +const cacheVersion = "D20240927T193831" # update when `BuildCache` spec changes type BuildCache = object cacheVersion: string outputFile: string + outputLastModificationTime: string compile: seq[(string, string)] link: seq[string] linkcmd: string @@ -1047,6 +1048,7 @@ proc writeJsonBuildInstructions*(conf: ConfigRef; deps: StringTableRef) = bcache.depfiles.add (path, $secureHashFile(path)) bcache.nimexe = hashNimExe() + bcache.outputLastModificationTime = $getLastModificationTime(bcache.outputFile) conf.jsonBuildFile = conf.jsonBuildInstructionsFile conf.jsonBuildFile.string.writeFile(bcache.toJson.pretty) @@ -1067,6 +1069,8 @@ proc changeDetectedViaJsonBuildInstructions*(conf: ConfigRef; jsonFile: Absolute # xxx optimize by returning false if stdin input was the same for (file, hash) in bcache.depfiles: if $secureHashFile(file) != hash: return true + if bcache.outputLastModificationTime != $getLastModificationTime(bcache.outputFile): + return true proc runJsonBuildInstructions*(conf: ConfigRef; jsonFile: AbsoluteFile) = var bcache: BuildCache = default(BuildCache) @@ -1083,7 +1087,7 @@ proc runJsonBuildInstructions*(conf: ConfigRef; jsonFile: AbsoluteFile) = "jsonscript command outputFile '$1' must match '$2' which was specified during --compileOnly, see \"outputFile\" entry in '$3' " % [outputCurrent, output, jsonFile.string]) var cmds: TStringSeq = default(TStringSeq) - var prettyCmds: TStringSeq= default(TStringSeq) + var prettyCmds: TStringSeq = default(TStringSeq) let prettyCb = proc (idx: int) = writePrettyCmdsStderr(prettyCmds[idx]) for (name, cmd) in bcache.compile: cmds.add cmd |