[project @ 2001-09-04 18:29:20 by ken]
[ghc-hetmet.git] / ghc / driver / PackageSrc.hs
index 5395b05..6fcec81 100644 (file)
+#include "../includes/config.h"
+#include "../includes/Derived.h"
+
 module Main (main) where
 
-import IOExts
+import Utils
+
 import IO
 import System
-import Config
 import Package
 
+main :: IO ()
 main = do
   args <- getArgs
   case args of
-       [ "install"  ] -> do { putStr (pprPackage (package_details True)) }
-       [ "in-place" ] -> do { putStr (pprPackage (package_details False)) }
-       _ -> do hPutStr stderr "usage: pkgconf (install | in-place)\n"
-               exitWith (ExitFailure 1)
+     ("install":rest)  -> do { putStrLn (dumpPackages (package_details True rest)) }
+     ("in-place":rest) -> do { putStrLn (dumpPackages (package_details False rest)) }
+     _ -> do hPutStr stderr "usage: pkgconf (install | in-place) ...\n"
+             exitWith (ExitFailure 1)
+
+-- The compiler automatically replaces the string "$libdir" at the
+-- beginning of a path with the directory passed to the compiler via
+-- the -B<dir> flag.  Absolute path names will be unchanged.
+--
+-- This is how we make package.conf independent of GHC's installation
+-- location.
+
+package_details :: Bool -> [String] -> [PackageConfig]
+package_details installing
+ [ cTARGETPLATFORM
+ , cCURRENT_DIR
+ , cHaveLibGmp
+ , cLibsReadline
+ , cGHC_LIB_DIR
+ , cGHC_RUNTIME_DIR
+ , cGHC_UTILS_DIR
+ , cGHC_INCLUDE_DIR
+ ] =
 
-package_details :: Bool -> [(String,Package)]
-package_details installing =
  [
-      ( "gmp", -- GMP is at the bottom of the heap
-       Package {
-       import_dirs    = [],
-       library_dirs   = if _HaveLibGmp == "YES"
-                            then []
-                            else if installing 
-                                  then [ _libdir ]
-                                  else [ ghc_src_dir _GHC_RUNTIME_DIR ++ "/gmp" ],
-       libraries      = [ "gmp" ],
-       include_dir    = "",
-       c_include      = "",
-       package_deps   = [],
-       extra_ghc_opts = "",
-       extra_cc_opts  = "",
-       extra_ld_opts  = ""
-       }
-       ),
+        Package {
+       name           = "gmp",  -- GMP is at the bottom of the heap
+        import_dirs    = [],
+        source_dirs    = [],
+        library_dirs   = if cHaveLibGmp == "YES"
+                            then []
+                            else if installing
+                                    then [ "$libdir" ]
+                                    else [ ghc_src_dir cGHC_RUNTIME_DIR ++ "/gmp" ],
+       hs_libraries   = [],
+        extra_libraries = [ "gmp" ],
+        include_dirs   = [],
+        c_includes     = [],
+        package_deps   = [],
+        extra_ghc_opts = [],
+        extra_cc_opts  = [],
+        extra_ld_opts  = []
+        },
 
-      ( "rts", -- The RTS is just another package!
-       Package {
-       import_dirs    = [],
-       library_dirs   = [ if installing 
-                             then _libdir
-                             else ghc_src_dir _GHC_RUNTIME_DIR ],
-       libraries      = [ "HSrts" ],
-       include_dir    = if installing 
-                           then "" 
-                           else ghc_src_dir _GHC_INCLUDE_DIR,
-       c_include      = "Stg.h",               -- ha!
-       package_deps   = [ "gmp" ],
-       extra_ghc_opts = "",
-       extra_cc_opts  = "",
-               -- the RTS forward-references to a bunch of stuff in the prelude,
-               -- so we force it to be included with special options to ld.
-       extra_ld_opts  = unwords [
-         "-u PrelMain_mainIO_closure",
-         "-u PrelBase_Izh_static_info",
-         "-u PrelBase_Czh_static_info",
-         "-u PrelFloat_Fzh_static_info",
-         "-u PrelFloat_Dzh_static_info",
-         "-u PrelAddr_Azh_static_info",
-         "-u PrelAddr_Wzh_static_info",
-         "-u PrelAddr_I64zh_static_info",
-         "-u PrelAddr_W64zh_static_info",
-         "-u PrelStable_StablePtr_static_info",
-        "-u PrelBase_Izh_con_info",
-         "-u PrelBase_Czh_con_info",
-         "-u PrelFloat_Fzh_con_info",
-         "-u PrelFloat_Dzh_con_info",
-         "-u PrelAddr_Azh_con_info",
-         "-u PrelAddr_Wzh_con_info",
-         "-u PrelAddr_I64zh_con_info",
-         "-u PrelAddr_W64zh_con_info",
-         "-u PrelStable_StablePtr_con_info",
-         "-u PrelBase_False_closure",
-         "-u PrelBase_True_closure",
-         "-u PrelPack_unpackCString_closure",
-         "-u PrelException_stackOverflow_closure",
-         "-u PrelException_heapOverflow_closure",
-         "-u PrelException_NonTermination_closure",
-         "-u PrelException_PutFullMVar_closure",
-         "-u PrelException_BlockedOnDeadMVar_closure",
-        "-u PrelWeak_runFinalizzerBatch_closure",
-         "-u __init_Prelude",
-         "-u __init_PrelMain"
-         ]
-       }
-      ),
+        Package {
+       name           = "rts",  -- The RTS is just another package!
+        import_dirs    = [],
+        source_dirs    = [],
+        library_dirs   = if installing
+                            then [ "$libdir" ]
+                            else [ ghc_src_dir cGHC_RUNTIME_DIR ],
+        hs_libraries      = [ "HSrts" ],
+       extra_libraries   =
+                             "m":              -- for ldexp()
+#ifdef mingw32_TARGET_OS
+                             "winmm":          -- for the threadDelay timer
+                             "wsock32":        -- for the linker
+#endif
+#ifdef USING_LIBBFD
+                             "bfd": "iberty":  -- for debugging
+#endif
+                           [],
+        include_dirs   = if installing
+                            then [ "$libdir/include"
+#ifdef mingw32_TARGET_OS
+                                , "$libdir/include/mingw"
+#endif
+                                ]
+                            else [ ghc_src_dir cGHC_INCLUDE_DIR ],
+        c_includes     = [ "Stg.h" ],           -- ha!
+        package_deps   = [ "gmp" ],
+        extra_ghc_opts = [],
+        extra_cc_opts  = [],
+                -- the RTS forward-references to a bunch of stuff in the prelude,
+                -- so we force it to be included with special options to ld.
+        extra_ld_opts  =
+          foldr (\ x xs -> "-u" : x : xs) []
+                 (map (
+#ifndef LEADING_UNDERSCORE
+                         ""
+#else
+                         "_"
+#endif
+                          ++ ) [
+           "PrelBase_Izh_static_info"
+         , "PrelBase_Czh_static_info"
+         , "PrelFloat_Fzh_static_info"
+         , "PrelFloat_Dzh_static_info"
+         , "PrelPtr_Ptr_static_info"
+         , "PrelWord_Wzh_static_info"
+         , "PrelInt_I8zh_static_info"
+         , "PrelInt_I16zh_static_info"
+         , "PrelInt_I32zh_static_info"
+         , "PrelInt_I64zh_static_info"
+         , "PrelWord_W8zh_static_info"
+         , "PrelWord_W16zh_static_info"
+         , "PrelWord_W32zh_static_info"
+         , "PrelWord_W64zh_static_info"
+         , "PrelStable_StablePtr_static_info"
+         , "PrelBase_Izh_con_info"
+         , "PrelBase_Czh_con_info"
+         , "PrelFloat_Fzh_con_info"
+         , "PrelFloat_Dzh_con_info"
+         , "PrelPtr_Ptr_con_info"
+         , "PrelStable_StablePtr_con_info"
+         , "PrelBase_False_closure"
+         , "PrelBase_True_closure"
+         , "PrelPack_unpackCString_closure"
+         , "PrelIOBase_stackOverflow_closure"
+         , "PrelIOBase_heapOverflow_closure"
+         , "PrelIOBase_NonTermination_closure"
+         , "PrelIOBase_BlockedOnDeadMVar_closure"
+         , "PrelWeak_runFinalizzerBatch_closure"
+         , "__stginit_Prelude"
+         ])
+        },
 
-      ( "std", -- The Prelude & Standard Libraries
-       Package {
-       import_dirs    = [ if installing 
-                            then _libdir ++ "/imports/std"
-                            else ghc_src_dir _GHC_LIB_DIR ++ "/std" ],
-       library_dirs   = if installing 
-                          then [ _libdir ]
-                          else [ ghc_src_dir _GHC_LIB_DIR ++ "/std"
-                               , ghc_src_dir _GHC_LIB_DIR ++ "/std/cbits" ],
-       libraries      = [ "HSstd", "HSstd_cbits" ],
-       include_dir    = if installing 
-                          then "" 
-                          else ghc_src_dir _GHC_LIB_DIR ++ "/std/cbits",
-       c_include      = "HsStd.h",
-       package_deps   = [ "rts" ],
-       extra_ghc_opts = "",
-       extra_cc_opts  = "",
-       extra_ld_opts  = "-lm"
-       }
-       ),
+        Package {
+        name           = "std",  -- The Prelude & Standard Hs_libraries
+       import_dirs    = if installing
+                            then [ "$libdir/imports/std" ]
+                            else [ ghc_src_dir cGHC_LIB_DIR ++ "/std" ],
+        source_dirs    = [],
+        library_dirs   = if installing
+                            then [ "$libdir" ]
+                            else [ ghc_src_dir cGHC_LIB_DIR ++ "/std"
+                                 , ghc_src_dir cGHC_LIB_DIR ++ "/std/cbits" ],
 
-       ( "lang",
-        Package { 
-        import_dirs    = if installing 
-                          then [ _libdir ++ "/imports/lang" ]
-                          else [ _FPTOOLS_TOP_ABS ++ "/hslibs/lang"
-                               , _FPTOOLS_TOP_ABS ++ "/hslibs/lang/monads"],
-        library_dirs   = if installing 
-                            then [ _libdir ]
-                            else [ _FPTOOLS_TOP_ABS ++ "/hslibs/lang"
-                                 , _FPTOOLS_TOP_ABS ++ "/hslibs/lang/cbits" ],
-        libraries      = [ "HSlang", "HSlang_cbits" ],
-        include_dir    = if installing 
-                            then "" 
-                            else _FPTOOLS_TOP_ABS ++ "/hslibs/lang/cbits",
-        c_include      = "HsLang.h",
-        package_deps   = [],
-        extra_ghc_opts = "",
-        extra_cc_opts  = "",
-        extra_ld_opts  = ""
-       }
-       ),
+        hs_libraries      = 
+#                           ifndef mingw32_TARGET_OS
+                            [ "HSstd" ]
+#                           else
+                            -- This splitting is the subject of a totally 
+                            -- horrible hack, which glues HSstd1 and HSstd2 
+                            -- back into HSstd for the purposes of static linking.
+                            -- See DriverState.getPackageLibraries for details.
+                            [ "HSstd1", "HSstd2" ]
+#                           endif
+                            ,
+       extra_libraries   = [ "HSstd_cbits" ] ++
+#                           ifdef mingw32_TARGET_OS
+                            [ "wsock32", "msvcrt" ]
+#                           else
+                            [ ]
+#                           endif
+                            ,
+        include_dirs   = if installing
+                            then []
+                            else [ ghc_src_dir cGHC_LIB_DIR ++ "/std/cbits" ],
+        c_includes     = [ "HsStd.h" ],
+        package_deps   = [ "rts" ],
+        extra_ghc_opts = [],
+        extra_cc_opts  = [],
+        extra_ld_opts  = []
+        },
 
-       ( "concurrent",
-        Package {
-        import_dirs    = [ if installing 
-                               then _libdir ++ "/imports/concurrent"
-                               else _FPTOOLS_TOP_ABS ++ "/hslibs/concurrent" ],
-        library_dirs   = [ if installing 
-                               then _libdir
-                               else _FPTOOLS_TOP_ABS ++ "/hslibs/concurrent" ],
-        libraries      = [ "HSconcurrent" ],
-        include_dir    = if installing 
-                           then "" 
-                           else _FPTOOLS_TOP_ABS ++ "/hslibs/concurrent/cbits",
-        c_include      = "HsConcurrent.h",
-        package_deps   = [ "lang" ],
-        extra_ghc_opts = "",
-        extra_cc_opts  = "",
-        extra_ld_opts  = ""
-       }
-       ),
+         Package { 
+         name           = "lang",
+        import_dirs    = if installing
+                             then [ "$libdir/imports/lang" ]
+                             else [ "$libdir/hslibs/lang"
+                                  , "$libdir/hslibs/lang/monads" ],
+         source_dirs    = [],
+         library_dirs   = if installing
+                             then [ "$libdir" ]
+                             else [ "$libdir/hslibs/lang"
+                                  , "$libdir/hslibs/lang/cbits" ],
+         hs_libraries      = [ "HSlang" ],
+        extra_libraries   = [ "HSlang_cbits" ],
+         include_dirs   = if installing
+                             then []
+                             else [ "$libdir/hslibs/lang/cbits" ],
+         c_includes     = [ "HsLang.h" ],
+         package_deps   = [],
+         extra_ghc_opts = [],
+         extra_cc_opts  = [],
+         extra_ld_opts  = [
+#ifndef LEADING_UNDERSCORE
+                         "-u", "Addr_Azh_static_info"
+#else
+                         "-u", "_Addr_Azh_static_info"
+#endif
+                       ]
+        },
 
-       ( "data",
-        Package {
-        import_dirs    = if installing 
-                            then [ _libdir ++ "/imports/data" ]
-                            else [ _FPTOOLS_TOP_ABS ++ "/hslibs/data"
-                                 , _FPTOOLS_TOP_ABS ++ "/hslibs/data/edison"
-                                 , _FPTOOLS_TOP_ABS ++ "/hslibs/data/edison/Assoc"
-                                 , _FPTOOLS_TOP_ABS ++ "/hslibs/data/edison/Coll"
-                                 , _FPTOOLS_TOP_ABS ++ "/hslibs/data/edison/Seq" ],
-        library_dirs   = if installing 
-                            then [_libdir ]
-                            else [ _FPTOOLS_TOP_ABS ++ "/hslibs/data" ],
-        libraries      = [ "HSdata" ],
-        include_dir    = if installing 
-                            then "" 
-                            else _FPTOOLS_TOP_ABS ++ "/hslibs/data/cbits",
-        c_include      = "HsData.h",
-        package_deps   = [ "lang" ],
-        extra_ghc_opts = "",
-        extra_cc_opts  = "",
-        extra_ld_opts  = ""
-       }
-       ),
+         Package {
+        name           = "concurrent",
+         import_dirs    = if installing
+                             then [ "$libdir/imports/concurrent" ]
+                             else [ "$libdir/hslibs/concurrent" ],
+         source_dirs    = [],
+         library_dirs   = if installing
+                             then [ "$libdir" ]
+                             else [ "$libdir/hslibs/concurrent" ],
+         hs_libraries      = [ "HSconcurrent" ],
+        extra_libraries   = [],
+         include_dirs   = if installing
+                             then []
+                             else [ "$libdir/hslibs/concurrent/cbits" ],
+         c_includes     = [],
+         package_deps   = [ "lang" ],
+         extra_ghc_opts = [],
+         extra_cc_opts  = [],
+         extra_ld_opts  = []
+        },
 
-       ( "net",
-        Package {
-        import_dirs    = if installing 
-                            then [ _libdir ++ "/imports/net" ]
-                            else [ _FPTOOLS_TOP_ABS ++ "/hslibs/net" ],
-        library_dirs   = if installing 
-                            then [ _libdir ]
-                            else [ _FPTOOLS_TOP_ABS ++ "/hslibs/net"
-                                 , _FPTOOLS_TOP_ABS ++ "/hslibs/net/cbits" ],
-        libraries      = [ "HSnet", "HSnet_cbits" ],
-        include_dir    = if installing 
-                            then "" 
-                            else _FPTOOLS_TOP_ABS ++ "/hslibs/net/cbits",
-        c_include      = "HsNet.h",
-        package_deps   = [ "lang", "text" ],
-        extra_ghc_opts = "",
-        extra_cc_opts  = "",
-        extra_ld_opts  = if postfixMatch "solaris2" _TARGETPLATFORM
-                               then "-lnsl -lsocket"
-                               else ""
-       }
-       ),
+         Package {
+         name           = "data",
+         import_dirs    = if installing
+                             then [ "$libdir/imports/data" ]
+                             else [ "$libdir/hslibs/data"
+                                  , "$libdir/hslibs/data/edison"
+                                  , "$libdir/hslibs/data/edison/Assoc"
+                                  , "$libdir/hslibs/data/edison/Coll"
+                                  , "$libdir/hslibs/data/edison/Seq" ],
+         source_dirs    = [],
+         library_dirs   = if installing
+                             then [ "$libdir" ]
+                             else [ "$libdir/hslibs/data" ],
+         hs_libraries      = [ "HSdata" ],
+        extra_libraries   = [],
+         include_dirs   = if installing
+                             then []
+                             else [ "$libdir/hslibs/data/cbits" ],
+         c_includes     = [],
+         package_deps   = [ "lang", "util" ],
+         extra_ghc_opts = [],
+         extra_cc_opts  = [],
+         extra_ld_opts  = []
+        },
 
-       ( "posix",
-        Package {
-        import_dirs    = if installing 
-                            then [ _libdir ++ "/imports/posix" ]
-                            else [ _FPTOOLS_TOP_ABS ++ "/hslibs/posix" ],
-        library_dirs   = if installing 
-                            then [ _libdir ]
-                            else [ _FPTOOLS_TOP_ABS ++ "/hslibs/posix"
-                                 , _FPTOOLS_TOP_ABS ++ "/hslibs/posix/cbits" ],
-        libraries      = [ "HSposix", "HSposix_cbits" ],
-        include_dir    = if installing 
-                            then "" 
-                            else _FPTOOLS_TOP_ABS ++ "/hslibs/posix/cbits",
-        c_include      = "HsPosix.h",
-        package_deps   = [ "lang" ],
-        extra_ghc_opts = "",
-        extra_cc_opts  = "",
-        extra_ld_opts  = ""
-       }
-       ),
+         Package {
+         name           = "net",
+         import_dirs    = if installing
+                             then [ "$libdir/imports/net" ]
+                             else [ "$libdir/hslibs/net" ],
+         source_dirs    = [],
+         library_dirs   = if installing
+                             then [ "$libdir" ]
+                             else [ "$libdir/hslibs/net"
+                                  , "$libdir/hslibs/net/cbits" ],
+         hs_libraries      = [ "HSnet" ],
+        extra_libraries   = if suffixMatch "solaris2" cTARGETPLATFORM
+                                then [ "nsl",  "socket" ]
+                                else []
+                             ,
+         include_dirs   = if installing
+                             then []
+                             else [ "$libdir/hslibs/net/cbits" ],
+         c_includes     = [ "HsNet.h" ],
+         package_deps   = [ "lang", "text", "concurrent" ],
+         extra_ghc_opts = [],
+         extra_cc_opts  = [],
+         extra_ld_opts  = []
+        },
 
-       ( "text",
-        Package {
-        import_dirs    = if installing 
-                            then [ _libdir ++ "/imports/text" ]
-                            else [ _FPTOOLS_TOP_ABS ++ "/hslibs/text" 
-                                 , _FPTOOLS_TOP_ABS ++ "/hslibs/text/html" 
-                                 , _FPTOOLS_TOP_ABS ++ "/hslibs/text/haxml/lib" 
-                                 , _FPTOOLS_TOP_ABS ++ "/hslibs/text/parsec" ],
-        library_dirs   = if installing 
-                            then [ _libdir ]
-                            else [ _FPTOOLS_TOP_ABS ++ "/hslibs/text"
-                                 , _FPTOOLS_TOP_ABS ++ "/hslibs/text/cbits" ],
-        libraries      = [ "HStext", "HStext_cbits" ],
-        include_dir    = if installing 
-                            then "" 
-                            else _FPTOOLS_TOP_ABS ++ "/hslibs/text/cbits",
-        c_include      = "HsText.h",
-        package_deps   = [ "lang", "data" ],
-        extra_ghc_opts = "",
-        extra_cc_opts  = "",
-        extra_ld_opts  = ""
-       }
-       ),
+         Package {
+         name           = "posix",
+         import_dirs    = if installing
+                             then [ "$libdir/imports/posix" ]
+                             else [ "$libdir/hslibs/posix" ],
+         source_dirs    = [],
+         library_dirs   = if installing
+                             then [ "$libdir" ]
+                             else [ "$libdir/hslibs/posix"
+                                  , "$libdir/hslibs/posix/cbits" ],
+         hs_libraries      = [ "HSposix" ],
+        extra_libraries   = [ "HSposix_cbits" ],
+         include_dirs   = if installing
+                             then []
+                             else [ "$libdir/hslibs/posix/cbits" ],
+         c_includes     = [ "HsPosix.h" ],
+         package_deps   = [ "lang" ],
+         extra_ghc_opts = [],
+         extra_cc_opts  = [],
+         extra_ld_opts  = []
+        },
 
-       ( "util",
-        Package {
-        import_dirs    = if installing 
-                            then [ _libdir ++ "/imports/util" ]
-                            else [ _FPTOOLS_TOP_ABS ++ "/hslibs/util"
-                                 , _FPTOOLS_TOP_ABS ++ "/hslibs/util/check" ],
-        library_dirs   = if installing 
-                            then [ _libdir ]
-                            else [ _FPTOOLS_TOP_ABS ++ "/hslibs/util"
-                                 , _FPTOOLS_TOP_ABS ++ "/hslibs/util/cbits" ],
-        libraries      = [ "HSutil", "HSutil_cbits" ],
-        include_dir    = if installing 
-                            then "" 
-                            else _FPTOOLS_TOP_ABS ++ "/hslibs/util/cbits",
-        c_include      = "HsUtil.h",
-        package_deps   = ["lang", "concurrent", "posix"],
-        extra_ghc_opts = "",
-        extra_cc_opts  = "",
-        extra_ld_opts  = ""
-       }
-       ),
+         Package {
+         name           = "text",
+         import_dirs    = if installing
+                             then [ "$libdir/imports/text" ]
+                             else [ "$libdir/hslibs/text" 
+                                  , "$libdir/hslibs/text/html" 
+                                  , "$libdir/hslibs/text/HaXml/lib" 
+                                  , "$libdir/hslibs/text/parsec" ],
+         source_dirs    = [],
+         library_dirs   = if installing
+                             then [ "$libdir" ]
+                             else [ "$libdir/hslibs/text"
+                                  , "$libdir/hslibs/text/cbits" ],
+         hs_libraries      = [ "HStext" ],
+        extra_libraries   = [ "HStext_cbits" ],
+         include_dirs   = if installing
+                             then []
+                             else [ "$libdir/hslibs/text/cbits" ],
+         c_includes     = [ "HsText.h" ],
+         package_deps   = [ "lang" ],
+         extra_ghc_opts = [],
+         extra_cc_opts  = [],
+         extra_ld_opts  = []
+        },
 
-       ( "win32",
-        Package {
-        import_dirs    = if installing 
-                            then [ _libdir ++ "/imports/win32" ]
-                            else [ _FPTOOLS_TOP_ABS ++ "/hslibs/win32/src" ],
-        library_dirs   = if installing 
-                            then [ _libdir ]
-                            else [ _FPTOOLS_TOP_ABS ++ "/hslibs/win32/src" ],
-        libraries      = [ "HSwin32" ],
-        include_dir    = "",
-        c_include      = "",           -- ???
-        package_deps   = ["lang"],
-        extra_ghc_opts = "",
-        extra_cc_opts  = "",
-        extra_ld_opts  = "-luser32 -lgdi32"
-       }
-       ),
+         Package {
+         name           = "util",
+         import_dirs    = if installing
+                             then [ "$libdir/imports/util" ]
+                             else [ "$libdir/hslibs/util"
+                                  , "$libdir/hslibs/util/check" ],
+         source_dirs    = [],
+         library_dirs   = if installing
+                             then [ "$libdir" ]
+                             else [ "$libdir/hslibs/util"
+                                  , "$libdir/hslibs/util/cbits" ],
+         hs_libraries      = [ "HSutil" ],
+        extra_libraries   = [ "HSutil_cbits" ] 
+#ifndef mingw32_TARGET_OS
+                             ++ words cLibsReadline
+#endif
+                             ,
+         include_dirs   = if installing
+                             then []
+                             else [ "$libdir/hslibs/util/cbits" ],
+         c_includes     = [ "HsUtil.h" ],
+         package_deps   = [ "lang", "concurrent"
+#ifndef mingw32_TARGET_OS
+                           , "posix"
+#endif
+                         ],
+         extra_ghc_opts = [],
+         extra_cc_opts  = [],
+         extra_ld_opts  = []
+        },
 
-       ( "com",
-        Package {
-        import_dirs    = if installing 
-                            then [ _libdir ++ "/imports/com" ]
-                            else [ _FPTOOLS_TOP_ABS ++ "/hdirect/lib" ],
-        library_dirs   = if installing 
-                            then [ _libdir ]
-                            else [ _FPTOOLS_TOP_ABS ++ "/hdirect/lib" ],
-        libraries      = [ "HScom" ],
-        include_dir    = "",
-        c_include      = "",           -- ???
-        package_deps   = [ "lang" ],
-        extra_ghc_opts = "",
-        extra_cc_opts  = "",
-        extra_ld_opts  = "-luser32 -lole32 -loleaut32 -ladvapi32"
-       }
-       )
-   ]
+        -- no cbits at the moment, we'll need to add one if this library
+        -- ever calls out to any C libs.
+         Package {
+         name           = "hssource",
+         import_dirs    = if installing
+                             then [ "$libdir/imports/hssource" ]
+                             else [ "$libdir/hslibs/hssource" ],
+         source_dirs    = [],
+         library_dirs   = if installing
+                             then [ "$libdir" ]
+                             else [ "$libdir/hslibs/hssource" ],
+         hs_libraries      = [ "HShssource" ],
+        extra_libraries   = [],
+         include_dirs   = [],
+         c_includes     = [],
+         package_deps   = [ "text" ],
+         extra_ghc_opts = [],
+         extra_cc_opts  = [],
+         extra_ld_opts  = []
+        },
 
-ghc_src_dir path = _FPTOOLS_TOP_ABS ++ '/':_CURRENT_DIR ++ '/':path
+         Package {
+        name         = "greencard",
+         import_dirs    = if installing
+                             then [ "$libdir/imports/greencard" ]
+                            else [ "$libdir/green-card/lib/ghc" ],
+         source_dirs    = [],
+         library_dirs   = if installing
+                             then [ "$libdir" ]
+                             else [ "$libdir/green-card/lib/ghc" ],
+         hs_libraries      = [ "HSgreencard" ],
+         extra_libraries   = [],
+         include_dirs   = [],
+         c_includes     = [],
+         package_deps   = [ "lang" ],
+         extra_ghc_opts = [],
+         extra_cc_opts  = [],
+         extra_ld_opts  = [],
+        }
 
-prefixMatch :: Eq a => [a] -> [a] -> Bool
-prefixMatch [] str = True
-prefixMatch pat [] = False
-prefixMatch (p:ps) (s:ss) | p == s    = prefixMatch ps ss
-                         | otherwise = False
+#if defined(mingw32_TARGET_OS) || defined(cygwin32_TARGET_OS)
+         ,Package {
+         name         = "win32",
+        import_dirs    = if installing
+                             then [ "$libdir/imports/win32" ]
+                             else [ "$libdir/hslibs/win32" ],
+         source_dirs    = [],
+         library_dirs   = if installing
+                             then [ "$libdir" ]
+                             else [ "$libdir/hslibs/win32" ],
+         hs_libraries      = [ "HSwin321", "HSwin322" ],
+        extra_libraries   = [ "user32",  "gdi32", "winmm", 
+                               "kernel32", "advapi32" ],
+         include_dirs   = [],
+         c_includes     = [],           -- ???
+         package_deps   = [ "lang" ], -- greencard now built in
+         extra_ghc_opts = [],
+         extra_cc_opts  = [],
+         extra_ld_opts  = []
+        },
 
-postfixMatch :: String -> String -> Bool
-postfixMatch pat str = prefixMatch (reverse pat) (reverse str)
+         Package {
+         name           = "com",
+         import_dirs    = if installing
+                             then [ "$libdir/imports/com" ]
+                             else [ "$libdir/hdirect/lib" ],
+         source_dirs    = [],
+         library_dirs   = if installing
+                             then [ "$libdir" ]
+                             else [ "$libdir/hdirect/lib" ],
+         hs_libraries      = [ "HScom" ],
+        extra_libraries   = [ "user32",  "ole32",  "oleaut32", "advapi32" ],
+         include_dirs   = [],
+         c_includes     = [],           -- ???
+         package_deps   = [ "lang" ],
+         extra_ghc_opts = [],
+         extra_cc_opts  = [],
+         extra_ld_opts  = []
+        }
+#endif
+
+         ,Package {
+         name           = "xlib",
+         import_dirs    = if installing
+                             then [ "$libdir/imports/xlib" ]
+                             else [ "$libdir/hslibs/xlib" ],
+         source_dirs    = [],
+         library_dirs   = if installing
+                             then [ "$libdir" ]
+                             else [ "$libdir/hslibs/xlib"
+                                  , "$libdir/hslibs/xlib/cbits" ],
+         hs_libraries      = [ "HSxlib" ],
+        extra_libraries   = [ "HSxlib_cbits", "X11" ],
+         include_dirs   = if installing
+                             then []
+                             else [ "$libdir/hslibs/xlib/cbits" ],
+         c_includes     = [ "HsXlib.h" ],
+         package_deps   = [ "greencard" ],
+         extra_ghc_opts = [],
+         extra_cc_opts  = [],
+         extra_ld_opts  = []
+        }
+
+         ,Package {
+         name           = "HGL",
+         import_dirs    = if installing
+                             then [ "$libdir/imports/HGL" ]
+                             else [ "$libdir/hslibs/graphics/lib/x11" ],
+         source_dirs    = [],
+         library_dirs   = [],
+         hs_libraries   = [ "HSHGL" ],
+        extra_libraries= [],
+         include_dirs   = [],
+         c_includes     = [],
+         package_deps   = [ "xlib", "concurrent" ],
+         extra_ghc_opts = [],
+         extra_cc_opts  = [],
+         extra_ld_opts  = []
+        }
+
+   ]
+  where
+       ghc_src_dir :: String -> String
+       ghc_src_dir path = "$libdir/" ++ cCURRENT_DIR ++ '/':path