reproducible-tmp-names
authorDebian Haskell Group <pkg-haskell-maintainers@lists.alioth.debian.org>
Sat, 26 Aug 2017 17:04:27 +0000 (18:04 +0100)
committerGianfranco Costamagna <locutusofborg@debian.org>
Sat, 26 Aug 2017 17:04:27 +0000 (18:04 +0100)
This is an attempt to make GHC build reproducible. The name of .c files may end
up in the resulting binary (in the debug section), but not the directory.

Instead of using the process id, create a hash from the command line arguments,
and assume that is going to be unique.

Gbp-Pq: Name reproducible-tmp-names

compiler/main/SysTools.hs

index 1ab5b138e0f24c80758f24250463f00d689b4ed1..39f0d64e767f879d8192ee195e37fdc995c5afb0 100644 (file)
@@ -65,6 +65,7 @@ import Platform
 import Util
 import DynFlags
 import Exception
+import Fingerprint
 
 import LlvmCodeGen.Base (llvmVersionStr, supportedLlvmVersion)
 
@@ -1145,8 +1146,8 @@ getTempDir dflags = do
     mapping <- readIORef dir_ref
     case Map.lookup tmp_dir mapping of
         Nothing -> do
-            pid <- getProcessID
-            let prefix = tmp_dir </> "ghc" ++ show pid ++ "_"
+            pid <- getStableProcessID
+            let prefix = tmp_dir </> "ghc" ++ pid ++ "_"
             mask_ $ mkTempDir prefix
         Just dir -> return dir
   where
@@ -1562,6 +1563,13 @@ getProcessID :: IO Int
 getProcessID = System.Posix.Internals.c_getpid >>= return . fromIntegral
 #endif
 
+-- Debian-specific hack to get reproducible output, by not using the "random"
+-- pid, but rather something determinisic
+getStableProcessID :: IO String
+getStableProcessID = do
+    args <- getArgs
+    return $ take 4 $ show $ fingerprintString $ unwords args
+
 -- Divvy up text stream into lines, taking platform dependent
 -- line termination into account.
 linesPlatform :: String -> [String]