|
5 | 5 | {-# LANGUAGE TypeSynonymInstances #-}
|
6 | 6 | {-# LANGUAGE GADTs #-}
|
7 | 7 | {-# LANGUAGE KindSignatures #-}
|
| 8 | +{-# LANGUAGE MultiWayIf #-} |
8 | 9 | {-# LANGUAGE DataKinds #-}
|
9 | 10 | {-# LANGUAGE TupleSections #-}
|
10 | 11 | {-# LANGUAGE ScopedTypeVariables #-}
|
@@ -151,6 +152,7 @@ data Flag
|
151 | 152 | | FlagVerbosity (Maybe String)
|
152 | 153 | | FlagUnitId
|
153 | 154 | | FlagShowUnitIds
|
| 155 | + | FlagTarget String |
154 | 156 | deriving Eq
|
155 | 157 |
|
156 | 158 | flags :: [OptDescr Flag]
|
@@ -198,7 +200,9 @@ flags = [
|
198 | 200 | Option [] ["ipid", "unit-id"] (NoArg FlagUnitId)
|
199 | 201 | "interpret package arguments as unit IDs (e.g. installed package IDs)",
|
200 | 202 | 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)" |
202 | 206 | ]
|
203 | 207 |
|
204 | 208 | data Verbosity = Silent | Normal | Verbose
|
@@ -593,6 +597,23 @@ readFromSettingsFile settingsFile f = do
|
593 | 597 | Right archOS -> Right archOS
|
594 | 598 | Left e -> Left e
|
595 | 599 |
|
| 600 | +getTarget :: [Flag] -> IO (Maybe String) |
| 601 | +getTarget my_flags = do |
| 602 | + case [ t | FlagTarget t <- my_flags ] of |
| 603 | + [] -> do |
| 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 | + |
596 | 617 | getPkgDatabases :: Verbosity
|
597 | 618 | -> GhcPkg.DbOpenMode mode DbModifySelector
|
598 | 619 | -> Bool -- use the user db
|
@@ -622,7 +643,12 @@ getPkgDatabases verbosity mode use_user use_cache expand_vars my_flags = do
|
622 | 643 | [] -> do mb_dir <- getBaseDir
|
623 | 644 | case mb_dir of
|
624 | 645 | Nothing -> die err_msg
|
625 |
| - 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 | + |
626 | 652 | -- Look for where it is given in the settings file, if marked there.
|
627 | 653 | let settingsFile = dir </> "settings"
|
628 | 654 | exists_settings_file <- doesFileExist settingsFile
|
|
0 commit comments