diff --git a/compiler/backpack/DriverBkp.hs b/compiler/backpack/DriverBkp.hs index f30c676e26c8b40d6c872142d9d896ac5591c0fd..ef06c3fa92d1d80646e92ce6419d560a55ddc335 100644 --- a/compiler/backpack/DriverBkp.hs +++ b/compiler/backpack/DriverBkp.hs @@ -341,9 +341,11 @@ buildUnit session cid insts lunit = do -- nope hsLibraries = [], extraLibraries = [], + extraLibrariesStatic = [], extraGHCiLibraries = [], libraryDynDirs = [], libraryDirs = [], + libraryDirsStatic = [], frameworks = [], frameworkDirs = [], ccOptions = [], diff --git a/compiler/main/DynFlags.hs b/compiler/main/DynFlags.hs index 70f50f2a8bb86a02a0c36ab3948398d842409438..ce861d4cff819b845f18591dd09d994905fd7a21 100644 --- a/compiler/main/DynFlags.hs +++ b/compiler/main/DynFlags.hs @@ -722,6 +722,7 @@ data GeneralFlag | Opt_KeepOFiles | Opt_BuildDynamicToo + | Opt_BuildStaticExe -- ^ when linking an executable, make it fully static -- safe haskell flags | Opt_DistrustAllPackages @@ -1581,6 +1582,7 @@ isOneShot _other = False data GhcLink = NoLink -- ^ Don't link at all | LinkBinary -- ^ Link object code into a binary + | LinkBinaryStatic -- ^ Link object code into a fully static binary | LinkInMemory -- ^ Use the in-memory dynamic linker (works for both -- bytecode and object code). | LinkDynLib -- ^ Link objects into a dynamic lib (DLL on Windows, DSO on ELF platforms) @@ -3136,6 +3138,8 @@ dynamic_flags_deps = [ (noArg (\d -> d { ghcLink=LinkDynLib })) , make_ord_flag defGhcFlag "staticlib" (noArg (\d -> d { ghcLink=LinkStaticLib })) + , make_ord_flag defGhcFlag "staticexe" + (NoArg (setGeneralFlag Opt_BuildStaticExe)) , make_ord_flag defGhcFlag "dynload" (hasArg parseDynLibLoaderMode) , make_ord_flag defGhcFlag "dylib-install-name" (hasArg setDylibInstallName) @@ -5572,6 +5576,8 @@ compilerInfo dflags ("Support reexported-modules", "YES"), -- Whether or not we support extended @-package foo (Foo)@ syntax. ("Support thinning and renaming package flags", "YES"), + -- Whether or not we support library-dirs-static in package databases. + ("Support library-dirs-static", "YES"), -- Whether or not we support Backpack. ("Support Backpack", "YES"), -- If true, we require that the 'id' field in installed package info diff --git a/compiler/main/PackageConfig.hs b/compiler/main/PackageConfig.hs index 7d096895b4778820783ee173a92fc162f8d9adf2..b445297f5ad445f176ed5237dae5b53892c68760 100644 --- a/compiler/main/PackageConfig.hs +++ b/compiler/main/PackageConfig.hs @@ -105,9 +105,11 @@ pprPackageConfig InstalledPackageInfo {..} = field "trusted" (ppr trusted), field "import-dirs" (fsep (map text importDirs)), field "library-dirs" (fsep (map text libraryDirs)), + field "library-dirs-static" (fsep (map text libraryDirsStatic)), field "dynamic-library-dirs" (fsep (map text libraryDynDirs)), field "hs-libraries" (fsep (map text hsLibraries)), field "extra-libraries" (fsep (map text extraLibraries)), + field "extra-libraries-static" (fsep (map text extraLibrariesStatic)), field "extra-ghci-libraries" (fsep (map text extraGHCiLibraries)), field "include-dirs" (fsep (map text includeDirs)), field "includes" (fsep (map text includes)), diff --git a/compiler/main/Packages.hs b/compiler/main/Packages.hs index ca2e74dfcf395be424cfa917031971fb18a1ff5c..ca895861c08013d7abd658b832775a21d3bc8c93 100644 --- a/compiler/main/Packages.hs +++ b/compiler/main/Packages.hs @@ -666,6 +666,7 @@ mungePackagePaths top_dir pkgroot pkg = importDirs = munge_paths (importDirs pkg), includeDirs = munge_paths (includeDirs pkg), libraryDirs = munge_paths (libraryDirs pkg), + libraryDirsStatic = munge_paths (libraryDirsStatic pkg), libraryDynDirs = munge_paths (libraryDynDirs pkg), frameworkDirs = munge_paths (frameworkDirs pkg), haddockInterfaces = munge_paths (haddockInterfaces pkg), @@ -1798,20 +1799,27 @@ getPackageLinkOpts :: DynFlags -> [PreloadUnitId] -> IO ([String], [String], [St getPackageLinkOpts dflags pkgs = collectLinkOpts dflags `fmap` getPreloadPackagesAnd dflags pkgs +getLibraries :: DynFlags -> PackageConfig -> [String] +getLibraries dflags pc + | gopt Opt_BuildStaticExe dflags = extraLibrariesStatic pc + | otherwise = extraLibraries pc + collectLinkOpts :: DynFlags -> [PackageConfig] -> ([String], [String], [String]) collectLinkOpts dflags ps = ( concatMap (map ("-l" ++) . packageHsLibs dflags) ps, - concatMap (map ("-l" ++) . extraLibraries) ps, + concatMap (map ("-l" ++) . getLibraries dflags) ps, concatMap ldOptions ps ) + where + collectArchives :: DynFlags -> PackageConfig -> IO [FilePath] collectArchives dflags pc = filterM doesFileExist [ searchPath </> ("lib" ++ lib ++ ".a") | searchPath <- searchPaths , lib <- libs ] where searchPaths = nub . filter notNull . libraryDirsForWay dflags $ pc - libs = packageHsLibs dflags pc ++ extraLibraries pc + libs = packageHsLibs dflags pc ++ getLibraries dflags pc getLibs :: DynFlags -> [PreloadUnitId] -> IO [(String,String)] getLibs dflags pkgs = do @@ -1869,11 +1877,13 @@ packageHsLibs dflags p = map (mkDynName . addSuffix) (hsLibraries p) expandTag t | null t = "" | otherwise = '_':t --- | Either the 'libraryDirs' or 'libraryDynDirs' as appropriate for the way. +-- | Either the 'libraryDirs', 'libraryDirsStatic', or 'libraryDynDirs' +-- as appropriate for the way. libraryDirsForWay :: DynFlags -> PackageConfig -> [String] libraryDirsForWay dflags - | WayDyn `elem` ways dflags = libraryDynDirs - | otherwise = libraryDirs + | WayDyn `elem` ways dflags = libraryDynDirs + | gopt Opt_BuildStaticExe dflags = libraryDirsStatic + | otherwise = libraryDirs -- | Find all the C-compiler options in these and the preload packages getPackageExtraCcOpts :: DynFlags -> [PreloadUnitId] -> IO [String] diff --git a/hadrian/hadrian.cabal b/hadrian/hadrian.cabal index 013896e88718082d77532fa489fc46df915acfbb..90e47b1865373744bf2a8ab5587e67da7143a3ce 100644 --- a/hadrian/hadrian.cabal +++ b/hadrian/hadrian.cabal @@ -133,7 +133,7 @@ executable hadrian other-extensions: MultiParamTypeClasses , TypeFamilies build-depends: base >= 4.8 && < 5 - , Cabal >= 3.0 && < 3.1 + , Cabal >= 3.0 && < 3.3 , containers >= 0.5 && < 0.7 , directory >= 1.3.1.0 && < 1.4 , extra >= 1.4.7 diff --git a/hadrian/src/Hadrian/Haskell/Cabal/Parse.hs b/hadrian/src/Hadrian/Haskell/Cabal/Parse.hs index af7966c0ef4a31d9a189b948324bd9dfb335ec86..e4d83433c4e9721bc4ecfb72af0619a86e2780d2 100644 --- a/hadrian/src/Hadrian/Haskell/Cabal/Parse.hs +++ b/hadrian/src/Hadrian/Haskell/Cabal/Parse.hs @@ -268,7 +268,9 @@ resolveContextData context@Context {..} = do , includes = C.includes buildInfo , installIncludes = C.installIncludes buildInfo , extraLibs = C.extraLibs buildInfo + , extraLibsStatic = C.extraLibsStatic buildInfo , extraLibDirs = C.extraLibDirs buildInfo + , extraLibDirsStatic = C.extraLibDirsStatic buildInfo , asmSrcs = C.asmSources buildInfo , cSrcs = C.cSources buildInfo , cmmSrcs = C.cmmSources buildInfo diff --git a/hadrian/src/Hadrian/Haskell/Cabal/Type.hs b/hadrian/src/Hadrian/Haskell/Cabal/Type.hs index 2b5d51a719cc1522f334030d70fa85240e2f1b31..a02754c3c351f053dec1817440db56503d2e7775 100644 --- a/hadrian/src/Hadrian/Haskell/Cabal/Type.hs +++ b/hadrian/src/Hadrian/Haskell/Cabal/Type.hs @@ -50,7 +50,9 @@ data ContextData = ContextData , includes :: [String] , installIncludes :: [String] , extraLibs :: [String] + , extraLibsStatic :: [String] , extraLibDirs :: [String] + , extraLibDirsStatic :: [String] , asmSrcs :: [String] , cSrcs :: [String] , cmmSrcs :: [String] diff --git a/libraries/Cabal b/libraries/Cabal index 63331c95ed15cc7e3d83850d308dc3a86a8c3c76..cc4ae8a3dd818c0d67b1988157cc63245dfd4d13 160000 --- a/libraries/Cabal +++ b/libraries/Cabal @@ -1 +1 @@ -Subproject commit 63331c95ed15cc7e3d83850d308dc3a86a8c3c76 +Subproject commit cc4ae8a3dd818c0d67b1988157cc63245dfd4d13 diff --git a/libraries/ghc-boot/GHC/PackageDb.hs b/libraries/ghc-boot/GHC/PackageDb.hs index 31073711d4908b9609a1c54b31b6b175ce1ddb52..60d15237ba70911d222bf0bbc3497b0400420291 100644 --- a/libraries/ghc-boot/GHC/PackageDb.hs +++ b/libraries/ghc-boot/GHC/PackageDb.hs @@ -106,8 +106,10 @@ data InstalledPackageInfo compid srcpkgid srcpkgname instunitid unitid modulenam importDirs :: [FilePath], hsLibraries :: [String], extraLibraries :: [String], + extraLibrariesStatic :: [String], extraGHCiLibraries :: [String], libraryDirs :: [FilePath], + libraryDirsStatic :: [FilePath], libraryDynDirs :: [FilePath], frameworks :: [String], frameworkDirs :: [FilePath], @@ -189,8 +191,10 @@ emptyInstalledPackageInfo = importDirs = [], hsLibraries = [], extraLibraries = [], + extraLibrariesStatic = [], extraGHCiLibraries = [], libraryDirs = [], + libraryDirsStatic = [], libraryDynDirs = [], frameworks = [], frameworkDirs = [], @@ -437,8 +441,8 @@ instance (RepInstalledPackageInfo a b c d e f g) => packageName packageVersion sourceLibName abiHash depends abiDepends importDirs - hsLibraries extraLibraries extraGHCiLibraries - libraryDirs libraryDynDirs + hsLibraries extraLibraries extraLibrariesStatic extraGHCiLibraries + libraryDirs libraryDirsStatic libraryDynDirs frameworks frameworkDirs ldOptions ccOptions includes includeDirs @@ -459,8 +463,10 @@ instance (RepInstalledPackageInfo a b c d e f g) => put importDirs put hsLibraries put extraLibraries + put extraLibrariesStatic put extraGHCiLibraries put libraryDirs + put libraryDirsStatic put libraryDynDirs put frameworks put frameworkDirs @@ -491,8 +497,10 @@ instance (RepInstalledPackageInfo a b c d e f g) => importDirs <- get hsLibraries <- get extraLibraries <- get + extraLibrariesStatic <- get extraGHCiLibraries <- get libraryDirs <- get + libraryDirsStatic <- get libraryDynDirs <- get frameworks <- get frameworkDirs <- get @@ -519,8 +527,8 @@ instance (RepInstalledPackageInfo a b c d e f g) => (map fromStringRep depends) (map (\(k,v) -> (fromStringRep k, v)) abiDepends) importDirs - hsLibraries extraLibraries extraGHCiLibraries - libraryDirs libraryDynDirs + hsLibraries extraLibraries extraLibrariesStatic extraGHCiLibraries + libraryDirs libraryDirsStatic libraryDynDirs frameworks frameworkDirs ldOptions ccOptions includes includeDirs diff --git a/utils/ghc-pkg/Main.hs b/utils/ghc-pkg/Main.hs index 946ae72007091a4af7b671e55cc12eb4379f4eee..eb367fb9d3697859ca426f3cd31e2908641f8259 100644 --- a/utils/ghc-pkg/Main.hs +++ b/utils/ghc-pkg/Main.hs @@ -975,6 +975,7 @@ mungePackagePaths top_dir pkgroot pkg = importDirs = munge_paths (importDirs pkg), includeDirs = munge_paths (includeDirs pkg), libraryDirs = munge_paths (libraryDirs pkg), + libraryDirsStatic = munge_paths (libraryDirsStatic pkg), libraryDynDirs = munge_paths (libraryDynDirs pkg), frameworkDirs = munge_paths (frameworkDirs pkg), haddockInterfaces = munge_paths (haddockInterfaces pkg), @@ -1375,8 +1376,10 @@ convertPackageInfoToCacheFormat pkg = GhcPkg.importDirs = importDirs pkg, GhcPkg.hsLibraries = hsLibraries pkg, GhcPkg.extraLibraries = extraLibraries pkg, + GhcPkg.extraLibrariesStatic = extraLibrariesStatic pkg, GhcPkg.extraGHCiLibraries = extraGHCiLibraries pkg, GhcPkg.libraryDirs = libraryDirs pkg, + GhcPkg.libraryDirsStatic = libraryDirsStatic pkg, GhcPkg.libraryDynDirs = libraryDynDirs pkg, GhcPkg.frameworks = frameworks pkg, GhcPkg.frameworkDirs = frameworkDirs pkg, @@ -1897,6 +1900,7 @@ checkPackageConfig pkg verbosity db_stack checkDuplicateDepends (depends pkg) mapM_ (checkDir False "import-dirs") (importDirs pkg) mapM_ (checkDir True "library-dirs") (libraryDirs pkg) + mapM_ (checkDir True "library-dirs-static") (libraryDirsStatic pkg) mapM_ (checkDir True "dynamic-library-dirs") (libraryDynDirs pkg) mapM_ (checkDir True "include-dirs") (includeDirs pkg) mapM_ (checkDir True "framework-dirs") (frameworkDirs pkg) @@ -1906,7 +1910,7 @@ checkPackageConfig pkg verbosity db_stack checkExposedModules db_stack pkg checkOtherModules pkg let has_code = Set.null (openModuleSubstFreeHoles (Map.fromList (instantiatedWith pkg))) - when has_code $ mapM_ (checkHSLib verbosity (libraryDirs pkg ++ libraryDynDirs pkg)) (hsLibraries pkg) + when has_code $ mapM_ (checkHSLib verbosity (libraryDirs pkg ++ libraryDirsStatic pkg ++ libraryDynDirs pkg)) (hsLibraries pkg) -- ToDo: check these somehow? -- extra_libraries :: [String], -- c_includes :: [String],