了解知识

Mac原生的开发工具是XCode。XCode包含了Unix传统的开发工具,如GCC等,但是版本较旧,不能满足许多开源项目的需求。而且,不同项目对同一个库的版本需求也有可能不同。

 

因此,出现了MacPorts这个项目(http://www.macports.org/),旨在简化各种开源项目的安装和升级。大多数包管理系统的原来都差不多,在MacPorts里,每个软件包叫做port,目前项目已经涵盖了大多数开源项目。MacPorts最主要的指令是:

sudo port install
后面指定包名,就会自动分析包的依赖关系并依次安装。MacPorts默认会把软件安装在/opt/local/目录,以避免和传统的unix路径/usr/local/冲突。尽管如此,许多MacPorts下的包还是会依赖/usr/local/。MacPorts管理的软件包全都是源码编译安装,即使系统已经提供了可用的包。虽然这点常被人诟病,但个人觉得只是慢了点,只要它能全部搞定就行。但是问题就是有时它搞不定,比如这次安装gtk,就老是卡壳。虽然通过google解决了一些,但是最终还是放弃了。当然,部分原因是gtk本身就依赖复杂,即使在Linux下也未必能一蹴而就。

 

MacPorts本身的卸载还是比较容易的(http://guide.macports.org/chunked/installing.macports.uninstalling.html)。

 

无奈之下试了另一个包管理工具:Homebrew(https://github.com/mxcl/homebrew/)。抛开实现上的区别,与MacPorts最大的不同在于:

尽量使用系统自带的库
软件包默认安装在/usr/local/
软件包安装不需要sudo
第二点避免了某些开源项目的路径错误,但是也就要求用户使用非Homebrew的其他方式(如源代码安装)安装软件时要小心,避免覆盖或者冲突。Homebrew提供了一个检查指令,来判断当前环境是否合适:

brew doctor
不幸的是,Homebrew安装gtk也失败了。

 

最终,只有一个办法成功了,就是使用gtk官网提供的方法(http://www.gtk.org/download/macos.php)。这种安装的gtk是不依赖X11的,而是通过Quartz使用Mac的原生显示方法。安装工具是jhbuild。安装完成后,会在~/目录下生成一个gtk目录,下面包含了gtk相关的所有项目的执行程序和库。使用前,必须先执行jhbuild shell来进入一个定制好的环境。

 

除了gtk,还有一个比较成熟的跨平台GUI库,就是wxWidgets(http://www.wxwidgets.org/)。通过Homebrew安装成功:

brew install wxmac --use-llvm --devel
--use-llvm是OSX10.7(Lion)的特殊需求

-devel安装的是2.9.3.1,否则是2.8.12。由于Homebrew默认安装的软件包都是64位的,而2.8.x只有32位,这样会造成不兼容。

尝试通过MacPorts安装失败。

 

安装Homebrew时还遇到个问题:XCode4.3将传统的/Developer路径去掉了,这导致以前hardcode这个路径的第三方软件无法执行

(https://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/WhatsNewXcode/Articles/xcode_4_3.html)。简单的做法就是soft link:

mkdir /Developer
ln -s /Applications/Xcode.app/Contents/Developer/Tools /Developer/Tools
直到这些软件更新支持。

 

另一个问题是Homebrew和Mono的官方dmg安装方式冲突,只好先把Mono删了。

------------------------------------------------------------------------------------------------------------

终于到了Haskell的部分。

 

gtk2hs(http://projects.haskell.org/gtk2hs)是对gtk的绑定。通过jhbuild安装的gtk+osx环境暂不支持直接用cabal install安装gtk2hs,只能下载源码编译安装(http://www.haskell.org/haskellwiki/Gtk2Hs/Mac)。尝试安装失败。所以前面gtk(http://internetwork.net/)的各种折腾也白费了,只能等官方更新了。

 

wxHaskell则通过cabal install安装成功了:

cabal install wx cabal-macosx
但是如前所说,Homebrew默认安装的软件包都是64位的(没找到怎么改成32位),这就要求Hakell Platform也是64位的,否则编出来的程序无法正确链接。好在后者可以直接dmg安装(http://hackage.haskell.org/platform/mac.html)。

 

另外,cabal install安装的haskell包是无法删除的,只能取消注册:

ghc-pkg unregister


补充一点:对于通过pkg后缀安装的Mac软件,可以通过pkgutil查询和管理和删除(https://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man1/pkgutil.1.html)。

 

以上的系统环境是Macbook Pro, i5 CPU,OSX 10.7.4 Lion 64位。

 

虽然最终可以跑起来,还是折腾了好几个晚上。经验教训就是:

尽量用现成的方案
尽量用官方的方案
尽量不用源码编译安装
更终极的方法应该是虚拟环境,比如泉叔推荐过的Vagrant(http://vagrantup.com/)。 

标签: mac Haskell
扩展知识