Nice work. I was still on GHC 6.10 to be able to use wxhaskell with ghci.
Here are some notes and patches for OS X. I'm running Lion (10.7.2) and getting wxwidgets running actually took the most time.
First of all, Haskell and wxwidgets must use the same architecture, i.e. both 32-bit or both 64-bit.
The standard build is 64-bit, but wxwidgets includes the QuickTime framework which is only available in 32-bit. It builds and ghc only gives a warning, but ghci will give an error (/System/Library/Frameworks/QuickTime.framework/QuickTime: mach-o, but wrong architecture).
To build 32-bit you can use "--enable-macosx_arch=i386".
It looks like quicktime is only used for PICT support, which is disabled in 64-bit builds anyway, so I made a patch that disables quicktime for both 32 and 64 bit cocoa builds.
By further disabling the ppc architecture, we can make a universal 32/64-bit binary with:
=remove -arch ppc in configure
=remove -framework QuickTime in configure
=remove PICT by __LP64__ -> __WXOSX_COCOA__ in bitmap.c, fontenum.c, metafile.cpp
> ./configure --disable-debug --disable-dependency-tracking --with-osx_cocoa --disable-webkit --with-macosx-sdk=/Developer/SDKs/MacOSX10.6.sdk --with-macosx-version-min=10.6 --enable-universal_binary
> make install
Note that on lion with the latest Xcode, 10.6 is the lowest sdk version.
I use Homebrew so I attached a formula for it. To install homebrew:
> /usr/bin/ruby -e "$(curl -fsSL https://raw.github.com/gist/323731)"
Then put "wxosx.rb" in /usr/local/Library/Formula and run:
> brew install wxosx
installing wxc gives:
> cd wxc
> cabal install
- error wxEVT_WEBKIT_ was not declared…
so I disabled webkit in wxwidgets above.
-ld: file not found: undefined
=change "-Wl,undefined" to "-Wl,-undefined" in linkCxxOpts in Setup.hs
-* Missing C library: wxc
name is wxc.so instead of libwxc.dylib
=change for sharedLibName: OSX -> "lib" ++ addExtension basename ".dylib" in Setup.hs
> ghc --make HelloWorld.hs
Undefined symbols for architecture x86_64:
I don't know where this is coming from (dialupman is enabled in wxwidgets) so I commented out the DIALUP lines in wxc_glue.h
- dlopen(dist/build/libwxc.dylib) failed
The final problem is that a dylib contains an absolute paths used for linking, and the library is expected to be found at that locations. To set this path we must pass the "-install_name" argument when linking libwxc.dylib
= OSX -> ["-dynamiclib",
"-o " ++ out_dir </> sharedLibName ver basename,
"-install_name " ++ basepath </> sharedLibName ver basename,
in "linkCxxOpts", thus needing an extra "basepath" argument
this is found by adding
= inst_lib_dir = libdir $ absoluteInstallDirs pkg_descr local_bld_info NoCopyDest
to "myBuildHook" and also using an extra argument for "linkSharedLib".
3) using wxhaskell
"ghc --make" seems to work with the limited testing that I did
ghci error: +[NSUndoManager(NSInternal) _endTopLevelGroupings] is only safe to invoke on the main thread.
ghci creates a new thread for each computation and under os x the gui apparently must run on the main (first) thread.
This is solved by:
> ghci -fno-ghci-sandbox
However, keyboard input is not directed to the gui but to the ghci terminal…
There used to be an EnableGUI module to fix this (http://www.haskell.org/haskellwiki/WxHaskell/MacOS_X), but that does not seem to work anymore.
The window can be closed and restarted from ghci though. However, the window does not actually disappear until ghci is exited.
Does anybody know how this was working/can be fixed?
Hope this is useful.
RSA(R) Conference 2012
Mar 27 - Feb 2
Save $400 by Jan. 27
wxhaskell-devel mailing list