diff options
author | Ben Gamari <ben@smart-cactus.org> | 2021-08-19 09:41:12 -0400 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2021-09-07 08:03:03 -0400 |
commit | 81975ef375de07a0ea5a69596b2077d7f5959182 (patch) | |
tree | 4f83ffaf128c48a95f43f63b261c5ff0aa6db9fb /hadrian | |
parent | f72aa31d36f4fbab0258cae1c94ac0cc24682ab9 (diff) | |
download | haskell-81975ef375de07a0ea5a69596b2077d7f5959182.tar.gz |
hadrian: Ensure that settings is regenerated during bindist installation
Previously Hadrian would simply install the settings file generated in
the build environment during the binary distribution installation. This
is wrong since these environments may differ (e.g. different `cc`
versions).
We noticed on Darwin when installation of a binary distribution produced
on a newer Darwin release resulted in a broken compiler due to the
installed `settings` file incorrectly claiming that `cc` supported
`-no-pie`.
Fixing this sadly requires a bit of code duplication since `settings` is
produced by Hadrian and not `configure`. For now I have simply
duplicated the `settings` generation logic used by the Make build system
into Hadrian's bindist Makefile.
Ultimately the solution will probably involve shipping a freestanding
utility to replace `configure`'s toolchain probing logic and generate a
toolchain description file (similar to `settings`) as described
in #19877.
Fixes #20253.
Diffstat (limited to 'hadrian')
-rw-r--r-- | hadrian/bindist/Makefile | 58 | ||||
-rw-r--r-- | hadrian/src/Rules/BinaryDist.hs | 7 |
2 files changed, 64 insertions, 1 deletions
diff --git a/hadrian/bindist/Makefile b/hadrian/bindist/Makefile index 74d2def7f5..c04e8a75bb 100644 --- a/hadrian/bindist/Makefile +++ b/hadrian/bindist/Makefile @@ -95,6 +95,62 @@ ActualLibsDir=${ghclibdir}/lib endif WrapperBinsDir=${bindir} +# N.B. this is duplicated from includes/ghc.mk. +lib/settings : + $(call removeFiles,$@) + @echo '[("GCC extra via C opts", "$(GccExtraViaCOpts)")' >> $@ + @echo ',("C compiler command", "$(SettingsCCompilerCommand)")' >> $@ + @echo ',("C compiler flags", "$(SettingsCCompilerFlags)")' >> $@ + @echo ',("C++ compiler flags", "$(SettingsCxxCompilerFlags)")' >> $@ + @echo ',("C compiler link flags", "$(SettingsCCompilerLinkFlags)")' >> $@ + @echo ',("C compiler supports -no-pie", "$(SettingsCCompilerSupportsNoPie)")' >> $@ + @echo ',("Haskell CPP command", "$(SettingsHaskellCPPCommand)")' >> $@ + @echo ',("Haskell CPP flags", "$(SettingsHaskellCPPFlags)")' >> $@ + @echo ',("ld command", "$(SettingsLdCommand)")' >> $@ + @echo ',("ld flags", "$(SettingsLdFlags)")' >> $@ + @echo ',("ld supports compact unwind", "$(LdHasNoCompactUnwind)")' >> $@ + @echo ',("ld supports build-id", "$(LdHasBuildId)")' >> $@ + @echo ',("ld supports filelist", "$(LdHasFilelist)")' >> $@ + @echo ',("ld is GNU ld", "$(LdIsGNULd)")' >> $@ + @echo ',("Merge objects command", "$(SettingsMergeObjectsCommand)")' >> $@ + @echo ',("Merge objects flags", "$(SettingsMergeObjectsFlags)")' >> $@ + @echo ',("ar command", "$(SettingsArCommand)")' >> $@ + @echo ',("ar flags", "$(ArArgs)")' >> $@ + @echo ',("ar supports at file", "$(ArSupportsAtFile)")' >> $@ + @echo ',("ranlib command", "$(SettingsRanlibCommand)")' >> $@ + @echo ',("otool command", "$(SettingsOtoolCommand)")' >> $@ + @echo ',("install_name_tool command", "$(SettingsInstallNameToolCommand)")' >> $@ + @echo ',("touch command", "$(SettingsTouchCommand)")' >> $@ + @echo ',("dllwrap command", "$(SettingsDllWrapCommand)")' >> $@ + @echo ',("windres command", "$(SettingsWindresCommand)")' >> $@ + @echo ',("libtool command", "$(SettingsLibtoolCommand)")' >> $@ + @echo ',("unlit command", "$$topdir/bin/unlit")' >> $@ + @echo ',("cross compiling", "$(CrossCompiling)")' >> $@ + @echo ',("target platform string", "$(TARGETPLATFORM)")' >> $@ + @echo ',("target os", "$(HaskellTargetOs)")' >> $@ + @echo ',("target arch", "$(HaskellTargetArch)")' >> $@ + @echo ',("target word size", "$(TargetWordSize)")' >> $@ + @echo ',("target word big endian", "$(TargetWordBigEndian)")' >> $@ + @echo ',("target has GNU nonexec stack", "$(TargetHasGnuNonexecStack)")' >> $@ + @echo ',("target has .ident directive", "$(TargetHasIdentDirective)")' >> $@ + @echo ',("target has subsections via symbols", "$(TargetHasSubsectionsViaSymbols)")' >> $@ + @echo ',("target has RTS linker", "$(TargetHasRTSLinker)")' >> $@ + @echo ',("Unregisterised", "$(GhcUnregisterised)")' >> $@ + @echo ',("LLVM target", "$(LLVMTarget_CPP)")' >> $@ + @echo ',("LLVM llc command", "$(SettingsLlcCommand)")' >> $@ + @echo ',("LLVM opt command", "$(SettingsOptCommand)")' >> $@ + @echo ',("LLVM clang command", "$(SettingsClangCommand)")' >> $@ + @echo + @echo ',("bignum backend", "$(BIGNUM_BACKEND)")' >> $@ + @echo ',("Use interpreter", "$(GhcWithInterpreter)")' >> $@ + @echo ',("Support SMP", "$(GhcWithSMP)")' >> $@ + @echo ',("RTS ways", "$(GhcRTSWays)")' >> $@ + @echo ',("Tables next to code", "$(TablesNextToCode)")' >> $@ + @echo ',("Leading underscore", "$(LeadingUnderscore)")' >> $@ + @echo ',("Use LibFFI", "$(UseLibffiForAdjustors)")' >> $@ + @echo ",(\"RTS expects libdw\", \"$(GhcRtsWithLibdw)\")" >> $@ + @echo "]" >> $@ + # We need to install binaries relative to libraries. BINARIES = $(wildcard ./bin/*) install_bin_libdir: @@ -110,7 +166,7 @@ install_bin_direct: cp ./bin/* "$(WrapperBinsDir)/" LIBRARIES = $(wildcard ./lib/*) -install_lib: +install_lib: lib/settings @echo "Copying libraries to $(ActualLibsDir)" $(INSTALL_DIR) "$(ActualLibsDir)" for i in $(LIBRARIES); do \ diff --git a/hadrian/src/Rules/BinaryDist.hs b/hadrian/src/Rules/BinaryDist.hs index 43a0f62f8c..8a03064ffd 100644 --- a/hadrian/src/Rules/BinaryDist.hs +++ b/hadrian/src/Rules/BinaryDist.hs @@ -193,6 +193,13 @@ bindistRules = do copyDirectory (ghcBuildDir -/- "lib") bindistFilesDir copyDirectory (rtsIncludeDir) bindistFilesDir + -- The settings file must be regenerated by the bindist installation + -- logic to account for the environment discovered by the bindist + -- configure script on the host. Not on Windows, however, where + -- we do not ship a configure script with the bindist. See #20254. + unless windowsHost $ + removeFile (bindistFilesDir -/- "lib" -/- "settings") + -- Call ghc-pkg recache, after copying so the package.cache is -- accurate, then it's on the distributor to use `cp -a` to install -- a relocatable bindist. |