#1798: add better framework support to ghc
------------------------------+---------------------------------------------
  Reporter:  guest            |          Owner:          
      Type:  feature request  |         Status:  new     
  Priority:  normal           |      Milestone:          
 Component:  Compiler         |        Version:  6.6.1   
  Severity:  normal           |       Keywords:          
Difficulty:  Unknown          |             Os:  MacOS X 
  Testcase:                   |   Architecture:  Multiple
------------------------------+---------------------------------------------
 ghc should be enabled to find a framework at runtime even in a user's home
 directory.

 Currently ghci cannot load a framework from a user's home directory. (ghci
 may find a framework in a directory given under `frameworkDirs` in a
 `package.conf`, though)

 If ghc would find the path to a framework `Bla' (at runtime) it could
 generate proper include and link options as follows.

 Be `<fpath>` the path to the directory `Bla.framework` (containing
 framework `Bla`) then

 {{{
 -I<fpath>/Bla.framework/Headers
 }}}
 should be added as include-path for header files.

 {{{
 -F<fpath> -framework Bla
 }}}
 are the linker flags and

 {{{
 <fpath>/Bla.framework/Bla
 }}}

 is the dynamic library to be loaded by `dlopen`.

 Currently only "`-framework Bla`" is passed to linker and the dynamic
 linker tries to find the framework under `/Library/Frameworks`,
 `/System/Library/Frameworks` and directories (that must be known at build
 time) under `frameworkDirs`.

 Currently C-Header files are only found if they are included in source
 files as:
 {{{
 #include <Bla/blaheader.h>
 }}}

 This is rather unportable (as it only works on Macs) and requires library
 writers to create code (and configure stuff) like:

 {{{
 #if defined(HAVE_FRAMEWORK_GMP)
 #include <GMP/gmp.h>
 #else
 #include <gmp.h>
 #endif
 }}}

 (I'm not even sure if the recursive includes work for the GNUreadline
 framework. see #1395)

 if "`#include <Bla/blaheader.h>`" should work with frameworks installed
 under `<fpath>` not being /Library/Frameworks or
 /System/Library/Frameworks then also `-F<fpath>` needs to be passed to the
 C-compiler. (But it is better to always only write "`#include
 <blaheader.h>`" and use the above include flag.)

 By accident the GNUreadline framework can be dynamically loaded from a
 user's home directory because ghci itself loads this framework (provided
 the `package.conf` file does not mention the framework GNUreadline, see
 #1395)

 All these disadvantages can be avoided by computing the `<fpath>` for
 every framework at runtime.
 (The code is almost there at the end of `compiler/ghci/Linker.lhs`)

 Once this all works the next step would be to also add a proper include-
 path to `hsc2hs` as it is currently rather difficult to pass
 `-I$HOME/Library/Frameworks/GNUreadline.framework/Headers` to `hsc2hs`
 when building `libraries/readline` with Cabal!

 Christian

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/1798>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
_______________________________________________
Glasgow-haskell-bugs mailing list
Glasgow-haskell-bugs@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs

Reply via email to