这个 -I
设置不对吧,librime 仓库里面并没有一个叫 include
的目录。
另外,在 $xx_path 后面加上斜线比较好。
➜ librime git:(master) find . -name rime_api.h
./src/rime_api.h
我自己改了一下 Makefile 是可以编译的。
这样吗?
ifdef RIME_PATH
CFLAGS += -I ${RIME_PATH}/src/
LDFLAGS += -L ${RIME_PATH}/lib/ -Wl,-rpath ${RIME_PATH}/lib/ $(LIBRIME)
else
LDFLAGS += $(LIBRIME)
endif
在 librime 下面 make 会把 dylib 放到 build/lib 下面,make xcode 会把 dylib 放到 lib/Release 下面,所以可能拆成两个变量比较好
没太理解,昨天刚学的 makefile 编写
就是把一个 RIME_PATH 分成两个 RIME_SRC_PATH 和 RIME_LIB_PATH,不过我对 librime 也不是很熟,不清楚有没有更好的做法
再试试看行不行
ifdef RIME_PATH
CFLAGS += -I ${RIME_PATH}/src/
LDFLAGS += -L ${RIME_PATH}/build/lib/ -L ${RIME_PATH}/build/lib/Release/
LDFLAGS += -Wl,-rpath,${RIME_PATH}/build/lib/:${RIME_PATH}/build/lib/Release $(LIBRIME)
else
LDFLAGS += $(LIBRIME)
endif
macOS 上也可用后缀 so,不是必须用 dylib,甚至当 module-file-suffix 返回 dylib 时,也能用 so。-shared 在 macOS 上也能用。总之用不着对 macOS 做特殊处理。
还有可以试试 GitHub Action,它支持 macOS。
已经按照同学提供的信息简化了 Makefile
不过 emacs 在 macos 上认 so 后缀不?
可以。在 emacs master 里,如果 liberime-core.dylib 不存在,(load "liberime-core")
会载入 liberime-core.so
27开始才会正确认dylib,以前一直只认so
认
不清楚 27 还是 28,反正如果支持 dylib 的话,so 也照样行,相应 Emacs 版本的 module-file-suffix 这个变量的 info 文档里有说明。
https://archive.casouri.cat/emacs-manuals/master/elisp/Dynamic-Modules.html#Dynamic-Modules
On macOS, dynamic modules can also have the suffix .so in addition to .dylib.
module-file-suffix
;; => ".so"
emacs-version
;; => "27.0.90"
(emacs-version)
;; => "GNU Emacs 27.0.90 (build 1, x86_64-apple-darwin19.4.0, Carbon Version 162 AppKit 1894.4)
of 2020-04-09"
如果有时间,再试一下这个makefile, 看能不能在macos上编译成功
试了一下(librime 用 make xcode
编译),可以编译成功
另外遇到了一个警告
src/interface.c:158:71: warning: control reaches end of non-void function
[-Wreturn-type]
emacs_value em_symbol(emacs_env *env, const char *str) { INTERN(str); }
可能需要用 return ?(对 Emacs C 接口不熟)
我这边也有这个警告 :-)