谁正在 macos 上使用 liberime, 帮忙测试一下这个 liberime makefile 是否可用

这个 -I 设置不对吧,librime 仓库里面并没有一个叫 include 的目录。

另外,在 $xx_path 后面加上斜线比较好。

➜  librime git:(master) find . -name rime_api.h
./src/rime_api.h

我自己改了一下 Makefile 是可以编译的。

1 个赞

这样吗?

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 编写 :rofl:

就是把一个 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 编译),可以编译成功 :ok_hand:

另外遇到了一个警告

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 接口不熟)

我这边也有这个警告 :-)