[Git][ghc/ghc][wip/marge_bot_batch_merge_job] 6 commits: Propagate annotations to simple interfaces
by Marge Bot (@marge-bot) 11 Oct '26
by Marge Bot (@marge-bot) 11 Oct '26
11 Oct '26
Marge Bot pushed to branch wip/marge_bot_batch_merge_job at Glasgow Haskell Compiler / GHC
Commits:
d538cac9 by Facundo Domínguez at 2026-10-09T20:26:38-04:00
Propagate annotations to simple interfaces
This allows annotations to be visible to plugins when run by
haddock. The LiquidHaskell plugin needs the annotations, in particular.
Fixes #26761
- - - - -
32c4f4ab by meooow25 at 2026-10-09T20:27:28-04:00
Bump containers submodule to 0.8.1
And fix affected tests.
* T4086a: containers depends on template-haskell-lift now instead of
template-haskell.
* T22611: Updated to be less dependent on containers internals.
- - - - -
c786065e by sheaf at 2026-10-09T20:28:20-04:00
Use an explicit pattern match in toIfaceIdDetails
The old wildcard pattern let this code bit rot: it did not properly account
for recently added 'IdDetails' such as 'RepPolyId', which resulted in
spurious 'pprTrace' messages that could even pollute HLS sessions.
Fixes #23785
- - - - -
e7cacf59 by sheaf at 2026-10-09T20:29:09-04:00
Take into account ifKind in freeNamesIfDecl
Commit 3c2f4bb4 added the 'ifKind' field to various constructors
of 'IfaceDecl', which preserves the original kind (before type synonym
expansion) for better error messages.
However, that commit forgot to update 'freeNamesIfDecl' correspondingly.
This could result in a "urk! lookup local fingerpring" crash when e.g.
a type's kind uses a type synonym defined later, as we failed to add a
dependency on the type synonym during dependency analysis.
Fixes #27916
- - - - -
10620b36 by Simon Peyton Jones at 2026-10-11T09:28:30-04:00
Simplify the error-suppression mechanism in GHC.Tc.Errors
In `GHC.Tc.Errors.reportWanteds` we suppress some errors in favour of
others. But the mechanism had grown crufty, and #27331 exposed a bug.
This MR makes it simpler and more uniform, by doing everything via
the `ei_suppress` field of the ErrorItem.
Claude then found another closely-related bug (see the review linked
on !16564). That bug is immortalised in new test T18851d.
I'm still not happy with `ignoreConstraint` but we can worry about
that another day; I have not touched it.
Main changes
* Instead of /predicting/ when an error will be reported, we set
`cec_error_reported` when an error is /actually/ reported. (I renamed
it from `cec_suppress` to reflect this change.)
Now errors are suppressed only when a preceding error has actually been
reported. Simpler and more robust.
See `Note [cec_error_reported: suppressing less-serious errors]`
The big changes are in `reportWanteds` which looks very different.
* New `Note [ei_suppress: suppressing confusing errors]` describes the
(quite separate) `ei_suppress` mechanism for suppressing confusing
errors, mainly arising from non-empty rewriter sets
* In `tryTypeClassDefaulting`, instead of switching off type-class defaulting
if there is an insoluble /anywhere/, we just switch it off locally when
we find an insoluble sub-tree. See Note [When to do type-class defaulting]
and (W5) in Note [ApproximateWC]
* Greatly simplify `insolubleWantedCt`.
* I made type-class-defaulting be a bit more eager, only switched off when
a peer or ancestor (but not child) constraint is insoluble. See
Note [When to do type-class defaulting].
Small refactorings
* Rename `askNoErrs` to `askErrsFound` and flip its polarity
* The code for "check if ei_suppress is true of all items" code is
moved to `mkErrorItems` rather than in the large `reportWanteds`.
* Code for `has_gadt_match` moves to `mkGivenErrorReporter`, rather than
polluting the large `reportWanteds`.
* Many tests with `-fdefer-type-errors` get more warnings, especially
about ambiguous (Num a) constraints. This is by-design: see
Note [Always warn with -fdefer-type-errors]. Previously GHC was not
honouring this Note but now it is, hence the extra errors.
- - - - -
0d80371f by Cheng Shao at 2026-10-11T09:28:31-04:00
compiler: ensure cross ghc --info output target unit ids
Previously, for cross ghcs, the base/ghc/ghc-internal unit ids in
--info output do not match the target unit ids reported by ghc-pkg,
breaking cross ghc release builds with hash-unit-ids when being used
with cabal 3.18. This patch fixes it by making --info output target
unit ids. Fixes #27919.
Co-authored-by: Codex <codex(a)openai.com>
- - - - -
84 changed files:
- .gitlab/hello.hs
- + changelog.d/26761
- + changelog.d/T23785
- + changelog.d/T27731
- + changelog.d/T27916
- + changelog.d/fix-cross-ghc-info-unit-id
- compiler/GHC/Builtin/WiredIn/Ids.hs
- compiler/GHC/CoreToIface.hs
- compiler/GHC/Driver/Session.hs
- compiler/GHC/Iface/Decl.hs
- compiler/GHC/Iface/Syntax.hs
- compiler/GHC/Iface/Tidy.hs
- compiler/GHC/Rename/Module.hs
- compiler/GHC/Settings.hs
- compiler/GHC/Settings/IO.hs
- compiler/GHC/Tc/Errors.hs
- compiler/GHC/Tc/Errors/Ppr.hs
- compiler/GHC/Tc/Errors/Types.hs
- compiler/GHC/Tc/Instance/Family.hs
- compiler/GHC/Tc/Solver/Default.hs
- compiler/GHC/Tc/Solver/Equality.hs
- compiler/GHC/Tc/Types/Constraint.hs
- compiler/GHC/Tc/Utils/Monad.hs
- distrib/configure.ac.in
- hadrian/bindist/Makefile
- hadrian/bindist/config.mk.in
- hadrian/src/Rules/BinaryDist.hs
- hadrian/src/Rules/Generate.hs
- libraries/containers
- testsuite/tests/ghci/prog020/ghci.prog020a.stderr
- testsuite/tests/ghci/prog020/ghci.prog020b.stderr
- testsuite/tests/ghci/prog021/prog021a.stderr
- testsuite/tests/ghci/prog021/prog021b.stderr
- testsuite/tests/ghci/prog022/ghci.prog022a.stderr
- testsuite/tests/ghci/prog022/ghci.prog022b.stderr
- testsuite/tests/ghci/prog022/ghci.prog022c.stderr
- testsuite/tests/ghci/prog022/ghci.prog022d.stderr
- testsuite/tests/ghci/prog022/ghci.prog022e.stderr
- testsuite/tests/ghci/prog022/ghci.prog022f.stderr
- testsuite/tests/ghci/scripts/Defer02.stderr
- testsuite/tests/module/mod130.stderr
- testsuite/tests/overloadedstrings/should_fail/T25926.stderr
- testsuite/tests/overloadedstrings/should_fail/T27124.stderr
- testsuite/tests/package/T4806a.stderr
- testsuite/tests/package/all.T
- testsuite/tests/patsyn/should_fail/records-nofieldselectors.stderr
- + testsuite/tests/plugins/T26761.hs
- + testsuite/tests/plugins/T26761.stderr
- + testsuite/tests/plugins/T26761Plugin.hs
- + testsuite/tests/plugins/T26761a.hs
- testsuite/tests/plugins/all.T
- testsuite/tests/printer/T17697.stderr
- testsuite/tests/rename/should_fail/T15607.stderr
- testsuite/tests/rename/should_fail/T19843b.stderr
- testsuite/tests/safeHaskell/ghci/p4.stderr
- testsuite/tests/safeHaskell/ghci/p6.stderr
- testsuite/tests/simplCore/should_compile/T22611.hs
- testsuite/tests/simplCore/should_compile/T22611.stderr
- + testsuite/tests/simplCore/should_compile/T22611a.hs
- testsuite/tests/simplCore/should_compile/all.T
- testsuite/tests/typecheck/should_compile/T11254.stderr
- testsuite/tests/typecheck/should_compile/T15370.stderr
- + testsuite/tests/typecheck/should_compile/T27916.hs
- testsuite/tests/typecheck/should_compile/all.T
- testsuite/tests/typecheck/should_compile/valid_hole_fits.stderr
- testsuite/tests/typecheck/should_fail/ClassOperator.stderr
- testsuite/tests/typecheck/should_fail/DoExpansion2.stderr
- testsuite/tests/typecheck/should_fail/DoExpansion3.stderr
- testsuite/tests/typecheck/should_fail/FunDepOrigin1b.hs
- testsuite/tests/typecheck/should_fail/T18851.stderr
- + testsuite/tests/typecheck/should_fail/T18851e.hs
- + testsuite/tests/typecheck/should_fail/T18851e.stderr
- + testsuite/tests/typecheck/should_fail/T18851f.hs
- + testsuite/tests/typecheck/should_fail/T18851f.stderr
- testsuite/tests/typecheck/should_fail/T22940.stderr
- testsuite/tests/typecheck/should_fail/T26823.stderr
- + testsuite/tests/typecheck/should_fail/T27731.hs
- + testsuite/tests/typecheck/should_fail/T27731.stderr
- testsuite/tests/typecheck/should_fail/T5691.stderr
- testsuite/tests/typecheck/should_fail/T7437.stderr
- testsuite/tests/typecheck/should_fail/all.T
- testsuite/tests/typecheck/should_fail/mc24.stderr
- testsuite/tests/typecheck/should_fail/tcfail019.stderr
- testsuite/tests/typecheck/should_fail/tcfail189.stderr
The diff was not included because it is too large.
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/2e8c4357c13d35972daf404e7ce70b…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/2e8c4357c13d35972daf404e7ce70b…
You're receiving this email because of your account on gitlab.haskell.org. Manage all notifications: https://gitlab.haskell.org/-/profile/notifications | Help: https://gitlab.haskell.org/help
1
0
[Git][ghc/ghc][wip/fix-cross-ghc-info-unit-id] compiler: ensure cross ghc --info output target unit ids
by Cheng Shao (@TerrorJack) 11 Oct '26
by Cheng Shao (@TerrorJack) 11 Oct '26
11 Oct '26
Cheng Shao pushed to branch wip/fix-cross-ghc-info-unit-id at Glasgow Haskell Compiler / GHC
Commits:
093abc71 by Cheng Shao at 2026-10-11T10:04:45+00:00
compiler: ensure cross ghc --info output target unit ids
Previously, for cross ghcs, the base/ghc/ghc-internal unit ids in
--info output do not match the target unit ids reported by ghc-pkg,
breaking cross ghc release builds with hash-unit-ids when being used
with cabal 3.18. This patch fixes it by making --info output target
unit ids. Fixes #27919.
Co-authored-by: Codex <codex(a)openai.com>
- - - - -
10 changed files:
- .gitlab/hello.hs
- + changelog.d/fix-cross-ghc-info-unit-id
- compiler/GHC/Driver/Session.hs
- compiler/GHC/Settings.hs
- compiler/GHC/Settings/IO.hs
- distrib/configure.ac.in
- hadrian/bindist/Makefile
- hadrian/bindist/config.mk.in
- hadrian/src/Rules/BinaryDist.hs
- hadrian/src/Rules/Generate.hs
Changes:
=====================================
.gitlab/hello.hs
=====================================
@@ -27,7 +27,11 @@ fakeSettings =
sTargetPlatform =
genericPlatform,
sPlatformMisc = PlatformMisc {},
- sUnitSettings = UnitSettings { unitSettings_baseUnitId = stringToUnitId "base" }
+ sUnitSettings = UnitSettings
+ { unitSettings_baseUnitId = stringToUnitId "base"
+ , unitSettings_ghcUnitId = stringToUnitId "ghc"
+ , unitSettings_ghcInternalUnitId = stringToUnitId "ghc-internal"
+ }
}
fakeDynFlags :: DynFlags
=====================================
changelog.d/fix-cross-ghc-info-unit-id
=====================================
@@ -0,0 +1,4 @@
+section: compiler
+synopsis: Fix a bug where unit ids in cross ghc --info output doesn't match ghc-pkg output, breaking cross ghc releases with cabal 3.18.
+mrs: !16790
+issues: #27919
=====================================
compiler/GHC/Driver/Session.hs
=====================================
@@ -546,7 +546,8 @@ opt_i dflags= toolSettings_opt_i $ toolSettings dflags
setBaseUnitId :: String -> DynP ()
-setBaseUnitId s = upd $ \d -> d { unitSettings = UnitSettings (stringToUnitId s) }
+setBaseUnitId s = upd $ \d -> d
+ { unitSettings = (unitSettings d) { unitSettings_baseUnitId = stringToUnitId s } }
-----------------------------------------------------------------------------
@@ -3663,8 +3664,6 @@ compilerInfo dflags
("Project Patch Level", cProjectPatchLevel),
("Project Patch Level1", cProjectPatchLevel1),
("Project Patch Level2", cProjectPatchLevel2),
- ("Project Unit Id", cProjectUnitId),
- ("ghc-internal Unit Id", cGhcInternalUnitId), -- See Note [Special unit-ids]
("Booter version", cBooterVersion),
("Stage", cStage),
("Build platform", cBuildPlatformString),
=====================================
compiler/GHC/Settings.hs
=====================================
@@ -94,7 +94,11 @@ data Settings = Settings
, sRawTarget :: Target
}
-data UnitSettings = UnitSettings { unitSettings_baseUnitId :: !UnitId }
+data UnitSettings = UnitSettings
+ { unitSettings_baseUnitId :: !UnitId
+ , unitSettings_ghcUnitId :: !UnitId
+ , unitSettings_ghcInternalUnitId :: !UnitId
+ }
-- | Settings for other executables GHC calls.
--
=====================================
compiler/GHC/Settings/IO.hs
=====================================
@@ -142,6 +142,8 @@ initSettings top_dir = do
ghcWithInterpreter <- getBooleanSetting "Use interpreter"
baseUnitId <- getSetting_raw "base unit-id"
+ ghcUnitId <- getSetting_raw "Project Unit Id"
+ ghcInternalUnitId <- getSetting_raw "ghc-internal Unit Id"
-- LibDir is optional. If not set, derive it from topDir. This allows
-- bindists to work without explicitly setting LibDir, but gives us the
@@ -174,6 +176,8 @@ initSettings top_dir = do
, sUnitSettings = UnitSettings
{
unitSettings_baseUnitId = stringToUnitId baseUnitId
+ , unitSettings_ghcUnitId = stringToUnitId ghcUnitId
+ , unitSettings_ghcInternalUnitId = stringToUnitId ghcInternalUnitId
}
, sToolSettings = ToolSettings
=====================================
distrib/configure.ac.in
=====================================
@@ -406,6 +406,12 @@ fi
AC_SUBST(BaseUnitId)
+dnl The units supplied with the target libraries, as reported by ghc --info.
+GhcUnitId=@GhcUnitId@
+GhcInternalUnitId=@GhcInternalUnitId@
+AC_SUBST(GhcUnitId)
+AC_SUBST(GhcInternalUnitId)
+
# We get caught by
# http://savannah.gnu.org/bugs/index.php?1516
# $(eval ...) inside conditionals causes errors
=====================================
hadrian/bindist/Makefile
=====================================
@@ -90,6 +90,8 @@ lib/settings : config.mk
@echo ',("RTS ways", "$(GhcRTSWays)")' >> $@
@echo ',("Relative Global Package DB", "package.conf.d")' >> $@
@echo ',("base unit-id", "$(BaseUnitId)")' >> $@
+ @echo ',("Project Unit Id", "$(GhcUnitId)")' >> $@
+ @echo ',("ghc-internal Unit Id", "$(GhcInternalUnitId)")' >> $@
@echo "]" >> $@
lib/targets/default.target : config.mk default.target
=====================================
hadrian/bindist/config.mk.in
=====================================
@@ -134,6 +134,8 @@ CrossCompilePrefix = @CrossCompilePrefix@
GhcUnregisterised = @Unregisterised@
EnableDistroToolchain = @EnableDistroToolchain@
BaseUnitId = @BaseUnitId@
+GhcUnitId = @GhcUnitId@
+GhcInternalUnitId = @GhcInternalUnitId@
# The THREADED_RTS requires `BaseReg` to be in a register and the
# `GhcUnregisterised` mode doesn't allow that.
=====================================
hadrian/src/Rules/BinaryDist.hs
=====================================
@@ -232,7 +232,7 @@ buildBinDistDir root conf@BindistConfig{..} = do
let bindistSettings = bindistFilesDir -/- "lib" -/- "settings"
bindistContext = vanillaContext library_stage compiler
bindistSettingsContent <- interpretInContext bindistContext $
- generateSettings bindistSettings False "package.conf.d"
+ generateSettings library_stage bindistSettings False "package.conf.d"
writeFileAtomic bindistSettings bindistSettingsContent
copyDirectory rtsIncludeDir bindistFilesDir
=====================================
hadrian/src/Rules/Generate.hs
=====================================
@@ -7,6 +7,7 @@ module Rules.Generate (
import Development.Shake.FilePath
import qualified Data.Set as Set
import Base
+import BindistConfig
import qualified Context
import Expression
import Hadrian.Oracles.TextFile (lookupStageBuildConfig)
@@ -275,7 +276,7 @@ generateRules = do
then root -/- stageString stage' -/- "lib"
else prefix
relPkgDb = makeRelativeNoSysLink libTopDir pkgDb
- go (generateSettings out True relPkgDb) out
+ go (generateSettings libStage out True relPkgDb) out
(prefix -/- "targets" -/- "default.target") %> \out -> go (show <$> expr (targetStage (succStage stage))) out
where
@@ -451,7 +452,9 @@ bindistRules = do
, interpolateVar "Unregisterised" $ yesNo <$> getTarget tgtUnregisterised
, interpolateVar "UseLibdw" $ fmap yesNo $ interp $ staged (fmap (isJust . tgtRTSWithLibdw) . targetStage)
, interpolateVar "UseLibffiForAdjustors" $ yesNo <$> getTarget tgtUseLibffiForAdjustors
- , interpolateVar "BaseUnitId" $ pkgUnitId Stage1 base
+ , interpolateVar "BaseUnitId" $ bindistUnitId base
+ , interpolateVar "GhcUnitId" $ bindistUnitId compiler
+ , interpolateVar "GhcInternalUnitId" $ bindistUnitId ghcInternal
, interpolateVar "GhcWithSMP" $ yesNo <$> targetSupportsSMP Stage2
, interpolateVar "TargetPlatformFull" (setting TargetPlatformFull)
, interpolateVar "BuildPlatformFull" (setting BuildPlatformFull)
@@ -460,6 +463,9 @@ bindistRules = do
where
interp = interpretInContext (semiEmptyTarget Stage2)
getTarget = interp . queryTarget Stage2
+ bindistUnitId pkg = do
+ stage <- library_stage <$> implicitBindistConfig
+ pkgUnitId stage pkg
-- | Given a 'String' replace characters '.' and '-' by underscores ('_') so that
-- the resulting 'String' is a valid C preprocessor identifier.
@@ -485,18 +491,18 @@ ghcWrapper stage = do
-- "package.conf.d"). Callers supply the correct relative path. For bindists
-- the layout is known statically; for in-tree builds callers compute it. For
-- bindists, we omit @LibDir@ so it defaults to @topDir@ at runtime.
-generateSettings :: FilePath -> Bool -> FilePath -> Expr String
-generateSettings settingsFile includeLibDir rel_pkg_db = do
+--
+-- @libraryStage@: the stage containing the target package database.
+generateSettings :: Stage -> FilePath -> Bool -> FilePath -> Expr String
+generateSettings libraryStage settingsFile includeLibDir rel_pkg_db = do
ctx <- getContext
stage <- getStage
- -- The unit-id of the base package which is always linked against (#25382)
- base_unit_id <- expr $ do
- case stage of
- Stage0 {} -> error "Unable to generate settings for stage0"
- Stage1 -> pkgUnitId Stage1 base
- Stage2 -> pkgUnitId Stage1 base
- Stage3 -> pkgUnitId Stage2 base
+ -- These are the units supplied in the target package database, which can
+ -- differ from the host units linked into a cross compiler.
+ base_unit_id <- expr $ pkgUnitId libraryStage base
+ ghc_unit_id <- expr $ pkgUnitId libraryStage compiler
+ ghc_internal_unit_id <- expr $ pkgUnitId libraryStage ghcInternal
-- For cross compilers, LibDir points to the succeeding stage's lib dir
-- (which contains the target architecture's libraries). For non-cross,
@@ -519,6 +525,8 @@ generateSettings settingsFile includeLibDir rel_pkg_db = do
, ("RTS ways", unwords . map show . Set.toList <$> getRtsWays)
, ("Relative Global Package DB", pure rel_pkg_db)
, ("base unit-id", pure base_unit_id)
+ , ("Project Unit Id", pure ghc_unit_id)
+ , ("ghc-internal Unit Id", pure ghc_internal_unit_id)
]
++ ([("LibDir", pure rel_lib_topDir) | includeLibDir])
let showTuple (k, v) = "(" ++ show k ++ ", " ++ show v ++ ")"
@@ -555,7 +563,6 @@ generateConfigHs = do
-- unit-id in both situations.
cProjectUnitId <- expr . (`pkgUnitId` compiler) =<< getStage
- cGhcInternalUnitId <- expr . (`pkgUnitId` ghcInternal) =<< getStage
return $ unlines
[ "module GHC.Settings.Config"
, " ( module GHC.Version"
@@ -565,7 +572,6 @@ generateConfigHs = do
, " , cBooterVersion"
, " , cStage"
, " , cProjectUnitId"
- , " , cGhcInternalUnitId"
, " ) where"
, ""
, "import GHC.Prelude.Basic"
@@ -589,9 +595,6 @@ generateConfigHs = do
, ""
, "cProjectUnitId :: String"
, "cProjectUnitId = " ++ show cProjectUnitId
- , ""
- , "cGhcInternalUnitId :: String"
- , "cGhcInternalUnitId = " ++ show cGhcInternalUnitId
]
where
stageString (Stage0 InTreeLibs) = "1"
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/093abc716633d5decb638db44c2e10f…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/093abc716633d5decb638db44c2e10f…
You're receiving this email because of your account on gitlab.haskell.org. Manage all notifications: https://gitlab.haskell.org/-/profile/notifications | Help: https://gitlab.haskell.org/help
1
0
[Git][ghc/ghc][wip/fix-cross-ghc-info-unit-id] compiler: ensure cross ghc --info output target unid ids
by Cheng Shao (@TerrorJack) 11 Oct '26
by Cheng Shao (@TerrorJack) 11 Oct '26
11 Oct '26
Cheng Shao pushed to branch wip/fix-cross-ghc-info-unit-id at Glasgow Haskell Compiler / GHC
Commits:
fa8f57da by Cheng Shao at 2026-10-11T10:01:31+00:00
compiler: ensure cross ghc --info output target unid ids
Previously, for cross ghcs, the base/ghc/ghc-internal unit ids in
--info output do not match the target unit ids reported by ghc-pkg,
breaking cross ghc release builds with hash-unit-ids when being used
with cabal 3.18. This patch fixes it by making --info output target
unit ids. Fixes #27919.
Co-authored-by: Codex <codex(a)openai.com>
- - - - -
10 changed files:
- .gitlab/hello.hs
- + changelog.d/fix-cross-ghc-info-unit-id
- compiler/GHC/Driver/Session.hs
- compiler/GHC/Settings.hs
- compiler/GHC/Settings/IO.hs
- distrib/configure.ac.in
- hadrian/bindist/Makefile
- hadrian/bindist/config.mk.in
- hadrian/src/Rules/BinaryDist.hs
- hadrian/src/Rules/Generate.hs
Changes:
=====================================
.gitlab/hello.hs
=====================================
@@ -27,7 +27,11 @@ fakeSettings =
sTargetPlatform =
genericPlatform,
sPlatformMisc = PlatformMisc {},
- sUnitSettings = UnitSettings { unitSettings_baseUnitId = stringToUnitId "base" }
+ sUnitSettings = UnitSettings
+ { unitSettings_baseUnitId = stringToUnitId "base"
+ , unitSettings_ghcUnitId = stringToUnitId "ghc"
+ , unitSettings_ghcInternalUnitId = stringToUnitId "ghc-internal"
+ }
}
fakeDynFlags :: DynFlags
=====================================
changelog.d/fix-cross-ghc-info-unit-id
=====================================
@@ -0,0 +1,4 @@
+section: compiler
+synopsis: Fix a bug where unit ids in cross ghc --info output doesn't match ghc-pkg output, breaking cross ghc releases with cabal 3.18.
+mrs: !16790
+issues: #27919
=====================================
compiler/GHC/Driver/Session.hs
=====================================
@@ -546,7 +546,8 @@ opt_i dflags= toolSettings_opt_i $ toolSettings dflags
setBaseUnitId :: String -> DynP ()
-setBaseUnitId s = upd $ \d -> d { unitSettings = UnitSettings (stringToUnitId s) }
+setBaseUnitId s = upd $ \d -> d
+ { unitSettings = (unitSettings d) { unitSettings_baseUnitId = stringToUnitId s } }
-----------------------------------------------------------------------------
@@ -3663,8 +3664,6 @@ compilerInfo dflags
("Project Patch Level", cProjectPatchLevel),
("Project Patch Level1", cProjectPatchLevel1),
("Project Patch Level2", cProjectPatchLevel2),
- ("Project Unit Id", cProjectUnitId),
- ("ghc-internal Unit Id", cGhcInternalUnitId), -- See Note [Special unit-ids]
("Booter version", cBooterVersion),
("Stage", cStage),
("Build platform", cBuildPlatformString),
=====================================
compiler/GHC/Settings.hs
=====================================
@@ -94,7 +94,11 @@ data Settings = Settings
, sRawTarget :: Target
}
-data UnitSettings = UnitSettings { unitSettings_baseUnitId :: !UnitId }
+data UnitSettings = UnitSettings
+ { unitSettings_baseUnitId :: !UnitId
+ , unitSettings_ghcUnitId :: !UnitId
+ , unitSettings_ghcInternalUnitId :: !UnitId
+ }
-- | Settings for other executables GHC calls.
--
=====================================
compiler/GHC/Settings/IO.hs
=====================================
@@ -142,6 +142,8 @@ initSettings top_dir = do
ghcWithInterpreter <- getBooleanSetting "Use interpreter"
baseUnitId <- getSetting_raw "base unit-id"
+ ghcUnitId <- getSetting_raw "Project Unit Id"
+ ghcInternalUnitId <- getSetting_raw "ghc-internal Unit Id"
-- LibDir is optional. If not set, derive it from topDir. This allows
-- bindists to work without explicitly setting LibDir, but gives us the
@@ -174,6 +176,8 @@ initSettings top_dir = do
, sUnitSettings = UnitSettings
{
unitSettings_baseUnitId = stringToUnitId baseUnitId
+ , unitSettings_ghcUnitId = stringToUnitId ghcUnitId
+ , unitSettings_ghcInternalUnitId = stringToUnitId ghcInternalUnitId
}
, sToolSettings = ToolSettings
=====================================
distrib/configure.ac.in
=====================================
@@ -406,6 +406,12 @@ fi
AC_SUBST(BaseUnitId)
+dnl The units supplied with the target libraries, as reported by ghc --info.
+GhcUnitId=@GhcUnitId@
+GhcInternalUnitId=@GhcInternalUnitId@
+AC_SUBST(GhcUnitId)
+AC_SUBST(GhcInternalUnitId)
+
# We get caught by
# http://savannah.gnu.org/bugs/index.php?1516
# $(eval ...) inside conditionals causes errors
=====================================
hadrian/bindist/Makefile
=====================================
@@ -90,6 +90,8 @@ lib/settings : config.mk
@echo ',("RTS ways", "$(GhcRTSWays)")' >> $@
@echo ',("Relative Global Package DB", "package.conf.d")' >> $@
@echo ',("base unit-id", "$(BaseUnitId)")' >> $@
+ @echo ',("Project Unit Id", "$(GhcUnitId)")' >> $@
+ @echo ',("ghc-internal Unit Id", "$(GhcInternalUnitId)")' >> $@
@echo "]" >> $@
lib/targets/default.target : config.mk default.target
=====================================
hadrian/bindist/config.mk.in
=====================================
@@ -134,6 +134,8 @@ CrossCompilePrefix = @CrossCompilePrefix@
GhcUnregisterised = @Unregisterised@
EnableDistroToolchain = @EnableDistroToolchain@
BaseUnitId = @BaseUnitId@
+GhcUnitId = @GhcUnitId@
+GhcInternalUnitId = @GhcInternalUnitId@
# The THREADED_RTS requires `BaseReg` to be in a register and the
# `GhcUnregisterised` mode doesn't allow that.
=====================================
hadrian/src/Rules/BinaryDist.hs
=====================================
@@ -232,7 +232,7 @@ buildBinDistDir root conf@BindistConfig{..} = do
let bindistSettings = bindistFilesDir -/- "lib" -/- "settings"
bindistContext = vanillaContext library_stage compiler
bindistSettingsContent <- interpretInContext bindistContext $
- generateSettings bindistSettings False "package.conf.d"
+ generateSettings library_stage bindistSettings False "package.conf.d"
writeFileAtomic bindistSettings bindistSettingsContent
copyDirectory rtsIncludeDir bindistFilesDir
=====================================
hadrian/src/Rules/Generate.hs
=====================================
@@ -7,6 +7,7 @@ module Rules.Generate (
import Development.Shake.FilePath
import qualified Data.Set as Set
import Base
+import BindistConfig
import qualified Context
import Expression
import Hadrian.Oracles.TextFile (lookupStageBuildConfig)
@@ -275,7 +276,7 @@ generateRules = do
then root -/- stageString stage' -/- "lib"
else prefix
relPkgDb = makeRelativeNoSysLink libTopDir pkgDb
- go (generateSettings out True relPkgDb) out
+ go (generateSettings libStage out True relPkgDb) out
(prefix -/- "targets" -/- "default.target") %> \out -> go (show <$> expr (targetStage (succStage stage))) out
where
@@ -451,7 +452,9 @@ bindistRules = do
, interpolateVar "Unregisterised" $ yesNo <$> getTarget tgtUnregisterised
, interpolateVar "UseLibdw" $ fmap yesNo $ interp $ staged (fmap (isJust . tgtRTSWithLibdw) . targetStage)
, interpolateVar "UseLibffiForAdjustors" $ yesNo <$> getTarget tgtUseLibffiForAdjustors
- , interpolateVar "BaseUnitId" $ pkgUnitId Stage1 base
+ , interpolateVar "BaseUnitId" $ bindistUnitId base
+ , interpolateVar "GhcUnitId" $ bindistUnitId compiler
+ , interpolateVar "GhcInternalUnitId" $ bindistUnitId ghcInternal
, interpolateVar "GhcWithSMP" $ yesNo <$> targetSupportsSMP Stage2
, interpolateVar "TargetPlatformFull" (setting TargetPlatformFull)
, interpolateVar "BuildPlatformFull" (setting BuildPlatformFull)
@@ -460,6 +463,9 @@ bindistRules = do
where
interp = interpretInContext (semiEmptyTarget Stage2)
getTarget = interp . queryTarget Stage2
+ bindistUnitId pkg = do
+ stage <- library_stage <$> implicitBindistConfig
+ pkgUnitId stage pkg
-- | Given a 'String' replace characters '.' and '-' by underscores ('_') so that
-- the resulting 'String' is a valid C preprocessor identifier.
@@ -485,18 +491,18 @@ ghcWrapper stage = do
-- "package.conf.d"). Callers supply the correct relative path. For bindists
-- the layout is known statically; for in-tree builds callers compute it. For
-- bindists, we omit @LibDir@ so it defaults to @topDir@ at runtime.
-generateSettings :: FilePath -> Bool -> FilePath -> Expr String
-generateSettings settingsFile includeLibDir rel_pkg_db = do
+--
+-- @libraryStage@: the stage containing the target package database.
+generateSettings :: Stage -> FilePath -> Bool -> FilePath -> Expr String
+generateSettings libraryStage settingsFile includeLibDir rel_pkg_db = do
ctx <- getContext
stage <- getStage
- -- The unit-id of the base package which is always linked against (#25382)
- base_unit_id <- expr $ do
- case stage of
- Stage0 {} -> error "Unable to generate settings for stage0"
- Stage1 -> pkgUnitId Stage1 base
- Stage2 -> pkgUnitId Stage1 base
- Stage3 -> pkgUnitId Stage2 base
+ -- These are the units supplied in the target package database, which can
+ -- differ from the host units linked into a cross compiler.
+ base_unit_id <- expr $ pkgUnitId libraryStage base
+ ghc_unit_id <- expr $ pkgUnitId libraryStage compiler
+ ghc_internal_unit_id <- expr $ pkgUnitId libraryStage ghcInternal
-- For cross compilers, LibDir points to the succeeding stage's lib dir
-- (which contains the target architecture's libraries). For non-cross,
@@ -519,6 +525,8 @@ generateSettings settingsFile includeLibDir rel_pkg_db = do
, ("RTS ways", unwords . map show . Set.toList <$> getRtsWays)
, ("Relative Global Package DB", pure rel_pkg_db)
, ("base unit-id", pure base_unit_id)
+ , ("Project Unit Id", pure ghc_unit_id)
+ , ("ghc-internal Unit Id", pure ghc_internal_unit_id)
]
++ ([("LibDir", pure rel_lib_topDir) | includeLibDir])
let showTuple (k, v) = "(" ++ show k ++ ", " ++ show v ++ ")"
@@ -555,7 +563,6 @@ generateConfigHs = do
-- unit-id in both situations.
cProjectUnitId <- expr . (`pkgUnitId` compiler) =<< getStage
- cGhcInternalUnitId <- expr . (`pkgUnitId` ghcInternal) =<< getStage
return $ unlines
[ "module GHC.Settings.Config"
, " ( module GHC.Version"
@@ -565,7 +572,6 @@ generateConfigHs = do
, " , cBooterVersion"
, " , cStage"
, " , cProjectUnitId"
- , " , cGhcInternalUnitId"
, " ) where"
, ""
, "import GHC.Prelude.Basic"
@@ -589,9 +595,6 @@ generateConfigHs = do
, ""
, "cProjectUnitId :: String"
, "cProjectUnitId = " ++ show cProjectUnitId
- , ""
- , "cGhcInternalUnitId :: String"
- , "cGhcInternalUnitId = " ++ show cGhcInternalUnitId
]
where
stageString (Stage0 InTreeLibs) = "1"
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/fa8f57da0ec92df26aca3a86860237e…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/fa8f57da0ec92df26aca3a86860237e…
You're receiving this email because of your account on gitlab.haskell.org. Manage all notifications: https://gitlab.haskell.org/-/profile/notifications | Help: https://gitlab.haskell.org/help
1
0
11 Oct '26
Cheng Shao pushed to branch wip/wasm-jsffi-fastcall at Glasgow Haskell Compiler / GHC
Commits:
987ec79c by Cheng Shao at 2026-10-11T09:06:39+00:00
WIP
- - - - -
a4dfedb2 by Cheng Shao at 2026-10-11T09:08:32+00:00
WIP
- - - - -
32 changed files:
- compiler/GHC/HsToCore.hs
- compiler/GHC/HsToCore/Foreign/Decl.hs
- compiler/GHC/HsToCore/Foreign/Wasm.hs
- docs/users_guide/wasm.rst
- libraries/ghc-experimental/src/GHC/Wasm/Prim.hs
- libraries/ghc-internal/src/GHC/Internal/Wasm/Prim.hs
- libraries/ghc-internal/src/GHC/Internal/Wasm/Prim/Exports.hs
- libraries/ghc-internal/src/GHC/Internal/Wasm/Prim/Imports.hs
- libraries/ghc-internal/src/GHC/Internal/Wasm/Prim/Types.hs
- libraries/ghci/GHCi/ObjLink.hs
- libraries/ghci/GHCi/Server.hs
- + testsuite/tests/jsffi/FastcallCrossAux.hs
- + testsuite/tests/jsffi/FastcallCrossCore.hs
- testsuite/tests/jsffi/all.T
- testsuite/tests/jsffi/bytearrayarg.hs
- + testsuite/tests/jsffi/fastcall.hs
- + testsuite/tests/jsffi/fastcall.mjs
- + testsuite/tests/jsffi/fastcall.stdout
- + testsuite/tests/jsffi/fastcall_core.hs
- + testsuite/tests/jsffi/fastcall_core.stderr
- + testsuite/tests/jsffi/fastcall_cross.hs
- + testsuite/tests/jsffi/fastcall_cross.mjs
- + testsuite/tests/jsffi/fastcall_cross.stdout
- + testsuite/tests/jsffi/fastcall_cross_core.stderr
- + testsuite/tests/jsffi/fastcall_cross_ghci.hs
- + testsuite/tests/jsffi/fastcall_cross_ghci.stdin
- + testsuite/tests/jsffi/fastcall_cross_ghci.stdout
- + testsuite/tests/jsffi/fastcall_ghci.hs
- + testsuite/tests/jsffi/fastcall_ghci.stdin
- + testsuite/tests/jsffi/fastcall_ghci.stdout
- testsuite/tests/jsffi/http.hs
- testsuite/tests/jsffi/textconv.hs
The diff was not included because it is too large.
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/ad3797c3e1385c144947cfefbe803f…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/ad3797c3e1385c144947cfefbe803f…
You're receiving this email because of your account on gitlab.haskell.org. Manage all notifications: https://gitlab.haskell.org/-/profile/notifications | Help: https://gitlab.haskell.org/help
1
0
[Git][ghc/ghc][wip/fix-cross-ghc-info-unit-id] compiler: ensure cross ghc --info output target unid ids
by Cheng Shao (@TerrorJack) 11 Oct '26
by Cheng Shao (@TerrorJack) 11 Oct '26
11 Oct '26
Cheng Shao pushed to branch wip/fix-cross-ghc-info-unit-id at Glasgow Haskell Compiler / GHC
Commits:
b4eea0be by Cheng Shao at 2026-10-11T08:38:58+00:00
compiler: ensure cross ghc --info output target unid ids
Previously, for cross ghcs, the base/ghc/ghc-internal unit ids in
--info output do not match the target unit ids reported by ghc-pkg,
breaking cross ghc release builds with hash-unit-ids when being used
with cabal 3.18. This patch fixes it by making --info output target
unid ids. Fixes #27919.
Co-authored-by: Codex <codex(a)openai.com>
- - - - -
10 changed files:
- .gitlab/hello.hs
- + changelog.d/fix-cross-ghc-info-unit-id
- compiler/GHC/Driver/Session.hs
- compiler/GHC/Settings.hs
- compiler/GHC/Settings/IO.hs
- distrib/configure.ac.in
- hadrian/bindist/Makefile
- hadrian/bindist/config.mk.in
- hadrian/src/Rules/BinaryDist.hs
- hadrian/src/Rules/Generate.hs
Changes:
=====================================
.gitlab/hello.hs
=====================================
@@ -27,7 +27,11 @@ fakeSettings =
sTargetPlatform =
genericPlatform,
sPlatformMisc = PlatformMisc {},
- sUnitSettings = UnitSettings { unitSettings_baseUnitId = stringToUnitId "base" }
+ sUnitSettings = UnitSettings
+ { unitSettings_baseUnitId = stringToUnitId "base"
+ , unitSettings_ghcUnitId = stringToUnitId "ghc"
+ , unitSettings_ghcInternalUnitId = stringToUnitId "ghc-internal"
+ }
}
fakeDynFlags :: DynFlags
=====================================
changelog.d/fix-cross-ghc-info-unit-id
=====================================
@@ -0,0 +1,4 @@
+section: compiler
+synopsis: Fix a bug where unit ids in cross ghc --info output doesn't match ghc-pkg output, breaking cross ghc releases with cabal 3.18.
+mrs: !16790
+issues: #27919
=====================================
compiler/GHC/Driver/Session.hs
=====================================
@@ -546,7 +546,8 @@ opt_i dflags= toolSettings_opt_i $ toolSettings dflags
setBaseUnitId :: String -> DynP ()
-setBaseUnitId s = upd $ \d -> d { unitSettings = UnitSettings (stringToUnitId s) }
+setBaseUnitId s = upd $ \d -> d
+ { unitSettings = (unitSettings d) { unitSettings_baseUnitId = stringToUnitId s } }
-----------------------------------------------------------------------------
@@ -3663,8 +3664,6 @@ compilerInfo dflags
("Project Patch Level", cProjectPatchLevel),
("Project Patch Level1", cProjectPatchLevel1),
("Project Patch Level2", cProjectPatchLevel2),
- ("Project Unit Id", cProjectUnitId),
- ("ghc-internal Unit Id", cGhcInternalUnitId), -- See Note [Special unit-ids]
("Booter version", cBooterVersion),
("Stage", cStage),
("Build platform", cBuildPlatformString),
=====================================
compiler/GHC/Settings.hs
=====================================
@@ -94,7 +94,11 @@ data Settings = Settings
, sRawTarget :: Target
}
-data UnitSettings = UnitSettings { unitSettings_baseUnitId :: !UnitId }
+data UnitSettings = UnitSettings
+ { unitSettings_baseUnitId :: !UnitId
+ , unitSettings_ghcUnitId :: !UnitId
+ , unitSettings_ghcInternalUnitId :: !UnitId
+ }
-- | Settings for other executables GHC calls.
--
=====================================
compiler/GHC/Settings/IO.hs
=====================================
@@ -142,6 +142,8 @@ initSettings top_dir = do
ghcWithInterpreter <- getBooleanSetting "Use interpreter"
baseUnitId <- getSetting_raw "base unit-id"
+ ghcUnitId <- getSetting_raw "Project Unit Id"
+ ghcInternalUnitId <- getSetting_raw "ghc-internal Unit Id"
-- LibDir is optional. If not set, derive it from topDir. This allows
-- bindists to work without explicitly setting LibDir, but gives us the
@@ -174,6 +176,8 @@ initSettings top_dir = do
, sUnitSettings = UnitSettings
{
unitSettings_baseUnitId = stringToUnitId baseUnitId
+ , unitSettings_ghcUnitId = stringToUnitId ghcUnitId
+ , unitSettings_ghcInternalUnitId = stringToUnitId ghcInternalUnitId
}
, sToolSettings = ToolSettings
=====================================
distrib/configure.ac.in
=====================================
@@ -406,6 +406,12 @@ fi
AC_SUBST(BaseUnitId)
+dnl The units supplied with the target libraries, as reported by ghc --info.
+GhcUnitId=@GhcUnitId@
+GhcInternalUnitId=@GhcInternalUnitId@
+AC_SUBST(GhcUnitId)
+AC_SUBST(GhcInternalUnitId)
+
# We get caught by
# http://savannah.gnu.org/bugs/index.php?1516
# $(eval ...) inside conditionals causes errors
=====================================
hadrian/bindist/Makefile
=====================================
@@ -90,6 +90,8 @@ lib/settings : config.mk
@echo ',("RTS ways", "$(GhcRTSWays)")' >> $@
@echo ',("Relative Global Package DB", "package.conf.d")' >> $@
@echo ',("base unit-id", "$(BaseUnitId)")' >> $@
+ @echo ',("Project Unit Id", "$(GhcUnitId)")' >> $@
+ @echo ',("ghc-internal Unit Id", "$(GhcInternalUnitId)")' >> $@
@echo "]" >> $@
lib/targets/default.target : config.mk default.target
=====================================
hadrian/bindist/config.mk.in
=====================================
@@ -134,6 +134,8 @@ CrossCompilePrefix = @CrossCompilePrefix@
GhcUnregisterised = @Unregisterised@
EnableDistroToolchain = @EnableDistroToolchain@
BaseUnitId = @BaseUnitId@
+GhcUnitId = @GhcUnitId@
+GhcInternalUnitId = @GhcInternalUnitId@
# The THREADED_RTS requires `BaseReg` to be in a register and the
# `GhcUnregisterised` mode doesn't allow that.
=====================================
hadrian/src/Rules/BinaryDist.hs
=====================================
@@ -232,7 +232,7 @@ buildBinDistDir root conf@BindistConfig{..} = do
let bindistSettings = bindistFilesDir -/- "lib" -/- "settings"
bindistContext = vanillaContext library_stage compiler
bindistSettingsContent <- interpretInContext bindistContext $
- generateSettings bindistSettings False "package.conf.d"
+ generateSettings library_stage bindistSettings False "package.conf.d"
writeFileAtomic bindistSettings bindistSettingsContent
copyDirectory rtsIncludeDir bindistFilesDir
=====================================
hadrian/src/Rules/Generate.hs
=====================================
@@ -7,6 +7,7 @@ module Rules.Generate (
import Development.Shake.FilePath
import qualified Data.Set as Set
import Base
+import BindistConfig
import qualified Context
import Expression
import Hadrian.Oracles.TextFile (lookupStageBuildConfig)
@@ -275,7 +276,7 @@ generateRules = do
then root -/- stageString stage' -/- "lib"
else prefix
relPkgDb = makeRelativeNoSysLink libTopDir pkgDb
- go (generateSettings out True relPkgDb) out
+ go (generateSettings libStage out True relPkgDb) out
(prefix -/- "targets" -/- "default.target") %> \out -> go (show <$> expr (targetStage (succStage stage))) out
where
@@ -451,7 +452,9 @@ bindistRules = do
, interpolateVar "Unregisterised" $ yesNo <$> getTarget tgtUnregisterised
, interpolateVar "UseLibdw" $ fmap yesNo $ interp $ staged (fmap (isJust . tgtRTSWithLibdw) . targetStage)
, interpolateVar "UseLibffiForAdjustors" $ yesNo <$> getTarget tgtUseLibffiForAdjustors
- , interpolateVar "BaseUnitId" $ pkgUnitId Stage1 base
+ , interpolateVar "BaseUnitId" $ bindistUnitId base
+ , interpolateVar "GhcUnitId" $ bindistUnitId compiler
+ , interpolateVar "GhcInternalUnitId" $ bindistUnitId ghcInternal
, interpolateVar "GhcWithSMP" $ yesNo <$> targetSupportsSMP Stage2
, interpolateVar "TargetPlatformFull" (setting TargetPlatformFull)
, interpolateVar "BuildPlatformFull" (setting BuildPlatformFull)
@@ -460,6 +463,9 @@ bindistRules = do
where
interp = interpretInContext (semiEmptyTarget Stage2)
getTarget = interp . queryTarget Stage2
+ bindistUnitId pkg = do
+ stage <- library_stage <$> implicitBindistConfig
+ pkgUnitId stage pkg
-- | Given a 'String' replace characters '.' and '-' by underscores ('_') so that
-- the resulting 'String' is a valid C preprocessor identifier.
@@ -485,18 +491,18 @@ ghcWrapper stage = do
-- "package.conf.d"). Callers supply the correct relative path. For bindists
-- the layout is known statically; for in-tree builds callers compute it. For
-- bindists, we omit @LibDir@ so it defaults to @topDir@ at runtime.
-generateSettings :: FilePath -> Bool -> FilePath -> Expr String
-generateSettings settingsFile includeLibDir rel_pkg_db = do
+--
+-- @libraryStage@: the stage containing the target package database.
+generateSettings :: Stage -> FilePath -> Bool -> FilePath -> Expr String
+generateSettings libraryStage settingsFile includeLibDir rel_pkg_db = do
ctx <- getContext
stage <- getStage
- -- The unit-id of the base package which is always linked against (#25382)
- base_unit_id <- expr $ do
- case stage of
- Stage0 {} -> error "Unable to generate settings for stage0"
- Stage1 -> pkgUnitId Stage1 base
- Stage2 -> pkgUnitId Stage1 base
- Stage3 -> pkgUnitId Stage2 base
+ -- These are the units supplied in the target package database, which can
+ -- differ from the host units linked into a cross compiler.
+ base_unit_id <- expr $ pkgUnitId libraryStage base
+ ghc_unit_id <- expr $ pkgUnitId libraryStage compiler
+ ghc_internal_unit_id <- expr $ pkgUnitId libraryStage ghcInternal
-- For cross compilers, LibDir points to the succeeding stage's lib dir
-- (which contains the target architecture's libraries). For non-cross,
@@ -519,6 +525,8 @@ generateSettings settingsFile includeLibDir rel_pkg_db = do
, ("RTS ways", unwords . map show . Set.toList <$> getRtsWays)
, ("Relative Global Package DB", pure rel_pkg_db)
, ("base unit-id", pure base_unit_id)
+ , ("Project Unit Id", pure ghc_unit_id)
+ , ("ghc-internal Unit Id", pure ghc_internal_unit_id)
]
++ ([("LibDir", pure rel_lib_topDir) | includeLibDir])
let showTuple (k, v) = "(" ++ show k ++ ", " ++ show v ++ ")"
@@ -555,7 +563,6 @@ generateConfigHs = do
-- unit-id in both situations.
cProjectUnitId <- expr . (`pkgUnitId` compiler) =<< getStage
- cGhcInternalUnitId <- expr . (`pkgUnitId` ghcInternal) =<< getStage
return $ unlines
[ "module GHC.Settings.Config"
, " ( module GHC.Version"
@@ -565,7 +572,6 @@ generateConfigHs = do
, " , cBooterVersion"
, " , cStage"
, " , cProjectUnitId"
- , " , cGhcInternalUnitId"
, " ) where"
, ""
, "import GHC.Prelude.Basic"
@@ -589,9 +595,6 @@ generateConfigHs = do
, ""
, "cProjectUnitId :: String"
, "cProjectUnitId = " ++ show cProjectUnitId
- , ""
- , "cGhcInternalUnitId :: String"
- , "cGhcInternalUnitId = " ++ show cGhcInternalUnitId
]
where
stageString (Stage0 InTreeLibs) = "1"
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/b4eea0bef71863aab3244879a92822e…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/b4eea0bef71863aab3244879a92822e…
You're receiving this email because of your account on gitlab.haskell.org. Manage all notifications: https://gitlab.haskell.org/-/profile/notifications | Help: https://gitlab.haskell.org/help
1
0
[Git][ghc/ghc][wip/rafl/hpc-instances] 2 commits: Clarify why we're not excluding all generated code (yet!)
by Florian Ragwitz (@rafl) 11 Oct '26
by Florian Ragwitz (@rafl) 11 Oct '26
11 Oct '26
Florian Ragwitz pushed to branch wip/rafl/hpc-instances at Glasgow Haskell Compiler / GHC
Commits:
45174db5 by Florian Ragwitz at 2026-10-11T00:21:37-07:00
Clarify why we're not excluding all generated code (yet!)
- - - - -
0c06dab6 by Florian Ragwitz at 2026-10-11T00:25:19-07:00
Minor documentation tweaks
- - - - -
3 changed files:
- compiler/GHC/HsToCore/Ticks.hs
- compiler/GHC/Types/Id/Info.hs
- libraries/containers
Changes:
=====================================
compiler/GHC/HsToCore/Ticks.hs
=====================================
@@ -312,6 +312,8 @@ addTickLHsBind (L pos (funBind@(FunBind { fun_id = L _ id, fun_matches = matches
exported = idName id `elemNameSet` exported_names
-- See Note [Instance Method Coverage].
+ -- We only exclude generated instance methods for now, not generated code in
+ -- general, whose coverage semantics may need to be considered separately.
let generatedInstMeth = tickishType env == HpcTicks
&& id `elemVarEnv` instMeths env
&& isGenerated (mg_origin (mg_ext matches))
=====================================
compiler/GHC/Types/Id/Info.hs
=====================================
@@ -222,9 +222,10 @@ data IdDetails
-- - the [CbvMark] is always empty (and ignored) until after Tidy
-- for ids from the current module
-- - If non-empty, at least is isMarkedCbbv; see (CBV2)
- | InstMethId Name
- -- ^ An instance method. The 'Name' identifies the dictionary of the
- -- instance it belongs to.
+ | InstMethId
+ -- ^ An instance method.
+ Name
+ -- ^ 'Name' of the dictionary function the instance it belongs to.
data RecSelInfo
= RSI { rsi_def :: [ConLike] -- Record selector defined for these
=====================================
libraries/containers
=====================================
@@ -1 +1 @@
-Subproject commit 953428ad079d5708df696442f9bdeaccd1acfc6c
+Subproject commit 801b06e5d4392b028e519d5ca116a2881d559721
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/ebc8c2bba1ab0a30892e8b6f1609a8…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/ebc8c2bba1ab0a30892e8b6f1609a8…
You're receiving this email because of your account on gitlab.haskell.org. Manage all notifications: https://gitlab.haskell.org/-/profile/notifications | Help: https://gitlab.haskell.org/help
1
0
[Git][ghc/ghc][wip/rafl/hpc-instances] 18 commits: ci: move hadrian/ghci into the lint category so it can be picked up by more runners
by Florian Ragwitz (@rafl) 11 Oct '26
by Florian Ragwitz (@rafl) 11 Oct '26
11 Oct '26
Florian Ragwitz pushed to branch wip/rafl/hpc-instances at Glasgow Haskell Compiler / GHC
Commits:
15ece296 by mangoiv at 2026-10-08T15:14:56-04:00
ci: move hadrian/ghci into the lint category so it can be picked up by more runners
Fixes #27817
- - - - -
c0823135 by mangoiv at 2026-10-08T15:14:56-04:00
ci: make lint-adjacent jobs into platform independent
- move lint jobs into lint-anyarch tag
- unify lint jobs under the same platform independent container
- - - - -
f76464cf by Zubin Duggal at 2026-10-08T15:15:39-04:00
DmdAnal: Make AbsDmd neutral in maxDmd
fixes #27845
- - - - -
ffa56ae4 by sheaf at 2026-10-09T17:15:59+02:00
Preserve sign of zero when parsing -0.0#
This commit leverages the recently added GHC.Types.Literal.Floating
module in order to preserve the sign of negative zero from
source-written floating-point literals.
Fixes #27545
- - - - -
d538cac9 by Facundo Domínguez at 2026-10-09T20:26:38-04:00
Propagate annotations to simple interfaces
This allows annotations to be visible to plugins when run by
haddock. The LiquidHaskell plugin needs the annotations, in particular.
Fixes #26761
- - - - -
32c4f4ab by meooow25 at 2026-10-09T20:27:28-04:00
Bump containers submodule to 0.8.1
And fix affected tests.
* T4086a: containers depends on template-haskell-lift now instead of
template-haskell.
* T22611: Updated to be less dependent on containers internals.
- - - - -
c786065e by sheaf at 2026-10-09T20:28:20-04:00
Use an explicit pattern match in toIfaceIdDetails
The old wildcard pattern let this code bit rot: it did not properly account
for recently added 'IdDetails' such as 'RepPolyId', which resulted in
spurious 'pprTrace' messages that could even pollute HLS sessions.
Fixes #23785
- - - - -
e7cacf59 by sheaf at 2026-10-09T20:29:09-04:00
Take into account ifKind in freeNamesIfDecl
Commit 3c2f4bb4 added the 'ifKind' field to various constructors
of 'IfaceDecl', which preserves the original kind (before type synonym
expansion) for better error messages.
However, that commit forgot to update 'freeNamesIfDecl' correspondingly.
This could result in a "urk! lookup local fingerpring" crash when e.g.
a type's kind uses a type synonym defined later, as we failed to add a
dependency on the type synonym during dependency analysis.
Fixes #27916
- - - - -
ca5317f5 by Florian Ragwitz at 2026-10-11T00:08:21-07:00
hpc: Test desired HPC behaviour for class instances
- - - - -
3e4d7161 by Florian Ragwitz at 2026-10-11T00:08:21-07:00
Extend TcGblEnv with a mapping from instance method Ids to DFunIds
We want to use this in HPC to provide better support for instance methods.
This is working towards #17155.
- - - - -
0f3d8cb8 by Florian Ragwitz at 2026-10-11T00:08:22-07:00
hpc: Do not create top-level boxes for generated instance methods
Users care about which of their written methods are or aren't covered, not
whether all of the inherited methods are covered as well. Those should be
covered where they are implemented.
We achieve that by stopping to generate top-level boxes which will often appear
as uncovered with no clear indication as to why, and no way to fix other than
excercising code the user has not written.
Fixes #17155, #15932.
- - - - -
fbbdbd13 by Florian Ragwitz at 2026-10-11T00:08:22-07:00
hpc: Provide coverage information for class instances
After fixing #17155, we no longer create top-level boxes for the source spans
of instance heads (previously that was the source span used for
inherited/generated instance methods).
With those boxes gone, we can introduce a new top-level box for each class
instance with that instance head source span, and provide more meaningful
coverage semantics for it.
We make the use of any of the instance's methods (user-written or generated)
tick this box, providing the programmer with useful information about whether
or not the instance was exercised at run-time, and whether the instance might
be unnecessary.
- - - - -
aa5e387c by Florian Ragwitz at 2026-10-11T00:08:22-07:00
hpc: Don't allocate boxes for methodless classes
With the plumbing we currently have, these could never be covered, which is not
helpful to hpc users. This could be improved upon further.
- - - - -
0d77a60b by Florian Ragwitz at 2026-10-11T00:08:22-07:00
Add a changelog entry for new HPC features
- - - - -
fb2d59a3 by Florian Ragwitz at 2026-10-11T00:10:18-07:00
Remove tcg_inst_meths in favour of a new IdDetails constructor
Thanks for this great suggestion, Sam! <3
- - - - -
2ec6543b by Florian Ragwitz at 2026-10-11T00:10:27-07:00
Revert back to just using getOccString for DFunIds
- - - - -
0bcada46 by Florian Ragwitz at 2026-10-11T00:10:27-07:00
Limit instance and instance method coverage to HPC only
It's not useful for SourceNotes, which is the other tickishType included in
TickForCoverage.
- - - - -
ebc8c2bb by Florian Ragwitz at 2026-10-11T00:10:27-07:00
Limit record selector ticking to HPC
- - - - -
50 changed files:
- .gitlab-ci.yml
- + changelog.d/26761
- + changelog.d/27845
- + changelog.d/T23785
- + changelog.d/T27545
- + changelog.d/T27916
- + changelog.d/hpc-classinsts
- compiler/GHC/Core/Make.hs
- compiler/GHC/Core/Opt/Specialise.hs
- compiler/GHC/CoreToIface.hs
- compiler/GHC/Hs/Lit.hs
- compiler/GHC/HsToCore.hs
- compiler/GHC/HsToCore/Match/Literal.hs
- compiler/GHC/HsToCore/Ticks.hs
- compiler/GHC/Iface/Decl.hs
- compiler/GHC/Iface/Syntax.hs
- compiler/GHC/Iface/Tidy.hs
- compiler/GHC/Tc/TyCl/Instance.hs
- compiler/GHC/Types/Demand.hs
- compiler/GHC/Types/Id/Info.hs
- compiler/Language/Haskell/Syntax/Lit.hs
- libraries/containers
- + testsuite/tests/dmdanal/should_run/T27845.hs
- + testsuite/tests/dmdanal/should_run/T27845.stdout
- + testsuite/tests/dmdanal/should_run/T27845_Lib.hs
- + testsuite/tests/dmdanal/should_run/T27845b.hs
- + testsuite/tests/dmdanal/should_run/T27845b.stdout
- + testsuite/tests/dmdanal/should_run/T27845b_Lib.hs
- testsuite/tests/dmdanal/should_run/all.T
- + testsuite/tests/hpc/instmeths/instmeths.hs
- + testsuite/tests/hpc/instmeths/instmeths.stdout
- + testsuite/tests/hpc/instmeths/test.T
- + testsuite/tests/numeric/should_run/T27545.hs
- + testsuite/tests/numeric/should_run/T27545.stdout
- testsuite/tests/numeric/should_run/all.T
- testsuite/tests/package/T4806a.stderr
- testsuite/tests/package/all.T
- + testsuite/tests/plugins/T26761.hs
- + testsuite/tests/plugins/T26761.stderr
- + testsuite/tests/plugins/T26761Plugin.hs
- + testsuite/tests/plugins/T26761a.hs
- testsuite/tests/plugins/all.T
- testsuite/tests/simplCore/should_compile/T22375.stderr
- testsuite/tests/simplCore/should_compile/T22375DataFamily.stderr
- testsuite/tests/simplCore/should_compile/T22611.hs
- testsuite/tests/simplCore/should_compile/T22611.stderr
- + testsuite/tests/simplCore/should_compile/T22611a.hs
- testsuite/tests/simplCore/should_compile/all.T
- + testsuite/tests/typecheck/should_compile/T27916.hs
- testsuite/tests/typecheck/should_compile/all.T
The diff was not included because it is too large.
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/a9c4f52b35b88ae900ac31fdec3f1c…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/a9c4f52b35b88ae900ac31fdec3f1c…
You're receiving this email because of your account on gitlab.haskell.org. Manage all notifications: https://gitlab.haskell.org/-/profile/notifications | Help: https://gitlab.haskell.org/help
1
0
[Git][ghc/ghc][wip/supersven/hadrian-cross-stage3] 8 commits: ci: Build Stage3 and Stage2 bindists for cross targets in one job (#26924)
by Sven Tennie (@supersven) 11 Oct '26
by Sven Tennie (@supersven) 11 Oct '26
11 Oct '26
Sven Tennie pushed to branch wip/supersven/hadrian-cross-stage3 at Glasgow Haskell Compiler / GHC
Commits:
10c23983 by Sven Tennie at 2026-10-11T06:54:09+00:00
ci: Build Stage3 and Stage2 bindists for cross targets in one job (#26924)
Building the stage3 target bindist already produces most of the stage2
cross-compiler bindist as a byproduct, so building them in separate jobs
duplicates the build efforts for no benefit. Instead of a separate
CROSS_STAGE=3 job, the stage3 job now also builds and publishes the
stage2 bindist.
The stage3 tarball is named and versioned as if it were built natively
on the target (target triple prefix, non-cross opsys), so its artifact
name stays what downstream consumers already expect and no changes are
needed on their side.
For now, this is only enabled for the RISC-V job. Others can easily
follow.
- - - - -
ceaa3ddb by Sven Tennie at 2026-10-11T06:54:09+00:00
ci: model cross targets as structured TargetPlatform triples
Storing the cross target as a raw triple forced ad-hoc parsing at every
use, and broke the single responsibility rule. Modelling it as a
structured `TargetPlatform`` instead, avoids parsing and provides a
clear separation of concerns.
- - - - -
d0570c3e by Sven Tennie at 2026-10-11T06:54:09+00:00
ci: use a scalar cross-stage switch, FINAL_CROSS_STAGE=2|3
For cross-compilers, Stage2 bindists are (almost) a by-product of Stage3
bindists. Thus, we either build Stage2 or Stage2 + Stage3 bindists. The
commit at hand reflects this fact in types.
- - - - -
2c7a99fc by Sven Tennie at 2026-10-11T06:54:27+00:00
ci: extract the cross smoke tests into a separate smoke_test command
This reduces if-nesting and complexity of the main `test_hadrian`
command. The decision how to test is now made by the caller. This is a
fair choice, because most test cases can run under emulation - they are
just very slow then.
- - - - -
cf4361ca by Sven Tennie at 2026-10-11T06:54:28+00:00
ci: inline the FINAL_CROSS_STAGE renderer
`finalCrossStageEnvVal` was small and only used in one place.
- - - - -
f4e45edd by Sven Tennie at 2026-10-11T06:54:28+00:00
hadrian: clarify cross-stage settings and project.mk comments
Reword the settings-rule comment to name the two stage roles
(compilerStage vs libraryStage) and explain what 'the final
architecture' in terms of project.mk generation means.
- - - - -
119a2f36 by Sven Tennie at 2026-10-11T06:54:34+00:00
Fix intepreter settings for native target bindists
Stage3 cross-compiled bindists wrongly assumed they cannot run the
interpreter natively. Fix this by adjusting compile flags and choosing
the correct libs/target/default.target files per compiler stage.
- - - - -
28789d48 by Sven Tennie at 2026-10-11T09:02:38+02:00
Generate default.target only from the successor stage for stage0
This mirrors the behaviour for the settings' rules. Reflects that Stage0
compilers depend on the Stage1 lib/ dir.
- - - - -
6 changed files:
- .gitlab/ci.sh
- .gitlab/generate-ci/gen_ci.hs
- .gitlab/jobs.yaml
- hadrian/src/Rules/BinaryDist.hs
- hadrian/src/Rules/Generate.hs
- hadrian/src/Settings/Packages.hs
Changes:
=====================================
.gitlab/ci.sh
=====================================
@@ -62,9 +62,10 @@ Common Modes:
Environment variables affecting the build:
CROSS_TARGET Triple of cross-compilation target.
- CROSS_STAGE The stage of the cross-compiler to build either
- * 2: Build a normal cross-compiler bindist
- * 3: Build a target executable bindist (with the stage2 cross-compiler)
+ FINAL_CROSS_STAGE The final stage of the cross-compiler to build either
+ * 2: Build a cross-compiler bindist
+ * 3: Also build the target executable bindist
+ (builds stages 2 and 3; implies the bindist of 2)
VERBOSE Set to non-empty for verbose build output
RUNTEST_ARGS Arguments passed to runtest.py
TEST_WAYS Testsuite ways to run
@@ -573,10 +574,17 @@ function build_hadrian() {
export XZ_OPT="${XZ_OPT:-} -T$cores"
fi
- case "${CROSS_STAGE:-2}" in
+ case "${FINAL_CROSS_STAGE:-2}" in
2) BINDIST_TARGET="binary-dist";;
- 3) BINDIST_TARGET="binary-dist-stage3";;
- *) fail "Unknown CROSS_STAGE, must be 2 or 3";;
+ # Stage2 bindists are (almost) a byproduct of Stage3 bindists. So, we
+ # bundle both of them when the Stage3 bindist is built.
+ 3)
+ BINDIST_TARGET="binary-dist binary-dist-stage3"
+ if [[ -z "${BIN_DIST_NAME_STAGE3:-}" ]]; then
+ fail "FINAL_CROSS_STAGE=3 requires BIN_DIST_NAME_STAGE3 to be set"
+ fi
+ ;;
+ *) fail "Unknown FINAL_CROSS_STAGE, must be 2 or 3";;
esac
if [[ -n "${REINSTALL_GHC:-}" ]]; then
@@ -590,6 +598,9 @@ function build_hadrian() {
*)
run_hadrian test:all_deps $BINDIST_TARGET
mv _build/bindist/ghc*.tar.xz "$BIN_DIST_NAME.tar.xz"
+ if [[ "${FINAL_CROSS_STAGE:-2}" == "3" ]]; then
+ mv _build/bindist-stage3/ghc*.tar.xz "$BIN_DIST_NAME_STAGE3.tar.xz"
+ fi
;;
esac
fi
@@ -648,6 +659,74 @@ function install_bindist() {
end_section install-bindist
}
+# Smoke-test the cross-compiled Stage2 and Stage2 bindists using the emulator.
+# For cross jobs with a working emulator this runs instead of `test_hadrian`
+# as a separate validation step after the build.
+function smoke_test() {
+ check_msys2_deps _build/stage1/bin/ghc --version
+ check_release_build
+
+ if [[ "${CROSS_EMULATOR:-}" == "NOT_SET" ]]; then
+ info "Cannot test cross-compiled build without CROSS_EMULATOR being set."
+ return
+ fi
+
+ local instdir="$TOP/_build/install"
+ local test_compiler="$instdir/bin/${cross_prefix}ghc$exe"
+ install_bindist _build/bindist/ghc-*/ "$instdir"
+ echo 'main = putStrLn "hello world"' > expected
+ run "$test_compiler" -package ghc "$TOP/.gitlab/hello.hs" -o hello
+
+ if [[ "${CROSS_TARGET:-no_cross_target}" =~ "mingw" ]]; then
+ ${CROSS_EMULATOR:-} ./hello.exe > actual
+ else
+ ${CROSS_EMULATOR:-} ./hello > actual
+ fi
+
+ # We have to use `-w` to make the test more stable across supported
+ # platforms, i.e. Windows:
+ # $ cmp expected actual
+ # differ: byte 30, line 1
+ # $ diff expected actual
+ # 1c1
+ # < main = putStrLn "hello world"
+ # ---
+ # > main = putStrLn "hello world"
+ run diff -w expected actual
+
+ if [[ "${FINAL_CROSS_STAGE:-2}" == "3" ]]; then
+ local stage3_dir
+ stage3_dir="$(echo _build/bindist-stage3/ghc-*/)"
+ local stage3_ghc="$stage3_dir/bin/ghc$exe"
+
+ info "Smoke-testing stage3 compiler..."
+ run ${CROSS_EMULATOR} "$stage3_ghc" --info > stage3-info
+ cat stage3-info
+
+ # The stage3 compiler is a native target compiler: it must not consider
+ # itself a cross-compiler, and GHCi support must be compiled in when the
+ # target supports it.
+ grep -q '"cross compiling","NO"' stage3-info \
+ || fail "stage3 compiler reports itself as cross-compiling"
+
+ if grep -q '"Use interpreter","YES"' stage3-info; then
+ echo 'ghci works' > ghci-expected
+ ${CROSS_EMULATOR:-} "$stage3_ghc" -e 'putStrLn "ghci works"' > ghci-actual
+ run diff -w ghci-expected ghci-actual
+ fi
+
+ run ${CROSS_EMULATOR} "$stage3_ghc" -package ghc "$TOP/.gitlab/hello.hs" -o hello-stage3
+
+ if [[ "${CROSS_TARGET:-no_cross_target}" =~ "mingw" ]]; then
+ ${CROSS_EMULATOR:-} ./hello-stage3.exe > actual-stage3
+ else
+ ${CROSS_EMULATOR:-} ./hello-stage3 > actual-stage3
+ fi
+
+ run diff -w expected actual-stage3
+ fi
+}
+
function test_hadrian() {
check_msys2_deps _build/stage1/bin/ghc --version
check_release_build
@@ -672,35 +751,7 @@ function test_hadrian() {
fi
fi
-
- if [[ "${CROSS_EMULATOR:-}" == "NOT_SET" ]]; then
- info "Cannot test cross-compiled build without CROSS_EMULATOR being set."
- return
- # If we have set CROSS_EMULATOR, then can't test using normal testsuite.
- elif [ -n "${CROSS_EMULATOR:-}" ] && [[ "${CROSS_TARGET:-}" != *"wasm"* ]]; then
- local instdir="$TOP/_build/install"
- local test_compiler="$instdir/bin/${cross_prefix}ghc$exe"
- install_bindist _build/bindist/ghc-*/ "$instdir"
- echo 'main = putStrLn "hello world"' > expected
- run "$test_compiler" -package ghc "$TOP/.gitlab/hello.hs" -o hello
-
- if [[ "${CROSS_TARGET:-no_cross_target}" =~ "mingw" ]]; then
- ${CROSS_EMULATOR:-} ./hello.exe > actual
- else
- ${CROSS_EMULATOR:-} ./hello > actual
- fi
-
- # We have to use `-w` to make the test more stable across supported
- # platforms, i.e. Windows:
- # $ cmp expected actual
- # differ: byte 30, line 1
- # $ diff expected actual
- # 1c1
- # < main = putStrLn "hello world"
- # ---
- # > main = putStrLn "hello world"
- run diff -w expected actual
- elif [[ -n "${REINSTALL_GHC:-}" ]]; then
+ if [[ -n "${REINSTALL_GHC:-}" ]]; then
run_hadrian \
test \
--test-root-dirs=testsuite/tests/stage1 \
@@ -1131,6 +1182,7 @@ case ${1:-help} in
time_it "test" test_hadrian || res=$?
push_perf_notes
exit $res ;;
+ smoke_test) time_it "smoke-test" smoke_test ;;
run_hadrian) shift; run_hadrian "$@" ;;
perf_test) run_perf_test ;;
abi_test) abi_test ;;
=====================================
.gitlab/generate-ci/gen_ci.hs
=====================================
@@ -110,26 +110,49 @@ data Opsys
= Linux LinuxDistro
| Darwin
| FreeBSD14
- | Windows deriving (Eq)
+ | Windows deriving (Eq, Show)
data LinuxDistro
= Debian13
| Debian12
- | Debian12Wine
- | Debian13Riscv
| Debian11
- | Debian11Js
| Fedora43
- | Ubuntu2404LoongArch64
| Ubuntu2404
| Ubuntu2204
| Alpine312
| Alpine323
- | AlpineWasm
| Rocky8
- deriving (Eq)
-
-data Arch = Amd64 | AArch64 | I386
+ deriving (Eq, Show)
+
+data Arch = Amd64 | AArch64 | I386 | RiscV64 | LoongArch | Wasm32 | JavaScript
+ deriving (Show)
+
+-- | Describes what the docker image is for: the development flavour of the
+-- build environment, orthogonal to the image's own architecture ('Arch').
+-- E.g. @FlavorRiscV@ denotes the image that carries the RISC-V cross
+-- toolchain.
+data ImageFlavor
+ = FlavorVanilla
+ | FlavorRiscV
+ | FlavorLoongArch
+ | FlavorWine
+ | FlavorEmscripten
+ | FlavorWasm
+ deriving (Eq, Show)
+
+-- | OS element of a configure target triple: this is the OS of the *target*
+-- platform, not the build environment (that is 'Opsys'/'LinuxDistro').
+data TargetOs
+ = TargetOsLinuxGnu
+ | TargetOsGhcjs
+ | TargetOsMingw32
+ | TargetOsWasi
+ deriving (Eq, Show)
+
+data TargetPlatform = TargetPlatform
+ { tpArch :: Arch -- ^ target architecture, e.g. 'RiscV64'
+ , tpOs :: TargetOs -- ^ target OS, e.g. 'TargetOsLinuxGnu'
+ }
data BignumBackend = Native | Gmp deriving Eq
@@ -158,8 +181,8 @@ data BuildConfig
, withAssertions :: Bool
, withNuma :: Bool
, withZstd :: Bool
- , crossTarget :: Maybe String
- , crossStage :: Maybe Int
+ , crossTarget :: Maybe TargetPlatform
+ , crossStages :: Maybe CrossStages
, crossEmulator :: CrossEmulator
, configureWrapper :: Maybe String
, fullyStatic :: Bool
@@ -180,7 +203,7 @@ configureArgsStr bc = unwords $
["--enable-unregisterised"| unregisterised bc ]
++ ["--disable-tables-next-to-code" | not (tablesNextToCode bc) ]
++ ["--with-intree-gmp" | Just _ <- [crossTarget bc] ]
- ++ ["--with-system-libffi" | crossTarget bc == Just "wasm32-wasi" ]
+ ++ ["--with-system-libffi" | (tpOs <$> crossTarget bc) == Just TargetOsWasi ]
++ ["--enable-ipe-data-compression" | withZstd bc ]
++ ["--enable-strict-ghc-toolchain-check"]
@@ -229,7 +252,7 @@ vanilla = BuildConfig
, withNuma = False
, withZstd = False
, crossTarget = Nothing
- , crossStage = Nothing
+ , crossStages = Nothing
, crossEmulator = NoEmulator
, configureWrapper = Nothing
, fullyStatic = False
@@ -275,17 +298,54 @@ static = vanilla { fullyStatic = True }
staticNativeInt :: BuildConfig
staticNativeInt = static { bignumBackend = Native }
-crossConfig :: String -- ^ target triple
+-- | The cross stages a build produces binary distributions for
+data CrossStages
+ = -- | Builds a cross-compiler (build == host, host /= target):
+ -- its bindist runs on the build host.
+ Stage2
+ | -- | Implies `Stage2` and additionally builds a cross-compiled compiler
+ -- (build /= host, host == target).
+ Stage2And3
+ deriving stock (Eq, Ord)
+
+crossConfig :: TargetPlatform -- ^ target platform
-> CrossEmulator -- ^ emulator for testing
-> Maybe String -- ^ Configure wrapper
+ -> CrossStages -- ^ final cross stages to build bindists for
-> BuildConfig
-crossConfig triple emulator configure_wrapper =
- vanilla { crossTarget = Just triple
- , crossStage = Just 2
+crossConfig targetPlatform emulator configure_wrapper crossStage =
+ vanilla { crossTarget = Just targetPlatform
+ , crossStages = Just crossStage
, crossEmulator = emulator
, configureWrapper = configure_wrapper
}
+-- | The docker image flavour of a build, derived from its cross target
+-- (the image must carry the target's toolchain) or 'FlavorVanilla' for
+-- plain builds.
+buildFlavor :: BuildConfig -> ImageFlavor
+buildFlavor bc = maybe FlavorVanilla flavorOf (crossTarget bc)
+ where
+ flavorOf :: TargetPlatform -> ImageFlavor
+ flavorOf TargetPlatform{ tpArch = arch, tpOs = os } = case (arch, os) of
+ (AArch64, TargetOsLinuxGnu) -> FlavorVanilla
+ (AArch64, TargetOsMingw32) -> FlavorWine
+ (RiscV64, TargetOsLinuxGnu) -> FlavorRiscV
+ (LoongArch, TargetOsLinuxGnu) -> FlavorLoongArch
+ (Wasm32, TargetOsWasi) -> FlavorWasm
+ (JavaScript, TargetOsGhcjs) -> FlavorEmscripten
+ _ -> error $
+ "flavorOf: no image flavour for target " ++ show arch ++ "/" ++ show os
+
+-- | The configure target triple the build system consumes, e.g.
+-- @"riscv64-linux-gnu"@.
+renderTriple :: TargetPlatform -> String
+renderTriple TargetPlatform{ tpArch = arch, tpOs = os } = case os of
+ TargetOsLinuxGnu -> archName arch ++ "-linux-gnu"
+ TargetOsGhcjs -> archName arch ++ "-unknown-ghcjs"
+ TargetOsMingw32 -> archName arch ++ "-unknown-mingw32"
+ TargetOsWasi -> archName arch ++ "-wasi"
+
llvm :: BuildConfig
llvm = vanilla { llvmBootstrap = True, testsuiteWays = ["llvm", "optllvm"] }
@@ -307,16 +367,16 @@ usePerfProfilingTestsuite bc = bc { testsuiteUsePerf = True }
-- | These tags have to match what we call the runners on gitlab
runnerTag :: Arch -> Opsys -> String
-runnerTag arch (Linux _) =
- case arch of
- Amd64 -> "x86_64-linux"
- AArch64 -> "aarch64-linux"
- I386 -> "x86_64-linux"
-runnerTag AArch64 Darwin = "aarch64-darwin"
-runnerTag Amd64 Darwin = "x86_64-darwin-m1"
-runnerTag Amd64 Windows = "new-x86_64-windows"
-runnerTag Amd64 FreeBSD14 = "x86_64-freebsd14"
-runnerTag _ _ = error "Invalid arch/opsys"
+runnerTag arch opsys = case (arch, opsys) of
+ (Amd64, Linux{}) -> "x86_64-linux"
+ (AArch64, Linux{}) -> "aarch64-linux"
+ (I386, Linux{}) -> "x86_64-linux"
+ (AArch64, Darwin) -> "aarch64-darwin"
+ (Amd64, Darwin) -> "x86_64-darwin-m1"
+ (Amd64, Windows) -> "new-x86_64-windows"
+ (Amd64, FreeBSD14) -> "x86_64-freebsd14"
+ _ -> error $ "runnerTag: no runner for "
+ ++ show arch ++ "/" ++ show opsys
tags :: Arch -> Opsys -> BuildConfig -> [String]
tags arch opsys _bc = [runnerTag arch opsys] -- Tag for which runners we can use
@@ -324,52 +384,92 @@ tags arch opsys _bc = [runnerTag arch opsys] -- Tag for which runners we can use
runnerPerfTag :: Arch -> Opsys -> String
runnerPerfTag arch sys = runnerTag arch sys ++ "-perf"
--- These names are used to find the docker image so they have to match what is
--- in the docker registry.
+-- | These names are used to find the docker image so they have to match what
+-- is in the docker registry.
distroName :: LinuxDistro -> String
distroName Debian13 = "deb13"
distroName Debian12 = "deb12"
distroName Debian11 = "deb11"
-distroName Debian11Js = "deb11-emsdk-closure"
-distroName Debian13Riscv = "deb13-riscv"
-distroName Debian12Wine = "deb12-wine"
distroName Fedora43 = "fedora43"
-distroName Ubuntu2404LoongArch64 = "ubuntu24_04-loongarch"
distroName Ubuntu2204 = "ubuntu22_04"
distroName Ubuntu2404 = "ubuntu24_04"
distroName Alpine312 = "alpine3_12"
distroName Alpine323 = "alpine3_23"
-distroName AlpineWasm = "alpine3_23-wasm"
distroName Rocky8 = "rocky8"
-opsysName :: Opsys -> String
-opsysName (Linux distro) = "linux-" ++ distroName distro
-opsysName Darwin = "darwin"
-opsysName FreeBSD14 = "freebsd14"
-opsysName Windows = "windows"
+-- | The distro tag used in docker image names, extended with the toolchain
+-- suffix of the image flavour (e.g. 'Debian13'' + 'FlavorRiscV' ->
+-- @"deb13-riscv"@).
+distroImageTag :: LinuxDistro -> ImageFlavor -> String
+distroImageTag distro flavor = distroName distro ++ flavorSuffix flavor
+ where
+ flavorSuffix :: ImageFlavor -> String
+ flavorSuffix FlavorVanilla = ""
+ flavorSuffix FlavorRiscV = "-riscv"
+ flavorSuffix FlavorLoongArch = "-loongarch"
+ flavorSuffix FlavorWine = "-wine"
+ flavorSuffix FlavorEmscripten = "-emsdk-closure"
+ flavorSuffix FlavorWasm = "-wasm"
+
+-- | OS name as it appears for job identity and docker image tags, qualified
+-- by the working image flavour if any (e.g. @"linux-deb13-riscv"@).
+opsysNameWithFlavor :: Opsys -> ImageFlavor -> String
+opsysNameWithFlavor (Linux distro) flavor = "linux-" ++ distroImageTag distro flavor
+opsysNameWithFlavor opsys _ = opsysName opsys
+ where
+ opsysName :: Opsys -> String
+ opsysName (Linux distro) = "linux-" ++ distroName distro
+ opsysName Darwin = "darwin"
+ opsysName FreeBSD14 = "freebsd14"
+ opsysName Windows = "windows"
archName :: Arch -> String
-archName Amd64 = "x86_64"
-archName AArch64 = "aarch64"
-archName I386 = "i386"
+archName Amd64 = "x86_64"
+archName AArch64 = "aarch64"
+archName I386 = "i386"
+archName RiscV64 = "riscv64"
+archName LoongArch = "loongarch64"
+archName Wasm32 = "wasm32"
+archName JavaScript = "javascript"
binDistName :: Arch -> Opsys -> BuildConfig -> String
-binDistName arch opsys bc = "ghc-" ++ testEnv arch opsys bc
+binDistName arch opsys bc = "ghc-" ++ testEnvWith (archName arch) opsys bc
+
+-- | Name of the stage3 (target-platform) bindist.
+--
+-- Because that bindist lives on its target, it is named as if built natively
+-- on the target: target architecture, the OS of the job, and no
+-- cross/toolchain flavour markers.
+stage3BinDistName :: Opsys -> BuildConfig -> Maybe String
+stage3BinDistName opsys bc
+ | buildsTargetBindist
+ , Just TargetPlatform{ tpArch = arch } <- crossTarget bc
+ = Just $ binDistName arch opsys (bc { crossTarget = Nothing })
+ | otherwise
+ = Nothing
+ where
+ -- Whether any bindist produced by this build configuration runs on its
+ -- target platform rather than on the build host.
+ buildsTargetBindist :: Bool
+ buildsTargetBindist = crossStages bc == Just Stage2And3
-- | Test env should create a string which changes whenever the 'BuildConfig' changes.
-- Either the change is reflected by modifying the flavourString or directly (as is
-- the case for settings which affect environment variables)
testEnv :: Arch -> Opsys -> BuildConfig -> String
-testEnv arch opsys bc =
+testEnv arch = testEnvWith (archName arch)
+
+testEnvWith :: String -> Opsys -> BuildConfig -> String
+testEnvWith archN opsys bc =
intercalate "-" $ concat
- [ [ archName arch
- , opsysName opsys ]
+ [ [ archN
+ , opsysNameWithFlavor opsys (buildFlavor bc) ]
, ["int_" ++ bignumString (bignumBackend bc) | bignumBackend bc /= Gmp]
, ["unreg" | unregisterised bc ]
, ["numa" | withNuma bc ]
, ["zstd" | withZstd bc ]
, ["no_tntc" | not (tablesNextToCode bc) ]
- , ["cross_"++triple | Just triple <- pure $ crossTarget bc ]
+ , ["cross_"++renderTriple ct | Just ct <- pure $ crossTarget bc ]
, [flavourString (mkJobFlavour bc)]
]
@@ -392,18 +492,18 @@ flavourString (Flavour base trans) = base_string base ++ concatMap (("+" ++) . f
flavour_string TextWithSIMDUTF = "text_simdutf"
-- The path to the docker image (just for linux builders)
-dockerImage :: Arch -> Opsys -> Maybe String
-dockerImage arch (Linux distro) =
+dockerImage :: Arch -> Opsys -> BuildConfig -> Maybe String
+dockerImage arch (Linux distro) bc =
Just image
where
image = mconcat
[ "registry.gitlab.haskell.org/ghc/ci-images/"
, archName arch
, "-linux-"
- , distroName distro
+ , distroImageTag distro (buildFlavor bc)
, ":$DOCKER_REV"
]
-dockerImage _ _ = Nothing
+dockerImage _ _ _ = Nothing
-----------------------------------------------------------------------------
-- Platform-specific variables
@@ -444,8 +544,8 @@ brokenTest :: TestName -- ^ test name
-> Variables
brokenTest test _why = "BROKEN_TESTS" =: test
-opsysVariables :: Arch -> Opsys -> Variables
-opsysVariables _ FreeBSD14 = mconcat
+opsysVariables :: Arch -> Opsys -> ImageFlavor -> Variables
+opsysVariables _ FreeBSD14 _ = mconcat
[ -- N.B. we use iconv from ports as I see linker errors when we attempt
-- to use the "native" iconv embedded in libc as suggested by the
-- porting guide [1].
@@ -459,8 +559,8 @@ opsysVariables _ FreeBSD14 = mconcat
, "FETCH_GHC_VERSION" =: "9.10.3"
, "CABAL_INSTALL_VERSION" =: "3.14.2.0"
]
-opsysVariables arch (Linux distro) = distroVariables arch distro
-opsysVariables AArch64 (Darwin {}) = mconcat
+opsysVariables arch (Linux distro) flavor = distroVariables arch distro flavor
+opsysVariables AArch64 (Darwin {}) _ = mconcat
[ "NIX_SYSTEM" =: "aarch64-darwin"
, "MACOSX_DEPLOYMENT_TARGET" =: "11.0"
, "LANG" =: "en_US.UTF-8"
@@ -468,7 +568,7 @@ opsysVariables AArch64 (Darwin {}) = mconcat
-- Fonts can't be installed on darwin
, "HADRIAN_ARGS" =: "--docs=no-sphinx-pdfs"
]
-opsysVariables Amd64 (Darwin {}) = mconcat
+opsysVariables Amd64 (Darwin {}) _ = mconcat
[ "NIX_SYSTEM" =: "x86_64-darwin"
, "MACOSX_DEPLOYMENT_TARGET" =: "11.0"
-- Only Sierra and onwards supports clock_gettime. See #12858
@@ -481,16 +581,15 @@ opsysVariables Amd64 (Darwin {}) = mconcat
, "CONFIGURE_ARGS" =: "--with-intree-gmp --with-system-libffi"
-- Fonts can't be installed on darwin
, "HADRIAN_ARGS" =: "--docs=no-sphinx-pdfs"
-
]
-opsysVariables _ (Windows {}) = mconcat
+opsysVariables _ (Windows {}) _ = mconcat
[ "MSYSTEM" =: "CLANG64"
, "LANG" =: "en_US.UTF-8"
, "CABAL_INSTALL_VERSION" =: "3.14.2.0"
, "HADRIAN_ARGS" =: "--docs=no-sphinx-pdfs"
, "FETCH_GHC_VERSION" =: "9.10.3"
]
-opsysVariables _ _ = mempty
+opsysVariables _ _ _ = mempty
alpineVariables :: Arch -> Variables
alpineVariables arch = mconcat $
@@ -509,10 +608,13 @@ alpineVariables arch = mconcat $
]
-distroVariables :: Arch -> LinuxDistro -> Variables
-distroVariables arch Alpine312 = alpineVariables arch
-distroVariables arch Alpine323 = alpineVariables arch
-distroVariables _ _ = mempty
+distroVariables :: Arch -> LinuxDistro -> ImageFlavor -> Variables
+distroVariables arch Alpine312 _ = alpineVariables arch
+-- The wasm image runs its own (libc-free) toolchain, so the alpine broken
+-- tests do not apply to it.
+distroVariables _ Alpine323 FlavorWasm = mempty
+distroVariables arch Alpine323 _ = alpineVariables arch
+distroVariables _ _ _ = mempty
-----------------------------------------------------------------------------
-- Cache settings, what to cache and when can we share the cache
@@ -524,8 +626,8 @@ data Cache
}
-- The cache doesn't depend on the BuildConfig because we only cache the cabal store.
-mkCacheKey :: Arch -> Opsys -> String
-mkCacheKey arch opsys = archName arch <> "-" <> opsysName opsys <> "-$CACHE_REV"
+mkCacheKey :: Arch -> Opsys -> ImageFlavor -> String
+mkCacheKey arch opsys flavor = archName arch <> "-" <> opsysNameWithFlavor opsys flavor <> "-$CACHE_REV"
instance ToJSON Cache where
toJSON Cache {..} = object
@@ -807,7 +909,7 @@ data Job
, jobArtifacts :: Artifacts
, jobCache :: Cache
, jobRules :: OnOffRules
- , jobPlatform :: (Arch, Opsys)
+ , jobPlatform :: (Arch, Opsys, ImageFlavor)
}
instance Show Job where
@@ -837,7 +939,7 @@ instance ToJSON Job where
job :: Arch -> Opsys -> BuildConfig -> NamedJob Job
job arch opsys buildConfig = NamedJob { name = jobName, jobInfo = Job {..} }
where
- jobPlatform = (arch, opsys)
+ jobPlatform = (arch, opsys, buildFlavor buildConfig)
jobRules = emptyRules jobName
@@ -845,14 +947,14 @@ job arch opsys buildConfig = NamedJob { name = jobName, jobInfo = Job {..} }
jobTags = tags arch opsys buildConfig
- jobDockerImage = dockerImage arch opsys
+ jobDockerImage = dockerImage arch opsys buildConfig
jobScript
| Windows <- opsys
= [ "bash .gitlab/ci.sh setup"
, "bash .gitlab/ci.sh configure"
, "bash .gitlab/ci.sh build_hadrian"
- , "bash .gitlab/ci.sh test_hadrian"
+ , "bash " ++ testStep
]
| otherwise
= [ "find libraries -name config.sub -exec cp config.sub {} \\;" | Darwin == opsys ] ++
@@ -860,9 +962,16 @@ job arch opsys buildConfig = NamedJob { name = jobName, jobInfo = Job {..} }
[ ".gitlab/ci.sh setup"
, ".gitlab/ci.sh configure"
, ".gitlab/ci.sh build_hadrian"
- , ".gitlab/ci.sh test_hadrian"
+ , testStep
]
+ -- Cross jobs with a working emulator smoke-test the bindist under the
+ -- emulator as a separate step after the build; everything else runs the
+ -- testsuite.
+ testStep
+ | Emulator _ <- crossEmulator buildConfig = ".gitlab/ci.sh smoke_test"
+ | otherwise = ".gitlab/ci.sh test_hadrian"
+
jobAfterScript
| Windows <- opsys =
[ "bash .gitlab/ci.sh save_cache"
@@ -880,16 +989,20 @@ job arch opsys buildConfig = NamedJob { name = jobName, jobInfo = Job {..} }
jobDependencies = []
jobVariables = mconcat
- [ opsysVariables arch opsys
+ [ opsysVariables arch opsys (buildFlavor buildConfig)
, "TEST_ENV" =: testEnv arch opsys buildConfig
, "BIN_DIST_NAME" =: binDistName arch opsys buildConfig
+ , maybe mempty ("BIN_DIST_NAME_STAGE3" =:) (stage3BinDistName opsys buildConfig)
, "BUILD_FLAVOUR" =: flavourString jobFlavour
, "BIGNUM_BACKEND" =: bignumString (bignumBackend buildConfig)
, "CONFIGURE_ARGS" =: configureArgsStr buildConfig
, "INSTALL_CONFIGURE_ARGS" =: "--enable-strict-ghc-toolchain-check"
, maybe mempty ("CONFIGURE_WRAPPER" =:) (configureWrapper buildConfig)
- , maybe mempty ("CROSS_TARGET" =:) (crossTarget buildConfig)
- , maybe mempty (("CROSS_STAGE" =:) . show) (crossStage buildConfig)
+ , maybe mempty (("CROSS_TARGET" =:) . renderTriple) (crossTarget buildConfig)
+ , case crossStages buildConfig of
+ Nothing -> mempty
+ Just Stage2 -> "FINAL_CROSS_STAGE" =: "2"
+ Just Stage2And3 -> "FINAL_CROSS_STAGE" =: "3"
, case crossEmulator buildConfig of
NoEmulator
-- we need an emulator but it isn't set. Won't run the testsuite
@@ -922,6 +1035,8 @@ job arch opsys buildConfig = NamedJob { name = jobName, jobInfo = Job {..} }
trim :: String -> String
trim = dropWhileEnd isSpace . dropWhile isSpace
+ stage3Artifacts = maybe [] (\n -> [n ++ ".tar.xz"]) (stage3BinDistName opsys buildConfig)
+
-- Keep in sync with the exclude list in `function clean()` in
-- `.gitlab/ci.sh`!
jobArtifacts = Artifacts
@@ -930,6 +1045,7 @@ job arch opsys buildConfig = NamedJob { name = jobName, jobInfo = Job {..} }
, artifactPaths = [binDistName arch opsys buildConfig ++ ".tar.xz"
,"junit.xml"
,"unexpected-test-output.tar.gz"]
+ ++ stage3Artifacts
, artifactsWhen = ArtifactsAlways
}
@@ -940,7 +1056,7 @@ job arch opsys buildConfig = NamedJob { name = jobName, jobInfo = Job {..} }
Cache { cachePaths = [], cacheKey = "no-caching" }
| otherwise = Cache
{ cachePaths = [ "cabal-cache", "toolchain" ]
- , cacheKey = mkCacheKey arch opsys
+ , cacheKey = mkCacheKey arch opsys (buildFlavor buildConfig)
}
@@ -1163,7 +1279,6 @@ debian_x86 =
, disableValidate (standardBuilds Amd64 (Linux Debian12))
, disableValidate (standardBuilds Amd64 (Linux Debian13))
-
-- Validate only builds
, fastCI (validateBuilds Amd64 (Linux validate_debian) debug)
, validateBuilds Amd64 (Linux validate_debian) nativeInt
@@ -1288,16 +1403,17 @@ alpine_aarch64 = [
cross_jobs :: [JobGroup Job]
cross_jobs = [
-- x86 -> aarch64
- validateBuilds Amd64 (Linux Debian13) (crossConfig "aarch64-linux-gnu" (Emulator "qemu-aarch64 -L /usr/aarch64-linux-gnu") Nothing)
+ validateBuilds Amd64 (Linux Debian13) (crossConfig (TargetPlatform AArch64 TargetOsLinuxGnu) (Emulator "qemu-aarch64 -L /usr/aarch64-linux-gnu") Nothing Stage2)
- -- x86_64 -> riscv
- , addValidateRule RiscV (validateBuilds Amd64 (Linux Debian13Riscv) (crossConfig "riscv64-linux-gnu" (Emulator "qemu-riscv64 -L /usr/riscv64-linux-gnu") Nothing))
+ -- Stage2: x86_64 (build/host) -> riscv64 (target)
+ -- Stage3: x86_64 (build) -> riscv64 (host/target)
+ , addValidateRule RiscV (validateBuilds Amd64 (Linux Debian13) (crossConfig (TargetPlatform RiscV64 TargetOsLinuxGnu) (Emulator "qemu-riscv64 -L /usr/riscv64-linux-gnu") Nothing Stage2And3))
-- x86_64 -> loongarch64
- , addValidateRule LoongArch64 (validateBuilds Amd64 (Linux Ubuntu2404LoongArch64) (crossConfig "loongarch64-linux-gnu" (Emulator "qemu-loongarch64 -L /usr/loongarch64-linux-gnu") Nothing))
+ , addValidateRule LoongArch64 (validateBuilds Amd64 (Linux Ubuntu2404) (crossConfig (TargetPlatform LoongArch TargetOsLinuxGnu) (Emulator "qemu-loongarch64 -L /usr/loongarch64-linux-gnu") Nothing Stage2))
-- Javascript
- , addValidateRule JSBackend (validateBuilds Amd64 (Linux Debian11Js) javascriptConfig)
+ , addValidateRule JSBackend (validateBuilds Amd64 (Linux Debian11) javascriptConfig)
-- Wasm
, make_wasm_jobs wasm_build_config
@@ -1309,13 +1425,13 @@ cross_jobs = [
-- Linux Aarch64 (Wine + FEX + MSYS64) => Windows Aarch64
, makeWinArmJobs
$ addValidateRule WinArm64
- (validateBuilds AArch64 (Linux Debian12Wine) winAarch64Config)
+ (validateBuilds AArch64 (Linux Debian12) winAarch64Config)
, makeWinArmJobs
$ addValidateRule WinArm64LLVM
- (validateBuilds AArch64 (Linux Debian12Wine) (winAarch64Config {llvmBootstrap = True}))
+ (validateBuilds AArch64 (Linux Debian12) (winAarch64Config {llvmBootstrap = True}))
]
where
- javascriptConfig = (crossConfig "javascript-unknown-ghcjs" (NoEmulatorNeeded TimeoutIncrease) (Just "emconfigure"))
+ javascriptConfig = (crossConfig (TargetPlatform JavaScript TargetOsGhcjs) (NoEmulatorNeeded TimeoutIncrease) (Just "emconfigure") Stage2)
{ bignumBackend = Native }
makeWinArmJobs = modifyJobs
@@ -1354,7 +1470,7 @@ cross_jobs = [
llvm_prefix = "/opt/llvm-mingw-linux/bin/aarch64-w64-mingw32-"
cflags = "-fuse-ld=" ++ llvm_prefix ++ "ld --rtlib=compiler-rt"
- winAarch64Config = (crossConfig "aarch64-unknown-mingw32" (Emulator "/opt/wine-arm64ec-msys2-deb12/bin/wine") Nothing)
+ winAarch64Config = (crossConfig (TargetPlatform AArch64 TargetOsMingw32) (Emulator "/opt/wine-arm64ec-msys2-deb12/bin/wine") Nothing Stage2)
{ bignumBackend = Native }
make_wasm_jobs cfg =
@@ -1364,10 +1480,10 @@ cross_jobs = [
. setVariable "HADRIAN_ARGS" "--docs=no-sphinx-pdfs --docs=no-sphinx-man"
. delVariable "INSTALL_CONFIGURE_ARGS"
)
- $ addValidateRule WasmBackend $ validateBuilds Amd64 (Linux AlpineWasm) cfg
+ $ addValidateRule WasmBackend $ validateBuilds Amd64 (Linux Alpine323) cfg
wasm_build_config =
- (crossConfig "wasm32-wasi" (NoEmulatorNeeded NoTimeoutIncrease) Nothing)
+ (crossConfig (TargetPlatform Wasm32 TargetOsWasi) (NoEmulatorNeeded NoTimeoutIncrease) Nothing Stage2)
{ hostFullyStatic = True
, buildFlavour = Release -- TODO: This needs to be validate but wasm backend doesn't pass yet
, textWithSIMDUTF = True
@@ -1392,8 +1508,8 @@ job_groups =
-- Platform mapping for GHCup metadata
---------------------------------------------------------------------
-mkPlatform :: Arch -> Opsys -> String
-mkPlatform arch opsys = archName arch <> "-" <> opsysName opsys
+mkPlatform :: (Arch, Opsys, ImageFlavor) -> String
+mkPlatform (arch, opsys, flavor) = archName arch <> "-" <> opsysNameWithFlavor opsys flavor
-- | This map tells us for a specific arch/opsys combo what the job name for
-- nightly/release pipelines is. This is used by the ghcup metadata generation so that
@@ -1438,7 +1554,7 @@ platform_mapping = Map.map go combined_result
process sel =
Map.fromListWith combine
- [ (uncurry mkPlatform (jobPlatform (jobInfo j)), j)
+ [ (mkPlatform (jobPlatform (jobInfo j)), j)
| (sel -> Just j) <- job_groups
]
=====================================
.gitlab/jobs.yaml
=====================================
@@ -303,7 +303,7 @@
".gitlab/ci.sh setup",
".gitlab/ci.sh configure",
".gitlab/ci.sh build_hadrian",
- ".gitlab/ci.sh test_hadrian"
+ ".gitlab/ci.sh smoke_test"
],
"stage": "full-build",
"tags": [
@@ -319,9 +319,9 @@
"CONFIGURE_ARGS": "--with-intree-gmp --enable-strict-ghc-toolchain-check",
"CONF_CC_OPTS_STAGE2": "-fuse-ld=/opt/llvm-mingw-linux/bin/aarch64-w64-mingw32-ld --rtlib=compiler-rt",
"CROSS_EMULATOR": "/opt/wine-arm64ec-msys2-deb12/bin/wine",
- "CROSS_STAGE": "2",
"CROSS_TARGET": "aarch64-unknown-mingw32",
"CXX": "/opt/llvm-mingw-linux/bin/aarch64-w64-mingw32-clang++",
+ "FINAL_CROSS_STAGE": "2",
"HADRIAN_ARGS": "--docs=none",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"LD": "/opt/llvm-mingw-linux/bin/aarch64-w64-mingw32-ld",
@@ -387,7 +387,7 @@
".gitlab/ci.sh setup",
".gitlab/ci.sh configure",
".gitlab/ci.sh build_hadrian",
- ".gitlab/ci.sh test_hadrian"
+ ".gitlab/ci.sh smoke_test"
],
"stage": "full-build",
"tags": [
@@ -403,9 +403,9 @@
"CONFIGURE_ARGS": "--with-intree-gmp --enable-strict-ghc-toolchain-check",
"CONF_CC_OPTS_STAGE2": "-fuse-ld=/opt/llvm-mingw-linux/bin/aarch64-w64-mingw32-ld --rtlib=compiler-rt",
"CROSS_EMULATOR": "/opt/wine-arm64ec-msys2-deb12/bin/wine",
- "CROSS_STAGE": "2",
"CROSS_TARGET": "aarch64-unknown-mingw32",
"CXX": "/opt/llvm-mingw-linux/bin/aarch64-w64-mingw32-clang++",
+ "FINAL_CROSS_STAGE": "2",
"HADRIAN_ARGS": "--docs=none",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"LD": "/opt/llvm-mingw-linux/bin/aarch64-w64-mingw32-ld",
@@ -1111,7 +1111,7 @@
".gitlab/ci.sh setup",
".gitlab/ci.sh configure",
".gitlab/ci.sh build_hadrian",
- ".gitlab/ci.sh test_hadrian"
+ ".gitlab/ci.sh smoke_test"
],
"stage": "full-build",
"tags": [
@@ -1127,9 +1127,9 @@
"CONFIGURE_ARGS": "--with-intree-gmp --enable-strict-ghc-toolchain-check",
"CONF_CC_OPTS_STAGE2": "-fuse-ld=/opt/llvm-mingw-linux/bin/aarch64-w64-mingw32-ld --rtlib=compiler-rt",
"CROSS_EMULATOR": "/opt/wine-arm64ec-msys2-deb12/bin/wine",
- "CROSS_STAGE": "2",
"CROSS_TARGET": "aarch64-unknown-mingw32",
"CXX": "/opt/llvm-mingw-linux/bin/aarch64-w64-mingw32-clang++",
+ "FINAL_CROSS_STAGE": "2",
"HADRIAN_ARGS": "--docs=none",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"LD": "/opt/llvm-mingw-linux/bin/aarch64-w64-mingw32-ld",
@@ -1196,7 +1196,7 @@
".gitlab/ci.sh setup",
".gitlab/ci.sh configure",
".gitlab/ci.sh build_hadrian",
- ".gitlab/ci.sh test_hadrian"
+ ".gitlab/ci.sh smoke_test"
],
"stage": "full-build",
"tags": [
@@ -1212,9 +1212,9 @@
"CONFIGURE_ARGS": "--with-intree-gmp --enable-strict-ghc-toolchain-check",
"CONF_CC_OPTS_STAGE2": "-fuse-ld=/opt/llvm-mingw-linux/bin/aarch64-w64-mingw32-ld --rtlib=compiler-rt",
"CROSS_EMULATOR": "/opt/wine-arm64ec-msys2-deb12/bin/wine",
- "CROSS_STAGE": "2",
"CROSS_TARGET": "aarch64-unknown-mingw32",
"CXX": "/opt/llvm-mingw-linux/bin/aarch64-w64-mingw32-clang++",
+ "FINAL_CROSS_STAGE": "2",
"HADRIAN_ARGS": "--docs=none",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"LD": "/opt/llvm-mingw-linux/bin/aarch64-w64-mingw32-ld",
@@ -2010,8 +2010,8 @@
"BIN_DIST_NAME": "ghc-x86_64-linux-alpine3_23-wasm-cross_wasm32-wasi-release+host_fully_static+text_simdutf",
"BUILD_FLAVOUR": "release+host_fully_static+text_simdutf",
"CONFIGURE_ARGS": "--with-intree-gmp --with-system-libffi --enable-strict-ghc-toolchain-check",
- "CROSS_STAGE": "2",
"CROSS_TARGET": "wasm32-wasi",
+ "FINAL_CROSS_STAGE": "2",
"FIREFOX_LAUNCH_OPTS": "{\"browser\":\"firefox\",\"executablePath\":\"/usr/bin/firefox\"}",
"HADRIAN_ARGS": "--docs=no-sphinx-pdfs --docs=no-sphinx-man",
"RUNTEST_ARGS": "",
@@ -2077,8 +2077,8 @@
"BIN_DIST_NAME": "ghc-x86_64-linux-alpine3_23-wasm-int_native-cross_wasm32-wasi-release+host_fully_static+text_simdutf",
"BUILD_FLAVOUR": "release+host_fully_static+text_simdutf",
"CONFIGURE_ARGS": "--with-intree-gmp --with-system-libffi --enable-strict-ghc-toolchain-check",
- "CROSS_STAGE": "2",
"CROSS_TARGET": "wasm32-wasi",
+ "FINAL_CROSS_STAGE": "2",
"FIREFOX_LAUNCH_OPTS": "{\"browser\":\"firefox\",\"executablePath\":\"/usr/bin/firefox\"}",
"HADRIAN_ARGS": "--docs=no-sphinx-pdfs --docs=no-sphinx-man",
"RUNTEST_ARGS": "",
@@ -2144,8 +2144,8 @@
"BIN_DIST_NAME": "ghc-x86_64-linux-alpine3_23-wasm-unreg-cross_wasm32-wasi-release+host_fully_static+text_simdutf",
"BUILD_FLAVOUR": "release+host_fully_static+text_simdutf",
"CONFIGURE_ARGS": "--enable-unregisterised --with-intree-gmp --with-system-libffi --enable-strict-ghc-toolchain-check",
- "CROSS_STAGE": "2",
"CROSS_TARGET": "wasm32-wasi",
+ "FINAL_CROSS_STAGE": "2",
"FIREFOX_LAUNCH_OPTS": "{\"browser\":\"firefox\",\"executablePath\":\"/usr/bin/firefox\"}",
"HADRIAN_ARGS": "--docs=no-sphinx-pdfs --docs=no-sphinx-man",
"RUNTEST_ARGS": "",
@@ -2212,8 +2212,8 @@
"BUILD_FLAVOUR": "validate",
"CONFIGURE_ARGS": "--with-intree-gmp --enable-strict-ghc-toolchain-check",
"CONFIGURE_WRAPPER": "emconfigure",
- "CROSS_STAGE": "2",
"CROSS_TARGET": "javascript-unknown-ghcjs",
+ "FINAL_CROSS_STAGE": "2",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "-e config.timeout=900",
"TEST_ENV": "x86_64-linux-deb11-emsdk-closure-int_native-cross_javascript-unknown-ghcjs-validate",
@@ -2459,7 +2459,7 @@
".gitlab/ci.sh setup",
".gitlab/ci.sh configure",
".gitlab/ci.sh build_hadrian",
- ".gitlab/ci.sh test_hadrian"
+ ".gitlab/ci.sh smoke_test"
],
"stage": "full-build",
"tags": [
@@ -2471,8 +2471,8 @@
"BUILD_FLAVOUR": "validate",
"CONFIGURE_ARGS": "--with-intree-gmp --enable-strict-ghc-toolchain-check",
"CROSS_EMULATOR": "qemu-aarch64 -L /usr/aarch64-linux-gnu",
- "CROSS_STAGE": "2",
"CROSS_TARGET": "aarch64-linux-gnu",
+ "FINAL_CROSS_STAGE": "2",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "-e config.timeout=900",
"TEST_ENV": "x86_64-linux-deb13-cross_aarch64-linux-gnu-validate",
@@ -2750,7 +2750,8 @@
"paths": [
"ghc-x86_64-linux-deb13-riscv-cross_riscv64-linux-gnu-validate.tar.xz",
"junit.xml",
- "unexpected-test-output.tar.gz"
+ "unexpected-test-output.tar.gz",
+ "ghc-riscv64-linux-deb13-validate.tar.xz"
],
"reports": {
"junit": "junit.xml"
@@ -2783,7 +2784,7 @@
".gitlab/ci.sh setup",
".gitlab/ci.sh configure",
".gitlab/ci.sh build_hadrian",
- ".gitlab/ci.sh test_hadrian"
+ ".gitlab/ci.sh smoke_test"
],
"stage": "full-build",
"tags": [
@@ -2792,11 +2793,12 @@
"variables": {
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-deb13-riscv-cross_riscv64-linux-gnu-validate",
+ "BIN_DIST_NAME_STAGE3": "ghc-riscv64-linux-deb13-validate",
"BUILD_FLAVOUR": "validate",
"CONFIGURE_ARGS": "--with-intree-gmp --enable-strict-ghc-toolchain-check",
"CROSS_EMULATOR": "qemu-riscv64 -L /usr/riscv64-linux-gnu",
- "CROSS_STAGE": "2",
"CROSS_TARGET": "riscv64-linux-gnu",
+ "FINAL_CROSS_STAGE": "3",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "-e config.timeout=900",
"TEST_ENV": "x86_64-linux-deb13-riscv-cross_riscv64-linux-gnu-validate",
@@ -3687,7 +3689,7 @@
".gitlab/ci.sh setup",
".gitlab/ci.sh configure",
".gitlab/ci.sh build_hadrian",
- ".gitlab/ci.sh test_hadrian"
+ ".gitlab/ci.sh smoke_test"
],
"stage": "full-build",
"tags": [
@@ -3699,8 +3701,8 @@
"BUILD_FLAVOUR": "validate",
"CONFIGURE_ARGS": "--with-intree-gmp --enable-strict-ghc-toolchain-check",
"CROSS_EMULATOR": "qemu-loongarch64 -L /usr/loongarch64-linux-gnu",
- "CROSS_STAGE": "2",
"CROSS_TARGET": "loongarch64-linux-gnu",
+ "FINAL_CROSS_STAGE": "2",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "-e config.timeout=900",
"TEST_ENV": "x86_64-linux-ubuntu24_04-loongarch-cross_loongarch64-linux-gnu-validate",
@@ -5995,8 +5997,8 @@
"BIN_DIST_NAME": "ghc-x86_64-linux-alpine3_23-wasm-cross_wasm32-wasi-release+host_fully_static+text_simdutf",
"BUILD_FLAVOUR": "release+host_fully_static+text_simdutf",
"CONFIGURE_ARGS": "--with-intree-gmp --with-system-libffi --enable-strict-ghc-toolchain-check",
- "CROSS_STAGE": "2",
"CROSS_TARGET": "wasm32-wasi",
+ "FINAL_CROSS_STAGE": "2",
"FIREFOX_LAUNCH_OPTS": "{\"browser\":\"firefox\",\"executablePath\":\"/usr/bin/firefox\"}",
"HADRIAN_ARGS": "--docs=no-sphinx-pdfs --docs=no-sphinx-man",
"RUNTEST_ARGS": "",
@@ -6062,8 +6064,8 @@
"BIN_DIST_NAME": "ghc-x86_64-linux-alpine3_23-wasm-int_native-cross_wasm32-wasi-release+host_fully_static+text_simdutf",
"BUILD_FLAVOUR": "release+host_fully_static+text_simdutf",
"CONFIGURE_ARGS": "--with-intree-gmp --with-system-libffi --enable-strict-ghc-toolchain-check",
- "CROSS_STAGE": "2",
"CROSS_TARGET": "wasm32-wasi",
+ "FINAL_CROSS_STAGE": "2",
"FIREFOX_LAUNCH_OPTS": "{\"browser\":\"firefox\",\"executablePath\":\"/usr/bin/firefox\"}",
"HADRIAN_ARGS": "--docs=no-sphinx-pdfs --docs=no-sphinx-man",
"RUNTEST_ARGS": "",
@@ -6129,8 +6131,8 @@
"BIN_DIST_NAME": "ghc-x86_64-linux-alpine3_23-wasm-unreg-cross_wasm32-wasi-release+host_fully_static+text_simdutf",
"BUILD_FLAVOUR": "release+host_fully_static+text_simdutf",
"CONFIGURE_ARGS": "--enable-unregisterised --with-intree-gmp --with-system-libffi --enable-strict-ghc-toolchain-check",
- "CROSS_STAGE": "2",
"CROSS_TARGET": "wasm32-wasi",
+ "FINAL_CROSS_STAGE": "2",
"FIREFOX_LAUNCH_OPTS": "{\"browser\":\"firefox\",\"executablePath\":\"/usr/bin/firefox\"}",
"HADRIAN_ARGS": "--docs=no-sphinx-pdfs --docs=no-sphinx-man",
"RUNTEST_ARGS": "",
@@ -6196,8 +6198,8 @@
"BUILD_FLAVOUR": "validate",
"CONFIGURE_ARGS": "--with-intree-gmp --enable-strict-ghc-toolchain-check",
"CONFIGURE_WRAPPER": "emconfigure",
- "CROSS_STAGE": "2",
"CROSS_TARGET": "javascript-unknown-ghcjs",
+ "FINAL_CROSS_STAGE": "2",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "-e config.timeout=900",
"TEST_ENV": "x86_64-linux-deb11-emsdk-closure-int_native-cross_javascript-unknown-ghcjs-validate",
@@ -6439,7 +6441,7 @@
".gitlab/ci.sh setup",
".gitlab/ci.sh configure",
".gitlab/ci.sh build_hadrian",
- ".gitlab/ci.sh test_hadrian"
+ ".gitlab/ci.sh smoke_test"
],
"stage": "full-build",
"tags": [
@@ -6451,8 +6453,8 @@
"BUILD_FLAVOUR": "validate",
"CONFIGURE_ARGS": "--with-intree-gmp --enable-strict-ghc-toolchain-check",
"CROSS_EMULATOR": "qemu-aarch64 -L /usr/aarch64-linux-gnu",
- "CROSS_STAGE": "2",
"CROSS_TARGET": "aarch64-linux-gnu",
+ "FINAL_CROSS_STAGE": "2",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "-e config.timeout=900",
"TEST_ENV": "x86_64-linux-deb13-cross_aarch64-linux-gnu-validate",
@@ -6726,7 +6728,8 @@
"paths": [
"ghc-x86_64-linux-deb13-riscv-cross_riscv64-linux-gnu-validate.tar.xz",
"junit.xml",
- "unexpected-test-output.tar.gz"
+ "unexpected-test-output.tar.gz",
+ "ghc-riscv64-linux-deb13-validate.tar.xz"
],
"reports": {
"junit": "junit.xml"
@@ -6759,7 +6762,7 @@
".gitlab/ci.sh setup",
".gitlab/ci.sh configure",
".gitlab/ci.sh build_hadrian",
- ".gitlab/ci.sh test_hadrian"
+ ".gitlab/ci.sh smoke_test"
],
"stage": "full-build",
"tags": [
@@ -6768,11 +6771,12 @@
"variables": {
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-deb13-riscv-cross_riscv64-linux-gnu-validate",
+ "BIN_DIST_NAME_STAGE3": "ghc-riscv64-linux-deb13-validate",
"BUILD_FLAVOUR": "validate",
"CONFIGURE_ARGS": "--with-intree-gmp --enable-strict-ghc-toolchain-check",
"CROSS_EMULATOR": "qemu-riscv64 -L /usr/riscv64-linux-gnu",
- "CROSS_STAGE": "2",
"CROSS_TARGET": "riscv64-linux-gnu",
+ "FINAL_CROSS_STAGE": "3",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "-e config.timeout=900",
"TEST_ENV": "x86_64-linux-deb13-riscv-cross_riscv64-linux-gnu-validate",
@@ -7650,7 +7654,7 @@
".gitlab/ci.sh setup",
".gitlab/ci.sh configure",
".gitlab/ci.sh build_hadrian",
- ".gitlab/ci.sh test_hadrian"
+ ".gitlab/ci.sh smoke_test"
],
"stage": "full-build",
"tags": [
@@ -7662,8 +7666,8 @@
"BUILD_FLAVOUR": "validate",
"CONFIGURE_ARGS": "--with-intree-gmp --enable-strict-ghc-toolchain-check",
"CROSS_EMULATOR": "qemu-loongarch64 -L /usr/loongarch64-linux-gnu",
- "CROSS_STAGE": "2",
"CROSS_TARGET": "loongarch64-linux-gnu",
+ "FINAL_CROSS_STAGE": "2",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "-e config.timeout=900",
"TEST_ENV": "x86_64-linux-ubuntu24_04-loongarch-cross_loongarch64-linux-gnu-validate",
=====================================
hadrian/src/Rules/BinaryDist.hs
=====================================
@@ -70,6 +70,13 @@ These are the steps to build a bindist:
to
<build root>/<bindist-dir>/ghc-<X>.<Y>.<Z>-<arch>-<os>/lib
+- for cross-compilers, overwrite the implicitly copied (previous step)
+ <build root>/<library-stage-dir>/lib/targets/default.target file with that of
+ the executable stage. I.e. copy:
+ <build root>/<executable-stage-dir>/lib/targets/default.target
+ to
+ <build root>/<bindist-dir>/ghc-<X>.<Y>.<Z>-<arch>-<os>/lib/targets/default.target
+
- copy the generated docs (user guide, haddocks, etc):
<build root>/doc/
to
@@ -248,6 +255,13 @@ buildBinDistDir root conf@BindistConfig{..} = do
copyDirectory (ghcBuildDir -/- "lib") bindistFilesDir
+ -- For cross-compilers we need to override the `targets/default.target`
+ -- file that was implicitly copied from the library stage, because this
+ -- describes a target native compiler (stage3) and not a cross-compiler.
+ when (library_stage /= executable_stage) $
+ copyFile (root -/- stageString executable_stage -/- "lib" -/- "targets" -/- "default.target")
+ (bindistFilesDir -/- "lib" -/- "targets" -/- "default.target")
+
-- Regenerate settings file without LibDir. For bindists, LibDir should
-- be derived from topdir at runtime such that the GHC binary is
-- relocatable. The package DB is always at "package.conf.d" relative to
=====================================
hadrian/src/Rules/Generate.hs
=====================================
@@ -255,11 +255,14 @@ generateRules = do
prefix = root -/- stageString compilerStage -/- "lib"
go gen file = generate file (semiEmptyTarget compilerStage) gen
(prefix -/- "settings") %> \out -> do
- -- Stage0 has no library or package DB of its own (the
- -- bootstrapping compiler uses Stage1's); for any other stage the
- -- package DB lives where the LibDir redirect points (this stage's
- -- own lib dir, or the successor's when @compilerStage@ is a cross
- -- stage).
+ -- @compilerStage@ is the stage that builds the compiler, i.e. the
+ -- binary whose settings these are; @libraryStage@ is the stage
+ -- whose libraries and package DB that compiler uses. The two
+ -- differ in two cases: Stage0 has no library or package DB of its
+ -- own (the bootstrapping compiler uses Stage1's), and cross
+ -- stages use the successor stage's libraries (a cross compiler
+ -- requires libs from the successor stage, otherwise they are
+ -- compiled for the host and not the target).
isCross <- crossStage compilerStage
let libraryStage = case compilerStage of
Stage0 {} -> Stage1
@@ -273,11 +276,23 @@ generateRules = do
else root -/- stageString libraryStage -/- "lib"
relPkgDb = makeRelativeNoSysLink libTopDir pkgDb
go (generateSettings out True relPkgDb libraryStage) out
- (prefix -/- "targets" -/- "default.target") %> \out -> go (show <$> expr (targetStage (succStage compilerStage))) out
+ (prefix -/- "targets" -/- "default.target") %> \out ->
+ go (generateTargetFile compilerStage) out
where
file <~+ gen = file %> \out -> generate out emptyTarget gen >> makeExecutable out
+ generateTargetFile :: Stage -> Expr String
+ generateTargetFile compilerStage = do
+ isCrossStage <- if compilerStage < Stage3
+ then expr (crossStage compilerStage)
+ else pure False
+ let libraryStage = case compilerStage of
+ Stage0 {} -> Stage1
+ _ -> if isCrossStage then succStage compilerStage else compilerStage
+ tgt <- expr (targetStage libraryStage)
+ pure $ show tgt { tgtLocallyExecutable = not isCrossStage }
+
-- TODO: Use the Types, Luke! (drop partial function)
-- We sometimes need to evaluate expressions that do not require knowing all
-- information about the context. In this case, we don't want to know anything.
@@ -421,8 +436,9 @@ bindistRules = do
, interpolateVar "HostOS_CPP" $ fmap cppify $ interp $ queryHost queryOS
- -- Stage2 always targets the final architecture. Thus, we can use a
- -- constant stage here.
+ -- Stage2 always targets the target (as in build, host, target)
+ -- architecture. Thus, we can use it constant stage here to find
+ -- information about the target architecture.
, interpolateVar "TargetPlatform" $ getTarget Stage2 targetPlatformTriple
, interpolateVar "TargetPlatform_CPP" $ cppify <$> getTarget Stage2 targetPlatformTriple
, interpolateVar "TargetArch_CPP" $ cppify <$> getTarget Stage2 queryArch
=====================================
hadrian/src/Settings/Packages.hs
=====================================
@@ -112,8 +112,11 @@ packageArgs = do
, compilerStageOption ghcDebugAssertions ? arg "-DDEBUG" ]
, builder (Cabal Flags) ? mconcat
- [ andM [expr (ghcWithInterpreter stage), orM [expr (notM cross), stage1]] `cabalFlag` "interpreter"
- , andM [expr (ghcWithInterpreter stage), notM (expr cross)] `cabalFlag` "internal-interpreter"
+ -- In the context of cross-compilation, stage2 runs on the target
+ -- and thus can - if the architecture supports it - provide the
+ -- interpreter natively.
+ [ andM [expr (ghcWithInterpreter stage), orM [expr (notM cross), stage1, stage2]] `cabalFlag` "interpreter"
+ , andM [expr (ghcWithInterpreter stage), orM [expr (notM cross), stage2]] `cabalFlag` "internal-interpreter"
, ifM stage0
-- We build a threaded stage 1 if the bootstrapping compiler
-- supports it.
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/b2d34f9787bff31b3e906387bdd94b…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/b2d34f9787bff31b3e906387bdd94b…
You're receiving this email because of your account on gitlab.haskell.org. Manage all notifications: https://gitlab.haskell.org/-/profile/notifications | Help: https://gitlab.haskell.org/help
1
0
[Git][ghc/ghc][wip/rafl/meaningful-main-return] Implement MeaningfulMainReturn
by Florian Ragwitz (@rafl) 11 Oct '26
by Florian Ragwitz (@rafl) 11 Oct '26
11 Oct '26
Florian Ragwitz pushed to branch wip/rafl/meaningful-main-return at Glasgow Haskell Compiler / GHC
Commits:
9099eb8d by Florian Ragwitz at 2026-10-10T23:28:44-07:00
Implement MeaningfulMainReturn
As per ghc-proposal#631, with one small adjustment explained in the comments.
Fixes #24848.
- - - - -
45 changed files:
- + changelog.d/MeaningfulMainReturn
- compiler/GHC/Builtin/KnownOccs.hs
- compiler/GHC/Driver/Flags.hs
- compiler/GHC/Driver/Session.hs
- compiler/GHC/Tc/Errors/Ppr.hs
- compiler/GHC/Tc/Errors/Types.hs
- compiler/GHC/Tc/Module.hs
- compiler/GHC/Types/Error/Codes.hs
- + docs/users_guide/exts/meaningful_main_return.rst
- docs/users_guide/exts/misc.rst
- docs/users_guide/using-warnings.rst
- libraries/base/src/GHC/Essentials.hs
- libraries/containers
- libraries/ghc-internal/src/GHC/Internal/LanguageExtensions.hs
- testsuite/tests/driver/T4437.hs
- + testsuite/tests/ghc-e/should_run/T9086.stderr
- testsuite/tests/interface-stability/base-exports.stdout
- testsuite/tests/interface-stability/base-exports.stdout-javascript-unknown-ghcjs
- testsuite/tests/interface-stability/base-exports.stdout-mingw32
- testsuite/tests/interface-stability/template-haskell-exports.stdout
- + testsuite/tests/meaningful-main-return/Imported.hs
- + testsuite/tests/meaningful-main-return/MainReturn_constrained_disabled.stderr
- + testsuite/tests/meaningful-main-return/MainReturn_exit_code_alias_disabled.stderr
- + testsuite/tests/meaningful-main-return/MainReturn_exit_code_bottom_disabled.stderr
- + testsuite/tests/meaningful-main-return/MainReturn_exit_code_bottom_enabled_run.stderr
- + testsuite/tests/meaningful-main-return/MainReturn_exit_code_disabled.stderr
- + testsuite/tests/meaningful-main-return/MainReturn_exit_success_disabled.stderr
- + testsuite/tests/meaningful-main-return/MainReturn_family_always_exit_disabled.stderr
- + testsuite/tests/meaningful-main-return/MainReturn_family_invalid_disabled.stderr
- + testsuite/tests/meaningful-main-return/MainReturn_family_invalid_enabled.stderr
- + testsuite/tests/meaningful-main-return/MainReturn_family_stuck_disabled.stderr
- + testsuite/tests/meaningful-main-return/MainReturn_family_stuck_enabled.stderr
- + testsuite/tests/meaningful-main-return/MainReturn_imported_disabled.stderr
- + testsuite/tests/meaningful-main-return/MainReturn_imported_invalid_disabled.stderr
- + testsuite/tests/meaningful-main-return/MainReturn_imported_invalid_enabled.stderr
- + testsuite/tests/meaningful-main-return/MainReturn_imported_wrapped_disabled.stderr
- + testsuite/tests/meaningful-main-return/MainReturn_int_disabled.stderr
- + testsuite/tests/meaningful-main-return/MainReturn_int_enabled.stderr
- + testsuite/tests/meaningful-main-return/MainReturn_newtype_disabled.stderr
- + testsuite/tests/meaningful-main-return/MainReturn_newtype_enabled.stderr
- + testsuite/tests/meaningful-main-return/MainReturn_typeapp_disabled.stderr
- + testsuite/tests/meaningful-main-return/MeaningfulMainReturn.hs
- + testsuite/tests/meaningful-main-return/all.T
- testsuite/tests/parser/should_compile/T7476/T7476.hs
- + testsuite/tests/typecheck/should_compile/tc104.stderr
The diff was not included because it is too large.
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/9099eb8dce2c316538aac298bd1af7c…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/9099eb8dce2c316538aac298bd1af7c…
You're receiving this email because of your account on gitlab.haskell.org. Manage all notifications: https://gitlab.haskell.org/-/profile/notifications | Help: https://gitlab.haskell.org/help
1
0
[Git][ghc/ghc][wip/rafl/meaningful-main-return] 7 commits: Preserve sign of zero when parsing -0.0#
by Florian Ragwitz (@rafl) 11 Oct '26
by Florian Ragwitz (@rafl) 11 Oct '26
11 Oct '26
Florian Ragwitz pushed to branch wip/rafl/meaningful-main-return at Glasgow Haskell Compiler / GHC
Commits:
ffa56ae4 by sheaf at 2026-10-09T17:15:59+02:00
Preserve sign of zero when parsing -0.0#
This commit leverages the recently added GHC.Types.Literal.Floating
module in order to preserve the sign of negative zero from
source-written floating-point literals.
Fixes #27545
- - - - -
d538cac9 by Facundo Domínguez at 2026-10-09T20:26:38-04:00
Propagate annotations to simple interfaces
This allows annotations to be visible to plugins when run by
haddock. The LiquidHaskell plugin needs the annotations, in particular.
Fixes #26761
- - - - -
32c4f4ab by meooow25 at 2026-10-09T20:27:28-04:00
Bump containers submodule to 0.8.1
And fix affected tests.
* T4086a: containers depends on template-haskell-lift now instead of
template-haskell.
* T22611: Updated to be less dependent on containers internals.
- - - - -
c786065e by sheaf at 2026-10-09T20:28:20-04:00
Use an explicit pattern match in toIfaceIdDetails
The old wildcard pattern let this code bit rot: it did not properly account
for recently added 'IdDetails' such as 'RepPolyId', which resulted in
spurious 'pprTrace' messages that could even pollute HLS sessions.
Fixes #23785
- - - - -
e7cacf59 by sheaf at 2026-10-09T20:29:09-04:00
Take into account ifKind in freeNamesIfDecl
Commit 3c2f4bb4 added the 'ifKind' field to various constructors
of 'IfaceDecl', which preserves the original kind (before type synonym
expansion) for better error messages.
However, that commit forgot to update 'freeNamesIfDecl' correspondingly.
This could result in a "urk! lookup local fingerpring" crash when e.g.
a type's kind uses a type synonym defined later, as we failed to add a
dependency on the type synonym during dependency analysis.
Fixes #27916
- - - - -
7d7786e4 by Florian Ragwitz at 2026-10-10T18:36:21-07:00
Move exitWith into GHC.IO.Exception
This is low enough within the hierarchy of base such that it can be imported
into GHC.Essentials.
The implementation of exitWith is slightly changed to avoid having to import
Data.Bool, which would lead to a dependency cycle.
We chose to keep it in base rather than moving it up all the way to
GHC.Internal.IO.Exception to allow a reinstallable base to change it
independently of GHC.
With this, we can now have a known occurrence for GHC to reference in order to
implement GHC proposal #631 (#24848).
- - - - -
eea8b99a by Florian Ragwitz at 2026-10-10T18:36:22-07:00
Implement MeaningfulMainReturn
As per ghc-proposal#631, with one small adjustment explained in the comments.
Fixes #24848.
- - - - -
69 changed files:
- + changelog.d/26761
- + changelog.d/MeaningfulMainReturn
- + changelog.d/T23785
- + changelog.d/T27545
- + changelog.d/T27916
- compiler/GHC/Builtin/KnownOccs.hs
- compiler/GHC/Core/Make.hs
- compiler/GHC/CoreToIface.hs
- compiler/GHC/Driver/Flags.hs
- compiler/GHC/Driver/Session.hs
- compiler/GHC/Hs/Lit.hs
- compiler/GHC/HsToCore/Match/Literal.hs
- compiler/GHC/Iface/Decl.hs
- compiler/GHC/Iface/Syntax.hs
- compiler/GHC/Iface/Tidy.hs
- compiler/GHC/Tc/Errors/Ppr.hs
- compiler/GHC/Tc/Errors/Types.hs
- compiler/GHC/Tc/Module.hs
- compiler/GHC/Types/Error/Codes.hs
- compiler/Language/Haskell/Syntax/Lit.hs
- + docs/users_guide/exts/meaningful_main_return.rst
- docs/users_guide/exts/misc.rst
- docs/users_guide/using-warnings.rst
- libraries/base/src/GHC/Essentials.hs
- libraries/base/src/GHC/IO/Exception.hs
- libraries/base/src/System/Exit.hs
- libraries/containers
- libraries/ghc-internal/src/GHC/Internal/LanguageExtensions.hs
- testsuite/tests/driver/T4437.hs
- + testsuite/tests/ghc-e/should_run/T9086.stderr
- testsuite/tests/interface-stability/base-exports.stdout
- testsuite/tests/interface-stability/base-exports.stdout-javascript-unknown-ghcjs
- testsuite/tests/interface-stability/base-exports.stdout-mingw32
- testsuite/tests/interface-stability/template-haskell-exports.stdout
- + testsuite/tests/meaningful-main-return/MainReturn_constrained_disabled.stderr
- + testsuite/tests/meaningful-main-return/MainReturn_exit_code_alias_disabled.stderr
- + testsuite/tests/meaningful-main-return/MainReturn_exit_code_bottom_disabled.stderr
- + testsuite/tests/meaningful-main-return/MainReturn_exit_code_bottom_enabled_run.stderr
- + testsuite/tests/meaningful-main-return/MainReturn_exit_code_disabled.stderr
- + testsuite/tests/meaningful-main-return/MainReturn_exit_success_disabled.stderr
- + testsuite/tests/meaningful-main-return/MainReturn_family_always_exit_disabled.stderr
- + testsuite/tests/meaningful-main-return/MainReturn_family_invalid_disabled.stderr
- + testsuite/tests/meaningful-main-return/MainReturn_family_invalid_enabled.stderr
- + testsuite/tests/meaningful-main-return/MainReturn_family_stuck_disabled.stderr
- + testsuite/tests/meaningful-main-return/MainReturn_family_stuck_enabled.stderr
- + testsuite/tests/meaningful-main-return/MainReturn_int_disabled.stderr
- + testsuite/tests/meaningful-main-return/MainReturn_int_enabled.stderr
- + testsuite/tests/meaningful-main-return/MainReturn_newtype_disabled.stderr
- + testsuite/tests/meaningful-main-return/MainReturn_newtype_enabled.stderr
- + testsuite/tests/meaningful-main-return/MeaningfulMainReturn.hs
- + testsuite/tests/meaningful-main-return/all.T
- + testsuite/tests/numeric/should_run/T27545.hs
- + testsuite/tests/numeric/should_run/T27545.stdout
- testsuite/tests/numeric/should_run/all.T
- testsuite/tests/package/T4806a.stderr
- testsuite/tests/package/all.T
- testsuite/tests/parser/should_compile/T7476/T7476.hs
- + testsuite/tests/plugins/T26761.hs
- + testsuite/tests/plugins/T26761.stderr
- + testsuite/tests/plugins/T26761Plugin.hs
- + testsuite/tests/plugins/T26761a.hs
- testsuite/tests/plugins/all.T
- testsuite/tests/simplCore/should_compile/T22611.hs
- testsuite/tests/simplCore/should_compile/T22611.stderr
- + testsuite/tests/simplCore/should_compile/T22611a.hs
- testsuite/tests/simplCore/should_compile/all.T
- + testsuite/tests/typecheck/should_compile/T27916.hs
- testsuite/tests/typecheck/should_compile/all.T
- + testsuite/tests/typecheck/should_compile/tc104.stderr
The diff was not included because it is too large.
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/29a91779a63413b1ae5976a003f322…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/29a91779a63413b1ae5976a003f322…
You're receiving this email because of your account on gitlab.haskell.org. Manage all notifications: https://gitlab.haskell.org/-/profile/notifications | Help: https://gitlab.haskell.org/help
1
0