标题的前半句好像说过好几次了- -b,只是最近事儿实在太多,都忙昏头了。。
这两天在公司干活,某项目明明是个java项目,但却没法在mac下跑,只能在linux下跑,很是让人烦闷,仔细一看发现是它JNI调用了好些操作系统相关的二进制库,譬如libramfile.amd64.so啊、liblzocompression.i386.so之类的。但问题是对于libJavaReadline,只有linux下的两个binary,却没有mac的,于是只好自力更生,也编译个对应的binary了。
结果稍微一google发现资料稀缺,大家都不在mac上编译这个库的嘛……看了好几个不靠谱的介绍后,终于看到相对最靠谱的的了:Java-Readline on Mac OS X Update,不过即使是相对最靠谱的,但由于是06年的文章,一些细节也变了,所以这里整理一下变化了的细节:
首先下载源码并解压缩
修改源代码根目录下的Makefile,做如下修改:
- 在
# Operating system dependent一行的下面加入JAVA_HOME变量:
JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Home
- 接着修改紧挨着的JAVAINCLUDE和JAVANATINC,使得它们看起来是:
JAVAINCLUDE = /System/Library/Frameworks/JavaVM.framework/Headers
JAVANATINC = /System/Library/Frameworks/JavaVM.framework/Headers
- 把
LD_LIBRARY_PATH改成DYLD_LIBRARY_PATH
接下来修改src/native/Makefile:
- 将
LIBPATH变量清空
- 把60行附近的
CFLAGS修改为
CFLAGS=-isysroot /Developer/SDKs/MacOSX10.6.sdk -arch i386 -fno-common -DMAC_OS
- 把102行附近的
$(CC) -shared $(OBJECTS) $(LIBPATH) $($(TG)_LIBS) -o $@修改为:
$(CC) -bundle -flat_namespace -isysroot /Developer/SDKs/MacOSX10.6.sdk -arch i386 $(OBJECTS) $(LIBPATH) $($(TG)_LIBS) -o $@
- 把51行附近的
JavaReadline_LIBS修改为
JavaReadline_LIBS = -lreadline -ltermcap
最后修改的是src/native/org_gnu_readline_Readline.c:
- 第98, 114, 213和224行,将
#ifdef JavaReadline修改为#if defined JavaReadline && !defined MAC_OS
- 第216, 235和475行,将
#ifdef JavaEditline修改为#if defined JavaEditline || defined MAC_OS
接下来就可以直接make了!
修改过的src和编译出来的binary,我也做好了懒人包替懒人们着想了……
嗯,没了。