-- Copyright 2014 Samplecount S.L. -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- -- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, -- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- See the License for the specific language governing permissions and -- limitations under the License. {-| Description: Toolchain definitions and utilities for Windows This module provides toolchain definitions and utilities for targeting Windows. See "Development.Shake.Language.C.Rules" for examples of how to use a target toolchain. Windows is also a supported host operating system, see "Development.Shake.Language.C.Host" for examples of how to target the host. On Windows currently only the toolchain is supported. -} module Development.Shake.Language.C.Target.Windows ( toolChain , getDefaultToolChain ) where import Data.Label (get, set) import Development.Shake import Development.Shake.Language.C.BuildFlags import Development.Shake.Language.C.Target import Development.Shake.Language.C.ToolChain import qualified System.Info as System getHostArch :: IO Arch getHostArch = do -- TODO: Get the info from the environment let arch = System.arch return $ case arch of "i386" -> X86 I386 "i686" -> X86 I686 "x86_64" -> X86 X86_64 _ -> error $ "Unknown host architecture " ++ arch target :: Arch -> Target target = Target Windows (Platform "windows") -- | Windows toolchain. toolChain :: ToolChainVariant -> ToolChain toolChain GCC = set variant GCC $ set compilerCommand "gcc" $ set archiverCommand "ar" $ set archiver (\tc flags inputs output -> do need inputs command_ [] (tool tc archiverCommand) $ ["cr"] ++ get archiverFlags flags ++ [output] ++ inputs command_ [] (toolFromString tc "ranlib") [output] ) $ set linkerCommand "g++" $ defaultToolChain toolChain LLVM = set variant LLVM $ set compilerCommand "gcc" $ set archiverCommand "ar" $ set linkerCommand "g++" $ defaultToolChain toolChain Generic = toolChain GCC getDefaultToolChain :: IO (Target, Action ToolChain) getDefaultToolChain = do t <- fmap target getHostArch return (t, return $ toolChain Generic)