From fec3a3cf8a1b3d575faaa576854e032b118433d3 Mon Sep 17 00:00:00 2001 From: GHC GitLab CI Date: Sun, 9 Aug 2020 09:35:47 -0400 Subject: configure: Avoid hard-coded ld path on Windows The fix to #17962 ended up regressing on Windows as it failed to replicate the logic responsible for overriding the toolchain paths on Windows. This resulted in a hard-coded path to a directory that likely doesn't exist on the user's system (#18550). (cherry picked from commit 34e0fa963f35a77093fc7111a80c557fc6bd614f) --- aclocal.m4 | 41 ++++++++++++++++++++++---------------- compiler/main/SysTools/Settings.hs | 2 +- configure.ac | 2 ++ hadrian/cfg/system.config.in | 9 +++++---- hadrian/src/Builder.hs | 2 +- mk/config.mk.in | 10 ++++++++++ rules/build-package-way.mk | 3 ++- 7 files changed, 45 insertions(+), 24 deletions(-) diff --git a/aclocal.m4 b/aclocal.m4 index 55ce057012..6ed252db61 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -516,6 +516,10 @@ AC_DEFUN([FP_SETTINGS], SettingsHaskellCPPCommand="${mingw_bin_prefix}gcc.exe" SettingsHaskellCPPFlags="$HaskellCPPArgs" SettingsLdCommand="${mingw_bin_prefix}ld.exe" + # Overrides FIND_MERGE_OBJECTS in order to avoid hard-coding linker + # path on Windows (#18550). + SettingsMergeObjectsCommand="${SettingsLdCommand}" + SettingsMergeObjectsFlags="-r --oformat=pe-bigobj-x86-64" SettingsArCommand="${mingw_bin_prefix}ar.exe" SettingsRanlibCommand="${mingw_bin_prefix}ranlib.exe" SettingsDllWrapCommand="${mingw_bin_prefix}dllwrap.exe" @@ -529,6 +533,8 @@ AC_DEFUN([FP_SETTINGS], SettingsHaskellCPPCommand="$(basename $HaskellCPPCmd)" SettingsHaskellCPPFlags="$HaskellCPPArgs" SettingsLdCommand="$(basename $LdCmd)" + SettingsMergeObjectsCommand="$(basename $MergeObjsCmd)" + SettingsMergeObjectsFlags="$MergeObjsArgs" SettingsArCommand="$(basename $ArCmd)" SettingsDllWrapCommand="$(basename $DllWrapCmd)" SettingsWindresCommand="$(basename $WindresCmd)" @@ -538,6 +544,8 @@ AC_DEFUN([FP_SETTINGS], SettingsHaskellCPPCommand="$HaskellCPPCmd" SettingsHaskellCPPFlags="$HaskellCPPArgs" SettingsLdCommand="$LdCmd" + SettingsMergeObjectsCommand="$MergeObjsCmd" + SettingsMergeObjectsFlags="$MergeObjsArgs" SettingsArCommand="$ArCmd" SettingsRanlibCommand="$RanlibCmd" if test -z "$DllWrapCmd" @@ -592,6 +600,8 @@ AC_DEFUN([FP_SETTINGS], AC_SUBST(SettingsCCompilerSupportsNoPie) AC_SUBST(SettingsLdCommand) AC_SUBST(SettingsLdFlags) + AC_SUBST(SettingsMergeObjectsCommand) + AC_SUBST(SettingsMergeObjectsFlags) AC_SUBST(SettingsArCommand) AC_SUBST(SettingsRanlibCommand) AC_SUBST(SettingsDllWrapCommand) @@ -2589,7 +2599,7 @@ AC_DEFUN([CHECK_FOR_GOLD_T22266],[ ]) $CC -c -o conftest.a.o conftest.a.c || AC_MSG_ERROR([Failed to compile test]) - $SettingsMergeObjectsCommand $SettingsMergeObjectsFlags -T conftest.t conftest.a.o -o conftest.ar.o || AC_MSG_ERROR([Failed to merge test object]) + $MergeObjsCmd $MergeObjsArgs -T conftest.t conftest.a.o -o conftest.ar.o || AC_MSG_ERROR([Failed to merge test object]) $CC -c -o conftest.main.o conftest.main.c || AC_MSG_ERROR([Failed to compile test driver]) $CC conftest.ar.o conftest.main.o -o conftest || AC_MSG_ERROR([Failed to link test driver]) @@ -2609,33 +2619,30 @@ AC_DEFUN([CHECK_FOR_GOLD_T22266],[ # ------------------ # Find which linker to use to merge object files. # +# See Note [Merging object files for GHCi] in GHC.Driver.Pipeline. AC_DEFUN([FIND_MERGE_OBJECTS],[ AC_REQUIRE([FIND_LD]) - if test -z "$SettingsMergeObjectsCommand"; then - SettingsMergeObjectsCommand="$LD" + if test -z "$MergeObjsCmd"; then + MergeObjsCmd="$LD" fi - if test -z "$SettingsMergeObjectsFlags"; then - SettingsMergeObjectsFlags="-r" + if test -z "$MergeObjsArgs"; then + MergeObjsArgs="-r" fi - CHECK_FOR_GOLD_T22266($SettingsMergeObjectsCommand) + CHECK_FOR_GOLD_T22266($MergeObjsCmd) if test "$result" = "1"; then - AC_MSG_NOTICE([$SettingsMergeObjectsCommand is broken due to binutils 22266, looking for another linker...]) - SettingsMergeObjectsCommand="" - AC_CHECK_TARGET_TOOL([SettingsMergeObjectsCommand], [ld]) - CHECK_FOR_GOLD_T22266($SettingsMergeObjectsCommand) + AC_MSG_NOTICE([$MergeObjsCmd is broken due to binutils 22266, looking for another linker...]) + MergeObjsCmd="" + AC_CHECK_TARGET_TOOL([MergeObjsCmd], [ld]) + CHECK_FOR_GOLD_T22266($MergeObjsCmd) if test "$result" = "1"; then - AC_MSG_ERROR([Linker is affected by binutils 22266 but couldn't find another unaffected linker. Please set the SettingsMergeObjectsCommand variable to a functional linker.]) + AC_MSG_ERROR([Linker is affected by binutils 22266 but couldn't find another unaffected linker. Please set the MergeObjsCmd variable to a functional linker.]) fi fi - if test "$windows" = YES -a "$EnableDistroToolchain" = "NO" -a "$WORD_SIZE" = 64; then - SettingsMergeObjectsFlags="$SettingsMergeObjectsFlags --oformat=pe-bigobj-x86-64" - fi - - AC_SUBST(SettingsMergeObjectsCommand) - AC_SUBST(SettingsMergeObjectsFlags) + AC_SUBST([MergeObjsCmd]) + AC_SUBST([MergeObjsArgs]) ]) # FIND_PYTHON diff --git a/compiler/main/SysTools/Settings.hs b/compiler/main/SysTools/Settings.hs index f3969be866..70b6c81e49 100644 --- a/compiler/main/SysTools/Settings.hs +++ b/compiler/main/SysTools/Settings.hs @@ -141,7 +141,7 @@ initSettings top_dir = do as_args = map Option cc_args ld_prog = cc_prog ld_args = map Option (cc_args ++ words cc_link_args_str) - ld_r_prog <- getSetting "Merge objects command" + ld_r_prog <- getToolSetting "Merge objects command" ld_r_args <- getSetting "Merge objects flags" llvmTarget <- getSetting "LLVM target" diff --git a/configure.ac b/configure.ac index 1f8d7eaf53..ead3eb2e8f 100644 --- a/configure.ac +++ b/configure.ac @@ -429,6 +429,8 @@ then NM="${mingwbin}nm.exe" RANLIB="${mingwbin}ranlib.exe" OBJDUMP="${mingwbin}objdump.exe" + MergeObjsCmd="$LD" + MergeObjsArgs="-r --oformat=pe-bigobj-x86-64" fp_prog_ar="${mingwbin}ar.exe" AC_PATH_PROG([Genlib],[genlib]) diff --git a/hadrian/cfg/system.config.in b/hadrian/cfg/system.config.in index c7fbc3b19b..769bf25b08 100644 --- a/hadrian/cfg/system.config.in +++ b/hadrian/cfg/system.config.in @@ -14,6 +14,7 @@ hs-cpp = @HaskellCPPCmd@ ld = @LdCmd@ make = @MakeCmd@ nm = @NmCmd@ +merge-objects = @MergeObjsCmd@ objdump = @ObjdumpCmd@ ranlib = @REAL_RANLIB_CMD@ sphinx-build = @SPHINXBUILD@ @@ -114,10 +115,10 @@ conf-ld-linker-args-stage1 = @CONF_LD_LINKER_OPTS_STAGE1@ conf-ld-linker-args-stage2 = @CONF_LD_LINKER_OPTS_STAGE2@ conf-ld-linker-args-stage3 = @CONF_LD_LINKER_OPTS_STAGE3@ -conf-merge-objects-args-stage0 = @SettingsMergeObjectsFlags@ -conf-merge-objects-args-stage1 = @SettingsMergeObjectsFlags@ -conf-merge-objects-args-stage2 = @SettingsMergeObjectsFlags@ -conf-merge-objects-args-stage3 = @SettingsMergeObjectsFlags@ +conf-merge-objects-args-stage0 = @MergeObjsArgs@ +conf-merge-objects-args-stage1 = @MergeObjsArgs@ +conf-merge-objects-args-stage2 = @MergeObjsArgs@ +conf-merge-objects-args-stage3 = @MergeObjsArgs@ # Settings: diff --git a/hadrian/src/Builder.hs b/hadrian/src/Builder.hs index bad760cc18..5689b7a8b1 100644 --- a/hadrian/src/Builder.hs +++ b/hadrian/src/Builder.hs @@ -313,7 +313,7 @@ systemBuilderPath builder = case builder of Happy -> fromKey "happy" HsCpp -> fromKey "hs-cpp" Ld _ -> fromKey "ld" - MergeObjects _ -> fromKey "settings-merge-objects-command" + MergeObjects _ -> fromKey "merge-objects" Make _ -> fromKey "make" Makeinfo -> fromKey "makeinfo" Nm -> fromKey "nm" diff --git a/mk/config.mk.in b/mk/config.mk.in index 57de094e10..59c1ae343c 100644 --- a/mk/config.mk.in +++ b/mk/config.mk.in @@ -556,6 +556,16 @@ LD_STAGE1 = $(LD) LD_STAGE2 = $(LD) LD_STAGE3 = $(LD) +MERGE_OBJS_STAGE0 = @MergeObjsCmd@ +MERGE_OBJS_STAGE1 = @MergeObjsCmd@ +MERGE_OBJS_STAGE2 = @MergeObjsCmd@ +MERGE_OBJS_STAGE3 = @MergeObjsCmd@ + +MERGE_OBJS_STAGE0_FLAGS = @MergeObjsArgs@ +MERGE_OBJS_STAGE1_FLAGS = @MergeObjsArgs@ +MERGE_OBJS_STAGE2_FLAGS = @MergeObjsArgs@ +MERGE_OBJS_STAGE3_FLAGS = @MergeObjsArgs@ + # Cross-compiling options # See Note [CrossCompiling vs Stage1Only] CrossCompiling = @CrossCompiling@ diff --git a/rules/build-package-way.mk b/rules/build-package-way.mk index a2a1e9a8fe..c1b95032ac 100644 --- a/rules/build-package-way.mk +++ b/rules/build-package-way.mk @@ -107,6 +107,7 @@ endif endif # Build the GHCi library +# See Note [Merging object files for GHCi] in GHC.Driver.Pipeline. ifneq "$(filter $3, v p)" "" $1_$2_$3_GHCI_LIB = $1/$2/build/HS$$($1_$2_COMPONENT_ID).$$($3_osuf) ifeq "$$($1_$2_BUILD_GHCI_LIB)" "YES" @@ -116,7 +117,7 @@ BINDIST_LIBS += $$($1_$2_$3_GHCI_LIB) endif endif $$($1_$2_$3_GHCI_LIB) : $$($1_$2_$3_HS_OBJS) $$($1_$2_$3_CMM_OBJS) $$($1_$2_$3_C_OBJS) $$($1_$2_$3_S_OBJS) $$($1_$2_EXTRA_OBJS) $$($1_$2_LD_SCRIPT) - $$(call cmd,SettingsMergeObjectsCommand) $(SettingsMergeObjectsFlags) $$(if $$($1_$2_LD_SCRIPT),$$($1_$2_LD_SCRIPT_CMD) $$($1_$2_LD_SCRIPT)) -o $$@ $$(EXTRA_LD_LINKER_OPTS) $$($1_$2_$3_HS_OBJS) $$($1_$2_$3_CMM_OBJS) $$($1_$2_$3_C_OBJS) $$($1_$2_$3_S_OBJS) $$($1_$2_EXTRA_OBJS) + $$(call cmd,MERGE_OBJS_STAGE$4) $(MERGE_OBJS_STAGE$4_FLAGS) $$(if $$($1_$2_LD_SCRIPT),$$($1_$2_LD_SCRIPT_CMD) $$($1_$2_LD_SCRIPT)) -o $$@ $$(EXTRA_LD_LINKER_OPTS) $$($1_$2_$3_HS_OBJS) $$($1_$2_$3_CMM_OBJS) $$($1_$2_$3_C_OBJS) $$($1_$2_$3_S_OBJS) $$($1_$2_EXTRA_OBJS) ifeq "$$($1_$2_BUILD_GHCI_LIB)" "YES" # Don't bother making ghci libs for bootstrapping packages ifneq "$4" "0" -- cgit v1.2.1