{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE RankNTypes #-}
module Distribution.Simple.Program.Ld (
combineObjectFiles,
) where
import Prelude ()
import Distribution.Compat.Prelude
import Distribution.Simple.Program.Types
( ConfiguredProgram(..) )
import Distribution.Simple.Program.Run
( programInvocation, multiStageProgramInvocation
, runProgramInvocation )
import Distribution.Verbosity
( Verbosity )
import System.Directory
( renameFile )
import System.FilePath
( (<.>) )
combineObjectFiles :: Verbosity -> ConfiguredProgram
-> FilePath -> [FilePath] -> IO ()
combineObjectFiles verbosity ld target files =
let simpleArgs = ["-r", "-o", target]
initialArgs = ["-r", "-o", target]
middleArgs = ["-r", "-o", target, tmpfile]
finalArgs = middleArgs
simple = programInvocation ld simpleArgs
initial = programInvocation ld initialArgs
middle = programInvocation ld middleArgs
final = programInvocation ld finalArgs
invocations = multiStageProgramInvocation
simple (initial, middle, final) files
in run invocations
where
tmpfile = target <.> "tmp"
run [] = return ()
run [inv] = runProgramInvocation verbosity inv
run (inv:invs) = do runProgramInvocation verbosity inv
renameFile target tmpfile
run invs