summary refs log tree commit diff stats
path: root/compiler/cgen.nim
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/cgen.nim')
-rw-r--r--compiler/cgen.nim67
1 files changed, 36 insertions, 31 deletions
diff --git a/compiler/cgen.nim b/compiler/cgen.nim
index e478b07cb..476b1362f 100644
--- a/compiler/cgen.nim
+++ b/compiler/cgen.nim
@@ -849,15 +849,15 @@ proc addIntTypes(result: var Rope) {.inline.} =
   addf(result, "#define NIM_INTBITS $1" & tnl, [
     platform.CPU[targetCPU].intSize.rope])
 
-proc getCopyright(cfile: string): Rope =
+proc getCopyright(cfile: Cfile): Rope =
   if optCompileOnly in gGlobalOptions:
     result = ("/* Generated by Nim Compiler v$1 */$N" &
-        "/*   (c) 2017 Andreas Rumpf */$N" &
+        "/*   (c) " & CompileDate.substr(0, 3) & " Andreas Rumpf */$N" &
         "/* The generated code is subject to the original license. */$N") %
         [rope(VersionAsString)]
   else:
     result = ("/* Generated by Nim Compiler v$1 */$N" &
-        "/*   (c) 2017 Andreas Rumpf */$N" &
+        "/*   (c) " & CompileDate.substr(0, 3) & " Andreas Rumpf */$N" &
         "/* The generated code is subject to the original license. */$N" &
         "/* Compiled for: $2, $3, $4 */$N" &
         "/* Command for C compiler:$n   $5 */$N") %
@@ -867,7 +867,7 @@ proc getCopyright(cfile: string): Rope =
         rope(extccomp.CC[extccomp.cCompiler].name),
         rope(getCompileCFileCmd(cfile))]
 
-proc getFileHeader(cfile: string): Rope =
+proc getFileHeader(cfile: Cfile): Rope =
   result = getCopyright(cfile)
   addIntTypes(result)
 
@@ -1096,7 +1096,7 @@ proc genInitCode(m: BModule) =
         [(i.ord - '0'.ord).rope, el]
       add(m.s[cfsInitProc], ex)
 
-proc genModule(m: BModule, cfile: string): Rope =
+proc genModule(m: BModule, cfile: Cfile): Rope =
   result = getFileHeader(cfile)
   result.add(genMergeInfo(m))
 
@@ -1227,7 +1227,11 @@ proc myOpen(graph: ModuleGraph; module: PSym; cache: IdentCache): PPassContext =
     incl g.generatedHeader.flags, isHeaderFile
 
 proc writeHeader(m: BModule) =
-  var result = getCopyright(m.filename)
+  var result = ("/* Generated by Nim Compiler v$1 */$N" &
+        "/*   (c) " & CompileDate.substr(0, 3) & " Andreas Rumpf */$N" &
+        "/* The generated code is subject to the original license. */$N") %
+        [rope(VersionAsString)]
+
   var guard = "__$1__" % [m.filename.splitFile.name.rope]
   result.addf("#ifndef $1$n#define $1$n", [guard])
   addIntTypes(result)
@@ -1281,20 +1285,19 @@ proc finishModule(m: BModule) =
   dec(m.g.forwardedProcsCounter, i)
   setLen(m.forwardedProcs, 0)
 
-proc shouldRecompile(code: Rope, cfile: string): bool =
+proc shouldRecompile(code: Rope, cfile: Cfile): bool =
   result = true
   if optForceFullMake notin gGlobalOptions:
-    var objFile = toObjFile(cfile)
-
-    if not equalsFile(code, cfile):
+    if not equalsFile(code, cfile.cname):
       if isDefined("nimdiff"):
-        copyFile(cfile, cfile & ".backup")
-        echo "diff ", cfile, ".backup ", cfile
-      writeRope(code, cfile)
+        copyFile(cfile.cname, cfile.cname & ".backup")
+        echo "diff ", cfile.cname, ".backup ", cfile.cname
+      writeRope(code, cfile.cname)
       return
-    if existsFile(objFile) and os.fileNewer(objFile, cfile): result = false
+    if existsFile(cfile.obj) and os.fileNewer(cfile.obj, cfile.cname):
+      result = false
   else:
-    writeRope(code, cfile)
+    writeRope(code, cfile.cname)
 
 # We need 2 different logics here: pending modules (including
 # 'nim__dat') may require file merging for the combination of dead code
@@ -1304,8 +1307,7 @@ proc shouldRecompile(code: Rope, cfile: string): bool =
 
 proc writeModule(m: BModule, pending: bool) =
   # generate code for the init statements of the module:
-  var cfile = getCFile(m)
-  var cfilenoext = changeFileExt(cfile, "")
+  let cfile = getCFile(m)
 
   if not m.fromCache or optForceFullMake in gGlobalOptions:
     genInitCode(m)
@@ -1315,42 +1317,45 @@ proc writeModule(m: BModule, pending: bool) =
       add(m.s[cfsProcHeaders], m.g.mainModProcs)
       generateThreadVarsSize(m)
 
-    var code = genModule(m, cfile)
+    var cf = Cfile(cname: cfile, obj: completeCFilePath(toObjFile(cfile)), flags: {})
+    var code = genModule(m, cf)
     when hasTinyCBackend:
       if gCmd == cmdRun:
         tccgen.compileCCode($code)
         return
 
-    if shouldRecompile(code, cfile):
-      addFileToCompile(cfile)
+    if not shouldRecompile(code, cf): cf.flags = {CfileFlag.Cached}
+    addFileToCompile(cf)
   elif pending and mergeRequired(m) and sfMainModule notin m.module.flags:
+    let cf = Cfile(cname: cfile, obj: completeCFilePath(toObjFile(cfile)), flags: {})
     mergeFiles(cfile, m)
     genInitCode(m)
     finishTypeDescriptions(m)
-    var code = genModule(m, cfile)
+    var code = genModule(m, cf)
     writeRope(code, cfile)
-    addFileToCompile(cfile)
-  elif not existsFile(toObjFile(cfilenoext)):
+    addFileToCompile(cf)
+  else:
     # Consider: first compilation compiles ``system.nim`` and produces
     # ``system.c`` but then compilation fails due to an error. This means
     # that ``system.o`` is missing, so we need to call the C compiler for it:
-    addFileToCompile(cfile)
-
-  addFileToLink(cfilenoext)
+    var cf = Cfile(cname: cfile, obj: completeCFilePath(toObjFile(cfile)), flags: {})
+    if not existsFile(cf.obj): cf.flags = {CfileFlag.Cached}
+    addFileToCompile(cf)
 
 proc updateCachedModule(m: BModule) =
   let cfile = getCFile(m)
-  let cfilenoext = changeFileExt(cfile, "")
+  var cf = Cfile(cname: cfile, obj: completeCFilePath(toObjFile(cfile)), flags: {})
 
   if mergeRequired(m) and sfMainModule notin m.module.flags:
     mergeFiles(cfile, m)
     genInitCode(m)
     finishTypeDescriptions(m)
-    var code = genModule(m, cfile)
-    writeRope(code, cfile)
-    addFileToCompile(cfile)
 
-  addFileToLink(cfilenoext)
+    var code = genModule(m, cf)
+    writeRope(code, cfile)
+  else:
+    cf.flags = {CfileFlag.Cached}
+  addFileToCompile(cf)
 
 proc myClose(b: PPassContext, n: PNode): PNode =
   result = n