From f0bb7616ff3b228b9ba8976ea552911bc6408731 Mon Sep 17 00:00:00 2001 From: Phil de Joux Date: Tue, 29 Sep 2026 13:21:21 -0400 Subject: [PATCH 01/13] Remove GHCJS module and tests --- Cabal/Cabal.cabal | 1 - Cabal/src/Distribution/Simple/Build.hs | 15 - Cabal/src/Distribution/Simple/Compiler.hs | 2 +- Cabal/src/Distribution/Simple/Configure.hs | 11 - Cabal/src/Distribution/Simple/GHCJS.hs | 2056 ----------------- Cabal/src/Distribution/Simple/Haddock.hs | 3 - Cabal/src/Distribution/Simple/Install.hs | 4 - Cabal/src/Distribution/Simple/Register.hs | 9 +- .../Distribution/Client/ProjectPlanning.hs | 2 - cabal-install/src/Distribution/Client/Run.hs | 21 +- .../GHCJS/BuildRunner/BuildRunner.cabal | 21 - .../GHCJS/BuildRunner/BuildRunner.hs | 7 - .../PackageTests/GHCJS/BuildRunner/README.md | 6 - .../GHCJS/BuildRunner/cabal.project | 1 - .../GHCJS/BuildRunner/cabal.test.hs | 21 - .../GHCJS/BuildRunner/scripts/cc.bat | 45 - .../GHCJS/BuildRunner/scripts/fake-ghcjs.exe | Bin 115712 -> 0 bytes .../GHCJS/BuildRunner/scripts/fake-ghcjs.sh | 20 - .../GHCJS/BuildRunner/scripts/fake-ghcjs.shim | 2 - .../GHCJS/BuildRunner/scripts/ghcjs-pkg | 9 - .../GHCJS/BuildRunner/scripts/ghcjs-pkg.exe | Bin 115712 -> 0 bytes .../GHCJS/BuildRunner/scripts/ghcjs-pkg.shim | 2 - 22 files changed, 7 insertions(+), 2251 deletions(-) delete mode 100644 Cabal/src/Distribution/Simple/GHCJS.hs delete mode 100644 cabal-testsuite/PackageTests/GHCJS/BuildRunner/BuildRunner.cabal delete mode 100644 cabal-testsuite/PackageTests/GHCJS/BuildRunner/BuildRunner.hs delete mode 100644 cabal-testsuite/PackageTests/GHCJS/BuildRunner/README.md delete mode 100644 cabal-testsuite/PackageTests/GHCJS/BuildRunner/cabal.project delete mode 100644 cabal-testsuite/PackageTests/GHCJS/BuildRunner/cabal.test.hs delete mode 100644 cabal-testsuite/PackageTests/GHCJS/BuildRunner/scripts/cc.bat delete mode 100644 cabal-testsuite/PackageTests/GHCJS/BuildRunner/scripts/fake-ghcjs.exe delete mode 100755 cabal-testsuite/PackageTests/GHCJS/BuildRunner/scripts/fake-ghcjs.sh delete mode 100644 cabal-testsuite/PackageTests/GHCJS/BuildRunner/scripts/fake-ghcjs.shim delete mode 100755 cabal-testsuite/PackageTests/GHCJS/BuildRunner/scripts/ghcjs-pkg delete mode 100644 cabal-testsuite/PackageTests/GHCJS/BuildRunner/scripts/ghcjs-pkg.exe delete mode 100644 cabal-testsuite/PackageTests/GHCJS/BuildRunner/scripts/ghcjs-pkg.shim diff --git a/Cabal/Cabal.cabal b/Cabal/Cabal.cabal index 1383588445d..a2873501231 100644 --- a/Cabal/Cabal.cabal +++ b/Cabal/Cabal.cabal @@ -125,7 +125,6 @@ library Distribution.Simple.FileMonitor.Types Distribution.Simple.Flag Distribution.Simple.GHC - Distribution.Simple.GHCJS Distribution.Simple.Haddock Distribution.Simple.Glob Distribution.Simple.Glob.Internal diff --git a/Cabal/src/Distribution/Simple/Build.hs b/Cabal/src/Distribution/Simple/Build.hs index 2e41bb1aa35..0fc2ea70b8f 100644 --- a/Cabal/src/Distribution/Simple/Build.hs +++ b/Cabal/src/Distribution/Simple/Build.hs @@ -70,7 +70,6 @@ import Distribution.Backpack import Distribution.Backpack.DescribeUnitId import Distribution.Package import qualified Distribution.Simple.GHC as GHC -import qualified Distribution.Simple.GHCJS as GHCJS import qualified Distribution.Simple.PackageIndex as Index import qualified Distribution.Simple.UHC as UHC @@ -443,7 +442,6 @@ startInterpreter startInterpreter verbosity programDb comp platform packageDBs = case compilerFlavor comp of GHC -> GHC.startInterpreter verbosity programDb comp platform packageDBs - GHCJS -> GHCJS.startInterpreter verbosity programDb comp platform packageDBs _ -> dieWithException verbosity REPLNotSupported buildComponent @@ -983,7 +981,6 @@ buildLib verbHandles flags numJobs pkg_descr lbi lib clbi = let verbosity = mkVerbosity verbHandles $ fromFlag $ buildVerbosity flags in case compilerFlavor (compiler lbi) of GHC -> GHC.buildLib verbHandles flags numJobs pkg_descr lbi lib clbi - GHCJS -> GHCJS.buildLib verbosity numJobs pkg_descr lbi lib clbi UHC -> UHC.buildLib verbosity pkg_descr lbi lib clbi _ -> dieWithException verbosity BuildingNotSupportedWithCompiler @@ -1015,7 +1012,6 @@ buildExe buildExe verbosity numJobs pkg_descr lbi exe clbi = case compilerFlavor (compiler lbi) of GHC -> GHC.buildExe verbosity numJobs pkg_descr lbi exe clbi - GHCJS -> GHCJS.buildExe verbosity numJobs pkg_descr lbi exe clbi UHC -> UHC.buildExe verbosity pkg_descr lbi exe clbi _ -> dieWithException verbosity BuildingNotSupportedWithCompiler @@ -1029,12 +1025,10 @@ replLib -> IO () replLib verbHandles replFlags pkg_descr lbi lib clbi = let verbosity = mkVerbosity verbHandles (fromFlag $ replVerbosity replFlags) - opts = replReplOptions replFlags in case compilerFlavor (compiler lbi) of -- 'cabal repl' doesn't need to support 'ghc --make -j', so we just pass -- NoFlag as the numJobs parameter. GHC -> GHC.replLib verbHandles replFlags NoFlag pkg_descr lbi lib clbi - GHCJS -> GHCJS.replLib (replOptionsFlags opts) verbosity NoFlag pkg_descr lbi lib clbi _ -> dieWithException verbosity REPLNotSupported replExe @@ -1049,15 +1043,6 @@ replExe verbHandles flags pkg_descr lbi exe clbi = let verbosity = mkVerbosity verbHandles $ fromFlag $ replVerbosity flags in case compilerFlavor (compiler lbi) of GHC -> GHC.replExe verbHandles flags NoFlag pkg_descr lbi exe clbi - GHCJS -> - GHCJS.replExe - (replOptionsFlags $ replReplOptions flags) - verbosity - NoFlag - pkg_descr - lbi - exe - clbi _ -> dieWithException verbosity REPLNotSupported replFLib diff --git a/Cabal/src/Distribution/Simple/Compiler.hs b/Cabal/src/Distribution/Simple/Compiler.hs index fbf159f11a6..3dd5534c5a1 100644 --- a/Cabal/src/Distribution/Simple/Compiler.hs +++ b/Cabal/src/Distribution/Simple/Compiler.hs @@ -158,7 +158,7 @@ compilerVersion = (\(CompilerId _ v) -> v) . compilerId -- | Is this compiler compatible with the compiler flavour we're interested in? -- -- For example this checks if the compiler is actually GHC or is another --- compiler that claims to be compatible with some version of GHC, e.g. GHCJS. +-- compiler that claims to be compatible with some version of GHC. -- -- > if compilerCompatFlavor GHC compiler then ... else ... compilerCompatFlavor :: CompilerFlavor -> Compiler -> Bool diff --git a/Cabal/src/Distribution/Simple/Configure.hs b/Cabal/src/Distribution/Simple/Configure.hs index 53c3b35caa0..bcb337dfb83 100644 --- a/Cabal/src/Distribution/Simple/Configure.hs +++ b/Cabal/src/Distribution/Simple/Configure.hs @@ -130,7 +130,6 @@ import Distribution.Verbosity import Distribution.Version import qualified Distribution.Simple.GHC as GHC -import qualified Distribution.Simple.GHCJS as GHCJS import qualified Distribution.Simple.UHC as UHC import Control.Exception @@ -823,8 +822,6 @@ buildOptionsFromConfigFlags verbosity cfg comp = do -- been changed to read shared libraries instead of archive -- files (see next code block). GHC.compilerBuildWay comp `notElem` [DynWay, ProfDynWay] - CompilerId GHCJS _ -> - not (GHCJS.isDynamic comp) _ -> False let sharedLibsByDefault @@ -837,8 +834,6 @@ buildOptionsFromConfigFlags verbosity cfg comp = do -- if ghc is dynamic, then ghci needs a shared -- library, so we build one by default. GHC.compilerBuildWay comp == DynWay - CompilerId GHCJS _ -> - GHCJS.isDynamic comp _ -> False withSharedLib_ = -- build shared libraries if required by GHC or by the @@ -2254,7 +2249,6 @@ getInstalledPackages verbosity comp mbWorkDir packageDBs progdb = do packageDBs' <- filterM packageDBExists packageDBs case compilerFlavor comp of GHC -> GHC.getInstalledPackages verbosity mbWorkDir packageDBs' progdb - GHCJS -> GHCJS.getInstalledPackages verbosity mbWorkDir packageDBs' progdb UHC -> UHC.getInstalledPackages verbosity comp mbWorkDir packageDBs' progdb flv -> dieWithException verbosity $ HowToFindInstalledPackages flv @@ -2289,8 +2283,6 @@ getPackageDBContents verbosity comp mbWorkDir packageDB progdb = do info verbosity "Reading installed packages..." case compilerFlavor comp of GHC -> GHC.getPackageDBContents verbosity mbWorkDir packageDB progdb - GHCJS -> GHCJS.getPackageDBContents verbosity mbWorkDir packageDB progdb - -- For other compilers, try to fall back on 'getInstalledPackages'. _ -> getInstalledPackages verbosity comp mbWorkDir [packageDB] progdb -- | A set of files (or directories) that can be monitored to detect when @@ -2688,7 +2680,6 @@ configCompilerEx Nothing _ _ _ verbosity = dieWithException verbosity UnknownCom configCompilerEx (Just hcFlavor) hcPath hcPkg progdb verbosity = do (comp, maybePlatform, programDb) <- case hcFlavor of GHC -> GHC.configure verbosity hcPath hcPkg progdb - GHCJS -> GHCJS.configure verbosity hcPath hcPkg progdb UHC -> UHC.configure verbosity hcPath progdb _ -> dieWithException verbosity UnknownCompilerException return (comp, fromMaybe buildPlatform maybePlatform, programDb) @@ -2708,7 +2699,6 @@ configCompiler mbFlavor hcPath progdb verbosity = do Just hcFlavor -> case hcFlavor of GHC -> GHC.configureCompiler verbosity hcPath progdb - GHCJS -> GHCJS.configureCompiler verbosity hcPath progdb UHC -> UHC.configure verbosity hcPath progdb _ -> dieWithException verbosity UnknownCompilerException return (comp, fromMaybe buildPlatform maybePlatform, programDb) @@ -2726,7 +2716,6 @@ configCompilerProgDb configCompilerProgDb verbosity comp hcProgDb hcPkgPath = do case compilerFlavor comp of GHC -> GHC.compilerProgramDb verbosity comp hcProgDb hcPkgPath - GHCJS -> GHCJS.compilerProgramDb verbosity comp hcProgDb hcPkgPath _ -> return hcProgDb -- ----------------------------------------------------------------------------- diff --git a/Cabal/src/Distribution/Simple/GHCJS.hs b/Cabal/src/Distribution/Simple/GHCJS.hs deleted file mode 100644 index 73eed6eefde..00000000000 --- a/Cabal/src/Distribution/Simple/GHCJS.hs +++ /dev/null @@ -1,2056 +0,0 @@ -{-# LANGUAGE DataKinds #-} - -module Distribution.Simple.GHCJS - ( getGhcInfo - , configure - , configureCompiler - , compilerProgramDb - , getInstalledPackages - , getInstalledPackagesMonitorFiles - , getPackageDBContents - , buildLib - , buildFLib - , buildExe - , replLib - , replFLib - , replExe - , startInterpreter - , installLib - , installFLib - , installExe - , libAbiHash - , hcPkgInfo - , registerPackage - , componentGhcOptions - , getLibDir - , isDynamic - , getGlobalPackageDB - , pkgRoot - , runCmd - - -- * Constructing and deconstructing GHC environment files - , Internal.GhcEnvironmentFileEntry (..) - , Internal.simpleGhcEnvironmentFile - , Internal.renderGhcEnvironmentFile - , Internal.writeGhcEnvironmentFile - , Internal.ghcPlatformAndVersionString - , readGhcEnvironmentFile - , parseGhcEnvironmentFile - , ParseErrorExc (..) - - -- * Version-specific implementation quirks - , getImplInfo - , GhcImplInfo (..) - ) where - -import Distribution.Compat.Prelude -import Prelude () - -import Distribution.CabalSpecVersion -import Distribution.InstalledPackageInfo (InstalledPackageInfo) -import qualified Distribution.InstalledPackageInfo as InstalledPackageInfo -import Distribution.ModuleName (ModuleName) -import qualified Distribution.ModuleName as ModuleName -import Distribution.Package -import Distribution.PackageDescription as PD -import Distribution.PackageDescription.Utils (cabalBug) -import Distribution.Pretty -import Distribution.Simple.BuildPaths -import Distribution.Simple.Compiler -import Distribution.Simple.Errors -import Distribution.Simple.Flag -import Distribution.Simple.GHC.Build.Link (hasThreaded) -import Distribution.Simple.GHC.Build.Utils (isCxx, isHaskell) -import Distribution.Simple.GHC.EnvironmentParser -import Distribution.Simple.GHC.ImplInfo -import qualified Distribution.Simple.GHC.Internal as Internal -import qualified Distribution.Simple.Hpc as Hpc -import Distribution.Simple.LocalBuildInfo -import Distribution.Simple.PackageIndex (InstalledPackageIndex) -import qualified Distribution.Simple.PackageIndex as PackageIndex -import Distribution.Simple.PreProcess.Types -import Distribution.Simple.Program -import Distribution.Simple.Program.GHC -import qualified Distribution.Simple.Program.HcPkg as HcPkg -import qualified Distribution.Simple.Program.Strip as Strip -import Distribution.Simple.Setup.Common -import Distribution.Simple.Utils -import Distribution.System -import Distribution.Types.ComponentLocalBuildInfo -import Distribution.Types.PackageName.Magic -import Distribution.Types.ParStrat -import Distribution.Utils.NubList -import Distribution.Utils.Path -import Distribution.Verbosity (Verbosity (..), VerbosityLevel, verbosityLevel) -import Distribution.Version - -import Control.Arrow ((***)) -import Control.Monad (msum) -import Data.Char (isLower) -import qualified Data.Map as Map -import Data.Maybe (fromJust) -import System.Directory - ( canonicalizePath - , createDirectoryIfMissing - , doesFileExist - , getAppUserDataDirectory - , renameFile - ) -import System.FilePath - ( isRelative - , replaceExtension - , takeDirectory - , takeExtension - ) -import qualified System.Info - --- ----------------------------------------------------------------------------- --- Configuring - --- | Configure GHCJS, and then auxiliary programs such as @ghc-pkg@, @haddock@ --- as well as toolchain programs such as @ar@, @ld. -configure - :: Verbosity - -> Maybe FilePath - -- ^ user-specified @ghcjs@ path (optional) - -> Maybe FilePath - -- ^ user-specified @ghcjs-pkg@ path (optional) - -> ProgramDb - -> IO (Compiler, Maybe Platform, ProgramDb) -configure verbosity hcPath hcPkgPath conf0 = do - (comp, compPlatform, progdb1) <- configureCompiler verbosity hcPath conf0 - compProgDb <- compilerProgramDb verbosity comp progdb1 hcPkgPath - return (comp, compPlatform, compProgDb) - --- | Configure GHCJS. -configureCompiler - :: Verbosity - -> Maybe FilePath - -- ^ user-specified @ghc@ path (optional) - -> ProgramDb - -> IO (Compiler, Maybe Platform, ProgramDb) -configureCompiler verbosity hcPath conf0 = do - (ghcjsProg, ghcjsVersion, progdb1) <- - requireProgramVersion - verbosity - ghcjsProgram - (orLaterVersion (mkVersion [0, 1])) - (userMaybeSpecifyPath "ghcjs" hcPath conf0) - - Just ghcjsGhcVersion <- findGhcjsGhcVersion verbosity (programPath ghcjsProg) - unless (ghcjsGhcVersion < mkVersion [8, 8]) $ - warn verbosity $ - "Unknown/unsupported 'ghc' version detected " - ++ "(Cabal " - ++ prettyShow cabalVersion - ++ " supports 'ghc' version < 8.8): " - ++ programPath ghcjsProg - ++ " is based on GHC version " - ++ prettyShow ghcjsGhcVersion - - let implInfo = ghcjsVersionImplInfo ghcjsVersion ghcjsGhcVersion - - languages <- Internal.getLanguages implInfo - extensions <- Internal.getExtensions verbosity ghcjsProg - - ghcjsInfo <- Internal.getGhcInfo verbosity implInfo ghcjsProg - let ghcInfoMap = Map.fromList ghcjsInfo - - let comp = - Compiler - { compilerId = CompilerId GHCJS ghcjsVersion - , compilerAbiTag = - AbiTag $ - "ghc" ++ intercalate "_" (map show . versionNumbers $ ghcjsGhcVersion) - , compilerCompat = [CompilerId GHC ghcjsGhcVersion] - , compilerLanguages = languages - , compilerExtensions = extensions - , compilerProperties = ghcInfoMap - , compilerWiredInUnitIds = Nothing - } - compPlatform = Internal.targetPlatform ghcjsInfo - return (comp, compPlatform, progdb1) - --- | Given a configured @ghcjs@ program, configure auxiliary programs such --- as @ghcjs-pkg@ or @haddock@, based on the location of the @ghcjs@ executable. -compilerProgramDb - :: Verbosity - -> Compiler - -> ProgramDb - -> Maybe FilePath - -- ^ user-specified @ghc-pkg@ path (optional) - -> IO ProgramDb -compilerProgramDb verbosity comp progdb1 hcPkgPath = do - let - ghcjsProg = fromJust $ lookupProgram ghcjsProgram progdb1 - ghcjsVersion = compilerVersion comp - ghcjsGhcVersion = case compilerCompat comp of - [CompilerId GHC ghcjsGhcVer] -> ghcjsGhcVer - compat -> error $ "could not parse ghcjsGhcVersion:" ++ show compat - - -- This is slightly tricky, we have to configure ghc first, then we use the - -- location of ghc to help find ghc-pkg in the case that the user did not - -- specify the location of ghc-pkg directly: - (ghcjsPkgProg, ghcjsPkgVersion, progdb2) <- - requireProgramVersion - verbosity - ghcjsPkgProgram - { programFindLocation = guessGhcjsPkgFromGhcjsPath ghcjsProg - } - anyVersion - (userMaybeSpecifyPath "ghcjs-pkg" hcPkgPath progdb1) - - Just ghcjsPkgGhcjsVersion <- - findGhcjsPkgGhcjsVersion - verbosity - (programPath ghcjsPkgProg) - - when (ghcjsVersion /= ghcjsPkgGhcjsVersion) $ - dieWithException verbosity $ - VersionMismatchJS - (programPath ghcjsProg) - ghcjsVersion - (programPath ghcjsPkgProg) - ghcjsPkgGhcjsVersion - - when (ghcjsGhcVersion /= ghcjsPkgVersion) $ - dieWithException verbosity $ - VersionMismatchGHCJS (programPath ghcjsProg) ghcjsGhcVersion (programPath ghcjsPkgProg) ghcjsPkgVersion - - -- Likewise we try to find the matching hsc2hs and haddock programs. - let hsc2hsProgram' = - hsc2hsProgram - { programFindLocation = - guessHsc2hsFromGhcjsPath ghcjsProg - } - haddockProgram' = - haddockProgram - { programFindLocation = - guessHaddockFromGhcjsPath ghcjsProg - } - hpcProgram' = - hpcProgram - { programFindLocation = guessHpcFromGhcjsPath ghcjsProg - } - {- - runghcProgram' = runghcProgram { - programFindLocation = guessRunghcFromGhcjsPath ghcjsProg - } -} - progdb3 = - addKnownProgram haddockProgram' $ - addKnownProgram hsc2hsProgram' $ - addKnownProgram hpcProgram' {- addKnownProgram runghcProgram' -} progdb2 - - return progdb3 - -guessGhcjsPkgFromGhcjsPath - :: ConfiguredProgram - -> Verbosity - -> ProgramSearchPath - -> IO (Maybe (FilePath, [FilePath])) -guessGhcjsPkgFromGhcjsPath = guessToolFromGhcjsPath ghcjsPkgProgram - -guessHsc2hsFromGhcjsPath - :: ConfiguredProgram - -> Verbosity - -> ProgramSearchPath - -> IO (Maybe (FilePath, [FilePath])) -guessHsc2hsFromGhcjsPath = guessToolFromGhcjsPath hsc2hsProgram - -guessHaddockFromGhcjsPath - :: ConfiguredProgram - -> Verbosity - -> ProgramSearchPath - -> IO (Maybe (FilePath, [FilePath])) -guessHaddockFromGhcjsPath = guessToolFromGhcjsPath haddockProgram - -guessHpcFromGhcjsPath - :: ConfiguredProgram - -> Verbosity - -> ProgramSearchPath - -> IO (Maybe (FilePath, [FilePath])) -guessHpcFromGhcjsPath = guessToolFromGhcjsPath hpcProgram - -guessToolFromGhcjsPath - :: Program - -> ConfiguredProgram - -> Verbosity - -> ProgramSearchPath - -> IO (Maybe (FilePath, [FilePath])) -guessToolFromGhcjsPath tool ghcjsProg verbosity searchpath = - do - let toolname = programName tool - given_path = programPath ghcjsProg - given_dir = takeDirectory given_path - real_path <- canonicalizePath given_path - let real_dir = takeDirectory real_path - versionSuffix path = takeVersionSuffix (dropExeExtension path) - given_suf = versionSuffix given_path - real_suf = versionSuffix real_path - guessNormal dir = dir toolname <.> exeExtension buildPlatform - guessGhcjs dir = - dir - (toolname ++ "-ghcjs") - <.> exeExtension buildPlatform - guessGhcjsVersioned dir suf = - dir - (toolname ++ "-ghcjs" ++ suf) - <.> exeExtension buildPlatform - guessVersioned dir suf = - dir - (toolname ++ suf) - <.> exeExtension buildPlatform - mkGuesses dir suf - | null suf = [guessGhcjs dir, guessNormal dir] - | otherwise = - [ guessGhcjsVersioned dir suf - , guessVersioned dir suf - , guessGhcjs dir - , guessNormal dir - ] - guesses = - mkGuesses given_dir given_suf - ++ if real_path == given_path - then [] - else mkGuesses real_dir real_suf - info verbosity $ - "looking for tool " - ++ toolname - ++ " near compiler in " - ++ given_dir - debug verbosity $ "candidate locations: " ++ show guesses - exists <- traverse doesFileExist guesses - case [file | (file, True) <- zip guesses exists] of - -- If we can't find it near ghc, fall back to the usual - -- method. - [] -> programFindLocation tool verbosity searchpath - (fp : _) -> do - info verbosity $ "found " ++ toolname ++ " in " ++ fp - let lookedAt = - map fst - . takeWhile (\(_file, exist) -> not exist) - $ zip guesses exists - return (Just (fp, lookedAt)) - where - takeVersionSuffix :: FilePath -> String - takeVersionSuffix = takeWhileEndLE isSuffixChar - - isSuffixChar :: Char -> Bool - isSuffixChar c = isDigit c || c == '.' || c == '-' - -getGhcInfo :: Verbosity -> ConfiguredProgram -> IO [(String, String)] -getGhcInfo verbosity ghcjsProg = Internal.getGhcInfo verbosity implInfo ghcjsProg - where - version = fromMaybe (error "GHCJS.getGhcInfo: no version") $ programVersion ghcjsProg - implInfo = ghcVersionImplInfo version - --- | Given a single package DB, return all installed packages. -getPackageDBContents - :: Verbosity - -> Maybe (SymbolicPath CWD (Dir from)) - -> PackageDBX (SymbolicPath from (Dir PkgDB)) - -> ProgramDb - -> IO InstalledPackageIndex -getPackageDBContents verbosity mbWorkDir packagedb progdb = do - pkgss <- getInstalledPackages' verbosity mbWorkDir [packagedb] progdb - toPackageIndex verbosity pkgss progdb - --- | Given a package DB stack, return all installed packages. -getInstalledPackages - :: Verbosity - -> Maybe (SymbolicPath CWD (Dir from)) - -> PackageDBStackX (SymbolicPath from (Dir PkgDB)) - -> ProgramDb - -> IO InstalledPackageIndex -getInstalledPackages verbosity mbWorkDir packagedbs progdb = do - checkPackageDbEnvVar verbosity - checkPackageDbStack verbosity packagedbs - pkgss <- getInstalledPackages' verbosity mbWorkDir packagedbs progdb - index <- toPackageIndex verbosity pkgss progdb - return $! index - -toPackageIndex - :: Verbosity - -> [(PackageDBX a, [InstalledPackageInfo])] - -> ProgramDb - -> IO InstalledPackageIndex -toPackageIndex verbosity pkgss progdb = do - -- On Windows, various fields have $topdir/foo rather than full - -- paths. We need to substitute the right value in so that when - -- we, for example, call gcc, we have proper paths to give it. - topDir <- getLibDir' verbosity ghcjsProg - let indices = - [ PackageIndex.fromList (map (Internal.substTopDir topDir) pkgs) - | (_, pkgs) <- pkgss - ] - return $! mconcat indices - where - ghcjsProg = fromMaybe (error "GHCJS.toPackageIndex no ghcjs program") $ lookupProgram ghcjsProgram progdb - -getLibDir :: Verbosity -> LocalBuildInfo -> IO FilePath -getLibDir verbosity lbi = - dropWhileEndLE isSpace - `fmap` getDbProgramOutput - verbosity - ghcjsProgram - (withPrograms lbi) - ["--print-libdir"] - -getLibDir' :: Verbosity -> ConfiguredProgram -> IO FilePath -getLibDir' verbosity ghcjsProg = - dropWhileEndLE isSpace - `fmap` getProgramOutput verbosity ghcjsProg ["--print-libdir"] - --- | Return the 'FilePath' to the global GHC package database. -getGlobalPackageDB :: Verbosity -> ConfiguredProgram -> IO FilePath -getGlobalPackageDB verbosity ghcProg = - dropWhileEndLE isSpace - `fmap` getProgramOutput verbosity ghcProg ["--print-global-package-db"] - --- | Return the 'FilePath' to the per-user GHC package database. -getUserPackageDB :: Verbosity -> ConfiguredProgram -> Platform -> IO FilePath -getUserPackageDB _verbosity ghcjsProg platform = do - -- It's rather annoying that we have to reconstruct this, because ghc - -- hides this information from us otherwise. But for certain use cases - -- like change monitoring it really can't remain hidden. - appdir <- getAppUserDataDirectory "ghcjs" - return (appdir platformAndVersion packageConfFileName) - where - platformAndVersion = - Internal.ghcPlatformAndVersionString - platform - ghcjsVersion - packageConfFileName = "package.conf.d" - ghcjsVersion = fromMaybe (error "GHCJS.getUserPackageDB: no version") $ programVersion ghcjsProg - -checkPackageDbEnvVar :: Verbosity -> IO () -checkPackageDbEnvVar verbosity = - Internal.checkPackageDbEnvVar verbosity "GHCJS" "GHCJS_PACKAGE_PATH" - -checkPackageDbStack :: Eq fp => Verbosity -> PackageDBStackX fp -> IO () -checkPackageDbStack _ (GlobalPackageDB : rest) - | GlobalPackageDB `notElem` rest = return () -checkPackageDbStack verbosity rest - | GlobalPackageDB `notElem` rest = - dieWithException verbosity GlobalPackageDBLimitation -checkPackageDbStack verbosity _ = - dieWithException verbosity GlobalPackageDBSpecifiedFirst - -getInstalledPackages' - :: Verbosity - -> Maybe (SymbolicPath CWD (Dir from)) - -> [PackageDBX (SymbolicPath from (Dir PkgDB))] - -> ProgramDb - -> IO [(PackageDBX (SymbolicPath from (Dir PkgDB)), [InstalledPackageInfo])] -getInstalledPackages' verbosity mbWorkDir packagedbs progdb = - sequenceA - [ do - pkgs <- HcPkg.dump (hcPkgInfo progdb) verbosity mbWorkDir packagedb - return (packagedb, pkgs) - | packagedb <- packagedbs - ] - --- | Get the packages from specific PackageDBs, not cumulative. -getInstalledPackagesMonitorFiles - :: Verbosity - -> Platform - -> Maybe (SymbolicPath CWD (Dir Pkg)) - -> ProgramDb - -> [PackageDB] - -> IO [FilePath] -getInstalledPackagesMonitorFiles verbosity platform mbWorkDir progdb = - traverse getPackageDBPath - where - getPackageDBPath :: PackageDB -> IO FilePath - getPackageDBPath GlobalPackageDB = - selectMonitorFile =<< getGlobalPackageDB verbosity ghcjsProg - getPackageDBPath UserPackageDB = - selectMonitorFile =<< getUserPackageDB verbosity ghcjsProg platform - getPackageDBPath (SpecificPackageDB path) = selectMonitorFile (interpretSymbolicPath mbWorkDir path) - - -- GHC has old style file dbs, and new style directory dbs. - -- Note that for dir style dbs, we only need to monitor the cache file, not - -- the whole directory. The ghc program itself only reads the cache file - -- so it's safe to only monitor this one file. - selectMonitorFile path0 = do - let path = - if isRelative path0 - then interpretSymbolicPath mbWorkDir (makeRelativePathEx path0) - else path0 - isFileStyle <- doesFileExist path - if isFileStyle - then return path - else return (path "package.cache") - - ghcjsProg = fromMaybe (error "GHCJS.toPackageIndex no ghcjs program") $ lookupProgram ghcjsProgram progdb - -toJSLibName :: String -> String -toJSLibName lib - | takeExtension lib `elem` [".dll", ".dylib", ".so"] = - replaceExtension lib "js_so" - | takeExtension lib == ".a" = replaceExtension lib "js_a" - | otherwise = lib <.> "js_a" - --- ----------------------------------------------------------------------------- --- Building a library - -buildLib - :: Verbosity - -> Flag ParStrat - -> PackageDescription - -> LocalBuildInfo - -> Library - -> ComponentLocalBuildInfo - -> IO () -buildLib = buildOrReplLib Nothing - -replLib - :: [String] - -> Verbosity - -> Flag ParStrat - -> PackageDescription - -> LocalBuildInfo - -> Library - -> ComponentLocalBuildInfo - -> IO () -replLib = buildOrReplLib . Just - -buildOrReplLib - :: Maybe [String] - -> Verbosity - -> Flag ParStrat - -> PackageDescription - -> LocalBuildInfo - -> Library - -> ComponentLocalBuildInfo - -> IO () -buildOrReplLib mReplFlags verbosity numJobs _pkg_descr lbi lib clbi = do - let uid = componentUnitId clbi - libTargetDir = componentBuildDir lbi clbi - whenVanillaLib forceVanilla = - when (forceVanilla || withVanillaLib lbi) - whenProfLib = when (withProfLib lbi) - whenSharedLib forceShared = - when (forceShared || withSharedLib lbi) - whenStaticLib forceStatic = - when (forceStatic || withStaticLib lbi) - -- whenGHCiLib = when (withGHCiLib lbi) - forRepl = isJust mReplFlags - -- ifReplLib = when forRepl - comp = compiler lbi - implInfo = getImplInfo comp - platform@(Platform _hostArch _hostOS) = hostPlatform lbi - has_code = not (componentIsIndefinite clbi) - mbWorkDir = mbWorkDirLBI lbi - - -- See Note [Symbolic paths] in Distribution.Utils.Path - i = interpretSymbolicPathLBI lbi - u :: SymbolicPathX allowAbs Pkg to -> FilePath - u = getSymbolicPath - - (ghcjsProg, _) <- requireProgram verbosity ghcjsProgram (withPrograms lbi) - let runGhcjsProg = runGHC verbosity ghcjsProg comp platform mbWorkDir - - let libBi = libBuildInfo lib - - -- fixme flags shouldn't depend on ghcjs being dynamic or not - let isGhcjsDynamic = isDynamic comp - dynamicTooSupported = supportsDynamicToo comp - doingTH = usesTemplateHaskellOrQQ libBi - forceVanillaLib = doingTH && not isGhcjsDynamic - forceSharedLib = doingTH && isGhcjsDynamic - -- TH always needs default libs, even when building for profiling - - -- Determine if program coverage should be enabled and if so, what - -- '-hpcdir' should be. - let isCoverageEnabled = libCoverage lbi - hpcdir way - | forRepl = mempty -- HPC is not supported in ghci - | isCoverageEnabled = toFlag $ Hpc.mixDir (coerceSymbolicPath libTargetDir coerceSymbolicPath extraCompilationArtifacts) way - | otherwise = mempty - - createDirectoryIfMissingVerbose verbosity True $ i libTargetDir - -- TODO: do we need to put hs-boot files into place for mutually recursive - -- modules? - let cLikeFiles = fromNubListR $ toNubListR (cSources libBi) <> toNubListR (cxxSources libBi) - jsSrcs = jsSources libBi - cObjs = map (`replaceExtensionSymbolicPath` objExtension) cLikeFiles - baseOpts = componentGhcOptions (verbosityLevel verbosity) lbi libBi clbi libTargetDir - linkJsLibOpts = - mempty - { ghcOptExtra = - [ "-link-js-lib" - , getHSLibraryName uid - , "-js-lib-outputdir" - , u libTargetDir - ] - ++ map u jsSrcs - } - vanillaOptsNoJsLib = - baseOpts - <> mempty - { ghcOptMode = toFlag GhcModeMake - , ghcOptNumJobs = numJobs - , ghcOptInputModules = toNubListR $ allLibModules lib clbi - , ghcOptHPCDir = hpcdir Hpc.Vanilla - } - vanillaOpts = vanillaOptsNoJsLib <> linkJsLibOpts - - profOpts = - adjustExts "p_hi" "p_o" vanillaOpts - <> mempty - { ghcOptProfilingMode = toFlag True - , ghcOptProfilingAuto = - Internal.profDetailLevelFlag - True - (withProfLibDetail lbi) - , -- ghcOptHiSuffix = toFlag "p_hi", - -- ghcOptObjSuffix = toFlag "p_o", - ghcOptExtra = hcProfOptions GHC libBi - , ghcOptHPCDir = hpcdir Hpc.Prof - } - - sharedOpts = - adjustExts "dyn_hi" "dyn_o" vanillaOpts - <> mempty - { ghcOptDynLinkMode = toFlag GhcDynamicOnly - , ghcOptFPic = toFlag True - , -- ghcOptHiSuffix = toFlag "dyn_hi", - -- ghcOptObjSuffix = toFlag "dyn_o", - ghcOptExtra = hcOptions GHC libBi ++ hcSharedOptions GHC libBi - , ghcOptHPCDir = hpcdir Hpc.Dyn - } - - vanillaSharedOpts = - vanillaOpts - <> mempty - { ghcOptDynLinkMode = toFlag GhcStaticAndDynamic - , ghcOptDynHiSuffix = toFlag "js_dyn_hi" - , ghcOptDynObjSuffix = toFlag "js_dyn_o" - , ghcOptHPCDir = hpcdir Hpc.Dyn - } - - unless (forRepl || null (allLibModules lib clbi) && null jsSrcs && null cObjs) $ - do - let vanilla = whenVanillaLib forceVanillaLib (runGhcjsProg vanillaOpts) - shared = whenSharedLib forceSharedLib (runGhcjsProg sharedOpts) - useDynToo = - dynamicTooSupported - && (forceVanillaLib || withVanillaLib lbi) - && (forceSharedLib || withSharedLib lbi) - && null (hcSharedOptions GHC libBi) - if not has_code - then vanilla - else - if useDynToo - then do - runGhcjsProg vanillaSharedOpts - case (hpcdir Hpc.Dyn, hpcdir Hpc.Vanilla) of - (Flag dynDir, Flag vanillaDir) -> - -- When the vanilla and shared library builds are done - -- in one pass, only one set of HPC module interfaces - -- are generated. This set should suffice for both - -- static and dynamically linked executables. We copy - -- the modules interfaces so they are available under - -- both ways. - copyDirectoryRecursive verbosity (i dynDir) (i vanillaDir) - _ -> return () - else - if isGhcjsDynamic - then do shared; vanilla - else do vanilla; shared - whenProfLib (runGhcjsProg profOpts) - - -- Build any C++ sources separately. - {- - unless (not has_code || null (cxxSources libBi) || not nativeToo) $ do - info verbosity "Building C++ Sources..." - sequence_ - [ do let baseCxxOpts = Internal.componentCxxGhcOptions verbosity implInfo - lbi libBi clbi libTargetDir filename - vanillaCxxOpts = if isGhcjsDynamic - then baseCxxOpts { ghcOptFPic = toFlag True } - else baseCxxOpts - profCxxOpts = vanillaCxxOpts <> mempty { - ghcOptProfilingMode = toFlag True, - ghcOptObjSuffix = toFlag "p_o" - } - sharedCxxOpts = vanillaCxxOpts <> mempty { - ghcOptFPic = toFlag True, - ghcOptDynLinkMode = toFlag GhcDynamicOnly, - ghcOptObjSuffix = toFlag "dyn_o" - } - odir = fromFlag (ghcOptObjDir vanillaCxxOpts) - createDirectoryIfMissingVerbose verbosity True odir - let runGhcProgIfNeeded cxxOpts = do - needsRecomp <- checkNeedsRecompilation filename cxxOpts - when needsRecomp $ runGhcjsProg cxxOpts - runGhcProgIfNeeded vanillaCxxOpts - unless forRepl $ - whenSharedLib forceSharedLib (runGhcProgIfNeeded sharedCxxOpts) - unless forRepl $ whenProfLib (runGhcProgIfNeeded profCxxOpts) - | filename <- cxxSources libBi] - - ifReplLib $ do - when (null (allLibModules lib clbi)) $ warn verbosity "No exposed modules" - ifReplLib (runGhcjsProg replOpts) - -} - -- build any C sources - -- TODO: Add support for S and CMM files. - {- - unless (not has_code || null (cSources libBi) || not nativeToo) $ do - info verbosity "Building C Sources..." - sequence_ - [ do let baseCcOpts = Internal.componentCcGhcOptions verbosity implInfo - lbi libBi clbi libTargetDir filename - vanillaCcOpts = if isGhcjsDynamic - -- Dynamic GHC requires C sources to be built - -- with -fPIC for REPL to work. See #2207. - then baseCcOpts { ghcOptFPic = toFlag True } - else baseCcOpts - profCcOpts = vanillaCcOpts <> mempty { - ghcOptProfilingMode = toFlag True, - ghcOptObjSuffix = toFlag "p_o" - } - sharedCcOpts = vanillaCcOpts <> mempty { - ghcOptFPic = toFlag True, - ghcOptDynLinkMode = toFlag GhcDynamicOnly, - ghcOptObjSuffix = toFlag "dyn_o" - } - odir = fromFlag (ghcOptObjDir vanillaCcOpts) - createDirectoryIfMissingVerbose verbosity True odir - let runGhcProgIfNeeded ccOpts = do - needsRecomp <- checkNeedsRecompilation filename ccOpts - when needsRecomp $ runGhcjsProg ccOpts - runGhcProgIfNeeded vanillaCcOpts - unless forRepl $ - whenSharedLib forceSharedLib (runGhcProgIfNeeded sharedCcOpts) - unless forRepl $ whenProfLib (runGhcProgIfNeeded profCcOpts) - | filename <- cSources libBi] - -} - -- TODO: problem here is we need the .c files built first, so we can load them - -- with ghci, but .c files can depend on .h files generated by ghc by ffi - -- exports. - - -- link: - - when has_code . when False {- fixme nativeToo -} . unless forRepl $ do - info verbosity "Linking..." - let cSharedObjs = - map - (`replaceExtensionSymbolicPath` ("dyn_" ++ objExtension)) - (cSources libBi ++ cxxSources libBi) - compiler_id = compilerId (compiler lbi) - sharedLibFilePath = libTargetDir makeRelativePathEx (mkSharedLibName (hostPlatform lbi) compiler_id uid) - staticLibFilePath = libTargetDir makeRelativePathEx (mkStaticLibName (hostPlatform lbi) compiler_id uid) - - let stubObjs = [] - stubSharedObjs = [] - - hObjs <- - Internal.getHaskellObjects - implInfo - lib - lbi - clbi - (coerceSymbolicPath libTargetDir) - objExtension - True - hSharedObjs <- - if withSharedLib lbi - then - Internal.getHaskellObjects - implInfo - lib - lbi - clbi - (coerceSymbolicPath libTargetDir) - ("dyn_" ++ objExtension) - False - else return [] - - unless (null hObjs && null cObjs && null stubObjs) $ do - rpaths <- getRPaths lbi clbi - - let staticObjectFiles = - hObjs - ++ map (makeSymbolicPath . (getSymbolicPath libTargetDir ) . getSymbolicPath) cObjs - ++ stubObjs - dynamicObjectFiles = - hSharedObjs - ++ map (makeSymbolicPath . (getSymbolicPath libTargetDir ) . getSymbolicPath) cSharedObjs - ++ stubSharedObjs - -- After the relocation lib is created we invoke ghc -shared - -- with the dependencies spelled out as -package arguments - -- and ghc invokes the linker with the proper library paths - ghcSharedLinkArgs = - mempty - { ghcOptShared = toFlag True - , ghcOptDynLinkMode = toFlag GhcDynamicOnly - , ghcOptInputFiles = toNubListR dynamicObjectFiles - , ghcOptOutputFile = toFlag sharedLibFilePath - , ghcOptExtra = hcOptions GHC libBi ++ hcSharedOptions GHC libBi - , ghcOptHideAllPackages = toFlag True - , ghcOptNoAutoLinkPackages = toFlag True - , ghcOptPackageDBs = withPackageDB lbi - , ghcOptThisUnitId = case clbi of - LibComponentLocalBuildInfo{componentCompatPackageKey = pk} -> - toFlag pk - _ -> mempty - , ghcOptThisComponentId = case clbi of - LibComponentLocalBuildInfo{componentInstantiatedWith = insts} -> - if null insts - then mempty - else toFlag (componentComponentId clbi) - _ -> mempty - , ghcOptInstantiatedWith = case clbi of - LibComponentLocalBuildInfo{componentInstantiatedWith = insts} -> - insts - _ -> [] - , ghcOptPackages = - toNubListR $ - Internal.mkGhcOptPackages mempty clbi - , ghcOptLinkLibs = extraLibs libBi - , ghcOptLinkLibPath = toNubListR $ extraLibDirs libBi - , ghcOptLinkFrameworks = toNubListR $ map getSymbolicPath $ PD.frameworks libBi - , ghcOptLinkFrameworkDirs = - toNubListR $ PD.extraFrameworkDirs libBi - , ghcOptRPaths = rpaths - } - ghcStaticLinkArgs = - mempty - { ghcOptStaticLib = toFlag True - , ghcOptInputFiles = toNubListR staticObjectFiles - , ghcOptOutputFile = toFlag staticLibFilePath - , ghcOptExtra = hcStaticOptions GHC libBi - , ghcOptHideAllPackages = toFlag True - , ghcOptNoAutoLinkPackages = toFlag True - , ghcOptPackageDBs = withPackageDB lbi - , ghcOptThisUnitId = case clbi of - LibComponentLocalBuildInfo{componentCompatPackageKey = pk} -> - toFlag pk - _ -> mempty - , ghcOptThisComponentId = case clbi of - LibComponentLocalBuildInfo{componentInstantiatedWith = insts} -> - if null insts - then mempty - else toFlag (componentComponentId clbi) - _ -> mempty - , ghcOptInstantiatedWith = case clbi of - LibComponentLocalBuildInfo{componentInstantiatedWith = insts} -> - insts - _ -> [] - , ghcOptPackages = - toNubListR $ - Internal.mkGhcOptPackages mempty clbi - , ghcOptLinkLibs = extraLibs libBi - , ghcOptLinkLibPath = toNubListR $ extraLibDirs libBi - } - - info verbosity (show (ghcOptPackages ghcSharedLinkArgs)) - {- - whenVanillaLib False $ do - Ar.createArLibArchive verbosity lbi vanillaLibFilePath staticObjectFiles - whenGHCiLib $ do - (ldProg, _) <- requireProgram verbosity ldProgram (withPrograms lbi) - Ld.combineObjectFiles verbosity lbi ldProg - ghciLibFilePath staticObjectFiles - -} - {- - whenProfLib $ do - Ar.createArLibArchive verbosity lbi profileLibFilePath profObjectFiles - whenGHCiLib $ do - (ldProg, _) <- requireProgram verbosity ldProgram (withPrograms lbi) - Ld.combineObjectFiles verbosity lbi ldProg - ghciProfLibFilePath profObjectFiles - -} - whenSharedLib False $ - runGhcjsProg ghcSharedLinkArgs - - whenStaticLib False $ - runGhcjsProg ghcStaticLinkArgs - --- | Start a REPL without loading any source files. -startInterpreter - :: Verbosity - -> ProgramDb - -> Compiler - -> Platform - -> PackageDBStack - -> IO () -startInterpreter verbosity progdb comp platform packageDBs = do - let replOpts = - mempty - { ghcOptMode = toFlag GhcModeInteractive - , ghcOptPackageDBs = packageDBs - } - checkPackageDbStack verbosity packageDBs - (ghcjsProg, _) <- requireProgram verbosity ghcjsProgram progdb - runGHC verbosity ghcjsProg comp platform Nothing replOpts - --- ----------------------------------------------------------------------------- --- Building an executable or foreign library - --- | Build a foreign library -buildFLib - :: Verbosity - -> Flag ParStrat - -> PackageDescription - -> LocalBuildInfo - -> ForeignLib - -> ComponentLocalBuildInfo - -> IO () -buildFLib v njobs pkg lbi = gbuild v njobs pkg lbi . GBuildFLib - -replFLib - :: [String] - -> Verbosity - -> Flag ParStrat - -> PackageDescription - -> LocalBuildInfo - -> ForeignLib - -> ComponentLocalBuildInfo - -> IO () -replFLib replFlags v njobs pkg lbi = - gbuild v njobs pkg lbi . GReplFLib replFlags - --- | Build an executable with GHC. -buildExe - :: Verbosity - -> Flag ParStrat - -> PackageDescription - -> LocalBuildInfo - -> Executable - -> ComponentLocalBuildInfo - -> IO () -buildExe v njobs pkg lbi = gbuild v njobs pkg lbi . GBuildExe - -replExe - :: [String] - -> Verbosity - -> Flag ParStrat - -> PackageDescription - -> LocalBuildInfo - -> Executable - -> ComponentLocalBuildInfo - -> IO () -replExe replFlags v njobs pkg lbi = - gbuild v njobs pkg lbi . GReplExe replFlags - --- | Building an executable, starting the REPL, and building foreign --- libraries are all very similar and implemented in 'gbuild'. The --- 'GBuildMode' distinguishes between the various kinds of operation. -data GBuildMode - = GBuildExe Executable - | GReplExe [String] Executable - | GBuildFLib ForeignLib - | GReplFLib [String] ForeignLib - -gbuildInfo :: GBuildMode -> BuildInfo -gbuildInfo (GBuildExe exe) = buildInfo exe -gbuildInfo (GReplExe _ exe) = buildInfo exe -gbuildInfo (GBuildFLib flib) = foreignLibBuildInfo flib -gbuildInfo (GReplFLib _ flib) = foreignLibBuildInfo flib - -gbuildName :: GBuildMode -> String -gbuildName (GBuildExe exe) = unUnqualComponentName $ exeName exe -gbuildName (GReplExe _ exe) = unUnqualComponentName $ exeName exe -gbuildName (GBuildFLib flib) = unUnqualComponentName $ foreignLibName flib -gbuildName (GReplFLib _ flib) = unUnqualComponentName $ foreignLibName flib - -gbuildTargetName :: LocalBuildInfo -> GBuildMode -> String -gbuildTargetName lbi (GBuildExe exe) = exeTargetName (hostPlatform lbi) exe -gbuildTargetName lbi (GReplExe _ exe) = exeTargetName (hostPlatform lbi) exe -gbuildTargetName lbi (GBuildFLib flib) = flibTargetName lbi flib -gbuildTargetName lbi (GReplFLib _ flib) = flibTargetName lbi flib - -exeTargetName :: Platform -> Executable -> String -exeTargetName platform exe = unUnqualComponentName (exeName exe) `withExt` exeExtension platform - --- | Target name for a foreign library (the actual file name) --- --- We do not use mkLibName and co here because the naming for foreign libraries --- is slightly different (we don't use "_p" or compiler version suffices, and we --- don't want the "lib" prefix on Windows). --- --- TODO: We do use `dllExtension` and co here, but really that's wrong: they --- use the OS used to build cabal to determine which extension to use, rather --- than the target OS (but this is wrong elsewhere in Cabal as well). -flibTargetName :: LocalBuildInfo -> ForeignLib -> String -flibTargetName lbi flib = - case (os, foreignLibType flib) of - (Windows, ForeignLibNativeShared) -> nm <.> "dll" - (Windows, ForeignLibNativeStatic) -> nm <.> "lib" - (Linux, ForeignLibNativeShared) -> "lib" ++ nm <.> versionedExt - (_other, ForeignLibNativeShared) -> "lib" ++ nm <.> dllExtension (hostPlatform lbi) - (_other, ForeignLibNativeStatic) -> "lib" ++ nm <.> staticLibExtension (hostPlatform lbi) - (_any, ForeignLibTypeUnknown) -> cabalBug "unknown foreign lib type" - where - nm :: String - nm = unUnqualComponentName $ foreignLibName flib - - os :: OS - os = - let (Platform _ os') = hostPlatform lbi - in os' - - -- If a foreign lib foo has lib-version-info 5:1:2 or - -- lib-version-linux 3.2.1, it should be built as libfoo.so.3.2.1 - -- Libtool's version-info data is translated into library versions in a - -- nontrivial way: so refer to libtool documentation. - versionedExt :: String - versionedExt = - let nums = foreignLibVersion flib os - in foldl (<.>) "so" (map show nums) - --- | Name for the library when building. --- --- If the `lib-version-info` field or the `lib-version-linux` field of --- a foreign library target is set, we need to incorporate that --- version into the SONAME field. --- --- If a foreign library foo has lib-version-info 5:1:2, it should be --- built as libfoo.so.3.2.1. We want it to get soname libfoo.so.3. --- However, GHC does not allow overriding soname by setting linker --- options, as it sets a soname of its own (namely the output --- filename), after the user-supplied linker options. Hence, we have --- to compile the library with the soname as its filename. We rename --- the compiled binary afterwards. --- --- This method allows to adjust the name of the library at build time --- such that the correct soname can be set. -flibBuildName :: LocalBuildInfo -> ForeignLib -> String -flibBuildName lbi flib - -- On linux, if a foreign-library has version data, the first digit is used - -- to produce the SONAME. - | (os, foreignLibType flib) - == (Linux, ForeignLibNativeShared) = - let nums = foreignLibVersion flib os - in "lib" ++ nm <.> foldl (<.>) "so" (map show (take 1 nums)) - | otherwise = flibTargetName lbi flib - where - os :: OS - os = - let (Platform _ os') = hostPlatform lbi - in os' - - nm :: String - nm = unUnqualComponentName $ foreignLibName flib - -gbuildIsRepl :: GBuildMode -> Bool -gbuildIsRepl (GBuildExe _) = False -gbuildIsRepl (GReplExe _ _) = True -gbuildIsRepl (GBuildFLib _) = False -gbuildIsRepl (GReplFLib _ _) = True - -gbuildNeedDynamic :: LocalBuildInfo -> GBuildMode -> Bool -gbuildNeedDynamic lbi bm = - case bm of - GBuildExe _ -> withDynExe lbi - GReplExe _ _ -> withDynExe lbi - GBuildFLib flib -> withDynFLib flib - GReplFLib _ flib -> withDynFLib flib - where - withDynFLib flib = - case foreignLibType flib of - ForeignLibNativeShared -> - ForeignLibStandalone `notElem` foreignLibOptions flib - ForeignLibNativeStatic -> - False - ForeignLibTypeUnknown -> - cabalBug "unknown foreign lib type" - -gbuildModDefFiles :: GBuildMode -> [RelativePath Source File] -gbuildModDefFiles (GBuildExe _) = [] -gbuildModDefFiles (GReplExe _ _) = [] -gbuildModDefFiles (GBuildFLib flib) = foreignLibModDefFile flib -gbuildModDefFiles (GReplFLib _ flib) = foreignLibModDefFile flib - --- | "Main" module name when overridden by @ghc-options: -main-is ...@ --- or 'Nothing' if no @-main-is@ flag could be found. --- --- In case of 'Nothing', 'Distribution.ModuleName.main' can be assumed. -exeMainModuleName :: Executable -> Maybe ModuleName -exeMainModuleName Executable{buildInfo = bnfo} = - -- GHC honors the last occurrence of a module name updated via -main-is - -- - -- Moreover, -main-is when parsed left-to-right can update either - -- the "Main" module name, or the "main" function name, or both, - -- see also 'decodeMainIsArg'. - msum $ reverse $ map decodeMainIsArg $ findIsMainArgs ghcopts - where - ghcopts = hcOptions GHC bnfo - - findIsMainArgs [] = [] - findIsMainArgs ("-main-is" : arg : rest) = arg : findIsMainArgs rest - findIsMainArgs (_ : rest) = findIsMainArgs rest - --- | Decode argument to '-main-is' --- --- Returns 'Nothing' if argument set only the function name. --- --- This code has been stolen/refactored from GHC's DynFlags.setMainIs --- function. The logic here is deliberately imperfect as it is --- intended to be bug-compatible with GHC's parser. See discussion in --- https://github.com/haskell/cabal/pull/4539#discussion_r118981753. -decodeMainIsArg :: String -> Maybe ModuleName -decodeMainIsArg arg - | headOf main_fn isLower = - -- The arg looked like "Foo.Bar.baz" - Just (ModuleName.fromString main_mod) - | headOf arg isUpper -- The arg looked like "Foo" or "Foo.Bar" - = - Just (ModuleName.fromString arg) - | otherwise -- The arg looked like "baz" - = - Nothing - where - headOf :: String -> (Char -> Bool) -> Bool - headOf str pred' = any pred' (safeHead str) - - (main_mod, main_fn) = splitLongestPrefix arg (== '.') - - splitLongestPrefix :: String -> (Char -> Bool) -> (String, String) - splitLongestPrefix str pred' - | null r_pre = (str, []) - | otherwise = (reverse (safeTail r_pre), reverse r_suf) - where - -- 'safeTail' drops the char satisfying 'pred' - (r_suf, r_pre) = break pred' (reverse str) - --- | A collection of: --- * C input files --- * C++ input files --- * GHC input files --- * GHC input modules --- --- Used to correctly build and link sources. -data BuildSources = BuildSources - { cSourcesFiles :: [SymbolicPath Pkg File] - , cxxSourceFiles :: [SymbolicPath Pkg File] - , inputSourceFiles :: [SymbolicPath Pkg File] - , inputSourceModules :: [ModuleName] - } - --- | Locate and return the 'BuildSources' required to build and link. -gbuildSources - :: Verbosity - -> Maybe (SymbolicPath CWD ('Dir Pkg)) - -> PackageId - -> CabalSpecVersion - -> SymbolicPath Pkg (Dir Source) - -> GBuildMode - -> IO BuildSources -gbuildSources verbosity mbWorkDir pkgId specVer tmpDir bm = - case bm of - GBuildExe exe -> exeSources exe - GReplExe _ exe -> exeSources exe - GBuildFLib flib -> return $ flibSources flib - GReplFLib _ flib -> return $ flibSources flib - where - exeSources :: Executable -> IO BuildSources - exeSources exe@Executable{buildInfo = bnfo, modulePath = modPath} = do - main <- findFileCwd verbosity mbWorkDir (tmpDir : hsSourceDirs bnfo) modPath - let mainModName = fromMaybe ModuleName.main $ exeMainModuleName exe - otherModNames = exeModules exe - haskellMain = isHaskell (getSymbolicPath main) - - -- Scripts have fakePackageId and are always Haskell but can have any extension. - if haskellMain || pkgId == fakePackageId - then - if specVer < CabalSpecV2_0 && (mainModName `elem` otherModNames) - then do - -- The cabal manual clearly states that `other-modules` is - -- intended for non-main modules. However, there's at least one - -- important package on Hackage (happy-1.19.5) which - -- violates this. We workaround this here so that we don't - -- invoke GHC with e.g. 'ghc --make Main src/Main.hs' which - -- would result in GHC complaining about duplicate Main - -- modules. - -- - -- Finally, we only enable this workaround for - -- specVersion < 2, as 'cabal-version:>=2.0' cabal files - -- have no excuse anymore to keep doing it wrong... ;-) - warn verbosity $ - "Enabling workaround for Main module '" - ++ prettyShow mainModName - ++ "' listed in 'other-modules' illegally!" - - return - BuildSources - { cSourcesFiles = cSources bnfo - , cxxSourceFiles = cxxSources bnfo - , inputSourceFiles = [main] - , inputSourceModules = filter (/= mainModName) $ exeModules exe - } - else - return - BuildSources - { cSourcesFiles = cSources bnfo - , cxxSourceFiles = cxxSources bnfo - , inputSourceFiles = [main] - , inputSourceModules = exeModules exe - } - else - let (csf, cxxsf) - | isCxx (getSymbolicPath main) = (cSources bnfo, main : cxxSources bnfo) - -- if main is not a Haskell source - -- and main is not a C++ source - -- then we assume that it is a C source - | otherwise = (main : cSources bnfo, cxxSources bnfo) - in return - BuildSources - { cSourcesFiles = csf - , cxxSourceFiles = cxxsf - , inputSourceFiles = [] - , inputSourceModules = exeModules exe - } - - flibSources :: ForeignLib -> BuildSources - flibSources flib@ForeignLib{foreignLibBuildInfo = bnfo} = - BuildSources - { cSourcesFiles = cSources bnfo - , cxxSourceFiles = cxxSources bnfo - , inputSourceFiles = [] - , inputSourceModules = foreignLibModules flib - } - --- | Generic build function. See comment for 'GBuildMode'. -gbuild - :: Verbosity - -> Flag ParStrat - -> PackageDescription - -> LocalBuildInfo - -> GBuildMode - -> ComponentLocalBuildInfo - -> IO () -gbuild verbosity numJobs pkg_descr lbi bm clbi = do - (ghcjsProg, _) <- requireProgram verbosity ghcjsProgram (withPrograms lbi) - let replFlags = case bm of - GReplExe flags _ -> flags - GReplFLib flags _ -> flags - GBuildExe{} -> mempty - GBuildFLib{} -> mempty - comp = compiler lbi - platform = hostPlatform lbi - mbWorkDir = mbWorkDirLBI lbi - runGhcProg = runGHC verbosity ghcjsProg comp platform mbWorkDir - - let (bnfo, threaded) = case bm of - GBuildFLib _ -> popThreadedFlag (gbuildInfo bm) - _ -> (gbuildInfo bm, False) - - -- the name that GHC really uses (e.g., with .exe on Windows for executables) - let targetName = gbuildTargetName lbi bm - targetDir = buildDir lbi makeRelativePathEx (gbuildName bm) - tmpDir = targetDir makeRelativePathEx (gbuildName bm ++ "-tmp") - - -- See Note [Symbolic paths] in Distribution.Utils.Path - i = interpretSymbolicPath mbWorkDir - - createDirectoryIfMissingVerbose verbosity True $ i targetDir - createDirectoryIfMissingVerbose verbosity True $ i tmpDir - - -- TODO: do we need to put hs-boot files into place for mutually recursive - -- modules? FIX: what about exeName.hi-boot? - - -- Determine if program coverage should be enabled and if so, what - -- '-hpcdir' should be. - let isCoverageEnabled = exeCoverage lbi - hpcdir way - | gbuildIsRepl bm = mempty -- HPC is not supported in ghci - | isCoverageEnabled = toFlag $ Hpc.mixDir (tmpDir coerceSymbolicPath extraCompilationArtifacts) way - | otherwise = mempty - - rpaths <- getRPaths lbi clbi - buildSources <- gbuildSources verbosity mbWorkDir (package pkg_descr) (specVersion pkg_descr) tmpDir bm - - let cSrcs = cSourcesFiles buildSources - cxxSrcs = cxxSourceFiles buildSources - inputFiles = inputSourceFiles buildSources - inputModules = inputSourceModules buildSources - isGhcDynamic = isDynamic comp - dynamicTooSupported = supportsDynamicToo comp - cObjs = map (`replaceExtensionSymbolicPath` objExtension) cSrcs - cxxObjs = map (`replaceExtensionSymbolicPath` objExtension) cxxSrcs - needDynamic = gbuildNeedDynamic lbi bm - needProfiling = withProfExe lbi - - -- build executables - buildRunner = case clbi of - LibComponentLocalBuildInfo{} -> False - FLibComponentLocalBuildInfo{} -> False - ExeComponentLocalBuildInfo{} -> True - TestComponentLocalBuildInfo{} -> True - BenchComponentLocalBuildInfo{} -> True - baseOpts = - componentGhcOptions (verbosityLevel verbosity) lbi bnfo clbi tmpDir - <> mempty - { ghcOptMode = toFlag GhcModeMake - , ghcOptInputFiles = - toNubListR $ - if package pkg_descr == fakePackageId - then filter (isHaskell . getSymbolicPath) inputFiles - else inputFiles - , ghcOptInputScripts = - toNubListR $ - if package pkg_descr == fakePackageId - then filter (not . isHaskell . getSymbolicPath) inputFiles - else [] - , ghcOptInputModules = toNubListR inputModules - , -- for all executable components (exe/test/bench), - -- GHCJS must be passed the "-build-runner" option - ghcOptExtra = - if buildRunner - then ["-build-runner"] - else mempty - } - staticOpts = - baseOpts - <> mempty - { ghcOptDynLinkMode = toFlag GhcStaticOnly - , ghcOptHPCDir = hpcdir Hpc.Vanilla - } - profOpts = - baseOpts - <> mempty - { ghcOptProfilingMode = toFlag True - , ghcOptProfilingAuto = - Internal.profDetailLevelFlag - False - (withProfExeDetail lbi) - , ghcOptHiSuffix = toFlag "p_hi" - , ghcOptObjSuffix = toFlag "p_o" - , ghcOptExtra = hcProfOptions GHC bnfo - , ghcOptHPCDir = hpcdir Hpc.Prof - } - dynOpts = - baseOpts - <> mempty - { ghcOptDynLinkMode = toFlag GhcDynamicOnly - , -- TODO: Does it hurt to set -fPIC for executables? - ghcOptFPic = toFlag True - , ghcOptHiSuffix = toFlag "dyn_hi" - , ghcOptObjSuffix = toFlag "dyn_o" - , ghcOptExtra = hcOptions GHC bnfo ++ hcSharedOptions GHC bnfo - , ghcOptHPCDir = hpcdir Hpc.Dyn - } - dynTooOpts = - staticOpts - <> mempty - { ghcOptDynLinkMode = toFlag GhcStaticAndDynamic - , ghcOptDynHiSuffix = toFlag "dyn_hi" - , ghcOptDynObjSuffix = toFlag "dyn_o" - , ghcOptHPCDir = hpcdir Hpc.Dyn - } - linkerOpts = - mempty - { ghcOptLinkOptions = PD.ldOptions bnfo - , ghcOptLinkLibs = extraLibs bnfo - , ghcOptLinkLibPath = toNubListR $ extraLibDirs bnfo - , ghcOptLinkFrameworks = - toNubListR $ - map getSymbolicPath $ - PD.frameworks bnfo - , ghcOptLinkFrameworkDirs = - toNubListR $ - PD.extraFrameworkDirs bnfo - , ghcOptInputFiles = - toNubListR - [makeSymbolicPath $ getSymbolicPath tmpDir getSymbolicPath x | x <- cObjs ++ cxxObjs] - } - dynLinkerOpts = - mempty - { ghcOptRPaths = rpaths - } - replOpts = - baseOpts - { ghcOptExtra = - Internal.filterGhciFlags - (ghcOptExtra baseOpts) - <> replFlags - } - -- For a normal compile we do separate invocations of ghc for - -- compiling as for linking. But for repl we have to do just - -- the one invocation, so that one has to include all the - -- linker stuff too, like -l flags and any .o files from C - -- files etc. - <> linkerOpts - <> mempty - { ghcOptMode = toFlag GhcModeInteractive - , ghcOptOptimisation = toFlag GhcNoOptimisation - } - commonOpts - | needProfiling = profOpts - | needDynamic = dynOpts - | otherwise = staticOpts - compileOpts - | useDynToo = dynTooOpts - | otherwise = commonOpts - withStaticExe = not needProfiling && not needDynamic - - -- For building exe's that use TH with -prof or -dynamic we actually have - -- to build twice, once without -prof/-dynamic and then again with - -- -prof/-dynamic. This is because the code that TH needs to run at - -- compile time needs to be the vanilla ABI so it can be loaded up and run - -- by the compiler. - -- With dynamic-by-default GHC the TH object files loaded at compile-time - -- need to be .dyn_o instead of .o. - doingTH = usesTemplateHaskellOrQQ bnfo - -- Should we use -dynamic-too instead of compiling twice? - useDynToo = - dynamicTooSupported - && isGhcDynamic - && doingTH - && withStaticExe - && null (hcSharedOptions GHC bnfo) - compileTHOpts - | isGhcDynamic = dynOpts - | otherwise = staticOpts - compileForTH - | gbuildIsRepl bm = False - | useDynToo = False - | isGhcDynamic = doingTH && (needProfiling || withStaticExe) - | otherwise = doingTH && (needProfiling || needDynamic) - - -- Build static/dynamic object files for TH, if needed. - when compileForTH $ - runGhcProg - compileTHOpts - { ghcOptNoLink = toFlag True - , ghcOptNumJobs = numJobs - } - - -- Do not try to build anything if there are no input files. - -- This can happen if the cabal file ends up with only cSrcs - -- but no Haskell modules. - unless - ( (null inputFiles && null inputModules) - || gbuildIsRepl bm - ) - $ runGhcProg - compileOpts - { ghcOptNoLink = toFlag True - , ghcOptNumJobs = numJobs - } - - -- build any C++ sources - unless (null cxxSrcs) $ do - info verbosity "Building C++ Sources..." - sequence_ - [ do - let baseCxxOpts = - Internal.splitCandCxxOptions Internal.CxxProgram (verbosityLevel verbosity) lbi bnfo clbi odir filename - vanillaCxxOpts = - if isGhcDynamic - then -- Dynamic GHC requires C++ sources to be built - -- with -fPIC for REPL to work. See #2207. - baseCxxOpts{ghcOptFPic = toFlag True} - else baseCxxOpts - profCxxOpts = - vanillaCxxOpts - <> mempty - { ghcOptProfilingMode = toFlag True - } - sharedCxxOpts = - vanillaCxxOpts - <> mempty - { ghcOptFPic = toFlag True - , ghcOptDynLinkMode = toFlag GhcDynamicOnly - } - opts - | needProfiling = profCxxOpts - | needDynamic = sharedCxxOpts - | otherwise = vanillaCxxOpts - -- TODO: Placing all Haskell, C, & C++ objects in a single directory - -- Has the potential for file collisions. In general we would - -- consider this a user error. However, we should strive to - -- add a warning if this occurs. - odir = fromFlag (ghcOptObjDir opts) - createDirectoryIfMissingVerbose verbosity True (i odir) - needsRecomp <- checkNeedsRecompilation mbWorkDir filename opts - when needsRecomp $ - runGhcProg opts - | filename <- cxxSrcs - ] - - -- build any C sources - unless (null cSrcs) $ do - info verbosity "Building C Sources..." - sequence_ - [ do - let baseCcOpts = - Internal.splitCandCxxOptions Internal.CcProgram (verbosityLevel verbosity) lbi bnfo clbi tmpDir filename - vanillaCcOpts = - if isGhcDynamic - then -- Dynamic GHC requires C sources to be built - -- with -fPIC for REPL to work. See #2207. - baseCcOpts{ghcOptFPic = toFlag True} - else baseCcOpts - profCcOpts = - vanillaCcOpts - <> mempty - { ghcOptProfilingMode = toFlag True - } - sharedCcOpts = - vanillaCcOpts - <> mempty - { ghcOptFPic = toFlag True - , ghcOptDynLinkMode = toFlag GhcDynamicOnly - } - opts - | needProfiling = profCcOpts - | needDynamic = sharedCcOpts - | otherwise = vanillaCcOpts - odir = fromFlag (ghcOptObjDir opts) - createDirectoryIfMissingVerbose verbosity True (i odir) - needsRecomp <- checkNeedsRecompilation mbWorkDir filename opts - when needsRecomp $ - runGhcProg opts - | filename <- cSrcs - ] - - -- TODO: problem here is we need the .c files built first, so we can load them - -- with ghci, but .c files can depend on .h files generated by ghc by ffi - -- exports. - case bm of - GReplExe _ _ -> runGhcProg replOpts - GReplFLib _ _ -> runGhcProg replOpts - GBuildExe _ -> do - let linkOpts = - commonOpts - <> linkerOpts - <> mempty - { ghcOptLinkNoHsMain = toFlag (null inputFiles) - } - <> (if withDynExe lbi then dynLinkerOpts else mempty) - - info verbosity "Linking..." - -- Work around old GHCs not relinking in this - -- situation, see #3294 - let target = targetDir makeRelativePathEx targetName - runGhcProg linkOpts{ghcOptOutputFile = toFlag target} - GBuildFLib flib -> do - let rtsInfo = extractRtsInfo lbi - rtsOptLinkLibs = - [ if needDynamic - then - if threaded - then dynRtsThreadedLib (rtsDynamicInfo rtsInfo) - else dynRtsVanillaLib (rtsDynamicInfo rtsInfo) - else - if threaded - then statRtsThreadedLib (rtsStaticInfo rtsInfo) - else statRtsVanillaLib (rtsStaticInfo rtsInfo) - ] - linkOpts = case foreignLibType flib of - ForeignLibNativeShared -> - commonOpts - <> linkerOpts - <> dynLinkerOpts - <> mempty - { ghcOptLinkNoHsMain = toFlag True - , ghcOptShared = toFlag True - , ghcOptLinkLibs = rtsOptLinkLibs - , ghcOptLinkLibPath = toNubListR $ map makeSymbolicPath $ rtsLibPaths rtsInfo - , ghcOptFPic = toFlag True - , ghcOptLinkModDefFiles = toNubListR (getSymbolicPath <$> gbuildModDefFiles bm) - } - ForeignLibNativeStatic -> - -- this should be caught by buildFLib - -- (and if we do implement this, we probably don't even want to call - -- ghc here, but rather Ar.createArLibArchive or something) - cabalBug "static libraries not yet implemented" - ForeignLibTypeUnknown -> - cabalBug "unknown foreign lib type" - -- We build under a (potentially) different filename to set a - -- soname on supported platforms. See also the note for - -- @flibBuildName@. - info verbosity "Linking..." - let buildName = flibBuildName lbi flib - buildFile = targetDir makeRelativePathEx buildName - runGhcProg linkOpts{ghcOptOutputFile = toFlag buildFile} - renameFile (i buildFile) (i targetDir targetName) - -data DynamicRtsInfo = DynamicRtsInfo - { dynRtsVanillaLib :: FilePath - , dynRtsThreadedLib :: FilePath - , dynRtsDebugLib :: FilePath - , dynRtsEventlogLib :: FilePath - , dynRtsThreadedDebugLib :: FilePath - , dynRtsThreadedEventlogLib :: FilePath - } - -data StaticRtsInfo = StaticRtsInfo - { statRtsVanillaLib :: FilePath - , statRtsThreadedLib :: FilePath - , statRtsDebugLib :: FilePath - , statRtsEventlogLib :: FilePath - , statRtsThreadedDebugLib :: FilePath - , statRtsThreadedEventlogLib :: FilePath - , statRtsProfilingLib :: FilePath - , statRtsThreadedProfilingLib :: FilePath - } - -data RtsInfo = RtsInfo - { rtsDynamicInfo :: DynamicRtsInfo - , rtsStaticInfo :: StaticRtsInfo - , rtsLibPaths :: [FilePath] - } - --- | Extract (and compute) information about the RTS library --- --- TODO: This hardcodes the name as @HSrts-ghc@. I don't know if we can --- find this information somewhere. We can lookup the 'hsLibraries' field of --- 'InstalledPackageInfo' but it will tell us @["HSrts", "Cffi"]@, which --- doesn't really help. -extractRtsInfo :: LocalBuildInfo -> RtsInfo -extractRtsInfo lbi = - case PackageIndex.lookupPackageName (installedPkgs lbi) (mkPackageName "rts") of - [(_, [rts])] -> aux rts - _otherwise -> error "No (or multiple) ghc rts package is registered" - where - aux :: InstalledPackageInfo -> RtsInfo - aux rts = - RtsInfo - { rtsDynamicInfo = - DynamicRtsInfo - { dynRtsVanillaLib = withGhcVersion "HSrts" - , dynRtsThreadedLib = withGhcVersion "HSrts_thr" - , dynRtsDebugLib = withGhcVersion "HSrts_debug" - , dynRtsEventlogLib = withGhcVersion "HSrts_l" - , dynRtsThreadedDebugLib = withGhcVersion "HSrts_thr_debug" - , dynRtsThreadedEventlogLib = withGhcVersion "HSrts_thr_l" - } - , rtsStaticInfo = - StaticRtsInfo - { statRtsVanillaLib = "HSrts" - , statRtsThreadedLib = "HSrts_thr" - , statRtsDebugLib = "HSrts_debug" - , statRtsEventlogLib = "HSrts_l" - , statRtsThreadedDebugLib = "HSrts_thr_debug" - , statRtsThreadedEventlogLib = "HSrts_thr_l" - , statRtsProfilingLib = "HSrts_p" - , statRtsThreadedProfilingLib = "HSrts_thr_p" - } - , rtsLibPaths = InstalledPackageInfo.libraryDirs rts - } - withGhcVersion = (++ ("-ghc" ++ prettyShow (compilerVersion (compiler lbi)))) - --- | Returns True if the modification date of the given source file is newer than --- the object file we last compiled for it, or if no object file exists yet. -checkNeedsRecompilation - :: Maybe (SymbolicPath CWD (Dir Pkg)) - -> SymbolicPath Pkg File - -> GhcOptions - -> IO Bool -checkNeedsRecompilation mbWorkDir filename opts = - i filename `moreRecentFile` oname - where - oname = getObjectFileName mbWorkDir filename opts - i = interpretSymbolicPath mbWorkDir -- See Note [Symbolic paths] in Distribution.Utils.Path - --- | Finds the object file name of the given source file -getObjectFileName - :: Maybe (SymbolicPath CWD (Dir Pkg)) - -> SymbolicPath Pkg File - -> GhcOptions - -> FilePath -getObjectFileName mbWorkDir filename opts = oname - where - i = interpretSymbolicPath mbWorkDir -- See Note [Symbolic paths] in Distribution.Utils.Path - odir = i $ fromFlag (ghcOptObjDir opts) - oext = fromFlagOrDefault "o" (ghcOptObjSuffix opts) - -- NB: the filepath might be absolute, e.g. if it is the path to - -- an autogenerated .hs file. - oname = odir replaceExtension (getSymbolicPath filename) oext - --- | Calculate the RPATHs for the component we are building. --- --- Calculates relative RPATHs when 'relocatable' is set. -getRPaths - :: LocalBuildInfo - -> ComponentLocalBuildInfo - -- ^ Component we are building - -> IO (NubListR FilePath) -getRPaths lbi clbi | supportRPaths hostOS = do - libraryPaths <- depLibraryPaths False (relocatable lbi) lbi clbi - let hostPref = case hostOS of - OSX -> "@loader_path" - _ -> "$ORIGIN" - relPath p = if isRelative p then hostPref p else p - rpaths = toNubListR (map relPath libraryPaths) - return rpaths - where - (Platform _ hostOS) = hostPlatform lbi - compid = compilerId . compiler $ lbi - - -- The list of RPath-supported operating systems below reflects the - -- platforms on which Cabal's RPATH handling is tested. It does _NOT_ - -- reflect whether the OS supports RPATH. - - -- E.g. when this comment was written, the *BSD operating systems were - -- untested with regards to Cabal RPATH handling, and were hence set to - -- 'False', while those operating systems themselves do support RPATH. - supportRPaths Linux = True - supportRPaths Windows = False - supportRPaths OSX = True - supportRPaths FreeBSD = - case compid of - CompilerId GHC _ -> True - _ -> False - supportRPaths OpenBSD = False - supportRPaths NetBSD = False - supportRPaths DragonFly = False - supportRPaths Solaris = False - supportRPaths AIX = False - supportRPaths HPUX = False - supportRPaths IRIX = False - supportRPaths HaLVM = False - supportRPaths IOS = False - supportRPaths Android = False - supportRPaths Ghcjs = False - supportRPaths Wasi = False - supportRPaths Hurd = True - supportRPaths Haiku = False - supportRPaths (OtherOS _) = False --- Do _not_ add a default case so that we get a warning here when a new OS --- is added. - -getRPaths _ _ = return mempty - --- | Remove the "-threaded" flag when building a foreign library, as it has no --- effect when used with "-shared". Returns the updated 'BuildInfo', along --- with whether or not the flag was present, so we can use it to link against --- the appropriate RTS on our own. -popThreadedFlag :: BuildInfo -> (BuildInfo, Bool) -popThreadedFlag bi = - ( bi{options = filterHcOptions (/= "-threaded") (options bi)} - , hasThreaded bi - ) - where - filterHcOptions - :: (String -> Bool) - -> PerCompilerFlavor [String] - -> PerCompilerFlavor [String] - filterHcOptions p (PerCompilerFlavor ghc ghcjs) = - PerCompilerFlavor (filter p ghc) ghcjs - --- | Extracts a String representing a hash of the ABI of a built --- library. It can fail if the library has not yet been built. -libAbiHash - :: Verbosity - -> PackageDescription - -> LocalBuildInfo - -> Library - -> ComponentLocalBuildInfo - -> IO String -libAbiHash verbosity _pkg_descr lbi lib clbi = do - let - libBi = libBuildInfo lib - comp = compiler lbi - platform = hostPlatform lbi - mbWorkDir = mbWorkDirLBI lbi - vanillaArgs = - componentGhcOptions (verbosityLevel verbosity) lbi libBi clbi (componentBuildDir lbi clbi) - <> mempty - { ghcOptMode = toFlag GhcModeAbiHash - , ghcOptInputModules = toNubListR $ exposedModules lib - } - sharedArgs = - vanillaArgs - <> mempty - { ghcOptDynLinkMode = toFlag GhcDynamicOnly - , ghcOptFPic = toFlag True - , ghcOptHiSuffix = toFlag "js_dyn_hi" - , ghcOptObjSuffix = toFlag "js_dyn_o" - , ghcOptExtra = hcOptions GHC libBi ++ hcSharedOptions GHC libBi - } - profArgs = - vanillaArgs - <> mempty - { ghcOptProfilingMode = toFlag True - , ghcOptProfilingAuto = - Internal.profDetailLevelFlag - True - (withProfLibDetail lbi) - , ghcOptHiSuffix = toFlag "js_p_hi" - , ghcOptObjSuffix = toFlag "js_p_o" - , ghcOptExtra = hcProfOptions GHC libBi - } - ghcArgs - | withVanillaLib lbi = vanillaArgs - | withSharedLib lbi = sharedArgs - | withProfLib lbi = profArgs - | otherwise = error "libAbiHash: Can't find an enabled library way" - - (ghcjsProg, _) <- requireProgram verbosity ghcjsProgram (withPrograms lbi) - hash <- - getProgramInvocationOutput - verbosity - =<< ghcInvocation verbosity ghcjsProg comp platform mbWorkDir ghcArgs - return (takeWhile (not . isSpace) hash) - -componentGhcOptions - :: VerbosityLevel - -> LocalBuildInfo - -> BuildInfo - -> ComponentLocalBuildInfo - -> SymbolicPath Pkg (Dir build) - -> GhcOptions -componentGhcOptions verbosity lbi bi clbi odir = - let opts = Internal.componentGhcOptions verbosity lbi bi clbi odir - in opts - { ghcOptExtra = ghcOptExtra opts <> hcOptions GHCJS bi - } - --- ----------------------------------------------------------------------------- --- Installing - --- | Install executables for GHCJS. -installExe - :: Verbosity - -> LocalBuildInfo - -> FilePath - -- ^ Where to copy the files to - -> FilePath - -- ^ Build location - -> (FilePath, FilePath) - -- ^ Executable (prefix,suffix) - -> PackageDescription - -> Executable - -> IO () -installExe - verbosity - lbi - binDir - buildPref - (progprefix, progsuffix) - _pkg - exe = do - createDirectoryIfMissingVerbose verbosity True binDir - let exeName' = unUnqualComponentName $ exeName exe - exeFileName = exeName' - fixedExeBaseName = progprefix ++ exeName' ++ progsuffix - installBinary dest = do - runDbProgramCwd verbosity (mbWorkDirLBI lbi) ghcjsProgram (withPrograms lbi) $ - [ "--install-executable" - , buildPref exeName' exeFileName - , "-o" - , dest - ] - ++ case (stripExes lbi, lookupProgram stripProgram $ withPrograms lbi) of - (True, Just strip) -> ["-strip-program", programPath strip] - _ -> [] - installBinary (binDir fixedExeBaseName) - --- | Install foreign library for GHC. -installFLib - :: Verbosity - -> LocalBuildInfo - -> FilePath - -- ^ install location - -> FilePath - -- ^ Build location - -> PackageDescription - -> ForeignLib - -> IO () -installFLib verbosity lbi targetDir builtDir _pkg flib = - install - (foreignLibIsShared flib) - builtDir - targetDir - (flibTargetName lbi flib) - where - install _isShared srcDir dstDir name = do - let src = srcDir name - dst = dstDir name - createDirectoryIfMissingVerbose verbosity True targetDir - installOrdinaryFile verbosity src dst - --- | Install for ghc, .hi, .a and, if --with-ghci given, .o -installLib - :: Verbosity - -> LocalBuildInfo - -> FilePath - -- ^ install location - -> FilePath - -- ^ install location for dynamic libraries - -> FilePath - -- ^ install location for bytecode libraries - -> FilePath - -- ^ Build location - -> PackageDescription - -> Library - -> ComponentLocalBuildInfo - -> IO () -installLib verbosity lbi targetDir dynlibTargetDir _bytecodeTargetDir _builtDir _pkg lib clbi = do - whenVanilla $ copyModuleFiles $ Suffix "js_hi" - whenProf $ copyModuleFiles $ Suffix "js_p_hi" - whenShared $ copyModuleFiles $ Suffix "js_dyn_hi" - - -- whenVanilla $ installOrdinary builtDir targetDir $ toJSLibName vanillaLibName - -- whenProf $ installOrdinary builtDir targetDir $ toJSLibName profileLibName - -- whenShared $ installShared builtDir dynlibTargetDir $ toJSLibName sharedLibName - -- fixme do these make the correct lib names? - whenHasCode $ do - whenVanilla $ do - sequence_ - [ installOrdinary builtDir' targetDir (toJSLibName $ mkGenericStaticLibName (l ++ f)) - | l <- getHSLibraryName (componentUnitId clbi) : extraBundledLibs (libBuildInfo lib) - , f <- "" : extraLibFlavours (libBuildInfo lib) - ] - -- whenGHCi $ installOrdinary builtDir targetDir (toJSLibName ghciLibName) - whenProf $ do - installOrdinary builtDir' targetDir (toJSLibName profileLibName) - -- whenGHCi $ installOrdinary builtDir targetDir (toJSLibName ghciProfLibName) - whenShared $ - sequence_ - [ installShared - builtDir' - dynlibTargetDir - (toJSLibName $ mkGenericSharedLibName platform compiler_id (l ++ f)) - | l <- getHSLibraryName uid : extraBundledLibs (libBuildInfo lib) - , f <- "" : extraDynLibFlavours (libBuildInfo lib) - ] - where - i = interpretSymbolicPathLBI lbi -- See Note [Symbolic paths] in Distribution.Utils.Path - builtDir' = componentBuildDir lbi clbi - mbWorkDir = mbWorkDirLBI lbi - - install isShared isJS srcDir dstDir name = do - let src = i $ srcDir makeRelativePathEx name - dst = dstDir name - createDirectoryIfMissingVerbose verbosity True dstDir - - if isShared - then installExecutableFile verbosity src dst - else installOrdinaryFile verbosity src dst - - when (stripLibs lbi && not isJS) $ - Strip.stripLib - verbosity - (hostPlatform lbi) - (withPrograms lbi) - dst - - installOrdinary = install False True - installShared = install True True - - copyModuleFiles ext = do - files <- findModuleFilesCwd verbosity mbWorkDir [builtDir'] [ext] (allLibModules lib clbi) - let files' = map (i *** getSymbolicPath) files - installOrdinaryFiles verbosity targetDir files' - - compiler_id = compilerId (compiler lbi) - platform = hostPlatform lbi - uid = componentUnitId clbi - -- vanillaLibName = mkLibName uid - profileLibName = mkProfLibName uid - -- sharedLibName = (mkSharedLibName (hostPlatform lbi) compiler_id) uid - - hasLib = - not $ - null (allLibModules lib clbi) - && null (cSources (libBuildInfo lib)) - && null (cxxSources (libBuildInfo lib)) - && null (jsSources (libBuildInfo lib)) - has_code = not (componentIsIndefinite clbi) - whenHasCode = when has_code - whenVanilla = when (hasLib && withVanillaLib lbi) - whenProf = when (hasLib && withProfLib lbi && has_code) - -- whenGHCi = when (hasLib && withGHCiLib lbi && has_code) - whenShared = when (hasLib && withSharedLib lbi && has_code) - -adjustExts :: String -> String -> GhcOptions -> GhcOptions -adjustExts hiSuf objSuf opts = - opts - <> mempty - { ghcOptHiSuffix = toFlag hiSuf - , ghcOptObjSuffix = toFlag objSuf - } - -isDynamic :: Compiler -> Bool -isDynamic = Internal.ghcLookupProperty "GHC Dynamic" - -supportsDynamicToo :: Compiler -> Bool -supportsDynamicToo = Internal.ghcLookupProperty "Support dynamic-too" - -withExt :: FilePath -> String -> FilePath -withExt fp ext = fp <.> if takeExtension fp /= ('.' : ext) then ext else "" - -findGhcjsGhcVersion :: Verbosity -> FilePath -> IO (Maybe Version) -findGhcjsGhcVersion verbosity pgm = - findProgramVersion "--numeric-ghc-version" id verbosity pgm - -findGhcjsPkgGhcjsVersion :: Verbosity -> FilePath -> IO (Maybe Version) -findGhcjsPkgGhcjsVersion verbosity pgm = - findProgramVersion "--numeric-ghcjs-version" id verbosity pgm - --- ----------------------------------------------------------------------------- --- Registering - -hcPkgInfo :: ProgramDb -> HcPkg.ConfiguredProgram -hcPkgInfo progdb = - fromMaybe (error "GHCJS.hcPkgInfo no ghcjs program") $ lookupProgram ghcjsPkgProgram progdb - -registerPackage - :: Verbosity - -> ProgramDb - -> Maybe (SymbolicPath CWD (Dir from)) - -> PackageDBStackS from - -> InstalledPackageInfo - -> HcPkg.RegisterOptions - -> IO () -registerPackage verbosity progdb mbWorkDir packageDbs installedPkgInfo registerOptions = - HcPkg.register - (hcPkgInfo progdb) - verbosity - mbWorkDir - packageDbs - installedPkgInfo - registerOptions - -pkgRoot :: Verbosity -> LocalBuildInfo -> PackageDB -> IO FilePath -pkgRoot verbosity lbi = pkgRoot' - where - pkgRoot' GlobalPackageDB = - let ghcjsProg = fromMaybe (error "GHCJS.pkgRoot: no ghcjs program") $ lookupProgram ghcjsProgram (withPrograms lbi) - in fmap takeDirectory (getGlobalPackageDB verbosity ghcjsProg) - pkgRoot' UserPackageDB = do - appDir <- getAppUserDataDirectory "ghcjs" - -- fixme correct this version - let ver = compilerVersion (compiler lbi) - subdir = - System.Info.arch - ++ '-' - : System.Info.os - ++ '-' - : prettyShow ver - rootDir = appDir subdir - -- We must create the root directory for the user package database if it - -- does not yet exists. Otherwise '${pkgroot}' will resolve to a - -- directory at the time of 'ghc-pkg register', and registration will - -- fail. - createDirectoryIfMissing True rootDir - return rootDir - pkgRoot' (SpecificPackageDB fp) = - return $ - takeDirectory $ - interpretSymbolicPathLBI lbi fp - --- | Get the JavaScript file name and command and arguments to run a --- program compiled by GHCJS --- the exe should be the base program name without exe extension -runCmd - :: ProgramDb - -> FilePath - -> (FilePath, FilePath, [String]) -runCmd progdb exe = - ( script - , programPath ghcjsProg - , programDefaultArgs ghcjsProg ++ programOverrideArgs ghcjsProg ++ ["--run"] - ) - where - script = exe <.> "jsexe" "all" <.> "js" - ghcjsProg = fromMaybe (error "GHCJS.runCmd: no ghcjs program") $ lookupProgram ghcjsProgram progdb diff --git a/Cabal/src/Distribution/Simple/Haddock.hs b/Cabal/src/Distribution/Simple/Haddock.hs index 201bb8c4b30..61b8c73b206 100644 --- a/Cabal/src/Distribution/Simple/Haddock.hs +++ b/Cabal/src/Distribution/Simple/Haddock.hs @@ -31,7 +31,6 @@ import Distribution.Compat.Prelude import Prelude () import qualified Distribution.Simple.GHC as GHC -import qualified Distribution.Simple.GHCJS as GHCJS -- local @@ -657,7 +656,6 @@ componentGhcOptions componentGhcOptions verbosity lbi bi clbi odir = let f = case compilerFlavor (compiler lbi) of GHC -> GHC.componentGhcOptions - GHCJS -> GHCJS.componentGhcOptions _ -> error $ "Distribution.Simple.Haddock.componentGhcOptions:" @@ -1041,7 +1039,6 @@ getGhcLibDir getGhcLibDir verbosity lbi = do l <- case compilerFlavor (compiler lbi) of GHC -> GHC.getLibDir verbosity lbi - GHCJS -> GHCJS.getLibDir verbosity lbi _ -> error "haddock only supports GHC and GHCJS" return $ mempty{argGhcLibDir = Flag l} diff --git a/Cabal/src/Distribution/Simple/Install.hs b/Cabal/src/Distribution/Simple/Install.hs index 52163b31be1..ffcaad97556 100644 --- a/Cabal/src/Distribution/Simple/Install.hs +++ b/Cabal/src/Distribution/Simple/Install.hs @@ -68,7 +68,6 @@ import Distribution.Utils.Path import Distribution.Compat.Graph (IsNode (..)) import Distribution.Simple.Errors import qualified Distribution.Simple.GHC as GHC -import qualified Distribution.Simple.GHCJS as GHCJS import Distribution.Simple.Setup.Common import qualified Distribution.Simple.UHC as UHC @@ -244,7 +243,6 @@ copyComponent verbosity pkg_descr lbi (CLib lib) clbi copydest = do case compilerFlavor (compiler lbi) of GHC -> GHC.installLib verbosity lbi libPref dynlibPref bytecodeLibPref buildPref pkg_descr lib clbi - GHCJS -> GHCJS.installLib verbosity lbi libPref dynlibPref bytecodeLibPref buildPref pkg_descr lib clbi UHC -> UHC.installLib verbosity lbi libPref dynlibPref bytecodeLibPref buildPref pkg_descr lib clbi _ -> dieWithException verbosity $ CompilerNotInstalled (compilerFlavor (compiler lbi)) @@ -260,7 +258,6 @@ copyComponent verbosity pkg_descr lbi (CFLib flib) clbi copydest = do case compilerFlavor (compiler lbi) of GHC -> GHC.installFLib verbosity lbi flibPref buildPref pkg_descr flib - GHCJS -> GHCJS.installFLib verbosity lbi flibPref buildPref pkg_descr flib _ -> dieWithException verbosity $ CompilerNotInstalled (compilerFlavor (compiler lbi)) copyComponent verbosity pkg_descr lbi (CExe exe) clbi copydest = do let installDirs = absoluteComponentInstallDirs pkg_descr lbi (componentUnitId clbi) copydest @@ -292,7 +289,6 @@ copyComponent verbosity pkg_descr lbi (CExe exe) clbi copydest = do ) case compilerFlavor (compiler lbi) of GHC -> GHC.installExe verbosity lbi binPref buildPref progFix pkg_descr exe - GHCJS -> GHCJS.installExe verbosity lbi binPref buildPref progFix pkg_descr exe UHC -> return () _ -> dieWithException verbosity $ CompilerNotInstalled (compilerFlavor (compiler lbi)) diff --git a/Cabal/src/Distribution/Simple/Register.hs b/Cabal/src/Distribution/Simple/Register.hs index 4e4aa8c1ae1..d50e897b645 100644 --- a/Cabal/src/Distribution/Simple/Register.hs +++ b/Cabal/src/Distribution/Simple/Register.hs @@ -56,7 +56,6 @@ import Distribution.Simple.BuildTarget import Distribution.Simple.LocalBuildInfo import qualified Distribution.Simple.GHC as GHC -import qualified Distribution.Simple.GHCJS as GHCJS import qualified Distribution.Simple.PackageIndex as Index import qualified Distribution.Simple.UHC as UHC @@ -327,10 +326,7 @@ abiHash -> IO AbiHash abiHash verbosity pkg distPref lbi lib clbi = case compilerFlavor comp of - GHC -> do - mkAbiHash <$> GHC.libAbiHash verbosity pkg lbi' lib clbi - GHCJS -> do - mkAbiHash <$> GHCJS.libAbiHash verbosity pkg lbi' lib clbi + GHC -> mkAbiHash <$> GHC.libAbiHash verbosity pkg lbi' lib clbi _ -> return (mkAbiHash "") where comp = compiler lbi @@ -379,7 +375,6 @@ createPackageDB createPackageDB verbosity comp progdb dbPath = case compilerFlavor comp of GHC -> HcPkg.init (GHC.hcPkgInfo progdb) verbosity dbPath - GHCJS -> HcPkg.init (GHCJS.hcPkgInfo progdb) verbosity dbPath UHC -> return () _ -> dieWithException verbosity CreatePackageDB @@ -424,7 +419,6 @@ withHcPkg withHcPkg verbosity name comp progdb f = case compilerFlavor comp of GHC -> f (GHC.hcPkgInfo progdb) - GHCJS -> f (GHCJS.hcPkgInfo progdb) _ -> dieWithException verbosity $ WithHcPkg name registerPackage @@ -439,7 +433,6 @@ registerPackage registerPackage verbosity comp progdb mbWorkDir packageDbs installedPkgInfo registerOptions = case compilerFlavor comp of GHC -> GHC.registerPackage verbosity progdb mbWorkDir packageDbs installedPkgInfo registerOptions - GHCJS -> GHCJS.registerPackage verbosity progdb mbWorkDir packageDbs installedPkgInfo registerOptions _ | HcPkg.registerMultiInstance registerOptions -> dieWithException verbosity RegisMultiplePkgNotSupported diff --git a/cabal-install/src/Distribution/Client/ProjectPlanning.hs b/cabal-install/src/Distribution/Client/ProjectPlanning.hs index f49c4279e14..6b65bf23b2a 100644 --- a/cabal-install/src/Distribution/Client/ProjectPlanning.hs +++ b/cabal-install/src/Distribution/Client/ProjectPlanning.hs @@ -214,7 +214,6 @@ import qualified Distribution.PackageDescription as PD import qualified Distribution.PackageDescription.Configuration as PD import qualified Distribution.Simple.Configure as Cabal import qualified Distribution.Simple.GHC as GHC -import qualified Distribution.Simple.GHCJS as GHCJS import qualified Distribution.Simple.InstallDirs as InstallDirs import qualified Distribution.Simple.LocalBuildInfo as Cabal import qualified Distribution.Simple.Setup as Cabal @@ -2585,7 +2584,6 @@ elaborateInstallPlan compilerShouldUseSharedLibByDefault = case compilerFlavor compiler of GHC -> GHC.compilerBuildWay compiler == DynWay && canBuildSharedLibs - GHCJS -> GHCJS.isDynamic compiler _ -> False compilerShouldUseProfilingLibByDefault = diff --git a/cabal-install/src/Distribution/Client/Run.hs b/cabal-install/src/Distribution/Client/Run.hs index 0b18235ff01..9e2d6735dad 100644 --- a/cabal-install/src/Distribution/Client/Run.hs +++ b/cabal-install/src/Distribution/Client/Run.hs @@ -25,7 +25,6 @@ import Distribution.PackageDescription import Distribution.Simple (PackageDBX (..)) import Distribution.Simple.Build (addInternalBuildTools) import Distribution.Simple.BuildPaths (exeExtension) -import Distribution.Simple.Compiler (CompilerFlavor (..), compilerFlavor) import Distribution.Simple.Flag (fromFlag) import Distribution.Simple.LocalBuildInfo ( ComponentName (..) @@ -52,8 +51,6 @@ import Distribution.Simple.Utils import Distribution.System (Platform (..)) import Distribution.Types.UnqualComponentName -import qualified Distribution.Simple.GHCJS as GHCJS - import Distribution.Client.Errors import Distribution.Utils.Path @@ -160,19 +157,11 @@ run verbosity lbi exe exeArgs = do (path, runArgs) <- let exeName' = prettyShow $ exeName exe - in case compilerFlavor (compiler lbiForExe) of - GHCJS -> do - let (script, cmd, cmdArgs) = - GHCJS.runCmd - (withPrograms lbiForExe) - (i buildPref exeName' exeName') - script' <- tryCanonicalizePath script - return (cmd, cmdArgs ++ [script']) - _ -> do - p <- - tryCanonicalizePath $ - i buildPref exeName' (exeName' <.> exeExtension (hostPlatform lbiForExe)) - return (p, []) + in do + p <- + tryCanonicalizePath $ + i buildPref exeName' (exeName' <.> exeExtension (hostPlatform lbiForExe)) + return (p, []) -- Compute the appropriate environment for running the executable let progDb = withPrograms lbiForExe diff --git a/cabal-testsuite/PackageTests/GHCJS/BuildRunner/BuildRunner.cabal b/cabal-testsuite/PackageTests/GHCJS/BuildRunner/BuildRunner.cabal deleted file mode 100644 index e31edc28d4c..00000000000 --- a/cabal-testsuite/PackageTests/GHCJS/BuildRunner/BuildRunner.cabal +++ /dev/null @@ -1,21 +0,0 @@ -name: BuildRunner -version: 1.0 -build-type: Simple -cabal-version: >= 1.10 - -test-suite ghcjs-test - type: exitcode-stdio-1.0 - main-is: BuildRunner.hs - build-depends: base - default-language: Haskell2010 - -executable ghcjs-exe - main-is: BuildRunner.hs - build-depends: base - default-language: Haskell2010 - -benchmark ghcjs-bench - type: exitcode-stdio-1.0 - main-is: BuildRunner.hs - build-depends: base - default-language: Haskell2010 diff --git a/cabal-testsuite/PackageTests/GHCJS/BuildRunner/BuildRunner.hs b/cabal-testsuite/PackageTests/GHCJS/BuildRunner/BuildRunner.hs deleted file mode 100644 index 84cf435b65a..00000000000 --- a/cabal-testsuite/PackageTests/GHCJS/BuildRunner/BuildRunner.hs +++ /dev/null @@ -1,7 +0,0 @@ -module Main where - -import System.Exit (exitSuccess) - -main :: IO () -main = do - exitSuccess diff --git a/cabal-testsuite/PackageTests/GHCJS/BuildRunner/README.md b/cabal-testsuite/PackageTests/GHCJS/BuildRunner/README.md deleted file mode 100644 index a58eb5ed102..00000000000 --- a/cabal-testsuite/PackageTests/GHCJS/BuildRunner/README.md +++ /dev/null @@ -1,6 +0,0 @@ -This test verifies that the `-build-runner` option is passed to GHCJS when the cabal commands `test`/`run`/`bench` are run with the `--ghcjs` option. - -This test was created in order to avoid regressions in running GHCJS executables, e.g.: - -* https://github.com/haskell/cabal/issues/6175 -* https://github.com/haskell/cabal/issues/6361 diff --git a/cabal-testsuite/PackageTests/GHCJS/BuildRunner/cabal.project b/cabal-testsuite/PackageTests/GHCJS/BuildRunner/cabal.project deleted file mode 100644 index e6fdbadb439..00000000000 --- a/cabal-testsuite/PackageTests/GHCJS/BuildRunner/cabal.project +++ /dev/null @@ -1 +0,0 @@ -packages: . diff --git a/cabal-testsuite/PackageTests/GHCJS/BuildRunner/cabal.test.hs b/cabal-testsuite/PackageTests/GHCJS/BuildRunner/cabal.test.hs deleted file mode 100644 index da8afae103e..00000000000 --- a/cabal-testsuite/PackageTests/GHCJS/BuildRunner/cabal.test.hs +++ /dev/null @@ -1,21 +0,0 @@ -import Test.Cabal.Prelude - -main = do - cabalTest . recordMode DoNotRecord $ do - cwd <- fmap testCurrentDir getTestEnv - testInvokedWithBuildRunner cwd "test" [] - testInvokedWithBuildRunner cwd "run" ["ghcjs-exe"] - testInvokedWithBuildRunner cwd "bench" [] - -magicString = "SUCCESS! GHCJS was invoked with '-build-runner' option" - -testInvokedWithBuildRunner cwd cabalCmd extraArgs = do - output <- fails $ cabal' cabalCmd $ extraArgs ++ - [ "--ghcjs" - , "--with-compiler", cwd fakeGhcjsPath - ] - -- On windows point cabal to the right cc - ++ if isWindows then ["--with-gcc", "scripts/cc.bat"] else [] - assertOutputContains magicString output - where - fakeGhcjsPath = if isWindows then "scripts/fake-ghcjs.exe" else "scripts/fake-ghcjs.sh" diff --git a/cabal-testsuite/PackageTests/GHCJS/BuildRunner/scripts/cc.bat b/cabal-testsuite/PackageTests/GHCJS/BuildRunner/scripts/cc.bat deleted file mode 100644 index b2300d2fd6b..00000000000 --- a/cabal-testsuite/PackageTests/GHCJS/BuildRunner/scripts/cc.bat +++ /dev/null @@ -1,45 +0,0 @@ -@ECHO off - -FOR /f "delims=" %%A in ('call ghc.exe --print-libdir') do set "libdir=%%A" -FOR /f "delims=" %%A in ('call ghc.exe --numeric-version') do set "numVersion=%%A" -setlocal EnableDelayedExpansion - -call :compareVersions 9.4.1 %numVersion% -if %errorlevel% == 1 (set "cc=gcc.exe") else (set "cc=clang.exe") -CALL !libdir:lib=mingw\bin\!%cc% %* -EXIT /B %ERRORLEVEL% - -REM taken from https://stackoverflow.com/questions/15807762/compare-version-numbers-in-batch-file - -:compareVersions version1 version2 -:: -:: Compares two version numbers and returns the result in the ERRORLEVEL -:: -:: Returns 1 if version1 > version2 -:: 0 if version1 = version2 -:: -1 if version1 < version2 -:: -:: The nodes must be delimited by . or , or - -:: -:: Nodes are normally strictly numeric, without a 0 prefix. A letter suffix -:: is treated as a separate node -:: -setlocal enableDelayedExpansion -set "v1=%~1" -set "v2=%~2" -:loop -call :parseNode "%v1%" n1 v1 -call :parseNode "%v2%" n2 v2 -if %n1% gtr %n2% exit /b 1 -if %n1% lss %n2% exit /b -1 -if not defined v1 if not defined v2 exit /b 0 -if not defined v1 exit /b -1 -if not defined v2 exit /b 1 -goto :loop - - -:parseNode version nodeVar remainderVar -for /f "tokens=1* delims=." %%A in ("%~1") do ( - set "%~2=%%A" - set "%~3=%%B" -) diff --git a/cabal-testsuite/PackageTests/GHCJS/BuildRunner/scripts/fake-ghcjs.exe b/cabal-testsuite/PackageTests/GHCJS/BuildRunner/scripts/fake-ghcjs.exe deleted file mode 100644 index 537023174dc7a094f693b3d9ef17fa234e6a4bf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 115712 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 M@bv#5|6v9G1`gwa{r~^~ diff --git a/cabal-testsuite/PackageTests/GHCJS/BuildRunner/scripts/fake-ghcjs.sh b/cabal-testsuite/PackageTests/GHCJS/BuildRunner/scripts/fake-ghcjs.sh deleted file mode 100755 index ba6e3667519..00000000000 --- a/cabal-testsuite/PackageTests/GHCJS/BuildRunner/scripts/fake-ghcjs.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env bash - -# A script that will print out $MAGIC_STRING when invoked with the -# '-build-runner' option. -# -# When cabal is invoked with the '--ghcjs' option and the '--with-compiler' -# option set to the path of this script, cabal will successfully get to the linking -# stage (where it *should* call this script with the '-build-runner' option). - -MAGIC_STRING="SUCCESS! GHCJS was invoked with '-build-runner' option" - -if [ "$1" == "--numeric-ghcjs-version" ]; then - ghc --numeric-version -elif [ "$1" == "--numeric-ghc-version" ]; then - ghc --numeric-version -elif [[ "$*" == *-build-runner* ]]; then - echo "$MAGIC_STRING" -else - ghc "$@" -fi diff --git a/cabal-testsuite/PackageTests/GHCJS/BuildRunner/scripts/fake-ghcjs.shim b/cabal-testsuite/PackageTests/GHCJS/BuildRunner/scripts/fake-ghcjs.shim deleted file mode 100644 index 725429e82d7..00000000000 --- a/cabal-testsuite/PackageTests/GHCJS/BuildRunner/scripts/fake-ghcjs.shim +++ /dev/null @@ -1,2 +0,0 @@ -path = "sh.exe" -args = "scripts/fake-ghcjs.sh" diff --git a/cabal-testsuite/PackageTests/GHCJS/BuildRunner/scripts/ghcjs-pkg b/cabal-testsuite/PackageTests/GHCJS/BuildRunner/scripts/ghcjs-pkg deleted file mode 100755 index 0fcfa2f1f21..00000000000 --- a/cabal-testsuite/PackageTests/GHCJS/BuildRunner/scripts/ghcjs-pkg +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env bash - -if [ "$1" == "--numeric-ghcjs-version" ]; then - ghc --numeric-version -elif [ "$1" == "--numeric-ghc-version" ]; then - ghc --numeric-version -else - ghc-pkg "$@" -fi diff --git a/cabal-testsuite/PackageTests/GHCJS/BuildRunner/scripts/ghcjs-pkg.exe b/cabal-testsuite/PackageTests/GHCJS/BuildRunner/scripts/ghcjs-pkg.exe deleted file mode 100644 index 537023174dc7a094f693b3d9ef17fa234e6a4bf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 115712 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 M@bv#5|6v9G1`gwa{r~^~ diff --git a/cabal-testsuite/PackageTests/GHCJS/BuildRunner/scripts/ghcjs-pkg.shim b/cabal-testsuite/PackageTests/GHCJS/BuildRunner/scripts/ghcjs-pkg.shim deleted file mode 100644 index d330fc23e3e..00000000000 --- a/cabal-testsuite/PackageTests/GHCJS/BuildRunner/scripts/ghcjs-pkg.shim +++ /dev/null @@ -1,2 +0,0 @@ -path = "sh.exe" -args = "scripts/ghcjs-pkg" From 7e881bf46ffe2b8a5aec6300b95c1cd33be3a3d3 Mon Sep 17 00:00:00 2001 From: Phil de Joux Date: Tue, 29 Sep 2026 13:44:06 -0400 Subject: [PATCH 02/13] Remove the --ghcjs flag --- Cabal/src/Distribution/Simple/Setup/Config.hs | 1 - doc/cmd-v1-help/configure.txt | 1 - doc/cmd-v1-help/install.txt | 1 - doc/cmd-v1-help/reconfigure.txt | 1 - doc/cmd-v2-help/bench.txt | 1 - doc/cmd-v2-help/build.txt | 1 - doc/cmd-v2-help/configure.txt | 1 - doc/cmd-v2-help/exec.txt | 1 - doc/cmd-v2-help/freeze.txt | 1 - doc/cmd-v2-help/gen-bounds.txt | 1 - doc/cmd-v2-help/haddock.txt | 1 - doc/cmd-v2-help/install.txt | 1 - doc/cmd-v2-help/list-bin.txt | 1 - doc/cmd-v2-help/outdated.txt | 1 - doc/cmd-v2-help/path.txt | 1 - doc/cmd-v2-help/repl.txt | 1 - doc/cmd-v2-help/run.txt | 1 - doc/cmd-v2-help/target.txt | 1 - doc/cmd-v2-help/test.txt | 1 - doc/cmd-v2-help/update.txt | 1 - doc/setup-commands.rst | 1 - doc/setup-help/configure.txt | 1 - 22 files changed, 22 deletions(-) diff --git a/Cabal/src/Distribution/Simple/Setup/Config.hs b/Cabal/src/Distribution/Simple/Setup/Config.hs index 40bcd24b46c..aa8222e5ce9 100644 --- a/Cabal/src/Distribution/Simple/Setup/Config.hs +++ b/Cabal/src/Distribution/Simple/Setup/Config.hs @@ -435,7 +435,6 @@ configureOptions showOrParseArgs = (\v flags -> flags{configHcFlavor = v}) ( choiceOpt [ (Flag GHC, ("g", ["ghc"]), "Compile with GHC") - , (Flag GHCJS, ([], ["ghcjs"]), "Compile with GHCJS") , (Flag UHC, ([], ["uhc"]), "Compile with UHC") ] ) diff --git a/doc/cmd-v1-help/configure.txt b/doc/cmd-v1-help/configure.txt index 7059ef5d400..ed350d369d6 100644 --- a/doc/cmd-v1-help/configure.txt +++ b/doc/cmd-v1-help/configure.txt @@ -16,7 +16,6 @@ Flags for v1-configure: --cabal-file=PATH # use this Cabal file --keep-temp-files # Keep temporary files. -g, --ghc # Compile with GHC - --ghcjs # Compile with GHCJS --uhc # Compile with UHC -w PATH or -wPATH, --with-compiler=PATH # Give the path to a particular compiler diff --git a/doc/cmd-v1-help/install.txt b/doc/cmd-v1-help/install.txt index b4937a719cc..00c23b590b3 100644 --- a/doc/cmd-v1-help/install.txt +++ b/doc/cmd-v1-help/install.txt @@ -27,7 +27,6 @@ Flags for v1-install: --cabal-file=PATH # use this Cabal file --keep-temp-files # Keep temporary files. -g, --ghc # Compile with GHC - --ghcjs # Compile with GHCJS --uhc # Compile with UHC -w PATH or -wPATH, --with-compiler=PATH # Give the path to a particular compiler diff --git a/doc/cmd-v1-help/reconfigure.txt b/doc/cmd-v1-help/reconfigure.txt index 15d821d1358..8d32929356b 100644 --- a/doc/cmd-v1-help/reconfigure.txt +++ b/doc/cmd-v1-help/reconfigure.txt @@ -15,7 +15,6 @@ Flags for v1-reconfigure: --cabal-file=PATH # use this Cabal file --keep-temp-files # Keep temporary files. -g, --ghc # Compile with GHC - --ghcjs # Compile with GHCJS --uhc # Compile with UHC -w PATH or -wPATH, --with-compiler=PATH # Give the path to a particular compiler diff --git a/doc/cmd-v2-help/bench.txt b/doc/cmd-v2-help/bench.txt index c5ba5a99f02..3673a0135e5 100644 --- a/doc/cmd-v2-help/bench.txt +++ b/doc/cmd-v2-help/bench.txt @@ -20,7 +20,6 @@ Flags for bench: files (default dist) --keep-temp-files # Keep temporary files. -g, --ghc # Compile with GHC - --ghcjs # Compile with GHCJS --uhc # Compile with UHC -w PATH or -wPATH, --with-compiler=PATH # Give the path to a particular compiler diff --git a/doc/cmd-v2-help/build.txt b/doc/cmd-v2-help/build.txt index c4d2f57a62f..026d5f13a39 100644 --- a/doc/cmd-v2-help/build.txt +++ b/doc/cmd-v2-help/build.txt @@ -20,7 +20,6 @@ Flags for build: files (default dist) --keep-temp-files # Keep temporary files. -g, --ghc # Compile with GHC - --ghcjs # Compile with GHCJS --uhc # Compile with UHC -w PATH or -wPATH, --with-compiler=PATH # Give the path to a particular compiler diff --git a/doc/cmd-v2-help/configure.txt b/doc/cmd-v2-help/configure.txt index c97f66063b1..4fe69c01f31 100644 --- a/doc/cmd-v2-help/configure.txt +++ b/doc/cmd-v2-help/configure.txt @@ -33,7 +33,6 @@ Flags for configure: files (default dist) --keep-temp-files # Keep temporary files. -g, --ghc # Compile with GHC - --ghcjs # Compile with GHCJS --uhc # Compile with UHC -w PATH or -wPATH, --with-compiler=PATH # Give the path to a particular compiler diff --git a/doc/cmd-v2-help/exec.txt b/doc/cmd-v2-help/exec.txt index ea4368e9cd8..e6418914ff0 100644 --- a/doc/cmd-v2-help/exec.txt +++ b/doc/cmd-v2-help/exec.txt @@ -22,7 +22,6 @@ Flags for exec: files (default dist) --keep-temp-files # Keep temporary files. -g, --ghc # Compile with GHC - --ghcjs # Compile with GHCJS --uhc # Compile with UHC -w PATH or -wPATH, --with-compiler=PATH # Give the path to a particular compiler diff --git a/doc/cmd-v2-help/freeze.txt b/doc/cmd-v2-help/freeze.txt index 64269ce7f8e..923faf4f2eb 100644 --- a/doc/cmd-v2-help/freeze.txt +++ b/doc/cmd-v2-help/freeze.txt @@ -25,7 +25,6 @@ Flags for freeze: files (default dist) --keep-temp-files # Keep temporary files. -g, --ghc # Compile with GHC - --ghcjs # Compile with GHCJS --uhc # Compile with UHC -w PATH or -wPATH, --with-compiler=PATH # Give the path to a particular compiler diff --git a/doc/cmd-v2-help/gen-bounds.txt b/doc/cmd-v2-help/gen-bounds.txt index 8764aac5bda..2343eb8c497 100644 --- a/doc/cmd-v2-help/gen-bounds.txt +++ b/doc/cmd-v2-help/gen-bounds.txt @@ -11,7 +11,6 @@ Flags for gen-bounds: files (default dist) --keep-temp-files # Keep temporary files. -g, --ghc # Compile with GHC - --ghcjs # Compile with GHCJS --uhc # Compile with UHC -w PATH or -wPATH, --with-compiler=PATH # Give the path to a particular compiler diff --git a/doc/cmd-v2-help/haddock.txt b/doc/cmd-v2-help/haddock.txt index 2e5046e47f7..06647d8dd98 100644 --- a/doc/cmd-v2-help/haddock.txt +++ b/doc/cmd-v2-help/haddock.txt @@ -25,7 +25,6 @@ Flags for haddock: files (default dist) --keep-temp-files # Keep temporary files. -g, --ghc # Compile with GHC - --ghcjs # Compile with GHCJS --uhc # Compile with UHC -w PATH or -wPATH, --with-compiler=PATH # Give the path to a particular compiler diff --git a/doc/cmd-v2-help/install.txt b/doc/cmd-v2-help/install.txt index 8850a2a2890..2ec898208b7 100644 --- a/doc/cmd-v2-help/install.txt +++ b/doc/cmd-v2-help/install.txt @@ -21,7 +21,6 @@ Flags for install: files (default dist) --keep-temp-files # Keep temporary files. -g, --ghc # Compile with GHC - --ghcjs # Compile with GHCJS --uhc # Compile with UHC -w PATH or -wPATH, --with-compiler=PATH # Give the path to a particular compiler diff --git a/doc/cmd-v2-help/list-bin.txt b/doc/cmd-v2-help/list-bin.txt index 3b8b8f01156..4813a871a17 100644 --- a/doc/cmd-v2-help/list-bin.txt +++ b/doc/cmd-v2-help/list-bin.txt @@ -12,7 +12,6 @@ Flags for list-bin: files (default dist) --keep-temp-files # Keep temporary files. -g, --ghc # Compile with GHC - --ghcjs # Compile with GHCJS --uhc # Compile with UHC -w PATH or -wPATH, --with-compiler=PATH # Give the path to a particular compiler diff --git a/doc/cmd-v2-help/outdated.txt b/doc/cmd-v2-help/outdated.txt index 85a07dd7493..7c8ac302dde 100644 --- a/doc/cmd-v2-help/outdated.txt +++ b/doc/cmd-v2-help/outdated.txt @@ -13,7 +13,6 @@ Flags for outdated: files (default dist) --keep-temp-files # Keep temporary files. -g, --ghc # Compile with GHC - --ghcjs # Compile with GHCJS --uhc # Compile with UHC -w PATH or -wPATH, --with-compiler=PATH # Give the path to a particular compiler diff --git a/doc/cmd-v2-help/path.txt b/doc/cmd-v2-help/path.txt index 74f4a3b3355..85d6a0fcf66 100644 --- a/doc/cmd-v2-help/path.txt +++ b/doc/cmd-v2-help/path.txt @@ -14,7 +14,6 @@ Flags for path: files (default dist) --keep-temp-files # Keep temporary files. -g, --ghc # Compile with GHC - --ghcjs # Compile with GHCJS --uhc # Compile with UHC -w PATH or -wPATH, --with-compiler=PATH # Give the path to a particular compiler diff --git a/doc/cmd-v2-help/repl.txt b/doc/cmd-v2-help/repl.txt index 2913c652167..7a8d67a106d 100644 --- a/doc/cmd-v2-help/repl.txt +++ b/doc/cmd-v2-help/repl.txt @@ -23,7 +23,6 @@ Flags for repl: files (default dist) --keep-temp-files # Keep temporary files. -g, --ghc # Compile with GHC - --ghcjs # Compile with GHCJS --uhc # Compile with UHC -w PATH or -wPATH, --with-compiler=PATH # Give the path to a particular compiler diff --git a/doc/cmd-v2-help/run.txt b/doc/cmd-v2-help/run.txt index f8dd2b32a58..315e1f8ec1f 100644 --- a/doc/cmd-v2-help/run.txt +++ b/doc/cmd-v2-help/run.txt @@ -26,7 +26,6 @@ Flags for run: files (default dist) --keep-temp-files # Keep temporary files. -g, --ghc # Compile with GHC - --ghcjs # Compile with GHCJS --uhc # Compile with UHC -w PATH or -wPATH, --with-compiler=PATH # Give the path to a particular compiler diff --git a/doc/cmd-v2-help/target.txt b/doc/cmd-v2-help/target.txt index 6dddae62364..7ee4373a095 100644 --- a/doc/cmd-v2-help/target.txt +++ b/doc/cmd-v2-help/target.txt @@ -42,7 +42,6 @@ Flags for target: files (default dist) --keep-temp-files # Keep temporary files. -g, --ghc # Compile with GHC - --ghcjs # Compile with GHCJS --uhc # Compile with UHC -w PATH or -wPATH, --with-compiler=PATH # Give the path to a particular compiler diff --git a/doc/cmd-v2-help/test.txt b/doc/cmd-v2-help/test.txt index 00c529d1a3b..5011fa949e6 100644 --- a/doc/cmd-v2-help/test.txt +++ b/doc/cmd-v2-help/test.txt @@ -22,7 +22,6 @@ Flags for test: files (default dist) --keep-temp-files # Keep temporary files. -g, --ghc # Compile with GHC - --ghcjs # Compile with GHCJS --uhc # Compile with UHC -w PATH or -wPATH, --with-compiler=PATH # Give the path to a particular compiler diff --git a/doc/cmd-v2-help/update.txt b/doc/cmd-v2-help/update.txt index cc4e6a3ea26..ff6cdee8feb 100644 --- a/doc/cmd-v2-help/update.txt +++ b/doc/cmd-v2-help/update.txt @@ -12,7 +12,6 @@ Flags for update: files (default dist) --keep-temp-files # Keep temporary files. -g, --ghc # Compile with GHC - --ghcjs # Compile with GHCJS --uhc # Compile with UHC -w PATH or -wPATH, --with-compiler=PATH # Give the path to a particular compiler diff --git a/doc/setup-commands.rst b/doc/setup-commands.rst index bdb8b34dfcd..27a0f2613ad 100644 --- a/doc/setup-commands.rst +++ b/doc/setup-commands.rst @@ -167,7 +167,6 @@ The following options govern the programs used to process the source files of a package: .. option:: -g, --ghc - --ghcjs --uhc --haskell-suite diff --git a/doc/setup-help/configure.txt b/doc/setup-help/configure.txt index a5b3587cdd3..c8d7969de58 100644 --- a/doc/setup-help/configure.txt +++ b/doc/setup-help/configure.txt @@ -16,7 +16,6 @@ Flags for configure: --cabal-file=PATH # use this Cabal file --keep-temp-files # Keep temporary files. -g, --ghc # Compile with GHC - --ghcjs # Compile with GHCJS --uhc # Compile with UHC -w PATH or -wPATH, --with-compiler=PATH # Give the path to a particular compiler From e9613b3a292f7d8c7f9345abbe7f10c45a197134 Mon Sep 17 00:00:00 2001 From: Phil de Joux Date: Tue, 29 Sep 2026 13:57:20 -0400 Subject: [PATCH 03/13] Remove the ghcjs and ghcjs-pkg builtin programs --- Cabal/src/Distribution/Simple/Build.hs | 1 - Cabal/src/Distribution/Simple/PreProcess.hs | 1 - Cabal/src/Distribution/Simple/Program.hs | 2 -- .../Distribution/Simple/Program/Builtin.hs | 22 ------------------- .../src/Distribution/Client/CmdPath.hs | 1 - .../src/Distribution/Client/SetupWrapper.hs | 5 +---- cabal-install/tests/IntegrationTests2.hs | 4 ---- doc/cmd-v1-help/build.txt | 4 ++-- doc/cmd-v1-help/configure.txt | 4 ++-- doc/cmd-v1-help/install.txt | 4 ++-- doc/config.rst | 4 ---- doc/setup-commands.rst | 5 ++--- doc/setup-help/build.txt | 4 ++-- doc/setup-help/configure.txt | 4 ++-- 14 files changed, 13 insertions(+), 52 deletions(-) diff --git a/Cabal/src/Distribution/Simple/Build.hs b/Cabal/src/Distribution/Simple/Build.hs index 0fc2ea70b8f..4d40d7da6b5 100644 --- a/Cabal/src/Distribution/Simple/Build.hs +++ b/Cabal/src/Distribution/Simple/Build.hs @@ -310,7 +310,6 @@ dumpBuildInfo verbosity distPref dumpBuildInfoFlag pkg_descr lbi flags = do -- which program we need. flavorToProgram :: CompilerFlavor -> Maybe Program flavorToProgram GHC = Just ghcProgram - flavorToProgram GHCJS = Just ghcjsProgram flavorToProgram UHC = Just uhcProgram flavorToProgram JHC = Just jhcProgram flavorToProgram _ = Nothing diff --git a/Cabal/src/Distribution/Simple/PreProcess.hs b/Cabal/src/Distribution/Simple/PreProcess.hs index 0bc8972f7fa..b251b67a91d 100644 --- a/Cabal/src/Distribution/Simple/PreProcess.hs +++ b/Cabal/src/Distribution/Simple/PreProcess.hs @@ -402,7 +402,6 @@ ppCpp' :: [String] -> BuildInfo -> LocalBuildInfo -> ComponentLocalBuildInfo -> ppCpp' extraArgs bi lbi clbi = case compilerFlavor (compiler lbi) of GHC -> ppGhcCpp ghcProgram (const True) args bi lbi clbi - GHCJS -> ppGhcCpp ghcjsProgram (const True) args bi lbi clbi _ -> ppCpphs args bi lbi clbi where cppArgs = getCppOptions bi lbi diff --git a/Cabal/src/Distribution/Simple/Program.hs b/Cabal/src/Distribution/Simple/Program.hs index 9b329feeb51..87e2e97827a 100644 --- a/Cabal/src/Distribution/Simple/Program.hs +++ b/Cabal/src/Distribution/Simple/Program.hs @@ -105,8 +105,6 @@ module Distribution.Simple.Program -- * Programs that Cabal knows about , ghcProgram , ghcPkgProgram - , ghcjsProgram - , ghcjsPkgProgram , jhcProgram , uhcProgram , gccProgram diff --git a/Cabal/src/Distribution/Simple/Program/Builtin.hs b/Cabal/src/Distribution/Simple/Program/Builtin.hs index c66d9362f0c..ad57a6dd02f 100644 --- a/Cabal/src/Distribution/Simple/Program/Builtin.hs +++ b/Cabal/src/Distribution/Simple/Program/Builtin.hs @@ -18,8 +18,6 @@ module Distribution.Simple.Program.Builtin , ghcProgram , ghcPkgProgram , runghcProgram - , ghcjsProgram - , ghcjsPkgProgram , jhcProgram , uhcProgram , gccProgram @@ -72,8 +70,6 @@ builtinPrograms = ghcProgram , runghcProgram , ghcPkgProgram - , ghcjsProgram - , ghcjsPkgProgram , jhcProgram , uhcProgram , hpcProgram @@ -142,24 +138,6 @@ ghcPkgProgram = _ -> "" } -ghcjsProgram :: Program -ghcjsProgram = - (simpleProgram "ghcjs") - { programFindVersion = findProgramVersion "--numeric-ghcjs-version" id - } - --- note: version is the version number of the GHC version that ghcjs-pkg was built with -ghcjsPkgProgram :: Program -ghcjsPkgProgram = - (simpleProgram "ghcjs-pkg") - { programFindVersion = findProgramVersion "--version" $ \str -> - -- Invoking "ghcjs-pkg --version" gives a string like - -- "GHCJS package manager version 6.4.1" - case words str of - (_ : _ : _ : _ : ver : _) -> ver - _ -> "" - } - jhcProgram :: Program jhcProgram = (simpleProgram "jhc") diff --git a/cabal-install/src/Distribution/Client/CmdPath.hs b/cabal-install/src/Distribution/Client/CmdPath.hs index 6307cc30c64..49e88a15e58 100644 --- a/cabal-install/src/Distribution/Client/CmdPath.hs +++ b/cabal-install/src/Distribution/Client/CmdPath.hs @@ -306,7 +306,6 @@ requireCompilerProg :: Verbosity -> Compiler -> IO Program requireCompilerProg verbosity compiler = case compilerFlavor compiler of GHC -> pure ghcProgram - GHCJS -> pure ghcjsProgram flavour -> die' verbosity $ "path: Unsupported compiler flavour: " diff --git a/cabal-install/src/Distribution/Client/SetupWrapper.hs b/cabal-install/src/Distribution/Client/SetupWrapper.hs index 4feb5e1827b..d3274a885bf 100644 --- a/cabal-install/src/Distribution/Client/SetupWrapper.hs +++ b/cabal-install/src/Distribution/Client/SetupWrapper.hs @@ -1267,10 +1267,7 @@ compileSetupX (compiler, progdb, options'') <- configureCompiler verbosity options' pkgDbs <- traverse (traverse (makeRelativeToDirS mbWorkDir)) (coercePackageDBStack (usePackageDB options'')) let cabalPkgid = PackageIdentifier (mkPackageName "Cabal") cabalLibVersion - (program, extraOpts) = - case compilerFlavor compiler of - GHCJS -> (ghcjsProgram, ["-build-runner"]) - _ -> (ghcProgram, ["-threaded"]) + (program, extraOpts) = (ghcProgram, ["-threaded"]) cabalDep = maybe [] diff --git a/cabal-install/tests/IntegrationTests2.hs b/cabal-install/tests/IntegrationTests2.hs index a3d9e20820a..2d840724dd9 100644 --- a/cabal-install/tests/IntegrationTests2.hs +++ b/cabal-install/tests/IntegrationTests2.hs @@ -2705,8 +2705,6 @@ testConfigOptionComments = do " -- gcc-location" `assertHasCommentLine` "gcc-location" " -- ghc-location" `assertHasCommentLine` "ghc-location" " -- ghc-pkg-location" `assertHasCommentLine` "ghc-pkg-location" - " -- ghcjs-location" `assertHasCommentLine` "ghcjs-location" - " -- ghcjs-pkg-location" `assertHasCommentLine` "ghcjs-pkg-location" " -- haddock-location" `assertHasCommentLine` "haddock-location" " -- happy-location" `assertHasCommentLine` "happy-location" " -- hpc-location" `assertHasCommentLine` "hpc-location" @@ -2727,8 +2725,6 @@ testConfigOptionComments = do " -- gcc-options" `assertHasCommentLine` "gcc-options" " -- ghc-options" `assertHasCommentLine` "ghc-options" " -- ghc-pkg-options" `assertHasCommentLine` "ghc-pkg-options" - " -- ghcjs-options" `assertHasCommentLine` "ghcjs-options" - " -- ghcjs-pkg-options" `assertHasCommentLine` "ghcjs-pkg-options" " -- haddock-options" `assertHasCommentLine` "haddock-options" " -- happy-options" `assertHasCommentLine` "happy-options" " -- hpc-options" `assertHasCommentLine` "hpc-options" diff --git a/doc/cmd-v1-help/build.txt b/doc/cmd-v1-help/build.txt index d8ef015e678..8d4873dae7d 100644 --- a/doc/cmd-v1-help/build.txt +++ b/doc/cmd-v1-help/build.txt @@ -30,8 +30,8 @@ Examples: cabal v1-build foo A component (i.e. lib, exe, test suite) The flags --with-PROG and --PROG-option(s) can be used with the following programs: - alex ar c2hs cpphs doctest gcc ghc ghc-pkg ghcjs ghcjs-pkg haddock happy hpc - hsc2hs hscolour jhc ld pkg-config runghc strip tar uhc + alex ar c2hs cpphs doctest gcc ghc ghc-pkg haddock happy hpc hsc2hs hscolour + jhc ld pkg-config runghc strip tar uhc The v1-build command is a part of the legacy v1 style of cabal usage. diff --git a/doc/cmd-v1-help/configure.txt b/doc/cmd-v1-help/configure.txt index ed350d369d6..8ae0e879c7b 100644 --- a/doc/cmd-v1-help/configure.txt +++ b/doc/cmd-v1-help/configure.txt @@ -205,8 +205,8 @@ Flags for v1-configure: after a successful build (v2-build only) The flags --with-PROG and --PROG-option(s) can be used with the following programs: - alex ar c2hs cpphs doctest gcc ghc ghc-pkg ghcjs ghcjs-pkg haddock happy hpc - hsc2hs hscolour jhc ld pkg-config runghc strip tar uhc + alex ar c2hs cpphs doctest gcc ghc ghc-pkg haddock happy hpc hsc2hs hscolour + jhc ld pkg-config runghc strip tar uhc Examples: cabal v1-configure diff --git a/doc/cmd-v1-help/install.txt b/doc/cmd-v1-help/install.txt index 00c23b590b3..9ff8d062e2e 100644 --- a/doc/cmd-v1-help/install.txt +++ b/doc/cmd-v1-help/install.txt @@ -374,8 +374,8 @@ Flags for v1-install: $arch, $benchmark) The flags --with-PROG and --PROG-option(s) can be used with the following programs: - alex ar c2hs cpphs doctest gcc ghc ghc-pkg ghcjs ghcjs-pkg haddock happy hpc - hsc2hs hscolour jhc ld pkg-config runghc strip tar uhc + alex ar c2hs cpphs doctest gcc ghc ghc-pkg haddock happy hpc hsc2hs hscolour + jhc ld pkg-config runghc strip tar uhc Examples: cabal v1-install Package in the current directory diff --git a/doc/config.rst b/doc/config.rst index 00032a459ca..bc46a86cb79 100644 --- a/doc/config.rst +++ b/doc/config.rst @@ -339,10 +339,6 @@ The list of known programs is: +-----------------------+------------------------------------------------------------------------------------------------------------------------------------+ | ``ghc-pkg`` | | +-----------------------+------------------------------------------------------------------------------------------------------------------------------------+ -| ``ghcjs`` | | -+-----------------------+------------------------------------------------------------------------------------------------------------------------------------+ -| ``ghcjs-pkg`` | | -+-----------------------+------------------------------------------------------------------------------------------------------------------------------------+ | ``haddock`` | ``_ | +-----------------------+------------------------------------------------------------------------------------------------------------------------------------+ | ``happy`` | ``_ | diff --git a/doc/setup-commands.rst b/doc/setup-commands.rst index 27a0f2613ad..a2e4c359d03 100644 --- a/doc/setup-commands.rst +++ b/doc/setup-commands.rst @@ -202,9 +202,8 @@ files of a package: ``--with-cpphs=/usr/local/bin/cpphs``. The full list of accepted programs is as follows: ``alex``, ``ar``, ``c2hs``, ``cpphs``, ``doctest``, ``gcc``, ``ghc``, - ``ghc-pkg``, ``ghcjs``, ``ghcjs-pkg``, ``haddock``, ``happy``, - ``hpc``, ``hsc2hs``, ``hscolour``, ``jhc``, ``ld``, ``pkg-config``, - ``runghc``, ``strip``, ``tar``, ``uhc``. + ``ghc-pkg``, ``haddock``, ``happy``, ``hpc``, ``hsc2hs``, ``hscolour``, + ``jhc``, ``ld``, ``pkg-config``, ``runghc``, ``strip``, ``tar``, ``uhc``. .. option:: --PROG-options=OPTS diff --git a/doc/setup-help/build.txt b/doc/setup-help/build.txt index 720d2ef784a..e2fa52204a8 100644 --- a/doc/setup-help/build.txt +++ b/doc/setup-help/build.txt @@ -30,5 +30,5 @@ Examples: cabal build foo A component (i.e. lib, exe, test suite) The flags --with-PROG and --PROG-option(s) can be used with the following programs: - alex ar c2hs cpphs doctest gcc ghc ghc-pkg ghcjs ghcjs-pkg haddock happy hpc - hsc2hs hscolour jhc ld pkg-config runghc strip tar uhc + alex ar c2hs cpphs doctest gcc ghc ghc-pkg haddock happy hpc hsc2hs hscolour + jhc ld pkg-config runghc strip tar uhc diff --git a/doc/setup-help/configure.txt b/doc/setup-help/configure.txt index c8d7969de58..4d89ab66c29 100644 --- a/doc/setup-help/configure.txt +++ b/doc/setup-help/configure.txt @@ -191,5 +191,5 @@ Flags for configure: use "" to prevent splitting) The flags --with-PROG and --PROG-option(s) can be used with the following programs: - alex ar c2hs cpphs doctest gcc ghc ghc-pkg ghcjs ghcjs-pkg haddock happy hpc - hsc2hs hscolour jhc ld pkg-config runghc strip tar uhc + alex ar c2hs cpphs doctest gcc ghc ghc-pkg haddock happy hpc hsc2hs hscolour + jhc ld pkg-config runghc strip tar uhc From 1c7c9cab531a6151b988e999333017c977fe64b8 Mon Sep 17 00:00:00 2001 From: Phil de Joux Date: Tue, 29 Sep 2026 14:04:59 -0400 Subject: [PATCH 04/13] Simplifications after removing ghcjs programs --- Cabal/src/Distribution/Simple/PreProcess.hs | 17 +++------ .../src/Distribution/Client/SetupWrapper.hs | 35 +++++++++---------- 2 files changed, 21 insertions(+), 31 deletions(-) diff --git a/Cabal/src/Distribution/Simple/PreProcess.hs b/Cabal/src/Distribution/Simple/PreProcess.hs index b251b67a91d..9b8667a194a 100644 --- a/Cabal/src/Distribution/Simple/PreProcess.hs +++ b/Cabal/src/Distribution/Simple/PreProcess.hs @@ -401,31 +401,24 @@ ppCpp = ppCpp' [] ppCpp' :: [String] -> BuildInfo -> LocalBuildInfo -> ComponentLocalBuildInfo -> PreProcessor ppCpp' extraArgs bi lbi clbi = case compilerFlavor (compiler lbi) of - GHC -> ppGhcCpp ghcProgram (const True) args bi lbi clbi + GHC -> ppGhcCpp args bi lbi clbi _ -> ppCpphs args bi lbi clbi where cppArgs = getCppOptions bi lbi args = cppArgs ++ extraArgs ppGhcCpp - :: Program - -> (Version -> Bool) - -> [String] + :: [String] -> BuildInfo -> LocalBuildInfo -> ComponentLocalBuildInfo -> PreProcessor -ppGhcCpp program xHs extraArgs _bi lbi clbi = +ppGhcCpp extraArgs _bi lbi clbi = PreProcessor { platformIndependent = False , ppOrdering = unsorted , runPreProcessor = mkSimplePreProcessor $ \inFile outFile verbosity -> do - (prog, version, _) <- - requireProgramVersion - verbosity - program - anyVersion - (withPrograms lbi) + (prog, _) <- requireProgram verbosity ghcProgram (withPrograms lbi) runProgramCwd verbosity (mbWorkDirLBI lbi) prog $ ["-E", "-cpp"] -- This is a bit of an ugly hack. We're going to @@ -433,7 +426,7 @@ ppGhcCpp program xHs extraArgs _bi lbi clbi = -- so we need GHC not to unlit it now or it'll get -- double-unlitted. In the future we might switch to -- using cpphs --unlit instead. - ++ (if xHs version then ["-x", "hs"] else []) + ++ ["-x", "hs"] ++ ["-optP-include", "-optP" ++ u (autogenComponentModulesDir lbi clbi makeRelativePathEx cppHeaderName)] ++ ["-o", outFile, inFile] ++ extraArgs diff --git a/cabal-install/src/Distribution/Client/SetupWrapper.hs b/cabal-install/src/Distribution/Client/SetupWrapper.hs index d3274a885bf..93faf44e53a 100644 --- a/cabal-install/src/Distribution/Client/SetupWrapper.hs +++ b/cabal-install/src/Distribution/Client/SetupWrapper.hs @@ -1155,27 +1155,25 @@ getCachedSetupExecutable True createDirectoryIfMissingVerbose verbosity True setupCacheDir installExecutableFile verbosity src cachedSetupProgFile - -- Do not strip if we're using GHCJS, since the result may be a script - when (maybe True ((/= GHCJS) . compilerFlavor) $ useCompiler options') $ do - -- Add the relevant PATH overrides for the package to the - -- program database. + -- Add the relevant PATH overrides for the package to the + -- program database. + setupProgDb + <- prependProgramSearchPath verbosity + (useExtraPathEnv options') + (useExtraEnvOverrides options') + (useProgramDb options') + >>= configureAllKnownPrograms verbosity + Strip.stripExe + verbosity + platform setupProgDb - <- prependProgramSearchPath verbosity - (useExtraPathEnv options') - (useExtraEnvOverrides options') - (useProgramDb options') - >>= configureAllKnownPrograms verbosity - Strip.stripExe - verbosity - platform - setupProgDb - cachedSetupProgFile + cachedSetupProgFile return cachedSetupProgFile where criticalSection' = maybe id criticalSection $ setupCacheLock options' -- | If the Setup.hs is out of date wrt the executable then recompile it. --- Currently this is GHC/GHCJS only. It should really be generalised. +-- Currently this is GHC only. It should really be generalised. compileExe :: Verbosity -> Platform @@ -1267,7 +1265,6 @@ compileSetupX (compiler, progdb, options'') <- configureCompiler verbosity options' pkgDbs <- traverse (traverse (makeRelativeToDirS mbWorkDir)) (coercePackageDBStack (usePackageDB options'')) let cabalPkgid = PackageIdentifier (mkPackageName "Cabal") cabalLibVersion - (program, extraOpts) = (ghcProgram, ["-threaded"]) cabalDep = maybe [] @@ -1316,7 +1313,7 @@ compileSetupX [ cppMacrosFile | useVersionMacros options' ] - , ghcOptExtra = extraOpts + , ghcOptExtra = ["-threaded"] , ghcOptExtensions = toNubListR $ [ Simple.DisableExtension Simple.ImplicitPrelude | not $ bt == Custom || any (isBasePkgId . snd) selectedDeps @@ -1343,7 +1340,7 @@ compileSetupX rewriteFileEx verbosity (i cppMacrosFile) $ generatePackageVersionMacros (pkgVersion pkgId) (map snd selectedDeps) case useLoggingHandle options' of - Nothing -> runDbProgramCwd verbosity mbWorkDir program progdb ghcCmdLine + Nothing -> runDbProgramCwd verbosity mbWorkDir ghcProgram progdb ghcCmdLine -- If build logging is enabled, redirect compiler output to -- the log file. Just logHandle -> do @@ -1351,7 +1348,7 @@ compileSetupX getDbProgramOutputCwd verbosity mbWorkDir - program + ghcProgram progdb ghcCmdLine hPutStr logHandle output From a9f82b140a8d706e5df09c1c0e746f09a14451dc Mon Sep 17 00:00:00 2001 From: Phil de Joux Date: Tue, 29 Sep 2026 14:10:33 -0400 Subject: [PATCH 05/13] Remove GHCJS from GHC.ImplInfo --- Cabal/src/Distribution/Simple/GHC/ImplInfo.hs | 32 ++----------------- 1 file changed, 2 insertions(+), 30 deletions(-) diff --git a/Cabal/src/Distribution/Simple/GHC/ImplInfo.hs b/Cabal/src/Distribution/Simple/GHC/ImplInfo.hs index 6fc9bad442e..a7899e77066 100644 --- a/Cabal/src/Distribution/Simple/GHC/ImplInfo.hs +++ b/Cabal/src/Distribution/Simple/GHC/ImplInfo.hs @@ -13,7 +13,6 @@ module Distribution.Simple.GHC.ImplInfo ( GhcImplInfo (..) , getImplInfo , ghcVersionImplInfo - , ghcjsVersionImplInfo ) where import Distribution.Compat.Prelude @@ -22,7 +21,6 @@ import Prelude () import Distribution.Simple.Compiler ( Compiler , CompilerFlavor (..) - , compilerCompatVersion , compilerFlavor , compilerVersion ) @@ -60,17 +58,10 @@ getImplInfo :: Compiler -> GhcImplInfo getImplInfo comp = case compilerFlavor comp of GHC -> ghcVersionImplInfo (compilerVersion comp) - GHCJS -> case compilerCompatVersion GHC comp of - Just ghcVer -> ghcjsVersionImplInfo (compilerVersion comp) ghcVer - _ -> - error - ( "Distribution.Simple.GHC.Props.getImplProps: " - ++ "could not find GHC version for GHCJS compiler" - ) x -> error - ( "Distribution.Simple.GHC.Props.getImplProps only works" - ++ "for GHC-like compilers (GHC, GHCJS)" + ( "Distribution.Simple.GHC.ImplInfo.getImplInfo only works" + ++ " for GHC" ++ ", but found " ++ show x ) @@ -88,22 +79,3 @@ ghcVersionImplInfo ver = } where v = versionNumbers ver - -ghcjsVersionImplInfo - :: Version - -- ^ The GHCJS version - -> Version - -- ^ The GHC version - -> GhcImplInfo -ghcjsVersionImplInfo _ghcjsver ghcver = - GhcImplInfo - { supportsGHC2021 = ghcv >= [9, 1] - , supportsGHC2024 = ghcv >= [9, 9] - , flagProfLate = ghcv >= [9, 4] - , flagHie = ghcv >= [8, 8] - , supportsPkgEnvFiles = ghcv >= [8, 0, 2] -- TODO: check this works in ghcjs - , flagWarnMissingHomeModules = ghcv >= [8, 2] - , unitIdForExes = ghcv >= [9, 2] - } - where - ghcv = versionNumbers ghcver From 84b2ecb8c67c881e3e016c3562315dce178601f9 Mon Sep 17 00:00:00 2001 From: Phil de Joux Date: Tue, 29 Sep 2026 14:13:37 -0400 Subject: [PATCH 06/13] Retire the GHCJS version mismatch errors --- Cabal/src/Distribution/Simple/Errors.hs | 24 ++---------------------- 1 file changed, 2 insertions(+), 22 deletions(-) diff --git a/Cabal/src/Distribution/Simple/Errors.hs b/Cabal/src/Distribution/Simple/Errors.hs index 4dc21def00d..373a5e8726f 100644 --- a/Cabal/src/Distribution/Simple/Errors.hs +++ b/Cabal/src/Distribution/Simple/Errors.hs @@ -81,8 +81,6 @@ data CabalException | PkgDumpFailed | FailedToParseOutput | CantFindSourceModule ModuleName - | VersionMismatchJS FilePath Version FilePath Version - | VersionMismatchGHCJS FilePath Version FilePath Version | GlobalPackageDBLimitation | GlobalPackageDBSpecifiedFirst | MatchDirFileGlob String @@ -214,8 +212,8 @@ exceptionCode e = case e of PkgDumpFailed{} -> 2291 FailedToParseOutput{} -> 5500 CantFindSourceModule{} -> 8870 - VersionMismatchJS{} -> 9001 - VersionMismatchGHCJS{} -> 4001 + -- Retired: VersionMismatchJS{} -> 9001 + -- Retired: VersionMismatchGHCJS{} -> 4001 GlobalPackageDBLimitation{} -> 5002 GlobalPackageDBSpecifiedFirst{} -> 3901 MatchDirFileGlob{} -> 9760 @@ -368,24 +366,6 @@ exceptionMessage e = case e of PkgDumpFailed -> "pkg dump failed" FailedToParseOutput -> "failed to parse output of 'pkg dump'" CantFindSourceModule moduleName -> "can't find source for module " ++ prettyShow moduleName - VersionMismatchJS ghcjsProgPath ghcjsVersion ghcjsPkgProgPath ghcjsPkgGhcjsVersion -> - "Version mismatch between ghcjs and ghcjs-pkg: " - ++ show ghcjsProgPath - ++ " is version " - ++ prettyShow ghcjsVersion - ++ " " - ++ show ghcjsPkgProgPath - ++ " is version " - ++ prettyShow ghcjsPkgGhcjsVersion - VersionMismatchGHCJS ghcjsProgPath ghcjsGhcVersion ghcjsPkgProgPath ghcjsPkgVersion -> - "Version mismatch between ghcjs and ghcjs-pkg: " - ++ show ghcjsProgPath - ++ " was built with GHC version " - ++ prettyShow ghcjsGhcVersion - ++ " " - ++ show ghcjsPkgProgPath - ++ " was built with GHC version " - ++ prettyShow ghcjsPkgVersion GlobalPackageDBLimitation -> "With current ghc versions the global package db is always used " ++ "and must be listed first. This ghc limitation may be lifted in " From f378ffc21f085f78e3aa638dc20032f646609eda Mon Sep 17 00:00:00 2001 From: Phil de Joux Date: Tue, 29 Sep 2026 14:18:44 -0400 Subject: [PATCH 07/13] Remove GHCJS flavor arms from the Cabal library --- .../src/Distribution/Simple/Build/PathsModule.hs | 1 - Cabal/src/Distribution/Simple/Compiler.hs | 3 --- Cabal/src/Distribution/Simple/Configure.hs | 2 -- Cabal/src/Distribution/Simple/Haddock.hs | 4 ++-- Cabal/src/Distribution/Simple/PreProcess.hs | 15 --------------- Cabal/src/Distribution/Simple/Program/GHC.hs | 4 ++-- Cabal/src/Distribution/Simple/Program/HcPkg.hs | 2 +- Cabal/src/Distribution/Simple/Register.hs | 2 +- Cabal/src/Distribution/Simple/ShowBuildInfo.hs | 1 - 9 files changed, 6 insertions(+), 28 deletions(-) diff --git a/Cabal/src/Distribution/Simple/Build/PathsModule.hs b/Cabal/src/Distribution/Simple/Build/PathsModule.hs index 525c19598b8..d26dd9917a7 100644 --- a/Cabal/src/Distribution/Simple/Build/PathsModule.hs +++ b/Cabal/src/Distribution/Simple/Build/PathsModule.hs @@ -73,7 +73,6 @@ generatePathsModule pkg_descr lbi clbi = _ -> False supportsRelocatableProgs GHC = isWindows - supportsRelocatableProgs GHCJS = isWindows supportsRelocatableProgs _ = False cid = componentUnitId clbi diff --git a/Cabal/src/Distribution/Simple/Compiler.hs b/Cabal/src/Distribution/Simple/Compiler.hs index 3dd5534c5a1..629ded37533 100644 --- a/Cabal/src/Distribution/Simple/Compiler.hs +++ b/Cabal/src/Distribution/Simple/Compiler.hs @@ -517,7 +517,6 @@ coverageSupported :: Compiler -> Bool coverageSupported comp = case compilerFlavor comp of GHC -> True - GHCJS -> True _ -> False -- | Does this compiler support profiling? @@ -525,7 +524,6 @@ profilingSupported :: Compiler -> Bool profilingSupported comp = case compilerFlavor comp of GHC -> True - GHCJS -> True _ -> False -- | Returns Just if we can certainly determine whether a way is supported @@ -595,7 +593,6 @@ ghcSupported :: String -> Compiler -> Bool ghcSupported key comp = case compilerFlavor comp of GHC -> checkProp - GHCJS -> checkProp _ -> False where checkProp = diff --git a/Cabal/src/Distribution/Simple/Configure.hs b/Cabal/src/Distribution/Simple/Configure.hs index bcb337dfb83..8a2586aa571 100644 --- a/Cabal/src/Distribution/Simple/Configure.hs +++ b/Cabal/src/Distribution/Simple/Configure.hs @@ -927,13 +927,11 @@ adjustBuildOptions comp programDb opts = | GHC <- compilerFlavor comp , compilerVersion comp >= mkVersion [8, 0] = True - | GHCJS <- compilerFlavor comp = True | otherwise = False -- not supported by this compiler splitObj | not (LBC.splitObjs opts) = False | splitSec = False -- mutually exclusive with split-sections | GHC <- compilerFlavor comp = True - | GHCJS <- compilerFlavor comp = True | otherwise = False -- not supported by this compiler linkerSupportsRelocations :: Maybe Bool linkerSupportsRelocations = diff --git a/Cabal/src/Distribution/Simple/Haddock.hs b/Cabal/src/Distribution/Simple/Haddock.hs index 61b8c73b206..4578579d07f 100644 --- a/Cabal/src/Distribution/Simple/Haddock.hs +++ b/Cabal/src/Distribution/Simple/Haddock.hs @@ -659,7 +659,7 @@ componentGhcOptions verbosity lbi bi clbi odir = _ -> error $ "Distribution.Simple.Haddock.componentGhcOptions:" - ++ "haddock only supports GHC and GHCJS" + ++ "haddock only supports GHC" in f verbosity lbi bi clbi odir {- @@ -1039,7 +1039,7 @@ getGhcLibDir getGhcLibDir verbosity lbi = do l <- case compilerFlavor (compiler lbi) of GHC -> GHC.getLibDir verbosity lbi - _ -> error "haddock only supports GHC and GHCJS" + _ -> error "haddock only supports GHC" return $ mempty{argGhcLibDir = Flag l} -- | If Hi Haddock is supported, this function creates temporary directories diff --git a/Cabal/src/Distribution/Simple/PreProcess.hs b/Cabal/src/Distribution/Simple/PreProcess.hs index 9b8667a194a..6af3e15051e 100644 --- a/Cabal/src/Distribution/Simple/PreProcess.hs +++ b/Cabal/src/Distribution/Simple/PreProcess.hs @@ -629,7 +629,6 @@ ppHsc2hs bi lbi clbi = isELF = case buildOS of OSX -> False; Windows -> False; AIX -> False; _ -> True packageHacks = case compilerFlavor (compiler lbi) of GHC -> hackRtsPackage - GHCJS -> hackRtsPackage _ -> id -- We don't link in the actual Haskell libraries of our dependencies, so -- the -u flags in the ldOptions of the rts package mean linking fails on @@ -731,23 +730,11 @@ platformDefines lbi = ++ ["-D" ++ arch ++ "_BUILD_ARCH=1"] ++ map (\os' -> "-D" ++ os' ++ "_HOST_OS=1") osStr ++ map (\arch' -> "-D" ++ arch' ++ "_HOST_ARCH=1") archStr - GHCJS -> - compatGlasgowHaskell - ++ ["-D__GHCJS__=" ++ versionInt version] - ++ ["-D" ++ os ++ "_BUILD_OS=1"] - ++ ["-D" ++ arch ++ "_BUILD_ARCH=1"] - ++ map (\os' -> "-D" ++ os' ++ "_HOST_OS=1") osStr - ++ map (\arch' -> "-D" ++ arch' ++ "_HOST_ARCH=1") archStr _ -> [] where comp = compiler lbi Platform hostArch hostOS = hostPlatform lbi version = compilerVersion comp - compatGlasgowHaskell = - maybe - [] - (\v -> ["-D__GLASGOW_HASKELL__=" ++ versionInt v]) - (compilerCompatVersion GHC comp) -- TODO: move this into the compiler abstraction -- FIXME: this forces GHC's crazy 4.8.2 -> 408 convention on all -- the other compilers. Check if that's really what they want. @@ -817,7 +804,6 @@ ppHappy _ lbi _ = pp{platformIndependent = True} pp = standardPP lbi happyProgram (hcFlags hc) hc = compilerFlavor (compiler lbi) hcFlags GHC = ["-agc"] - hcFlags GHCJS = ["-agc"] hcFlags _ = [] ppAlex :: BuildInfo -> LocalBuildInfo -> ComponentLocalBuildInfo -> PreProcessor @@ -826,7 +812,6 @@ ppAlex _ lbi _ = pp{platformIndependent = True} pp = standardPP lbi alexProgram (hcFlags hc) hc = compilerFlavor (compiler lbi) hcFlags GHC = ["-g"] - hcFlags GHCJS = ["-g"] hcFlags _ = [] standardPP :: LocalBuildInfo -> Program -> [String] -> PreProcessor diff --git a/Cabal/src/Distribution/Simple/Program/GHC.hs b/Cabal/src/Distribution/Simple/Program/GHC.hs index 1b6a1857d11..ccefdabd553 100644 --- a/Cabal/src/Distribution/Simple/Program/GHC.hs +++ b/Cabal/src/Distribution/Simple/Program/GHC.hs @@ -765,10 +765,10 @@ ghcInvocation verbosity ghcProg comp platform mbWorkDir opts = do renderGhcOptions :: Compiler -> Platform -> GhcOptions -> [String] renderGhcOptions comp _platform@(Platform _arch os) opts - | compilerFlavor comp `notElem` [GHC, GHCJS] = + | compilerFlavor comp /= GHC = error $ "Distribution.Simple.Program.GHC.renderGhcOptions: " - ++ "compiler flavor must be 'GHC' or 'GHCJS'!" + ++ "compiler flavor must be 'GHC'!" | otherwise = concat [ case flagToMaybe (ghcOptMode opts) of diff --git a/Cabal/src/Distribution/Simple/Program/HcPkg.hs b/Cabal/src/Distribution/Simple/Program/HcPkg.hs index b3177a9d316..0f4234bd883 100644 --- a/Cabal/src/Distribution/Simple/Program/HcPkg.hs +++ b/Cabal/src/Distribution/Simple/Program/HcPkg.hs @@ -9,7 +9,7 @@ -- Portability : portable -- -- This module provides an library interface to the @hc-pkg@ program. --- Currently only GHC and GHCJS have hc-pkg programs. +-- Currently only GHC has an hc-pkg program. module Distribution.Simple.Program.HcPkg ( -- * Types ConfiguredProgram (..) diff --git a/Cabal/src/Distribution/Simple/Register.hs b/Cabal/src/Distribution/Simple/Register.hs index d50e897b645..c11f52b2107 100644 --- a/Cabal/src/Distribution/Simple/Register.hs +++ b/Cabal/src/Distribution/Simple/Register.hs @@ -744,7 +744,7 @@ unregisterWithHandles verbHandles pkg lbi regFlags = do setupMessage verbosity "Unregistering" pkgid withHcPkg verbosity - "unregistering is only implemented for GHC and GHCJS" + "unregistering is only implemented for GHC" (compiler lbi) (withPrograms lbi) unreg diff --git a/Cabal/src/Distribution/Simple/ShowBuildInfo.hs b/Cabal/src/Distribution/Simple/ShowBuildInfo.hs index 489c237c27c..e10f2b69e3a 100644 --- a/Cabal/src/Distribution/Simple/ShowBuildInfo.hs +++ b/Cabal/src/Distribution/Simple/ShowBuildInfo.hs @@ -201,7 +201,6 @@ getCompilerArgs getCompilerArgs bi lbi clbi = case compilerFlavor $ compiler lbi of GHC -> ([], ghcArgs) - GHCJS -> ([], ghcArgs) c -> ( [ "ShowBuildInfo.getCompilerArgs: Don't know how to get build " From a9dc79ab26057d6d6eca52b92746f6f70f9695a2 Mon Sep 17 00:00:00 2001 From: Phil de Joux Date: Tue, 29 Sep 2026 14:23:29 -0400 Subject: [PATCH 08/13] Remove GHCJS flavor arms from cabal-install - Use uhc instead in tests that used ghcjs --- cabal-install/parser-tests/Tests/ParserTests.hs | 2 +- .../Tests/files/project-config-shared/cabal.project | 2 +- cabal-install/src/Distribution/Client/CmdInstall.hs | 2 +- .../src/Distribution/Client/ProjectOrchestration.hs | 2 +- .../src/Distribution/Client/ProjectPlanOutput.hs | 4 +--- .../src/Distribution/Client/ProjectPlanning.hs | 10 +++++----- .../src/Distribution/Client/ProjectPlanning/Types.hs | 2 +- 7 files changed, 11 insertions(+), 13 deletions(-) diff --git a/cabal-install/parser-tests/Tests/ParserTests.hs b/cabal-install/parser-tests/Tests/ParserTests.hs index 33debe829f9..36c54be6849 100644 --- a/cabal-install/parser-tests/Tests/ParserTests.hs +++ b/cabal-install/parser-tests/Tests/ParserTests.hs @@ -188,7 +188,7 @@ testProjectConfigShared = do projectConfigProjectDir = toFlag "my-project-dir" projectConfigProjectFile = toFlag "my-project" projectConfigIgnoreProject = toFlag False - projectConfigHcFlavor = toFlag GHCJS + projectConfigHcFlavor = toFlag UHC projectConfigHcPath = toFlag "/some/path/to/compiler" projectConfigHcPkg = toFlag "/some/path/to/ghc-pkg" projectConfigHaddockIndex = toFlag $ toPathTemplate "/path/to/haddock-index" diff --git a/cabal-install/parser-tests/Tests/files/project-config-shared/cabal.project b/cabal-install/parser-tests/Tests/files/project-config-shared/cabal.project index 90f00f96278..a413d6f6cf8 100644 --- a/cabal-install/parser-tests/Tests/files/project-config-shared/cabal.project +++ b/cabal-install/parser-tests/Tests/files/project-config-shared/cabal.project @@ -5,7 +5,7 @@ store-dir: a/store/dir/path per-component: True independent-goals: True ignore-project: False -compiler: ghcjs +compiler: uhc with-compiler: /some/path/to/compiler with-hc-pkg: /some/path/to/ghc-pkg doc-index-file: /path/to/haddock-index diff --git a/cabal-install/src/Distribution/Client/CmdInstall.hs b/cabal-install/src/Distribution/Client/CmdInstall.hs index 1215af9fc7b..50e55e14c82 100644 --- a/cabal-install/src/Distribution/Client/CmdInstall.hs +++ b/cabal-install/src/Distribution/Client/CmdInstall.hs @@ -1288,7 +1288,7 @@ getExistingEnvEntries :: Verbosity -> CompilerFlavor -> Bool -> FilePath -> IO ( getExistingEnvEntries verbosity compilerFlavor supportsPkgEnvFiles envFile = do envFileExists <- doesFileExist envFile (usedExisting, allEntries) <- - if (compilerFlavor == GHC || compilerFlavor == GHCJS) + if compilerFlavor == GHC && supportsPkgEnvFiles && envFileExists then catch ((True,) <$> readGhcEnvironmentFile envFile) $ \(ParseErrorExc parseError) -> diff --git a/cabal-install/src/Distribution/Client/ProjectOrchestration.hs b/cabal-install/src/Distribution/Client/ProjectOrchestration.hs index 42316e2149e..ca321b8987b 100644 --- a/cabal-install/src/Distribution/Client/ProjectOrchestration.hs +++ b/cabal-install/src/Distribution/Client/ProjectOrchestration.hs @@ -967,7 +967,7 @@ availableTargetIndexesFromSourcePackages pkgSpecifiers = AvailableTargetIndexes{ -- TODO: [research required] what if the solution has multiple -- versions of this package? -- e.g. due to setup deps or due to multiple independent sets --- of packages being built (e.g. ghc + ghcjs in a project) +-- of packages being built (e.g. native ghc + the ghc javascript backend in a project) filterTargetsKind :: ComponentKind -> [AvailableTarget k] -> [AvailableTarget k] filterTargetsKind ckind = filterTargetsKindWith (== ckind) diff --git a/cabal-install/src/Distribution/Client/ProjectPlanOutput.hs b/cabal-install/src/Distribution/Client/ProjectPlanOutput.hs index 7ba35583ca0..1976da2869a 100644 --- a/cabal-install/src/Distribution/Client/ProjectPlanOutput.hs +++ b/cabal-install/src/Distribution/Client/ProjectPlanOutput.hs @@ -853,7 +853,6 @@ writePlanGhcEnvironment postBuildStatus | compilerFlavor compiler == GHC , supportsPkgEnvFiles (getImplInfo compiler) = - -- TODO: check ghcjs compat Just <$> writeGhcEnvironmentFile path @@ -903,8 +902,7 @@ argsEquivalentOfGhcEnvironmentFile argsEquivalentOfGhcEnvironmentFile compiler = case compilerId compiler of CompilerId GHC _ -> argsEquivalentOfGhcEnvironmentFileGhc - CompilerId GHCJS _ -> argsEquivalentOfGhcEnvironmentFileGhc - CompilerId _ _ -> error "Only GHC and GHCJS are supported" + CompilerId _ _ -> error "Only GHC is supported" -- TODO remove this when we drop support for non-.ghc.env ghc argsEquivalentOfGhcEnvironmentFileGhc diff --git a/cabal-install/src/Distribution/Client/ProjectPlanning.hs b/cabal-install/src/Distribution/Client/ProjectPlanning.hs index 6b65bf23b2a..da185e990c0 100644 --- a/cabal-install/src/Distribution/Client/ProjectPlanning.hs +++ b/cabal-install/src/Distribution/Client/ProjectPlanning.hs @@ -28,10 +28,10 @@ -- -- The division between the shared and per-package config is not set in stone -- for all time. For example if we wanted to generalise the install plan to --- describe a situation where we want to build some packages with GHC and some --- with GHCJS then the platform and compiler would no longer be shared between --- all packages but would have to be per-package (probably with some sanity --- condition on the graph structure). +-- describe a situation where we want to build some packages with one compiler +-- and some with another then the platform and compiler would no longer be +-- shared between all packages but would have to be per-package (probably with +-- some sanity condition on the graph structure). module Distribution.Client.ProjectPlanning ( -- * Types for the elaborated install plan ElaboratedInstallPlan @@ -1539,7 +1539,7 @@ planPackages | isGHC, compVer >= mkVersion [8, 2] = mkVersion [2, 0] | otherwise = mkVersion [1, 24] where - isGHC = compFlav `elem` [GHC, GHCJS] + isGHC = compFlav == GHC compFlav = compilerFlavor comp compVer = compilerVersion comp diff --git a/cabal-install/src/Distribution/Client/ProjectPlanning/Types.hs b/cabal-install/src/Distribution/Client/ProjectPlanning/Types.hs index 15d91232441..67e10c46813 100644 --- a/cabal-install/src/Distribution/Client/ProjectPlanning/Types.hs +++ b/cabal-install/src/Distribution/Client/ProjectPlanning/Types.hs @@ -179,7 +179,7 @@ showElaboratedInstallPlan = InstallPlan.showInstallPlan_gen showNode -- TODO: [code cleanup] decide if we really need this, there's not much in it, and in principle -- even platform and compiler could be different if we're building things --- like a server + client with ghc + ghcjs +-- like a server + client with native ghc + the ghc javascript backend data ElaboratedSharedConfig = ElaboratedSharedConfig { pkgConfigPlatform :: Platform , pkgConfigCompiler :: Compiler -- TODO: [code cleanup] replace with CompilerInfo From 4c70d7cfdabfd88f080c4cf9c1e8ba84d0bca3c9 Mon Sep 17 00:00:00 2001 From: Phil de Joux Date: Tue, 29 Sep 2026 14:27:15 -0400 Subject: [PATCH 09/13] Update the manual for GHCJS removal --- doc/cabal-package-description-file.rst | 20 ++++++++++++++++---- doc/cabal-project-description-file.rst | 4 ++-- doc/setup-commands.rst | 5 +++-- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/doc/cabal-package-description-file.rst b/doc/cabal-package-description-file.rst index 0607caec290..9f31a228dda 100644 --- a/doc/cabal-package-description-file.rst +++ b/doc/cabal-package-description-file.rst @@ -1820,20 +1820,32 @@ system-dependent values for these fields. generate the ``.dyn_o`` files). .. pkg-field:: ghcjs-options: token list + :deprecated: - Like :pkg-field:`ghc-options` but applies to GHCJS + Formerly like :pkg-field:`ghc-options` but for GHCJS. Still accepted so + that existing packages parse, but ignored since GHCJS support was + removed. .. pkg-field:: ghcjs-prof-options: token list + :deprecated: - Like :pkg-field:`ghc-prof-options` but applies to GHCJS + Formerly like :pkg-field:`ghc-prof-options` but for GHCJS. Still accepted + so that existing packages parse, but ignored since GHCJS support was + removed. .. pkg-field:: ghcjs-shared-options: token list + :deprecated: - Like :pkg-field:`ghc-shared-options` but applies to GHCJS + Formerly like :pkg-field:`ghc-shared-options` but for GHCJS. Still + accepted so that existing packages parse, but ignored since GHCJS support + was removed. .. pkg-field:: ghcjs-prof-shared-options: token list + :deprecated: - Like :pkg-field:`ghc-prof-shared-options` but applies to GHCJS + Formerly like :pkg-field:`ghc-prof-shared-options` but for GHCJS. Still + accepted so that existing packages parse, but ignored since GHCJS support + was removed. .. pkg-field:: includes: filename list :since: 1.0 diff --git a/doc/cabal-project-description-file.rst b/doc/cabal-project-description-file.rst index 4b3858862f4..3530cf23051 100644 --- a/doc/cabal-project-description-file.rst +++ b/doc/cabal-project-description-file.rst @@ -1074,7 +1074,7 @@ feature was added. Specify the path to a particular compiler to be used. If not an absolute path, it will be resolved according to the ``PATH`` - environment. The type of the compiler (GHC, GHCJS, etc) must be + environment. The type of the compiler (GHC, UHC, etc) must be consistent with the setting of the :cfg-field:`compiler` field. The most common use of this option is to specify a different version @@ -1157,7 +1157,7 @@ feature was added. The command line variant of this flag is ``--configure-option=arg``, which can be specified multiple times to pass multiple options. -.. cfg-field:: compiler: ghc, ghcjs, jhc, lhc, or uhc +.. cfg-field:: compiler: ghc, jhc, lhc, or uhc --compiler=compiler :synopsis: Compiler to build with. diff --git a/doc/setup-commands.rst b/doc/setup-commands.rst index a2e4c359d03..d53fa6a809d 100644 --- a/doc/setup-commands.rst +++ b/doc/setup-commands.rst @@ -449,8 +449,9 @@ $arch e.g. ``i386``, ``x86_64``, ``ppc`` or ``sparc`` $abitag An optional tag that a compiler can use for telling incompatible - ABI's on the same architecture apart. GHCJS encodes the underlying - GHC version in the ABI tag. + ABI's on the same architecture apart. GHC uses the part of its project + unit id that is not already in its version, e.g. ``inplace`` for an + in-tree build. $abi A shortcut for getting a path that completely identifies the platform in terms of binary compatibility. Expands to the same value From 06a15b1a80dd548b490f338d558e6a566ee8e222 Mon Sep 17 00:00:00 2001 From: Phil de Joux Date: Tue, 29 Sep 2026 14:41:35 -0400 Subject: [PATCH 10/13] Give a dedicated error when GHCJS is selected --- Cabal/src/Distribution/Simple/Configure.hs | 2 ++ Cabal/src/Distribution/Simple/Errors.hs | 5 +++++ .../PackageTests/GHCJS/NotSupported/cabal.out | 3 +++ .../PackageTests/GHCJS/NotSupported/cabal.project | 2 ++ .../PackageTests/GHCJS/NotSupported/cabal.test.hs | 7 +++++++ .../GHCJS/NotSupported/ghcjs-not-supported.cabal | 11 +++++++++++ .../PackageTests/GHCJS/NotSupported/src/MyLib.hs | 4 ++++ 7 files changed, 34 insertions(+) create mode 100644 cabal-testsuite/PackageTests/GHCJS/NotSupported/cabal.out create mode 100644 cabal-testsuite/PackageTests/GHCJS/NotSupported/cabal.project create mode 100644 cabal-testsuite/PackageTests/GHCJS/NotSupported/cabal.test.hs create mode 100644 cabal-testsuite/PackageTests/GHCJS/NotSupported/ghcjs-not-supported.cabal create mode 100644 cabal-testsuite/PackageTests/GHCJS/NotSupported/src/MyLib.hs diff --git a/Cabal/src/Distribution/Simple/Configure.hs b/Cabal/src/Distribution/Simple/Configure.hs index 8a2586aa571..cd7d13d397f 100644 --- a/Cabal/src/Distribution/Simple/Configure.hs +++ b/Cabal/src/Distribution/Simple/Configure.hs @@ -2679,6 +2679,7 @@ configCompilerEx (Just hcFlavor) hcPath hcPkg progdb verbosity = do (comp, maybePlatform, programDb) <- case hcFlavor of GHC -> GHC.configure verbosity hcPath hcPkg progdb UHC -> UHC.configure verbosity hcPath progdb + GHCJS -> dieWithException verbosity GHCJSNotSupported _ -> dieWithException verbosity UnknownCompilerException return (comp, fromMaybe buildPlatform maybePlatform, programDb) @@ -2698,6 +2699,7 @@ configCompiler mbFlavor hcPath progdb verbosity = do case hcFlavor of GHC -> GHC.configureCompiler verbosity hcPath progdb UHC -> UHC.configure verbosity hcPath progdb + GHCJS -> dieWithException verbosity GHCJSNotSupported _ -> dieWithException verbosity UnknownCompilerException return (comp, fromMaybe buildPlatform maybePlatform, programDb) diff --git a/Cabal/src/Distribution/Simple/Errors.hs b/Cabal/src/Distribution/Simple/Errors.hs index 373a5e8726f..24b4891f0c3 100644 --- a/Cabal/src/Distribution/Simple/Errors.hs +++ b/Cabal/src/Distribution/Simple/Errors.hs @@ -131,6 +131,7 @@ data CabalException | PkgConfigNotFound String String | BadVersion String String PkgconfigVersion | UnknownCompilerException + | GHCJSNotSupported | NoWorkingGcc | NoOSSupport OS String | NoCompilerSupport String @@ -265,6 +266,7 @@ exceptionCode e = case e of PkgConfigNotFound{} -> 7123 BadVersion{} -> 7600 UnknownCompilerException{} -> 3022 + GHCJSNotSupported{} -> 4002 NoWorkingGcc{} -> 1088 NoOSSupport{} -> 3339 NoCompilerSupport{} -> 2290 @@ -587,6 +589,9 @@ exceptionMessage e = case e of ++ " system is version " ++ prettyShow v UnknownCompilerException -> "Unknown compiler" + GHCJSNotSupported -> + "GHCJS is no longer supported. Use the JavaScript backend of GHC instead, " + ++ "for example with --with-compiler=javascript-unknown-ghcjs-ghc." NoWorkingGcc -> unlines [ "No working gcc" diff --git a/cabal-testsuite/PackageTests/GHCJS/NotSupported/cabal.out b/cabal-testsuite/PackageTests/GHCJS/NotSupported/cabal.out new file mode 100644 index 00000000000..e590e3952f2 --- /dev/null +++ b/cabal-testsuite/PackageTests/GHCJS/NotSupported/cabal.out @@ -0,0 +1,3 @@ +# cabal v2-build +Error: [Cabal-4002] +GHCJS is no longer supported. Use the JavaScript backend of GHC instead, for example with --with-compiler=javascript-unknown-ghcjs-ghc. diff --git a/cabal-testsuite/PackageTests/GHCJS/NotSupported/cabal.project b/cabal-testsuite/PackageTests/GHCJS/NotSupported/cabal.project new file mode 100644 index 00000000000..faa04288180 --- /dev/null +++ b/cabal-testsuite/PackageTests/GHCJS/NotSupported/cabal.project @@ -0,0 +1,2 @@ +packages: . +compiler: ghcjs diff --git a/cabal-testsuite/PackageTests/GHCJS/NotSupported/cabal.test.hs b/cabal-testsuite/PackageTests/GHCJS/NotSupported/cabal.test.hs new file mode 100644 index 00000000000..ddf83ef512a --- /dev/null +++ b/cabal-testsuite/PackageTests/GHCJS/NotSupported/cabal.test.hs @@ -0,0 +1,7 @@ +import Test.Cabal.Prelude + +-- Selecting the removed GHCJS compiler flavor must fail with a message that +-- points at the JavaScript backend of GHC. +main = cabalTest $ do + result <- fails $ cabal' "v2-build" ["all"] + assertOutputContains "GHCJS is no longer supported" result diff --git a/cabal-testsuite/PackageTests/GHCJS/NotSupported/ghcjs-not-supported.cabal b/cabal-testsuite/PackageTests/GHCJS/NotSupported/ghcjs-not-supported.cabal new file mode 100644 index 00000000000..d96fdfca3be --- /dev/null +++ b/cabal-testsuite/PackageTests/GHCJS/NotSupported/ghcjs-not-supported.cabal @@ -0,0 +1,11 @@ +cabal-version: 3.0 +name: ghcjs-not-supported +version: 0.1.0.0 +license: NONE +build-type: Simple + +library + exposed-modules: MyLib + build-depends: base + hs-source-dirs: src + default-language: Haskell2010 diff --git a/cabal-testsuite/PackageTests/GHCJS/NotSupported/src/MyLib.hs b/cabal-testsuite/PackageTests/GHCJS/NotSupported/src/MyLib.hs new file mode 100644 index 00000000000..e657c4403f6 --- /dev/null +++ b/cabal-testsuite/PackageTests/GHCJS/NotSupported/src/MyLib.hs @@ -0,0 +1,4 @@ +module MyLib (someFunc) where + +someFunc :: IO () +someFunc = putStrLn "someFunc" From 56396a08e6dda0d2489703994f640199fe7a8363 Mon Sep 17 00:00:00 2001 From: Phil de Joux Date: Tue, 29 Sep 2026 14:51:07 -0400 Subject: [PATCH 11/13] Add a changelog entry --- changelog.d/12396.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 changelog.d/12396.md diff --git a/changelog.d/12396.md b/changelog.d/12396.md new file mode 100644 index 00000000000..0ef5caba48d --- /dev/null +++ b/changelog.d/12396.md @@ -0,0 +1,14 @@ +--- +synopsis: Remove GHCJS +packages: [Cabal, cabal-install] +prs: 12396 +issues: 11609 +significance: significant +--- + +Removes GHCJS, the standalone compiler that predates the JavaScript backend of +GHC. The `Distribution.Simple.GHCJS` module, the `ghcjs` and `ghcjs-pkg` +programs, the `--ghcjs` flag and the GHCJS-only code paths are gone. Selecting +`compiler: ghcjs` now fails with an error that points at the JavaScript backend +of GHC. The `ghcjs-options` family of package fields still parse but are +ignored. From 06aa4da81c13d0f929d5daad71c76bb7b4c5fac4 Mon Sep 17 00:00:00 2001 From: Phil de Joux Date: Mon, 5 Oct 2026 07:31:32 -0400 Subject: [PATCH 12/13] Separate path and runArgs --- cabal-install/src/Distribution/Client/Run.hs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/cabal-install/src/Distribution/Client/Run.hs b/cabal-install/src/Distribution/Client/Run.hs index 9e2d6735dad..9d0205a0b83 100644 --- a/cabal-install/src/Distribution/Client/Run.hs +++ b/cabal-install/src/Distribution/Client/Run.hs @@ -155,13 +155,12 @@ run verbosity lbi exe exeArgs = do (withPrograms lbi) } - (path, runArgs) <- - let exeName' = prettyShow $ exeName exe - in do - p <- - tryCanonicalizePath $ - i buildPref exeName' (exeName' <.> exeExtension (hostPlatform lbiForExe)) - return (p, []) + let exeName' = prettyShow $ exeName exe + path <- + tryCanonicalizePath $ + i buildPref exeName' (exeName' <.> exeExtension (hostPlatform lbiForExe)) + + let runArgs = [] -- Compute the appropriate environment for running the executable let progDb = withPrograms lbiForExe From ce95809b7235ef0e96e392617178a2adbfff9ec4 Mon Sep 17 00:00:00 2001 From: Phil de Joux Date: Mon, 5 Oct 2026 07:49:52 -0400 Subject: [PATCH 13/13] Remove runArgs, rename exePath --- cabal-install/src/Distribution/Client/Run.hs | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/cabal-install/src/Distribution/Client/Run.hs b/cabal-install/src/Distribution/Client/Run.hs index 9d0205a0b83..6a09dd97289 100644 --- a/cabal-install/src/Distribution/Client/Run.hs +++ b/cabal-install/src/Distribution/Client/Run.hs @@ -134,7 +134,8 @@ splitRunArgs verbosity lbi args = -- | Run a given executable. run :: Verbosity -> LocalBuildInfo -> Executable -> [String] -> IO () -run verbosity lbi exe exeArgs = do +run verbosity lbi exe@Executable{exeName} exeArgs = do + let exeName' = prettyShow exeName curDir <- absoluteWorkingDirLBI lbi let distPref = fromFlag $ configDistPref $ configFlags lbi buildPref = buildDir lbi @@ -155,13 +156,10 @@ run verbosity lbi exe exeArgs = do (withPrograms lbi) } - let exeName' = prettyShow $ exeName exe - path <- + exePath <- tryCanonicalizePath $ i buildPref exeName' (exeName' <.> exeExtension (hostPlatform lbiForExe)) - let runArgs = [] - -- Compute the appropriate environment for running the executable let progDb = withPrograms lbiForExe pathVar = progSearchPath progDb @@ -174,7 +172,7 @@ run verbosity lbi exe exeArgs = do if withDynExe lbiForExe then do let (Platform _ os) = hostPlatform lbiForExe - clbi <- case componentNameTargets' pkg_descr lbiForExe (CExeName (exeName exe)) of + clbi <- case componentNameTargets' pkg_descr lbiForExe (CExeName exeName) of [target] -> return (targetCLBI target) [] -> dieWithException verbosity CouldNotFindExecutable _ -> dieWithException verbosity FoundMultipleMatchingExes @@ -182,5 +180,5 @@ run verbosity lbi exe exeArgs = do return (addLibraryPath os paths env) else return env - notice verbosity $ "Running " ++ prettyShow (exeName exe) ++ "..." - rawSystemExitWithEnvCwd verbosity mbWorkDir path (runArgs ++ exeArgs) env' + notice verbosity $ "Running " ++ exeName' ++ "..." + rawSystemExitWithEnvCwd verbosity mbWorkDir exePath exeArgs env'