--  C -> Haskell Compiler: management of switches
--
--  Author : Manuel M T Chakravarty
--  Created: 6 March 99
--
--  Version $Revision: 1.3 $ from $Date: 2005/06/22 16:01:21 $
--
--  Copyright (c) [1999..2004] 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 ---------------------------------------------------------------
--
--  This module manages C2HS's compiler switches. It exports the data types
--  used to store the switches and operations on them.
--
--- DOCU ----------------------------------------------------------------------
--
--  language: Haskell 98
--
--  Overview over the switches:
--
--  * The cpp options specify the options passed to the C preprocessor.
--
--  * The cpp filename gives the name of the executable of the C preprocessor.
--
--  * The `hpaths' switch lists all directories that should be considered when
--    searching for a header file.
--
--  * The `keep' flag says whether the intermediate file produced by the C
--    pre-processor should be retained or not.
--
--  * Traces specify which trace information should be output by the compiler.
--    Currently the following trace information is supported:
--
--    - information about phase activation and phase completion
--
--  * After processing the compiler options, `outputSB' contains the base name
--    for the generated Haskell, C header, and .chi files.  However, during
--    processing compiler options, `outputSB' contains arguments to the
--    `--output' option and `outDirSB' contains arguments to the
--    `--output-dir' option.
--
--  * The pre-compiled header switch is unset if no pre-compiled header should
--    be read or generated. If the option is set and a header file is given
--    a concise version of the header will be written to the FilePath. If
--    a binding file is given, the pre-compiled header is used to expand the
--    module unless the binding file contains itself C declarations.
--
--- TODO ----------------------------------------------------------------------
--

module Switches (
  SwitchBoard(..), Traces(..), initialSwitchBoard
) where


-- the switch board contains all toolkit switches
-- ----------------------------------------------

-- all switches of the toolkit (EXPORTED)
--
data SwitchBoard = SwitchBoard {
                     cppOptsSB :: [String],     -- cpp options
                     cppSB     :: FilePath,     -- cpp executable
                     hpathsSB  :: [FilePath],   -- header file directories
                       -- since 0.11.1 `hpathsSB' isn't really needed anymore..
                       -- ..remove from 0.12 series
                     keepSB    :: Bool,         -- keep intermediate file
                     tracesSB  :: Traces,       -- trace flags
                     outputSB  :: FilePath,     -- basename of generated files
                     outDirSB  :: FilePath,     -- dir where generated files go
                     headerSB  :: FilePath,     -- generated header file
                     preCompSB :: Maybe FilePath,-- optional binary header r/w
                     oldFFI    :: Bool,         -- GHC 4.XX compatible code
                     chiPathSB :: [FilePath],   -- .chi file directories
                     lockFunSB :: Maybe String  -- a function to wrap each call
                   }

-- switch states on startup (EXPORTED)
--
initialSwitchBoard :: SwitchBoard
initialSwitchBoard  = SwitchBoard {
                        cppOptsSB = [],
                        cppSB     = "cpp",
                        hpathsSB  = [],
                        keepSB    = False,
                        tracesSB  = initialTraces,
                        outputSB  = "",
                        outDirSB  = "",
                        headerSB  = "",
                        preCompSB = Nothing,
                        oldFFI    = False,
                        chiPathSB = ["."],
                        lockFunSB = Nothing
                      }


-- traces
-- ------

-- different kinds of traces possible (EXPORTED)
--
data Traces = Traces {
                tracePhasesSW  :: Bool,
                traceGenBindSW :: Bool,
                traceCTravSW   :: Bool,
                dumpCHSSW      :: Bool
              }

-- trace setting on startup
--
--  * all traces are initially off
--
initialTraces :: Traces
initialTraces  = Traces {
                   tracePhasesSW  = False,
                   traceGenBindSW = False,
                   traceCTravSW   = False,
                   dumpCHSSW      = False
                 }