diff options
Diffstat (limited to 'src/Propellor/Bootstrap.hs')
| -rw-r--r-- | src/Propellor/Bootstrap.hs | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/src/Propellor/Bootstrap.hs b/src/Propellor/Bootstrap.hs index 6812b4ab..b2cf5609 100644 --- a/src/Propellor/Bootstrap.hs +++ b/src/Propellor/Bootstrap.hs @@ -104,9 +104,22 @@ build = catchBoolIO $ do void $ cabal ["configure"] unlessM (cabal ["build"]) $ error "cabal build failed" - nukeFile "propellor" - createSymbolicLink "dist/build/propellor-config/propellor-config" "propellor" + -- For safety against eg power loss in the middle of the build, + -- make a copy of the binary, and move it into place atomically. + -- This ensures that the propellor symlink only ever points at + -- a binary that is fully built. Also, avoid ever removing + -- or breaking the symlink. + unlessM (boolSystem "cp" [Param cabalbuiltbin, Param (tmpfor safetycopy)]) $ + error "cp of binary failed" + rename (tmpfor safetycopy) safetycopy + createSymbolicLink safetycopy (tmpfor dest) + rename (tmpfor dest) dest return True + where + dest = "propellor" + cabalbuiltbin = "dist/build/propellor-config/propellor-config" + safetycopy = cabalbuiltbin ++ ".built" + tmpfor f = f ++ ".propellortmp" make :: FilePath -> [FilePath] -> IO Bool -> IO () make dest srcs builder = do |
