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