diff options
author | Ben Gamari <ben@smart-cactus.org> | 2022-02-25 10:00:01 -0500 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2022-05-18 11:22:45 -0400 |
commit | 1905d69fa41e2fbe9c96efc4ae46162bbed620d8 (patch) | |
tree | b18d32f187d02a05096467537cbc46ee47e2ef9f | |
parent | 1445e55e569ff318065f7eb7568f67cff9148f43 (diff) | |
download | haskell-1905d69fa41e2fbe9c96efc4ae46162bbed620d8.tar.gz |
hadrian: Clean up handling of libffi dependencies
(cherry picked from commit c556cbf3144f2c209cb41b4524f36247de974d41)
-rw-r--r-- | compiler/GHC/Driver/CodeOutput.hs | 9 | ||||
-rw-r--r-- | hadrian/src/Rules/Libffi.hs | 3 | ||||
-rw-r--r-- | hadrian/src/Rules/Rts.hs | 3 | ||||
-rw-r--r-- | hadrian/src/Settings/Packages.hs | 16 | ||||
-rw-r--r-- | libraries/ghci/ghci.cabal.in | 2 |
5 files changed, 21 insertions, 12 deletions
diff --git a/compiler/GHC/Driver/CodeOutput.hs b/compiler/GHC/Driver/CodeOutput.hs index 5f5f9882c2..4a96967932 100644 --- a/compiler/GHC/Driver/CodeOutput.hs +++ b/compiler/GHC/Driver/CodeOutput.hs @@ -224,6 +224,15 @@ outputLlvm logger dflags filenm cmm_stream = do ************************************************************************ -} +{- +Note [Packaging libffi headers] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +The C code emitted by GHC for libffi adjustors must depend upon the ffi_arg type, +defined in <ffi.h>. For this reason, we must ensure that <ffi.h> is available +in binary distributions. To do so, we install these headers as part of the +`rts` package. +-} + outputForeignStubs :: Logger -> TmpFs diff --git a/hadrian/src/Rules/Libffi.hs b/hadrian/src/Rules/Libffi.hs index e37faee5dc..8e62461202 100644 --- a/hadrian/src/Rules/Libffi.hs +++ b/hadrian/src/Rules/Libffi.hs @@ -103,6 +103,9 @@ libffiLocalName force_dynamic = do libffiLibrary :: FilePath libffiLibrary = "inst/lib/libffi.a" +-- | These are the headers that we must package with GHC since foreign export +-- adjustor code produced by GHC depends upon them. +-- See Note [Packaging libffi headers] in GHC.Driver.CodeOutput. libffiHeaderFiles :: [FilePath] libffiHeaderFiles = ["ffi.h", "ffitarget.h"] diff --git a/hadrian/src/Rules/Rts.hs b/hadrian/src/Rules/Rts.hs index abc9947f4a..20a9fd1241 100644 --- a/hadrian/src/Rules/Rts.hs +++ b/hadrian/src/Rules/Rts.hs @@ -26,6 +26,7 @@ rtsRules = priority 3 $ do let buildPath = root -/- buildDir (rtsContext stage) -- Header files + -- See Note [Packaging libffi headers] in GHC.Driver.CodeOutput. forM_ libffiHeaderFiles $ \header -> buildPath -/- "include" -/- header %> copyLibffiHeader stage @@ -44,6 +45,8 @@ withLibffi stage action = needLibffi stage -- | Copy a header files wither from the system libffi or from the libffi -- build dir to the rts build dir. +-- +-- See Note [Packaging libffi headers] in GHC.Driver.CodeOutput. copyLibffiHeader :: Stage -> FilePath -> Action () copyLibffiHeader stage header = do useSystemFfi <- flag UseSystemFfi diff --git a/hadrian/src/Settings/Packages.hs b/hadrian/src/Settings/Packages.hs index 43141610a7..d4b8810810 100644 --- a/hadrian/src/Settings/Packages.hs +++ b/hadrian/src/Settings/Packages.hs @@ -6,7 +6,6 @@ import Oracles.Setting import Oracles.Flag import Packages import Settings -import Rules.Libffi -- | Package-specific command-line arguments. packageArgs :: Args @@ -26,6 +25,8 @@ packageArgs = do cursesIncludeDir <- getSetting CursesIncludeDir cursesLibraryDir <- getSetting CursesLibDir + ffiIncludeDir <- getSetting FfiIncludeDir + ffiLibraryDir <- getSetting FfiLibDir debugAssertions <- ghcDebugAssertions <$> expr flavour mconcat @@ -139,7 +140,8 @@ packageArgs = do -- the Stage1 libraries, as we already know that the bootstrap -- compiler comes with the same versions as the one we are building. -- - builder (Cabal Flags) ? ifM stage0 + builder (Cabal Setup) ? cabalExtraDirs ffiIncludeDir ffiLibraryDir + , builder (Cabal Flags) ? ifM stage0 (andM [cross, bootCross] `cabalFlag` "internal-interpreter") (arg "internal-interpreter") @@ -269,7 +271,6 @@ rtsPackageArgs = package rts ? do path <- getBuildPath top <- expr topDirectory useSystemFfi <- expr $ flag UseSystemFfi - ffiLibName <- libffiName ffiIncludeDir <- getSetting FfiIncludeDir ffiLibraryDir <- getSetting FfiLibDir libdwIncludeDir <- getSetting LibdwIncludeDir @@ -296,8 +297,6 @@ rtsPackageArgs = package rts ? do let cArgs = mconcat [ rtsWarnings - , flag UseSystemFfi ? not (null ffiIncludeDir) ? arg ("-I" ++ ffiIncludeDir) - , flag WithLibdw ? not (null libdwIncludeDir) ? arg ("-I" ++ libdwIncludeDir) , arg "-fomit-frame-pointer" -- RTS *must* be compiled with optimisations. The INLINE_HEADER macro -- requires that functions are inlined to work as expected. Inlining @@ -386,6 +385,7 @@ rtsPackageArgs = package rts ? do , builder (Cabal Setup) ? mconcat [ cabalExtraDirs libdwIncludeDir libdwLibraryDir , cabalExtraDirs libnumaIncludeDir libnumaLibraryDir + , useSystemFfi ? cabalExtraDirs ffiIncludeDir ffiLibraryDir ] , builder (Cc (FindCDependencies CDep)) ? cArgs , builder (Cc (FindCDependencies CxxDep)) ? cArgs @@ -394,11 +394,7 @@ rtsPackageArgs = package rts ? do , builder Ghc ? ghcArgs , builder HsCpp ? pure - [ "-DTOP=" ++ show top - , "-DFFI_INCLUDE_DIR=" ++ show ffiIncludeDir - , "-DFFI_LIB_DIR=" ++ show ffiLibraryDir - , "-DFFI_LIB=" ++ show ffiLibName - , "-DLIBDW_LIB_DIR=" ++ show libdwLibraryDir ] + [ "-DTOP=" ++ show top ] , builder HsCpp ? flag WithLibdw ? arg "-DUSE_LIBDW" , builder HsCpp ? flag HaveLibMingwEx ? arg "-DHAVE_LIBMINGWEX" ] diff --git a/libraries/ghci/ghci.cabal.in b/libraries/ghci/ghci.cabal.in index 0f7bd690b5..643680e0bf 100644 --- a/libraries/ghci/ghci.cabal.in +++ b/libraries/ghci/ghci.cabal.in @@ -58,8 +58,6 @@ library GHCi.StaticPtrTable GHCi.TH - include-dirs: @FFIIncludeDir@ - exposed-modules: GHCi.BreakArray GHCi.BinaryArray |