
#9873: Use CONF_GCC_LINKER_OPTS_STAGE2 only in stage2 -------------------------------------+------------------------------------- Reporter: nomeata | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: Build System | Version: 7.9 Keywords: | Operating System: Architecture: Unknown/Multiple | Unknown/Multiple Difficulty: Unknown | Type of failure: Blocked By: | None/Unknown Related Tickets: | Test Case: | Blocking: | Differential Revisions: -------------------------------------+------------------------------------- On ARM, we want to make sure that GHC uses the gold linker. In order to achieve that, we need to get `-fuse-ld=gold` into SettingsCCompilerLinkFlags in the settings. This field is filled with only CONF_GCC_LINKER_OPTS_STAGE2. So we want that flag to show up there. But this variable is used in other places as well. For example, the configuration of tinfo fails: {{{ $ make libraries/terminfo/dist-boot/package-data.mk ===--- building phase 0 make -r --no-print-directory -f ghc.mk phase=0 phase_0_builds libraries/terminfo/ghc.mk:3: libraries/terminfo/dist-boot/package-data.mk: Datei oder Verzeichnis nicht gefunden "inplace/bin/ghc-cabal" configure libraries/terminfo dist-boot "" --with- ghc="/usr/bin/ghc" --with-ghc-pkg="/usr/bin/ghc-pkg" --package- db=/home/jojo/build/haskell/ghc/libraries/bootstrapping.conf --disable- library-for-ghci --enable-library-vanilla --disable-library-profiling --disable-shared --with-hscolour="/usr/bin/HsColour" --configure- option=CFLAGS=" -fno-stack-protector " --configure-option=LDFLAGS=" -fuse-ld=gold " --configure-option=CPPFLAGS=" " --gcc-options=" -fno- stack-protector -fuse-ld=gold " --constraint "binary == 0.7.1.0" --constraint "Cabal == 1.21.1.0" --constraint "hpc == 0.6.0.2" --constraint "bin-package-db == 0.0.0.0" --constraint "hoopl == 3.10.0.2" --constraint "transformers == 0.4.2.0" --constraint "terminfo == 0.4.0.0" --with-gcc="/usr/bin/gcc" --configure-option=--with- cc="/usr/bin/gcc" --with-ar="/usr/bin/ar" --with-alex="/usr/bin/alex" --with-happy="/usr/bin/happy" Configuring terminfo-0.4.0.0... configure: WARNING: unrecognized options: --with-compiler, --with-gcc checking for gcc... /usr/bin/gcc checking whether the C compiler works... yes checking for C compiler default output file name... a.out checking for suffix of executables... checking whether we are cross compiling... no checking for suffix of object files... o checking whether we are using the GNU C compiler... yes checking whether /usr/bin/gcc accepts -g... yes checking for /usr/bin/gcc option to accept ISO C89... none needed checking how to run the C preprocessor... /usr/bin/gcc -E checking for grep that handles long lines and -e... /bin/grep checking for egrep... /bin/grep -E checking for ANSI C header files... yes checking for sys/types.h... yes checking for sys/stat.h... yes checking for stdlib.h... yes checking for string.h... yes checking for memory.h... yes checking for strings.h... yes checking for inttypes.h... yes checking for stdint.h... yes checking for unistd.h... yes checking ncurses.h usability... yes checking ncurses.h presence... yes checking for ncurses.h... yes checking for setupterm in -ltinfo... yes configure: creating ./config.status config.status: creating terminfo.buildinfo configure: WARNING: unrecognized options: --with-compiler, --with-gcc ghc-cabal: Missing dependency on a foreign library: * Missing C library: tinfo This problem can usually be solved by installing the system package that provides this library (you may need the "-dev" version). If the library is already installed but in a non-standard location then you can use the flags --extra-include-dirs= and --extra-lib-dirs= to specify where it is. libraries/terminfo/ghc.mk:3: recipe for target 'libraries/terminfo/dist- boot/package-data.mk' failed make[1]: *** [libraries/terminfo/dist-boot/package-data.mk] Error 1 Makefile:71: recipe for target 'libraries/terminfo/dist-boot/package- data.mk' failed make: *** [libraries/terminfo/dist-boot/package-data.mk] Error 2 }}} The problem (unfortunately, not very visible) is that `ghc-cabal` calls `gcc` to test if the C libaries are available. It uses the linker flags that it’s being told to use from the host GHC (here: 7.6.3), which contains the usual: {{{ $ ghc --info |fgrep 'C compiler flags' ,("C compiler flags"," -fno-stack-protector -Wl,--hash-size=31 -Wl ,--reduce-memory-overheads") }}} But to that it adds `-fuse-ld-gold` because `ghc-cabal` is gets `" --gcc- options=" -fno-stack-protector -fuse-ld=gold "` passed. So the build system should not pass flags from `CONF_GCC_LINKER_OPTS_STAGE2` anywhere besides gcc when used *by the stage 2 ghc* during linking. The chain of variables leading to this can be seen here: {{{ $ git grep CONFIGURE_LDFLAGS rules/build-package-data.mk:$1_$2_CONFIGURE_LDFLAGS = $$(SRC_LD_OPTS) $$(CONF_GCC_LINKER_OPTS_STAGE$3) $$($1_LD_OPTS) $$($1_$2_LD_OPTS) rules/build-package-data.mk:$1_$2_CONFIGURE_OPTS += --configure- option=LDFLAGS="$$($1_$2_CONFIGURE_LDFLAGS)" rules/build-package-data.mk:$1_$2_CONFIGURE_OPTS += --gcc- options="$$($1_$2_CONFIGURE_CFLAGS) $$($1_$2_CONFIGURE_LDFLAGS)" }}} I’m currently experimenting with a patch that simply does not use `CONF_GCC_LINKER_OPTS_STAGE` anywhere besides when defining `SettingsCCompilerLinkFlags`, but I’m afraid that this might introduce new unwanted behaviour. But since `ghc-cabal` reads gcc-flags from `ghc --info`, maybe that channel of information is sufficient. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/9873 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler