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.
1) wxwidgets 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 2) wxhaskell 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 installing wxcore -* 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: "_expEVT_DIALUP_DISCONNECTED 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 > ./HelloWorld - 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, "-Wl,-undefined,dynamic_lookup"] 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. Regards, Kenneth
require 'formula' class Wxosx < Formula url 'http://downloads.sourceforge.net/project/wxwindows/2.9.3/wxWidgets-2.9.3.tar.bz2' homepage 'http://www.wxwidgets.org' md5 '6b6003713289ea4d3cd9b49c5db5b721' # depends_on 'cmake' => :build def install system "./configure", "--disable-debug", "--disable-dependency-tracking", "--prefix=#{prefix}", "--with-osx_cocoa", "--disable-webkit", "--with-macosx-sdk=/Developer/SDKs/MacOSX10.6.sdk", "--with-macosx-version-min=10.6", "--enable-universal_binary" # , "--enable-macosx_arch=i386" # system "cmake . #{std_cmake_parameters}" system "make install" end def patches # fixes deprecated QuickTime framework DATA end # def test # # This test will fail and we won't accept that! It's enough to just # # replace "false" with the main program this formula installs, but # # it'd be nice if you were more thorough. Test the test with # # `brew test wxWidgets`. Remove this comment before submitting # # your pull request! # system "false" # end end __END__ diff --git a/configure b/configure index 3d5b60d..5fba29d 100755 --- a/configure +++ b/configure @@ -19253,7 +19253,7 @@ See \`config.log' for more details." >&2;} echo "$as_me: WARNING: Please use --with-macosx-sdk=PATH and --enable-universal_binary without an argument" >&2;} fi fi - OSX_ARCH_OPTS="-arch ppc -arch i386" + OSX_ARCH_OPTS="-arch i386" if test "$wxUSE_OSX_COCOA" = 1; then OSX_ARCH_OPTS="$OSX_ARCH_OPTS -arch x86_64" fi @@ -51787,7 +51787,7 @@ if test "$wxUSE_MAC" = 1 ; then if test "$wxUSE_OSX_IPHONE" = 1; then EXTRA_FRAMEWORKS="-framework IOKit -framework UIKit -framework CFNetwork -framework AudioToolbox -framework CoreFoundation -framework CoreGraphics -framework OpenGLES -framework Foundation -framework QuartzCore" else - EXTRA_FRAMEWORKS="-framework IOKit -framework Carbon -framework Cocoa -framework AudioToolbox -framework System -framework OpenGL -framework QuickTime" + EXTRA_FRAMEWORKS="-framework IOKit -framework Carbon -framework Cocoa -framework AudioToolbox -framework System -framework OpenGL" fi fi fi diff --git a/src/osx/carbon/metafile.cpp b/src/osx/carbon/metafile.cpp index dde3a49..3df7694 100644 --- a/src/osx/carbon/metafile.cpp +++ b/src/osx/carbon/metafile.cpp @@ -224,7 +224,7 @@ void wxMetafile::SetHMETAFILE(WXHMETAFILE mf) m_refData = new wxMetafileRefData((CFDataRef)mf); } -#if wxOSX_USE_COCOA_OR_CARBON && !defined( __LP64__ ) +#if wxOSX_USE_COCOA_OR_CARBON && !defined( __WXOSX_COCOA__ ) void wxMetafile::SetPICT(void* pictHandle) { UnRef(); diff --git a/src/osx/core/bitmap.cpp b/src/osx/core/bitmap.cpp index 408ab30..de70b5d 100644 --- a/src/osx/core/bitmap.cpp +++ b/src/osx/core/bitmap.cpp @@ -191,7 +191,7 @@ void wxMacCreateBitmapButton( ControlButtonContentInfo*info , const wxBitmap& bi } else { -#ifndef __LP64__ +#ifndef __WXOSX_COCOA__ info->contentType = kControlContentPictHandle ; info->u.picture = bmap->GetPictHandle() ; #endif @@ -646,7 +646,7 @@ PicHandle wxBitmapRefData::GetPictHandle() { if ( m_pictHandle == NULL ) { -#ifndef __LP64__ +#ifndef __WXOSX_COCOA__ GraphicsExportComponent exporter = 0; OSStatus err = OpenADefaultComponent(GraphicsExporterComponentType, kQTFileTypePicture, &exporter); if (noErr == err) @@ -817,7 +817,7 @@ void wxBitmapRefData::Free() m_iconRef = NULL ; } -#ifndef __LP64__ +#ifndef __WXOSX_COCOA__ if ( m_pictHandle ) { KillPicture( m_pictHandle ) ; @@ -1803,7 +1803,7 @@ bool wxBundleResourceHandler::LoadFile(wxBitmap *bitmap, return false ; } -#if !defined( __LP64__ ) && !defined(__WXOSX_IPHONE__) +#if !defined( __WXOSX_COCOA__ ) && !defined(__WXOSX_IPHONE__) class WXDLLEXPORT wxPICTResourceHandler: public wxBitmapHandler { @@ -1859,7 +1859,7 @@ bool wxPICTResourceHandler::LoadFile(wxBitmap *bitmap, void wxBitmap::InitStandardHandlers() { -#if !defined( __LP64__ ) && !defined(__WXOSX_IPHONE__) +#if !defined( __WXOSX_COCOA__ ) && !defined(__WXOSX_IPHONE__) AddHandler( new wxPICTResourceHandler ) ; #endif #if wxOSX_USE_COCOA_OR_CARBON diff --git a/src/osx/core/fontenum.cpp b/src/osx/core/fontenum.cpp index 72cc4ef..b553b44 100644 --- a/src/osx/core/fontenum.cpp +++ b/src/osx/core/fontenum.cpp @@ -65,7 +65,7 @@ bool wxFontEnumerator::EnumerateFacenames(wxFontEncoding encoding, status = ATSFontFamilyIteratorNext( theFontFamilyIterator, &theATSFontFamilyRef ); if(status == noErr) { - #ifndef __LP64__ + #ifndef __WXOSX_COCOA__ // TODO CS : Find replacement // added CS : avoid showing fonts that won't be displayable FMFontStyle intrinsicStyle = 0 ;
wxhaskell-osx.patch
Description: Binary data
------------------------------------------------------------------------------ RSA(R) Conference 2012 Mar 27 - Feb 2 Save $400 by Jan. 27 Register now! http://p.sf.net/sfu/rsa-sfdev2dev2
_______________________________________________ wxhaskell-devel mailing list wxhaskell-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/wxhaskell-devel