Swiftc not updating modification times of object files

I've noticed that swiftc may not update the modification time of outputs after successfully compiling. In the example below, foo.o has the same modification time after a compile even though the input file has been touched. The source file ends up with a modification time later than the object file at the end.

Was that the intended behaviour? It makes any kind of build dependency tracking (via make, ninja etc) a bit of a pain. It's easy enough to touch the files afterwards but it's kind of odd.

 $ swiftc -frontend -o foo.o -emit-object foo.swift -target x86_64-apple-macosx10.15 -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk
 
 $ stat foo.o
  File: foo.o
  Size: 2840        Blocks: 8          IO Block: 4096   regular file
Device: 1000004h/16777220d  Inode: 8679820584  Links: 1
Access: (0644/-rw-r--r--)  Uid: (  501/ krister)   Gid: (   20/   staff)
Access: 2019-10-17 15:41:20.769490519 +0800
Modify: 2019-10-17 15:41:20.772221926 +0800
Change: 2019-10-17 15:41:20.772221926 +0800
 Birth: 2019-10-17 15:41:20.769490519 +0800


$ touch foo.swift
$ swiftc -frontend -o foo.o -emit-object foo.swift -target x86_64-apple-macosx10.15 -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk

$ stat foo.o
  File: foo.o
  Size: 2840        Blocks: 8          IO Block: 4096   regular file
Device: 1000004h/16777220d  Inode: 8679820584  Links: 1
Access: (0644/-rw-r--r--)  Uid: (  501/ krister)   Gid: (   20/   staff)
Access: 2019-10-17 15:41:31.555112097 +0800
Modify: 2019-10-17 15:41:20.772221926 +0800
Change: 2019-10-17 15:41:20.772221926 +0800
 Birth: 2019-10-17 15:41:20.769490519 +0800

$ stat foo.swift
  File: foo.swift
  Size: 36          Blocks: 8          IO Block: 4096   regular file
Device: 1000004h/16777220d  Inode: 8679669012  Links: 1
Access: (0644/-rw-r--r--)  Uid: (  501/ krister)   Gid: (   20/   staff)
Access: 2019-10-17 15:41:27.991699000 +0800
Modify: 2019-10-17 15:41:27.991699000 +0800
Change: 2019-10-17 15:41:27.991715976 +0800
 Birth: 2019-10-16 19:52:23.072205698 +0800

Yep, this is intended behavior when the output hasn't changed. It's supposed to help make/ninja-style dependency tracking by allowing downstream files to not be recompiled/relinked, but maybe we should have a flag to turn it off since it means the intermediate steps still look out of date.

(Also, I notice you're using frontend commands directly, so please take a look at docs/Driver.md if you haven't already and you're doing that in production somewhere!)

3 Likes