-{-# OPTIONS -fffi -cpp #-}
+{-# LANGUAGE CPP, ForeignFunctionInterface #-}
------------------------------------------------------------------------
-- Program for converting .hsc files to .hs files, by converting the
#endif
#if defined(__GLASGOW_HASKELL__) && !defined(BUILD_NHC)
-import Compat.RawSystem ( rawSystem )
+import System.Cmd ( rawSystem )
#define HAVE_rawSystem
#elif __NHC__ >= 117
import System.Cmd ( rawSystem )
#endif
#endif
+import Distribution.Text
+import qualified Paths_hsc2hs
+
version :: String
version = "hsc2hs version 0.66\n"
-- to find one by looking near the executable. This only
-- works on Win32 or Hugs (getExecDir). On Unix, there's a wrapper
-- script which specifies an explicit template flag.
- flags_w_tpl <- if any template_flag flags then
+ flags_w_tpl0 <- if any template_flag flags then
return flags
else
do mb_path <- getExecDir "/bin/hsc2hs.exe"
case mb_path of
Nothing -> return id
Just path -> do
- let templ = path ++ "/template-hsc.h"
+ -- Euch, this is horrible. Unfortunately
+ -- Paths_hsc2hs isn't too useful for a
+ -- relocatable binary, though.
+ let templ = path ++ "/hsc2hs-" ++ display Paths_hsc2hs.version ++ "/template-hsc.h"
flg <- doesFileExist templ
if flg
then return ((Template templ):)
else return id
return (add_opt flags)
+
+ -- take only the last --template flag on the cmd line
+ let
+ (before,tpl:after) = break template_flag (reverse flags_w_tpl0)
+ flags_w_tpl = reverse (before ++ tpl : filter (not.template_flag) after)
+
case (files, errs) of
(_, _)
| any isHelp flags_w_tpl -> bye (usageInfo header options)
-- (called hsc2hs-inplace, generated from hsc2hs.sh)
compiler <- case [c | Compiler c <- flags] of
[] -> locateGhc "ghc"
- [c] -> return c
- _ -> onlyOne "compiler"
+ cs -> return (last cs)
linker <- case [l | Linker l <- flags] of
[] -> locateGhc compiler
- [l] -> return l
- _ -> onlyOne "linker"
+ ls -> return (last ls)
writeFile cProgName $
concatMap outFlagHeaderCProg flags++