Repository : ssh://darcs.haskell.org//srv/darcs/ghc On branch : master
http://hackage.haskell.org/trac/ghc/changeset/cb40a3fd653bec7b6f420bcddb8e37486d4816db >--------------------------------------------------------------- commit cb40a3fd653bec7b6f420bcddb8e37486d4816db Author: David Terei <[email protected]> Date: Tue May 10 12:20:42 2011 -0700 SafeHaskell: Add new package flags for setting trust Now ghc supports: - trust => Set a package to be trusted - distrust => Set a package to be untrusted - distrust-all-package => Set all packages to be untrusted by default >--------------------------------------------------------------- compiler/main/DynFlags.hs | 39 +++++++++++++++++++++++++-------------- compiler/main/Packages.lhs | 35 +++++++++++++++++++++++++++++------ 2 files changed, 54 insertions(+), 20 deletions(-) diff --git a/compiler/main/DynFlags.hs b/compiler/main/DynFlags.hs index 3585915..c125949 100644 --- a/compiler/main/DynFlags.hs +++ b/compiler/main/DynFlags.hs @@ -287,6 +287,7 @@ data DynFlag | Opt_SplitObjs | Opt_StgStats | Opt_HideAllPackages + | Opt_DistrustAllPackages | Opt_PrintBindResult | Opt_Haddock | Opt_HaddockOptions @@ -734,10 +735,12 @@ doingTickyProfiling _ = opt_Ticky -- static. If the way flags were made dynamic, we could fix this. data PackageFlag - = ExposePackage String + = ExposePackage String | ExposePackageId String - | HidePackage String - | IgnorePackage String + | HidePackage String + | IgnorePackage String + | TrustPackage String + | DistrustPackage String deriving Eq defaultHscTarget :: HscTarget @@ -1666,16 +1669,19 @@ dynamic_flags = [ package_flags :: [Flag (CmdLineP DynFlags)] package_flags = [ ------- Packages ---------------------------------------------------- - flagC "package-conf" (HasArg extraPkgConf_) - , flagC "no-user-package-conf" (NoArg (unSetDynFlag Opt_ReadUserPackageConf)) - , flagC "package-name" (hasArg setPackageName) - , flagC "package-id" (HasArg exposePackageId) - , flagC "package" (HasArg exposePackage) - , flagC "hide-package" (HasArg hidePackage) - , flagC "hide-all-packages" (NoArg (setDynFlag Opt_HideAllPackages)) - , flagC "ignore-package" (HasArg ignorePackage) - , flagC "syslib" (HasArg (\s -> do { exposePackage s - ; deprecate "Use -package instead" })) + flagC "package-conf" (HasArg extraPkgConf_) + , flagC "no-user-package-conf" (NoArg (unSetDynFlag Opt_ReadUserPackageConf)) + , flagC "package-name" (hasArg setPackageName) + , flagC "package-id" (HasArg exposePackageId) + , flagC "package" (HasArg exposePackage) + , flagC "hide-package" (HasArg hidePackage) + , flagC "hide-all-packages" (NoArg (setDynFlag Opt_HideAllPackages)) + , flagC "ignore-package" (HasArg ignorePackage) + , flagC "syslib" (HasArg (\s -> do { exposePackage s + ; deprecate "Use -package instead" })) + , flagC "trust" (HasArg trustPackage) + , flagC "distrust" (HasArg distrustPackage) + , flagC "distrust-all-packages" (NoArg (setDynFlag Opt_DistrustAllPackages)) ] type TurnOnFlag = Bool -- True <=> we are turning the flag on @@ -2279,7 +2285,8 @@ addCmdlineHCInclude a = upd (\s -> s{cmdlineHcIncludes = a : cmdlineHcIncludes extraPkgConf_ :: FilePath -> DynP () extraPkgConf_ p = upd (\s -> s{ extraPkgConfs = p : extraPkgConfs s }) -exposePackage, exposePackageId, hidePackage, ignorePackage :: String -> DynP () +exposePackage, exposePackageId, hidePackage, ignorePackage, + trustPackage, distrustPackage :: String -> DynP () exposePackage p = upd (\s -> s{ packageFlags = ExposePackage p : packageFlags s }) exposePackageId p = @@ -2288,6 +2295,10 @@ hidePackage p = upd (\s -> s{ packageFlags = HidePackage p : packageFlags s }) ignorePackage p = upd (\s -> s{ packageFlags = IgnorePackage p : packageFlags s }) +trustPackage p = exposePackage p >> -- both trust and distrust also expose a package + upd (\s -> s{ packageFlags = TrustPackage p : packageFlags s }) +distrustPackage p = exposePackage p >> + upd (\s -> s{ packageFlags = DistrustPackage p : packageFlags s }) setPackageName :: String -> DynFlags -> DynFlags setPackageName p s = s{ thisPackage = stringToPackageId p } diff --git a/compiler/main/Packages.lhs b/compiler/main/Packages.lhs index 1231671..33858be 100644 --- a/compiler/main/Packages.lhs +++ b/compiler/main/Packages.lhs @@ -171,7 +171,7 @@ initPackages :: DynFlags -> IO (DynFlags, [PackageId]) initPackages dflags = do pkg_db <- case pkgDatabase dflags of Nothing -> readPackageConfigs dflags - Just db -> return $ maybeHidePackages dflags db + Just db -> return $ setBatchPackageFlags dflags db (pkg_state, preload, this_pkg) <- mkPackageState dflags pkg_db [] (thisPackage dflags) return (dflags{ pkgDatabase = Just pkg_db, @@ -249,16 +249,23 @@ readPackageConfig dflags conf_file = do top_dir = topDir dflags pkgroot = takeDirectory conf_file pkg_configs1 = map (mungePackagePaths top_dir pkgroot) proto_pkg_configs - pkg_configs2 = maybeHidePackages dflags pkg_configs1 + pkg_configs2 = setBatchPackageFlags dflags pkg_configs1 -- return pkg_configs2 -maybeHidePackages :: DynFlags -> [PackageConfig] -> [PackageConfig] -maybeHidePackages dflags pkgs - | dopt Opt_HideAllPackages dflags = map hide pkgs - | otherwise = pkgs +setBatchPackageFlags :: DynFlags -> [PackageConfig] -> [PackageConfig] +setBatchPackageFlags dflags pkgs = (maybeDistrustAll . maybeHideAll) pkgs where + maybeHideAll pkgs' + | dopt Opt_HideAllPackages dflags = map hide pkgs' + | otherwise = pkgs' + + maybeDistrustAll pkgs' + | dopt Opt_DistrustAllPackages dflags = map distrust pkgs' + | otherwise = pkgs' + hide pkg = pkg{ exposed = False } + distrust pkg = pkg{ exposed = False } -- TODO: This code is duplicated in utils/ghc-pkg/Main.hs mungePackagePaths :: FilePath -> FilePath -> PackageConfig -> PackageConfig @@ -344,6 +351,20 @@ applyPackageFlag unusable pkgs flag = Right (ps,qs) -> return (map hide ps ++ qs) where hide p = p {exposed=False} + -- we trust all matching packages. Maybe should only trust first one? + -- and leave others the same or set them untrusted + TrustPackage str -> + case selectPackages (matchingStr str) pkgs unusable of + Left ps -> packageFlagErr flag ps + Right (ps,qs) -> return (map trust ps ++ qs) + where trust p = p {trusted=True} + + DistrustPackage str -> + case selectPackages (matchingStr str) pkgs unusable of + Left ps -> packageFlagErr flag ps + Right (ps,qs) -> return (map distrust ps ++ qs) + where distrust p = p {trusted=False} + _ -> panic "applyPackageFlag" where @@ -407,6 +428,8 @@ packageFlagErr flag reasons = ghcError (CmdLineError (showSDoc $ err)) HidePackage p -> text "-hide-package " <> text p ExposePackage p -> text "-package " <> text p ExposePackageId p -> text "-package-id " <> text p + TrustPackage p -> text "-trust " <> text p + DistrustPackage p -> text "-distrust " <> text p ppr_reasons = vcat (map ppr_reason reasons) ppr_reason (p, reason) = pprReason (pprIPkg p <+> text "is") reason _______________________________________________ Cvs-ghc mailing list [email protected] http://www.haskell.org/mailman/listinfo/cvs-ghc
