Ubuntu 10.04那边编译下来没什么问题很顺利,但是Lion上问题多多,首先是因为Lion自己(或者23.3a自己, whatever...)的问题导致编译有问题,然后是编译完成的版本没有窗口外框,无法拖动和管理,就像Compiz下有时候丢失了窗口管理器一样。花了我几个小时上网查找资料什么的,因此过程记录在下面,方便其他在lion上编译Emacs23.3的朋友们。
环境: Mac OS X lion (10.7.2) + XCode 4.2 + emacs-23.3a
我在第一次编译成功时没有使用附加的图像文件格式库,目前来看没什么影响,Emacs的文档里也给出列具体的地址,需要的朋友没可以自己去编译安装,然后去掉 configure中对应的配置即可
配置 :../emacs-23.3/configure --with-ns --with-png=no --with-jpeg=no --with-gif=no --with-tiff=no
--with-ns: 编译位nextstep(也就是MacOsX的前身啦 :-) )
编译: make bootstrap && make && make install
安装: 进行编译的目录下面有Emacs.app,复制到/Application目录即可
OK Let's ROCK!
<----------------------------------- Next -------------------------------------->
Bug#8223: (http://debbugs.gnu.org/cgi/bugreport.cgi?bug=8223)
......................
x7fcaeb5fc080 (sz: 0x3f2d/ 0x3f30)
0x7fcaeb500000 (sz: 0xfc080/ 0xfc080)
0x7fcaef1fc080 (sz: 0x3f2c/ 0x3f30)
0x7fcaef100000 (sz: 0x1765/ 0xfc080)
0x7fcaeb4fc080 (sz: 0x3f2d/ 0x3f30)
0x7fcaeb400000 (sz: 0xfc080/ 0xfc080)
0x7fcaed7f8000 (sz: 0x389e/ 0x7fa8)
0x7fcaed000000 (sz: 0x3873ff/0x7f8000)
0x7fcaec7f8000 (sz: 0x7fa8/ 0x7fa8)
0x7fcaec000000 (sz: 0x7f7fff/0x7f8000)
0x7fcaf0ff8000 (sz: 0x2b2/ 0x7fa8)
0x7fcaf0800000 (sz: 0x283fe/0x7f8000)
0x7fcaf07f8000 (sz: 0xa8/ 0x7fa8)
0x7fcaf0000000 (sz: 0x6fc1/0x7f8000)
0x7fcaefff8000 (sz: 0x11e/ 0x7fa8)
0x7fcaef800000 (sz: 0xf3ff/0x7f8000)
0x10614b000 (sz: 0/ 0x1000)
--- Load Commands written to Output File ---
Writing segment __PAGEZERO @ 0 ( 0/0x100000000 @ 0)
Writing segment __TEXT @ 0 (0x1d4000/0x1d4000 @ 0x100000000)
Writing segment __DATA @ 0x1d4000 (0x367000/0x367000 @ 0x1001d4000)
section __program_vars at 0x1d4000 - 0x1d4028 (sz: 0x28)
section __nl_symbol_ptr at 0x1d4028 - 0x1d4038 (sz: 0x10)
unexec: unrecognized section name in __DATA segment
make[2]: *** [bootstrap-emacs] Error 1
make[1]: *** [src] Error 2
make: *** [bootstrap] Error 2
................
根据在官方maillist中查到的结果,这是由于 src/unexmacosx.c文件中, copy_data_segment()函数中没有对名称为__got的区段进行判断导致出错,自行修改下代码复制这个区段即可。
src/unexmacosx.c line 828
+ || strncmp (sectp->sectname, "__got", 16) == 0
<----------------------------------- Next -------------------------------------->
Bug#8395(http://debbugs.gnu.org/cgi/bugreport.cgi?bug=8395)
....................
0x7f94a6afc080 (sz: 0x3f2c/ 0x3f30)
0x7f94a6a00000 (sz: 0x1d85/ 0xfc080)
0x7f94a40fc080 (sz: 0x3f2d/ 0x3f30)
0x7f94a4000000 (sz: 0xfc07f/ 0xfc080)
0x7f94a2dfc080 (sz: 0x3f2d/ 0x3f30)
0x7f94a2d00000 (sz: 0xfc080/ 0xfc080)
0x7f94a69fc080 (sz: 0x3f2c/ 0x3f30)
0x7f94a6900000 (sz: 0xc7f/ 0xfc080)
0x7f94a2cfc080 (sz: 0x3f2d/ 0x3f30)
0x7f94a2c00000 (sz: 0xfc080/ 0xfc080)
0x7f94a2efc080 (sz: 0x3f2c/ 0x3f30)
0x7f94a2e00000 (sz: 0xfc080/ 0xfc080)
0x7f94a4ff8000 (sz: 0x389e/ 0x7fa8)
0x7f94a4800000 (sz: 0x3873ff/0x7f8000)
0x7f94a3ff8000 (sz: 0x7fa8/ 0x7fa8)
0x7f94a3800000 (sz: 0x7f7fff/0x7f8000)
0x7f94a87f8000 (sz: 0x270/ 0x7fa8)
0x7f94a8000000 (sz: 0x243fe/0x7f8000)
0x7f94a7ff8000 (sz: 0x86/ 0x7fa8)
0x7f94a7800000 (sz: 0x4af7/0x7f8000)
0x7f94a77f8000 (sz: 0xa8/ 0x7fa8)
0x7f94a7000000 (sz: 0x6fc1/0x7f8000)
0x103467000 (sz: 0/ 0x1000)
--- Load Commands written to Output File ---
Writing segment __PAGEZERO @ 0 ( 0/0x100000000 @ 0)
Writing segment __TEXT @ 0 (0x1d4000/0x1d4000 @ 0x100000000)
Writing segment __DATA @ 0x1d4000 (0x367000/0x367000 @ 0x1001d4000)
section __program_vars at 0x1d4000 - 0x1d4028 (sz: 0x28)
section __nl_symbol_ptr at 0x1d4028 - 0x1d4038 (sz: 0x10)
section __got at 0x1d4038 - 0x1d41d8 (sz: 0x1a0)
section __la_symbol_ptr at 0x1d41d8 - 0x1d4a08 (sz: 0x830)
section __objc_classlist at 0x1d4a08 - 0x1d4a78 (sz: 0x70)
section __objc_protolist at 0x1d4a78 - 0x1d4a88 (sz: 0x10)
section __objc_imageinfo at 0x1d4a88 - 0x1d4a90 (sz: 0x8)
section __objc_const at 0x1d4a90 - 0x1d6c60 (sz: 0x21d0)
section __objc_selrefs at 0x1d6c60 - 0x1d7a98 (sz: 0xe38)
section __objc_msgrefs at 0x1d7aa0 - 0x1d7b90 (sz: 0xf0)
section __objc_classrefs at 0x1d7b90 - 0x1d7d80 (sz: 0x1f0)
section __objc_superrefs at 0x1d7d80 - 0x1d7de0 (sz: 0x60)
section __objc_data at 0x1d7de0 - 0x1d8240 (sz: 0x460)
unexec: cannot write section __data
make[2]: *** [bootstrap-emacs] Error 1
make[1]: *** [src] Error 2
make: *** [bootstrap] Error 2
....................
根据在官方maillist中查到的结果,似乎是要求gcc在lion上禁止地址空间随机化功能,我不是很确定具体原因是否如此,读完maillist也暂时无解。MachObje的一点资料(http://hackage.haskell.org/packages/archive/macho/0.22/doc/html/Data-Macho.html).
对于23.3 Release的修正方法:
- #define LD_SWITCH_SYSTEM_TEMACS -prebind LIBS_NSGUI -Xlinker -headerpad -Xlinker HEADERPAD_EXTRA
+ #define LD_SWITCH_SYSTEM_TEMACS -prebind LIBS_NSGUI -Xlinker -headerpad -Xlinker HEADERPAD_EXTRA -fno-pie
<----------------------------------- Next -------------------------------------->
至此编译上没有什么问题了,但是编译出来的Emacs还是没法用,没有标题栏,没法最大最小化,没法移动,而且位置出现在最左上角,很挫很受伤啊.....解决这个问题需要另一个Patch, 我在官方的bugtrace上没搜到patch, 而是在 MacPort上找到了patch.. (https://trac.macports.org/attachment/ticket/30268/patch-fix-title-bar.diff)
src/nsterm.m Line 5109
- styleMask: (NSResizableWindowMask | + styleMask: (NSTitledWindowMask |
+ NSResizableWindowMask |
<----------------------------------- Next -------------------------------------->
最后将编译出来的Emacs.App文件夹复制到 /Application 中即可,希望对诸位有帮助,吃午饭去了,88 :-)