-prefix := $(shell pwd)/prefix
-jvm-bridge-site := umn.dl.sourceforge.net
-jvm-bridge-url := http://$(jvm-bridge-site)/sourceforge/jvm-bridge/haskell-jvm-bridge-0.3.tar.gz
-link := -L$(prefix)/lib/ \
- -L$(JAVA_HOME)/jre/lib/i386/ \
- -L$(JAVA_HOME)/jre/lib/i386/client/ \
- -lstdc++ -lJVMBridge -lJVMInvocation -lHaskellJVMBridge -ljava -ljvm -lverify
-packages := -package haskell98 -package base -package rts -package concurrent -package lang
-ghc := ghc -fglasgow-exts $(packages) $(link) -i$(prefix)/imports/
-bin := $(prefix)/bin/
+ghc_version = $(shell ghc --version | sed 's_.*version \([0-9]*\.[0-9]*\).*_\1_')
+
+ifeq ($(ghc_version),6.5)
+patchghc = patch -p0 < $(shell pwd)/misc/ghc-6.5-patch &&
+else
+patchghc =
+endif
+
+ifeq ($(shell uname),Darwin)
+with_jvmdir = --with-jvmdir=/System/Library/Frameworks/JavaVM.framework/
+jvmlink = -framework JavaVM -optl -fexceptions
+patchmac = patch -p0 < $(shell pwd)/misc/intel-mac-patch &&
+linkopts =
+else
+with_jvmdir = --with-jvmdir=$(JAVA_HOME)
+jvmlink = -ljava -ljvm -lverify
+patchmac =
+linkopts = -optl "-Wl,-rpath,$(JAVA_HOME)/jre/lib/i386/" -optl "-Wl,-rpath,$(JAVA_HOME)/jre/lib/i386/client/"
+endif
+
+prefix = $(shell pwd)/prefix
+jvm-bridge-site = umn.dl.sourceforge.net
+jvm-bridge-url = http://$(jvm-bridge-site)/sourceforge/jvm-bridge/haskell-jvm-bridge-0.3.tar.gz
+
+# The double -lHaskellJVMBridge is due to a circular link dep; the linux linker gets upset
+link = -L$(prefix)/lib/ \
+ -L$(JAVA_HOME)/jre/lib/i386/ \
+ -L$(JAVA_HOME)/jre/lib/i386/client/ \
+ -lstdc++ -lHaskellJVMBridge -lJVMBridge -lJVMInvocation -lHaskellJVMBridge $(jvmlink)
+packages = -package haskell98 -package base -package rts
+ghc = ghc -fglasgow-exts $(packages) -i$(prefix)/imports/
+bin = $(prefix)/bin/