Sometimes '-optl-optl' used for linker options instead of just '-optl'
The build system does not construct some linker options correctly. For some options it doubles the -optl
switch, resulting in options like
-optl-optl-Wl,-arch -optl-optl-Wl,x86_64
being passed to GHC, instead of
-optl-Wl,-arch -optl-Wl,x86_64
Root cause: in rules/distdir-way-opts.mk
, $1_$2_$3_ALL_LD_OPTS
is constructed with
# Options for passing to gcc for linking
$1_$2_$3_ALL_LD_OPTS = \
... \
$$(foreach o,$$(EXTRA_LD_LINKER_OPTS),-optl-Wl$$(comma)$$o) \
$$(foreach o,$$(CONF_LD_LINKER_OPTS_STAGE$4),-optl-Wl$$(comma)$$o)
Which is then used in
# Options for passing to GHC when we use it for linking
$1_$2_$3_GHC_LD_OPTS = \
$$(addprefix -optl, $$($1_$2_$3_ALL_LD_OPTS)) \
$$($1_$2_$3_MOST_HC_OPTS)
The -optl
in the foreach invocations in $1_$2_$3_ALL_LD_OPTS
is not necessary, it is handled already by the addprefix call in $1_$2_$3_GHC_LD_OPTS
.
Example link command line generated by the the build system, showing the problem:
"${HOME}/.stack/programs/x86_64-osx/ghc-7.10.3/bin/ghc" -o utils/hsc2hs/dist/build/tmp/hsc2hs
-hisuf hi -osuf o -hcsuf hc -static -H32m -O -Wall
-package-db libraries/bootstrapping.conf -hide-all-packages
-i -iutils/hsc2hs/. -iutils/hsc2hs/dist/build -iutils/hsc2hs/dist/build/autogen
-Iutils/hsc2hs/dist/build -Iutils/hsc2hs/dist/build/autogen
-optP-include -optPutils/hsc2hs/dist/build/autogen/cabal_macros.h
-package-id base-4.8.2.0-cc43d8e06aa74e9c4c0132becc49ee25
-package-id containers-0.5.6.2-68e3ece8a4f91a31e327fe89f8052a53
-package-id directory-1.2.2.0-3b3e1a8d629ccaa6c4588a9bb46bb163
-package-id filepath-1.4.0.0-f97d1e4aebfd7a03be6980454fe31d6e
-package-id process-1.2.3.0-a1a69425f3f6c11a82785be7baab3b68
-XHaskell2010 -no-user-package-db -rtsopts
-odir utils/hsc2hs/dist/build -hidir utils/hsc2hs/dist/build
-stubdir utils/hsc2hs/dist/build
-optl-optl-Wl,-arch -optl-optl-Wl,x86_64
-static -H32m -O -Wall -package-db libraries/bootstrapping.conf
-hide-all-packages -i -iutils/hsc2hs/. -iutils/hsc2hs/dist/build
-iutils/hsc2hs/dist/build/autogen
-Iutils/hsc2hs/dist/build -Iutils/hsc2hs/dist/build/autogen
-optP-include -optPutils/hsc2hs/dist/build/autogen/cabal_macros.h
-package-id base-4.8.2.0-cc43d8e06aa74e9c4c0132becc49ee25
-package-id containers-0.5.6.2-68e3ece8a4f91a31e327fe89f8052a53
-package-id directory-1.2.2.0-3b3e1a8d629ccaa6c4588a9bb46bb163
-package-id filepath-1.4.0.0-f97d1e4aebfd7a03be6980454fe31d6e
-package-id process-1.2.3.0-a1a69425f3f6c11a82785be7baab3b68
-XHaskell2010 -no-user-package-db -rtsopts
utils/hsc2hs/dist/build/Main.o
utils/hsc2hs/dist/build/C.o
utils/hsc2hs/dist/build/Common.o
utils/hsc2hs/dist/build/CrossCodegen.o
utils/hsc2hs/dist/build/DirectCodegen.o
utils/hsc2hs/dist/build/Flags.o
utils/hsc2hs/dist/build/HSCParser.o
utils/hsc2hs/dist/build/UtilsCodegen.o
utils/hsc2hs/dist/build/Paths_hsc2hs.o
It affects all operating systems as far as I can tell, but only seems to cause a build failure on Solaris, see #13091 (closed).
Looks like this was introduced in commit 87c3b1d, in release 8.2.1, backported to 8.0.2 in commit c5f375c.
Trac metadata
Trac field | Value |
---|---|
Version | 8.0.2 |
Type | Bug |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | Build System |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | |
Architecture |