diff options
author | sheaf <sam.derbyshire@gmail.com> | 2022-09-16 12:54:09 +0200 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2022-09-20 03:50:06 -0400 |
commit | 545ff490144ed3ddd596d2a0c01b0a16b5528f63 (patch) | |
tree | 4e6061e82dcadda09e8eb43914b4e32cb1ad400b /hadrian | |
parent | 19f45a25f4b14fff081d75f506e7992c81371fc5 (diff) | |
download | haskell-545ff490144ed3ddd596d2a0c01b0a16b5528f63.tar.gz |
Hadrian: merge archives even in stage 0
We now always merge .a archives when ar supports -L.
This change is necessary in order to bootstrap GHC using GHC 9.4
on Windows, as nested archives aren't supported.
Not doing so triggered bug #21990 when trying to use the Win32
package, with errors such as:
Not a x86_64 PE+ file.
Unknown COFF 4 type in getHeaderInfo.
ld.lld: error: undefined symbol: Win32zm2zi12zi0zi0_SystemziWin32ziConsoleziCtrlHandler_withConsoleCtrlHandler1_info
We have to be careful about which ar is meant: in stage 0, the check
should be done on the system ar (system-ar in system.config).
Diffstat (limited to 'hadrian')
-rw-r--r-- | hadrian/cfg/system.config.in | 9 | ||||
-rw-r--r-- | hadrian/src/Oracles/Flag.hs | 9 | ||||
-rw-r--r-- | hadrian/src/Settings/Builders/Ar.hs | 6 |
3 files changed, 17 insertions, 7 deletions
diff --git a/hadrian/cfg/system.config.in b/hadrian/cfg/system.config.in index f3a4e3f438..0541d90138 100644 --- a/hadrian/cfg/system.config.in +++ b/hadrian/cfg/system.config.in @@ -39,10 +39,11 @@ python = @PythonCmd@ # Information about builders: #============================ -ar-supports-at-file = @ArSupportsAtFile@ -ar-supports-dash-l = @ArSupportsDashL@ -cc-llvm-backend = @CcLlvmBackend@ -hs-cpp-args = @HaskellCPPArgs@ +ar-supports-at-file = @ArSupportsAtFile@ +ar-supports-dash-l = @ArSupportsDashL@ +system-ar-supports-dash-l = @ArSupportsDashL_STAGE0@ +cc-llvm-backend = @CcLlvmBackend@ +hs-cpp-args = @HaskellCPPArgs@ # Build options: #=============== diff --git a/hadrian/src/Oracles/Flag.hs b/hadrian/src/Oracles/Flag.hs index 7c05be5a68..bf0aa62383 100644 --- a/hadrian/src/Oracles/Flag.hs +++ b/hadrian/src/Oracles/Flag.hs @@ -5,7 +5,8 @@ module Oracles.Flag ( platformSupportsSharedLibs, platformSupportsGhciObjects, targetSupportsSMP, - useLibffiForAdjustors + useLibffiForAdjustors, + arSupportsDashL ) where import Hadrian.Oracles.TextFile @@ -16,6 +17,7 @@ import Oracles.Setting data Flag = ArSupportsAtFile | ArSupportsDashL + | SystemArSupportsDashL | CrossCompiling | CcLlvmBackend | GhcUnregisterised @@ -39,6 +41,7 @@ flag f = do let key = case f of ArSupportsAtFile -> "ar-supports-at-file" ArSupportsDashL -> "ar-supports-dash-l" + SystemArSupportsDashL-> "system-ar-supports-dash-l" CrossCompiling -> "cross-compiling" CcLlvmBackend -> "cc-llvm-backend" GhcUnregisterised -> "ghc-unregisterised" @@ -69,6 +72,10 @@ platformSupportsGhciObjects :: Action Bool platformSupportsGhciObjects = not . null <$> settingsFileSetting SettingsFileSetting_MergeObjectsCommand +arSupportsDashL :: Stage -> Action Bool +arSupportsDashL (Stage0 {}) = flag SystemArSupportsDashL +arSupportsDashL _ = flag ArSupportsDashL + platformSupportsSharedLibs :: Action Bool platformSupportsSharedLibs = do windows <- isWinTarget diff --git a/hadrian/src/Settings/Builders/Ar.hs b/hadrian/src/Settings/Builders/Ar.hs index 08379f07f8..65c9d5bb59 100644 --- a/hadrian/src/Settings/Builders/Ar.hs +++ b/hadrian/src/Settings/Builders/Ar.hs @@ -6,7 +6,9 @@ import Settings.Builders.Common -- want to place these in a response file. This is handled in -- 'Hadrian.Builder.Ar.runAr'. arBuilderArgs :: Args -arBuilderArgs = mconcat +arBuilderArgs = do + stage <- getStage + mconcat [ builder (Ar Pack) ? mconcat [ -- When building on platforms which don't support object merging -- we must use the -L flag supported by llvm-ar, which ensures that @@ -14,7 +16,7 @@ arBuilderArgs = mconcat -- not added as a single file. This requires that we are using llvm-ar -- -- See Note [Object merging] in GHC.Driver.Pipeline.Execute for details. - ifM ((&&) <$> notStage0 <*> expr (flag ArSupportsDashL)) (arg "qL") (arg "q") + ifM (expr $ arSupportsDashL stage) (arg "qL") (arg "q") , arg =<< getOutput ] , builder (Ar Unpack) ? mconcat |