-- -*-haskell-*- -- =========================================================================== -- C -> Haskell Compiler: configuration -- -- Author : Manuel M T Chakravarty -- Created: 27 September 99 -- -- Version $Revision: 1.3 $ from $Date: 2005/02/07 00:04:28 $ -- -- Copyright (c) [1999..2003] Manuel M T Chakravarty -- -- This file is free software; you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation; either version 2 of the License, or -- (at your option) any later version. -- -- This file is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- --- DESCRIPTION --------------------------------------------------------------- -- -- Configuration options; largely set by `configure'. -- --- TODO ---------------------------------------------------------------------- -- module C2HSConfig ( -- -- programs and paths -- cpp, cppopts, cppoptsdef, hpaths, dlsuffix, tmpdir, -- -- system-dependent definitions, as the New FFI isn't fully supported on all -- systems yet -- Ptr, FunPtr, Storable(sizeOf, alignment), -- -- parameters of the targeted C compiler -- bitfieldDirection, bitfieldPadding, bitfieldIntSigned, bitfieldAlignment ) where import Data.Ix (Ix) import Data.Array (Array, array) import Foreign (Ptr, FunPtr) import Foreign (Storable(sizeOf, alignment), toBool) import Foreign.C (CInt(..)) import System.Info (os) -- program settings -- ---------------- -- C preprocessor executable (EXPORTED) -- cpp :: FilePath cpp :: FilePath cpp = case FilePath os of FilePath "darwin" -> FilePath "gcc" FilePath _ -> FilePath "cpp" -- C preprocessor options (EXPORTED) -- -- * `-x c' forces CPP to regard the input as C code; this option seems to be -- understood at least on Linux, FreeBSD, and Solaris and seems to make a -- difference over the default language setting on FreeBSD -- -- * `-P' would suppress `#line' directives -- cppopts :: [String] cppopts :: [FilePath] cppopts = case (FilePath os,FilePath cpp) of (FilePath "openbsd",FilePath "cpp") -> [FilePath "-xc", FilePath "-w"] (FilePath _,FilePath "cpp") -> [FilePath "-x", FilePath "c", FilePath "-w"] (FilePath _,FilePath "gcc") -> [FilePath "-E", FilePath "-x", FilePath "c", FilePath "-w"] (FilePath, FilePath) _ -> [] -- C preprocessor option for including only definitions (EXPORTED) cppoptsdef :: String cppoptsdef :: FilePath cppoptsdef = FilePath "-imacros" -- standard system search paths for header files (EXPORTED) -- hpaths :: [FilePath] hpaths :: [FilePath] hpaths = [FilePath ".", FilePath "/usr/include", FilePath "/usr/local/include"] -- OS-dependent suffix for dynamic libraries -- dlsuffix :: String dlsuffix :: FilePath dlsuffix = forall a. HasCallStack => FilePath -> a error FilePath "C2HSConfig.dlsuffix" -- used to be: "@DLSUFFIX@" -- possibly system-dependent location for temporary files -- tmpdir :: String tmpdir :: FilePath tmpdir = forall a. HasCallStack => FilePath -> a error FilePath "C2HSConfig.tmpdir" -- used to be: "@TMPDIR@" -- tmpdir is unused and it causes problems on widows since it ends up with -- the value "C:\TMP" which is not a valid string. It'd need to be "C:\\TMP" -- so just remove the thing for now. -- parameters of the targeted C compiler -- ------------------------------------- -- indicates in which direction the C compiler fills bitfields (EXPORTED) -- -- * the value is 1 or -1, depending on whether the direction is growing -- towards the MSB -- bitfieldDirection :: Int bitfieldDirection :: Int bitfieldDirection = forall a b. (Integral a, Num b) => a -> b fromIntegral CInt bitfield_direction foreign import ccall bitfield_direction :: CInt -- indicates whether a bitfield that does not fit into a partially filled -- storage unit in its entirety introduce padding or split over two storage -- units (EXPORTED) -- -- * `True' means that such a bitfield introduces padding (instead of being -- split) -- bitfieldPadding :: Bool bitfieldPadding :: Bool bitfieldPadding = forall a. (Eq a, Num a) => a -> Bool toBool CInt bitfield_padding foreign import ccall bitfield_padding :: CInt -- indicates whether a bitfield of type `int' is signed in the targeted C -- compiler (EXPORTED) -- bitfieldIntSigned :: Bool bitfieldIntSigned :: Bool bitfieldIntSigned = forall a. (Eq a, Num a) => a -> Bool toBool CInt bitfield_int_signed foreign import ccall bitfield_int_signed :: CInt -- the alignment constraint for a bitfield (EXPORTED) -- -- * this makes the assumption that the alignment of a bitfield is independent -- of the bitfield's size -- bitfieldAlignment :: Int bitfieldAlignment :: Int bitfieldAlignment = forall a b. (Integral a, Num b) => a -> b fromIntegral CInt bitfield_alignment foreign import ccall bitfield_alignment :: CInt