summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsheaf <sam.derbyshire@gmail.com>2022-09-16 12:54:09 +0200
committerMarge Bot <ben+marge-bot@smart-cactus.org>2022-09-20 03:50:06 -0400
commit545ff490144ed3ddd596d2a0c01b0a16b5528f63 (patch)
tree4e6061e82dcadda09e8eb43914b4e32cb1ad400b
parent19f45a25f4b14fff081d75f506e7992c81371fc5 (diff)
downloadhaskell-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).
-rw-r--r--configure.ac1
-rw-r--r--hadrian/cfg/system.config.in9
-rw-r--r--hadrian/src/Oracles/Flag.hs9
-rw-r--r--hadrian/src/Settings/Builders/Ar.hs6
4 files changed, 18 insertions, 7 deletions
diff --git a/configure.ac b/configure.ac
index e7fce23eec..f4c66de811 100644
--- a/configure.ac
+++ b/configure.ac
@@ -201,6 +201,7 @@ if test "$WithGhc" != ""; then
fi
BOOTSTRAPPING_GHC_INFO_FIELD([AR_OPTS_STAGE0],[ar flags])
BOOTSTRAPPING_GHC_INFO_FIELD([ArSupportsAtFile_STAGE0],[ar supports at file])
+ BOOTSTRAPPING_GHC_INFO_FIELD([ArSupportsDashL_STAGE0],[ar supports -L])
BOOTSTRAPPING_GHC_INFO_FIELD([SUPPORT_SMP_STAGE0],[Support SMP])
BOOTSTRAPPING_GHC_INFO_FIELD([RTS_WAYS_STAGE0],[RTS ways])
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