Skip to content

Commit 6f006af

Browse files
committed
ghc-pkg: Add support for --target
This adds support to ghc-pkg to infer a package-db from a target name.
1 parent 9d626be commit 6f006af

File tree

1 file changed

+34
-2
lines changed

1 file changed

+34
-2
lines changed

utils/ghc-pkg/Main.hs

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
{-# LANGUAGE TypeSynonymInstances #-}
66
{-# LANGUAGE GADTs #-}
77
{-# LANGUAGE KindSignatures #-}
8+
{-# LANGUAGE MultiWayIf #-}
89
{-# LANGUAGE DataKinds #-}
910
{-# LANGUAGE TupleSections #-}
1011
{-# LANGUAGE ScopedTypeVariables #-}
@@ -151,6 +152,7 @@ data Flag
151152
| FlagVerbosity (Maybe String)
152153
| FlagUnitId
153154
| FlagShowUnitIds
155+
| FlagTarget String
154156
deriving Eq
155157

156158
flags :: [OptDescr Flag]
@@ -198,7 +200,9 @@ flags = [
198200
Option [] ["ipid", "unit-id"] (NoArg FlagUnitId)
199201
"interpret package arguments as unit IDs (e.g. installed package IDs)",
200202
Option ['v'] ["verbose"] (OptArg FlagVerbosity "Verbosity")
201-
"verbosity level (0-2, default 1)"
203+
"verbosity level (0-2, default 1)",
204+
Option [] ["target"] (ReqArg FlagTarget "TARGET")
205+
"run against the specified target (this has no effect if --global-package-db is specified)"
202206
]
203207

204208
data Verbosity = Silent | Normal | Verbose
@@ -587,6 +591,29 @@ readFromSettingsFile settingsFile f = do
587591
Right archOS -> Right archOS
588592
Left e -> Left e
589593

594+
-- | Get the cross target.
595+
--
596+
-- This is either extracted from the '--target' flag or inferred
597+
-- from the current program name.
598+
getTarget :: [Flag] -> IO (Maybe String)
599+
getTarget my_flags = do
600+
case [ t | FlagTarget t <- my_flags ] of
601+
[] -> do
602+
-- when no target is specified on the command line, infer it from the program name.
603+
-- e.g. x86_64-unknown-linux-ghc-pkg
604+
progN <- getProgName
605+
if | "-ghc-pkg" `isSuffixOf` progN
606+
, parts <- split '-' progN
607+
, length parts > 3 -> pure (Just (take (length progN - 8) progN))
608+
| otherwise -> pure Nothing
609+
ts -> pure (Just (last ts))
610+
where
611+
split :: Char -> String -> [String]
612+
split c s = case rest of
613+
[] -> [chunk]
614+
_:rest -> chunk : split c rest
615+
where (chunk, rest) = break (==c) s
616+
590617
getPkgDatabases :: Verbosity
591618
-> GhcPkg.DbOpenMode mode DbModifySelector
592619
-> Bool -- use the user db
@@ -616,7 +643,12 @@ getPkgDatabases verbosity mode use_user use_cache expand_vars my_flags = do
616643
[] -> do mb_dir <- getBaseDir
617644
case mb_dir of
618645
Nothing -> die err_msg
619-
Just dir -> do
646+
Just dir' -> do
647+
mt <- getTarget my_flags
648+
dir <- case mt of
649+
Nothing -> pure dir'
650+
Just target -> pure (dir' </> "targets" </> target </> "lib")
651+
620652
-- Look for where it is given in the settings file, if marked there.
621653
let settingsFile = dir </> "settings"
622654
exists_settings_file <- doesFileExist settingsFile

0 commit comments

Comments
 (0)