packages feed

clr-win-linker-0.1.0.0: src/Main.hs

module Main where

import Control.Monad
import Data.List
import System.Environment
import System.Process
import System.IO
import System.Directory
import Pipes
import Pipes.Safe
import qualified Pipes.Safe.Prelude as SP
import Pipes.Prelude

runLinker :: [String] -> IO ()
runLinker args = callProcess "gcc" args

modifyLinkerArgs :: Pipe String String (SafeT IO) ()
modifyLinkerArgs = do
  x <- await
  if x == "\"-Xlinker\""
    then do
      y <- await
      if y == "\"--stack=0x800000,0x800000\""
        then yield "\"-fstack-check\""
      else yield x >> yield y
    else yield x
  modifyLinkerArgs

main :: IO ()
main = do
  args <- getArgs
  case args of
    (  []  ) -> error "No args"
    (x : xs) -> do
      let linkFileOrig = tail x
      let linkFileNew  = linkFileOrig ++ "-temp"
      runSafeT $ runEffect $ SP.readFile linkFileOrig >-> modifyLinkerArgs >-> SP.writeFile linkFileNew
      renameFile linkFileNew linkFileOrig
      runLinker args