[GHC] #15075: Sometimes '-optl-optl' used for linker options instead of just '-optl'

GHC ghc-devs at haskell.org
Sat Apr 21 17:33:34 UTC 2018


#15075: Sometimes '-optl-optl' used for linker options instead of just '-optl'
-------------------------------------+-------------------------------------
           Reporter:  jwhite         |             Owner:  (none)
               Type:  bug            |            Status:  new
           Priority:  normal         |         Milestone:  8.6.1
          Component:  Build System   |           Version:  8.0.2
           Keywords:                 |  Operating System:  Unknown/Multiple
       Architecture:                 |   Type of failure:  None/Unknown
  Unknown/Multiple                   |
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:  #13091
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 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.

 Looks like this was introduced in commit
 [https://phabricator.haskell.org/rGHC87c3b1d4395c3d4fc7a5272717c48f3f525da959
 87c3b1d], in release 8.2.1, backported to 8.0.2 in commit
 [https://phabricator.haskell.org/rGHCc5f375c53671130c79713800b13a1da53d070b84
 c5f375c].

-- 
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/15075>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list