Moritz Angermann pushed to branch wip/angerman/ghc-pkg-target at Glasgow Haskell Compiler / GHC

Commits:

1 changed file:

Changes:

  • utils/ghc-pkg/Main.hs
    ... ... @@ -5,6 +5,7 @@
    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
    
    ... ... @@ -587,6 +591,29 @@ readFromSettingsFile settingsFile f = do
    587 591
           Right archOS -> Right archOS
    
    588 592
           Left e -> Left e
    
    589 593
     
    
    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
    +
    
    590 617
     getPkgDatabases :: Verbosity
    
    591 618
                     -> GhcPkg.DbOpenMode mode DbModifySelector
    
    592 619
                     -> Bool    -- use the user db
    
    ... ... @@ -616,7 +643,12 @@ getPkgDatabases verbosity mode use_user use_cache expand_vars my_flags = do
    616 643
             [] -> do mb_dir <- getBaseDir
    
    617 644
                      case mb_dir of
    
    618 645
                        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
    +
    
    620 652
                          -- Look for where it is given in the settings file, if marked there.
    
    621 653
                          let settingsFile = dir </> "settings"
    
    622 654
                          exists_settings_file <- doesFileExist settingsFile