[Git][ghc/ghc][wip/toolchain-selection] Configure Cpp and HsCpp separately

Rodrigo Mesquita (@alt-romes) gitlab at gitlab.haskell.org
Mon May 22 14:51:19 UTC 2023



Rodrigo Mesquita pushed to branch wip/toolchain-selection at Glasgow Haskell Compiler / GHC


Commits:
fad8a5ed by Rodrigo Mesquita at 2023-05-22T15:51:10+01:00
Configure Cpp and HsCpp separately

- - - - -


7 changed files:

- hadrian/src/Oracles/Setting.hs
- hadrian/src/Settings/Builders/HsCpp.hs
- hadrian/src/Settings/Builders/Hsc2Hs.hs
- m4/ghc_toolchain.m4
- utils/ghc-toolchain/Main.hs
- utils/ghc-toolchain/src/GHC/Toolchain/Target.hs
- utils/ghc-toolchain/src/GHC/Toolchain/Tools/Cpp.hs


Changes:

=====================================
hadrian/src/Oracles/Setting.hs
=====================================
@@ -189,7 +189,7 @@ settingsFileSetting key = case key of
     ToolchainSetting_CCompilerCommand       -> queryHostTargetConfig (cmd . ccProgram . tgtCCompiler)
     ToolchainSetting_CxxCompilerCommand     -> queryHostTargetConfig (cmd . cxxProgram . tgtCxxCompiler)
     ToolchainSetting_CPPCommand             -> queryHostTargetConfig (cmd . cppProgram . tgtCPreprocessor)
-    ToolchainSetting_CPPCommand             -> queryHostTargetConfig (flags . cppProgram . tgtCPreprocessor)
+    ToolchainSetting_CPPFlags               -> queryHostTargetConfig (flags . cppProgram . tgtCPreprocessor)
     ToolchainSetting_HaskellCPPCommand      -> queryHostTargetConfig (cmd . hsCppProgram . tgtHsCPreprocessor)
     ToolchainSetting_HaskellCPPFlags        -> queryHostTargetConfig (flags . hsCppProgram . tgtHsCPreprocessor)
     ToolchainSetting_CCompilerFlags         -> queryHostTargetConfig (flags . ccProgram . tgtCCompiler)


=====================================
hadrian/src/Settings/Builders/HsCpp.hs
=====================================
@@ -2,14 +2,14 @@ module Settings.Builders.HsCpp (hsCppBuilderArgs) where
 
 import Packages
 import Settings.Builders.Common
-import GHC.Toolchain
+import qualified GHC.Toolchain as T
 import GHC.Toolchain.Program
 
 hsCppBuilderArgs :: Args
 hsCppBuilderArgs = builder HsCpp ? do
     stage   <- getStage
     ghcPath <- expr $ buildPath (vanillaContext stage compiler)
-    mconcat [ prgFlags . cppProgram . tgtCPreprocessor <$> getStagedTargetConfig -- ROMES:TODO: HsCppArgs, not CppArgs, make sure this is the case
+    mconcat [ prgFlags . T.hsCppProgram . T.tgtHsCPreprocessor <$> getStagedTargetConfig
             , arg "-P"
             , arg "-Irts/include"
             , arg $ "-I" ++ ghcPath


=====================================
hadrian/src/Settings/Builders/Hsc2Hs.hs
=====================================
@@ -52,7 +52,8 @@ getCFlags = do
     let cabalMacros = autogen -/- "cabal_macros.h"
     expr $ need [cabalMacros]
     mconcat [ remove ["-O"] (cArgs <> (prgFlags . ccProgram . tgtCCompiler <$> getStagedTargetConfig))
-            , prgFlags . cppProgram . tgtCPreprocessor <$> getStagedTargetConfig
+            -- Either "-E" is not part of the configured cpp args, or we can't add those args to invocations of things like this
+            -- ROMES:TODO: , prgFlags . cppProgram . tgtCPreprocessor <$> getStagedTargetConfig
             , cIncludeArgs
             , getContextData ccOpts
             -- we might be able to leave out cppOpts, to be investigated.


=====================================
m4/ghc_toolchain.m4
=====================================
@@ -21,12 +21,14 @@ AC_DEFUN([FIND_GHC_TOOLCHAIN],
     echo "--cc=$CC" >> acargs
     ADD_GHC_TOOLCHAIN_ARG([cc-opt], [$CONF_CC_OPTS_STAGE1])
 
-    # We can't use $CPP, since HS_CPP_CMD is expected to be a single
-    # command (no flags), and AC_PROG_CPP defines CPP as "/usr/bin/gcc -E".
-    echo "--cpp=$HaskellCPPCmd" >> acargs
-    # ROMES:TODO: CONF_CPP_OPTS_STAGE1 vs HaskellCPPArgs
+    # CPP flags
+    echo "--cpp=$CPPCmd" >> acargs
     ADD_GHC_TOOLCHAIN_ARG([cpp-opt], [$CONF_CPP_OPTS_STAGE1])
 
+    # HS CPP flags
+    echo "--hs-cpp=$HaskellCPPCmd" >> acargs
+    ADD_GHC_TOOLCHAIN_ARG([hs-cpp-opt], [$HaskellCPPArgs])
+
     echo "--cc-link=$CC" >> acargs
     ADD_GHC_TOOLCHAIN_ARG([cc-link-opt], [$CONF_GCC_LINK_OPTS_STAGE1])
     echo "--cxx=$CXX" >> acargs


=====================================
utils/ghc-toolchain/Main.hs
=====================================
@@ -35,6 +35,7 @@ data Opts = Opts
     , optCc        :: ProgOpt
     , optCxx       :: ProgOpt
     , optCpp       :: ProgOpt
+    , optHsCpp     :: ProgOpt
     , optCcLink    :: ProgOpt
     , optAr        :: ProgOpt
     , optRanlib    :: ProgOpt
@@ -58,6 +59,7 @@ emptyOpts = Opts
     , optCc        = po0
     , optCxx       = po0
     , optCpp       = po0
+    , optHsCpp     = po0
     , optCcLink    = po0
     , optAr        = po0
     , optRanlib    = po0
@@ -76,12 +78,13 @@ emptyOpts = Opts
   where
     po0 = emptyProgOpt
 
-_optCc, _optCxx, _optCpp, _optCcLink, _optAr, _optRanlib, _optNm,
+_optCc, _optCxx, _optCpp, _optHsCpp, _optCcLink, _optAr, _optRanlib, _optNm,
     _optReadelf, _optMergeObjs, _optDllwrap, _optWindres
     :: Lens Opts ProgOpt
 _optCc      = Lens optCc      (\x o -> o {optCc=x})
 _optCxx     = Lens optCxx     (\x o -> o {optCxx=x})
 _optCpp     = Lens optCpp     (\x o -> o {optCpp=x})
+_optHsCpp   = Lens optHsCpp   (\x o -> o {optHsCpp=x})
 _optCcLink  = Lens optCcLink  (\x o -> o {optCcLink=x})
 _optAr      = Lens optAr      (\x o -> o {optAr=x})
 _optRanlib  = Lens optRanlib  (\x o -> o {optRanlib=x})
@@ -131,6 +134,7 @@ options =
     concat
     [ progOpts "cc" "C compiler" _optCc
     , progOpts "cpp" "C preprocessor" _optCpp
+    , progOpts "hs-cpp" "Haskell C preprocessor" _optHsCpp
     , progOpts "cxx" "C++ compiler" _optCxx
     , progOpts "cc-link" "C compiler for linking" _optCcLink
     , progOpts "ar" "ar archiver" _optAr
@@ -289,6 +293,7 @@ mkTarget opts = do
     cc0 <- findCc (optCc opts)
     cxx <- findCxx (optCxx opts)
     cpp <- findCpp (optCpp opts) cc0
+    hsCpp <- findHsCpp (optHsCpp opts) cc0
     archOs <- parseTriple cc0 (optTriple opts)
     cc <- addPlatformDepCcFlags archOs cc0
     readelf <- optional $ findReadelf (optReadelf opts)
@@ -338,6 +343,7 @@ mkTarget opts = do
                    , tgtCCompiler = cc
                    , tgtCxxCompiler = cxx
                    , tgtCPreprocessor = cpp
+                   , tgtHsCPreprocessor = hsCpp
                    , tgtAr = ar
                    , tgtCCompilerLink = ccLink
                    , tgtRanlib = ranlib


=====================================
utils/ghc-toolchain/src/GHC/Toolchain/Target.hs
=====================================
@@ -48,7 +48,8 @@ data Target = Target
       -- C toolchain
     , tgtCCompiler :: Cc
     , tgtCxxCompiler :: Cxx
-    , tgtCPreprocessor :: Cpp -- if hadrian depends on Cpp (not HsCpp flags) then this isn't sufficient
+    , tgtCPreprocessor :: Cpp
+    , tgtHsCPreprocessor :: HsCpp
     , tgtCCompilerLink :: CcLink
     -- , tgtLd :: Program -- needed? probably not, we link always through the c compiler
     -- , tgtLdIsGnuLd :: Bool -- After rebase on LdHasGcSections (and renamed)


=====================================
utils/ghc-toolchain/src/GHC/Toolchain/Tools/Cpp.hs
=====================================
@@ -1,6 +1,6 @@
 {-# LANGUAGE NamedFieldPuns #-}
 
-module GHC.Toolchain.Tools.Cpp (Cpp(..), findCpp) where
+module GHC.Toolchain.Tools.Cpp (HsCpp(..), findHsCpp, Cpp(..), findCpp) where
 
 import Control.Monad
 import System.FilePath
@@ -12,22 +12,28 @@ import GHC.Toolchain.Utils (withTempDir)
 import GHC.Toolchain.Tools.Cc
 
 newtype Cpp = Cpp { cppProgram :: Program
-                  }
+                    }
     deriving (Show, Read, Eq, Ord)
 
-findCpp :: ProgOpt -> Cc -> M Cpp
-findCpp progOpt cc = checking "for C preprocessor" $ do
-  -- Use the specified CPP or try to find one (candidate is the c compiler)
-  foundCppProg <- findProgram "C preprocessor" progOpt [prgPath $ ccProgram cc]
+newtype HsCpp = HsCpp { hsCppProgram :: Program
+                      }
+    deriving (Show, Read, Eq, Ord)
+
+----- Haskell Preprocessor -----
+
+findHsCpp :: ProgOpt -> Cc -> M HsCpp
+findHsCpp progOpt cc = checking "for Haskell C preprocessor" $ do
+  -- Use the specified HS CPP or try to find one (candidate is the c compiler)
+  foundHsCppProg <- findProgram "Haskell C preprocessor" progOpt [prgPath $ ccProgram cc]
   case poFlags progOpt of
-    -- If the user specified CPP flags don't second-guess them
-    Just _ -> return Cpp{cppProgram=foundCppProg}
-    -- Otherwise, configure the CPP flags for this CPP program
+    -- If the user specified HS CPP flags don't second-guess them
+    Just _ -> return HsCpp{hsCppProgram=foundHsCppProg}
+    -- Otherwise, configure the HS CPP flags for this CPP program
     Nothing -> do
-      let rawCppProgram = over _prgFlags (["-E"]++) foundCppProg
-      hppArgs <- findHsCppArgs rawCppProgram
-      let cppProgram = over _prgFlags (++hppArgs) rawCppProgram
-      return Cpp{cppProgram}
+      let rawHsCppProgram = over _prgFlags (["-E"]++) foundHsCppProg
+      hppArgs <- findHsCppArgs rawHsCppProgram
+      let hsCppProgram = over _prgFlags (++hppArgs) rawHsCppProgram
+      return HsCpp{hsCppProgram}
 
 -- | Given a C preprocessor, figure out how it should be invoked to preprocess
 -- Haskell source.
@@ -51,3 +57,16 @@ findHsCppArgs cpp = withTempDir $ \dir -> do
       , tryFlag "-Wno-trigraphs"
       ]
 
+----- C preprocessor -----
+
+findCpp :: ProgOpt -> Cc -> M Cpp
+findCpp progOpt cc = checking "for C preprocessor" $ do
+  -- Use the specified HS CPP or try to find one (candidate is the c compiler)
+  foundCppProg <- findProgram "C preprocessor" progOpt [prgPath $ ccProgram cc]
+  case poFlags progOpt of
+    -- If the user specified CPP flags don't second-guess them
+    Just _ -> return Cpp{cppProgram=foundCppProg}
+    -- Otherwise, configure the CPP flags for this CPP program
+    Nothing -> do
+      let cppProgram = over _prgFlags (["-E"]++) foundCppProg
+      return Cpp{cppProgram}



View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/fad8a5ed808b5e56b51983f546cc0453bdb7d278

-- 
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/fad8a5ed808b5e56b51983f546cc0453bdb7d278
You're receiving this email because of your account on gitlab.haskell.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-commits/attachments/20230522/4a439490/attachment-0001.html>


More information about the ghc-commits mailing list