求助:CentOS 8 上源码编译安装emacs 29报错

安装步骤参考资料:

环境:CentOS 8 安装版本:emacs 29

1. 先安装 tree-sitter

  • git clone [email protected]:tree-sitter/tree-sitter.git
  • cd tree-sitter/
  • make
  • make install

安装成功:

  • $ tree-sitter
  • tree-sitter 0.20.8

make以后so文件目录在

  • /usr/local/lib 文件:ls
  • -rw-r–r-- 1 root root 272K Jan 25 18:06 libtree-sitter.a
  • lrwxrwxrwx 1 root root 21 Jan 25 18:06 libtree-sitter.so → libtree-sitter.so.0.0
  • lrwxrwxrwx 1 root root 21 Jan 25 18:06 libtree-sitter.so.0 → libtree-sitter.so.0.0
  • -rwxr-xr-x 1 root root 207K Jan 25 18:06 libtree-sitter.so.0.0

2. 源码安装emacs

问题: configure: error: The following required libraries were not found: tree-sitter Maybe some development libraries/packages are missing? To build anyway, give: –with-tree-sitter=ifavailable as options to configure.

实际上,经过步骤1,已经安装 tree-sitter 了。

libtree-sitter.so (或者类似名称的动态库)在 /usr/… 的哪个位置呢

感谢提示。已补充到问题中了哈。 在目录:/usr/local/lib

可以软链接到 /usr/lib 中

或者编译 emacs 时添加 /usr/local/lib 到 LD_LIBRARY_DIR,不过我没试过

ln -s /usr/local/lib/libtree-sitter.so.0.0 /usr/lib 以后还是报同样的错误。我再试试其他办法。感谢帮忙~

… .so 后缀的 symlink 呢,而不是 .0.0 的

一样的结果哈。实际libtree-sitter.so应该软链到libtree-sitter.so.0.0的。

configure 检查的是头文件在哪里,你贴动态库位置又没用

ln -s /usr/local/lib/libtree-sitter.so.0.0 /usr/lib/libtree-sitter.so
ln -s /usr/local/lib/libtree-sitter.so.0.0 /usr/lib/libtree-sitter.so.0

没注意到你的 ln 参数,Emacs 靠 libtree-sitter.so 这个名字识别是否有 tree-sitter,如果不加上后一条,在 configure 时不会有问题,但编译时会出问题。

我在 Ubuntu 上试了下,最新版的 emacs 29.2 能够正常编译…

发现有点不对,编译出来的tree-sitter版本和命令行里面的不是同一个版本。

后者是按照tree-sitter文档:https://github.com/tree-sitter/tree-sitter/blob/master/cli/README.md

  • cargo install tree-sitter-cli

不熟悉Linux哈。请教一下,有什么办法可以排查并修复这种configuer问题吗?感谢感谢~

你这个 tree-sitter 命令只是生成 parser 时用的构建工具,你不写 parser 的话是没用的,和 Emacs 实际要链接的 libtree-sitter 也没关系。

你应该看 /usr/local/include 里有没有 tree_sitter 路径,有的话运行 ./configure 时加上

 ./configure CFLAGS="-I/usr/local/include" LDFLAGS="-L/usr/local/lib" <其它参数>

草,我一直以为你是这样操作的:


cd /usr/local/src
git clone https://github.com/tree-sitter/tree-sitter
sudo make 
sudo make install

bash - How to add include and lib paths to configure/make cycle? - Stack Overflow 里面的方法,也就是 ldbeth 上面说的应该是标准做法,不过我没试过,等会去试试

:joy:是这么操作的。只是遇到问题了,病急乱投医,就去看tree-sitter文档,就用rust的cargo安装了一遍cli工具。抱歉,我没说清楚。主要还是不熟悉,乱尝试。

我在内网编译emacs,也遇到了这个问题,我跟踪了下configure这个文件,发现是系统少了pkg-config,导致的。 我在arch下执行pacman -S pkg-config 安装后,再执行 *./configure --with-tree-sitter 就ok了。

有时间在 ubuntu 上编译了一下,按照标准方法安装的 tree-sitter 可被识别,编译参数如下(emacs 29.2, ubuntu 20):

./configure CFLAGS="-O2 -mtune=native -pipe -I/usr/local/include" LDFLAGS="-L/usr/local/lib"  \
--with-json --with-tree-sitter --without-compress-install \
--with-native-compilation=no --with-mailutils