archlinux 编译 emacs 25.3 和 27 均无法支持imagemagick

事发原因:

由于我发现自己编译的emacs无法执行org的缩放图片功能,具体实现代码是:

     #+attr_org: :width 200px
    [[file:../images/example.image]]

这个只有运行从pacman官方源的emacs 25.3才有用.

于是忽我google 具体方法解决自编译版本无法实现这个功能的原因,最后得出结果是在编译emacs的时候没有支持imagemagick:

 (image-type-available-p 'imagemagick) ;;查看编译的emacs是否支持imagemagick

结果显示为nil.

原文链

相似的问题的链接 不过是macos的

我在configure的时候加上了参数 --with-imagemagick ,查看configure的结果的时候imagemagick一栏依然是’no’ .

大佬们,皮皮虾跪求帮助.

你系统里装imagemagick6了没?

我也错了……我得再找找原因

=====update===== 我发现我这儿configure的时候是no,但是检测函数却返回t……

我装了imagemagick了 但是检测项还是no emacs检测函数还是nil

我看到mac好像是通过 imagemagick@6 这个pass的 但是我这里不行

Emacs 不支持最新的 imagemagick 7,你要先自己编译安装一份 6 才行。

用 MacPort 版就算没有 imagemagick 也能用系统自带 API 的

我已经安装了6了,还是不行

configure 只提供了 --without-imagemagick 选项:

⋊> ./configure --help | grep imagemagick
  --without-imagemagick   don't compile with ImageMagick image support

所以 homebrew 的那个 --with-imagemagick@6 只是个安慰选项,默认本来就会检测 imagemagick,除非指定了 --without-imagemagick 参数。

但是 emacs 比较挑剔,不支持 7,也不是所有 6 都支持:

⋊> ag imagemagick_module configure.ac
2547:    IMAGEMAGICK_MODULE="Wand >= 6.3.5 Wand != 6.8.2 Wand < 7"
2548:    EMACS_CHECK_MODULES([IMAGEMAGICK], [$IMAGEMAGICK_MODULE])

不知道 homebrew 用了什么魔法,单看 emacs.rb 文件并没有什么特别设置,而我自行编译把 cflags、libs 参数都设置了还是检测不到 imagemagic:

  Does Emacs use imagemagick (version 6)?                 no

我也发现了 其实emacs本身默认就没有 --with-imagemagick 这个选项,只有 --without-imagemagick .

感谢你贴出emacs要求的imagemagick的版本要求,让我发现emacs对于imagemagickd这么挑剔.

我在想 为什么 emacs对于imagemagick的 支持这么繁琐? 官方有没有解决的办法 ,我google了很多都找不到!:joy:

本人非cs出身 问出什么幼稚的话 还请大佬们海涵.

我知道问题出在哪儿了,参数应该是 wand 而不是 imagemagick:

⋊> cat ./build.sh
#!/usr/bin/env bash
#
# Usage:
#
#       ./build.sh /path/to/emacs-source
#

cd $1

case $(uname -s) in
    Darwin) IMAGEMAGICK_PATH=$(brew --prefix imagemagick@6);;
    *     ) echo "Unknown system: $(uname -s)"; exit 1;;
esac

export PATH=$IMAGEMAGICK_PATH/bin:$PATH
export PKG_CONFIG_PATH=$IMAGEMAGICK_PATH/lib/pkgconfig:$PKG_CONFIG_PATH
export IMAGEMAGICK_LIBS=$(pkg-config --libs wand)
export IMAGEMAGICK_CFLAGS=$(pkg-config --cflags wand)

[[ -f ./configure ]] || ./autogen.sh
./configure --with-imagemagick
make

Linux 下的 ImageMagick 6 路径你补上应该就能检测到:

⋊> ./build.sh emacs-05e8b4392be7fb368dcf4e4a19f75f94b323028d | grep imagemagick
  Does Emacs use imagemagick (version 6)?                 yes
1 个赞

@twlz0ne 新年好

由于之前过年,没有携带自己的个人电脑,所以无法实验你给的解决方案,对于没有及时回复,抱歉。

现在我实验了一下,发现我有以下问题需要你的帮助:

  1. 在LINUX环境下我只是知道 ImageMagick的路径是 /usr/bin/convert 不清楚你在bash脚本中的case中的设定方式(ps:我知道你的case是对于macos的 我已经改为linux了)
  2. 我使用的ImageMagick 版本是直接从gayhub上克隆后切换成6.9.6-0 版本分支,不知道是否符合你之前告诉我的版本条件。
  3. pkg-config --libs wand 之后返回的结果是这样的,我不知道怎样解决:
	[@localhost]$ pkg-config --libs wand
	
	Package wand was not found in the pkg-config search path.
	
	Perhaps you should add the directory containing `wand.pc'
	
	to the PKG_CONFIG_PATH environment variable
	
	Package 'wand', required by 'virtual:world', not found

希望得到你的帮助 :slight_smile:

对 Linux 不了解。

错误信息显示 pkg-config 找不到 imagemagick,有可能:

  1. imagemagick 安装到了 pkg-config 找不到的地方。这就需要像我前面回帖那样设置 PKG_CONFIG_PATH

    通常一个 pkg 安装之后,都会把配置文件拷贝/连接到 pkg-config 搜索目录,例如在我的 macOS 上是 /usr/local/lib/pkgconfig/。为什么 homebrew 不把 imagemagick@6 的配置文件拷贝/连接到 pkg-config 搜索目录?可能是考虑 imagemagick7 才是主流版本。

    如果 linux 不存在这个问题,看下一条。

  2. 需要要安装 imagemagick-devel.XXXX (名字大概是这种形式)。

谢谢你给了我很大的帮助 :slightly_smiling_face:,不过我还是不太明白你所说的,我需要自己从网络中分片搜索你提供的知识点从而学习和了解它们,关于:

  1. 什么是pkg-config;它有什么用;它对于编译源码有什么作用。
  2. cflag设定是什么。

我是否需要学习一下关于编译源码的具体知识才能理解这些?如果方便的化,你可以提供给我一个学习引导以便于让我可以在linux平台中理解和解决这个问题吗?

其实吧,还是用 Gentoo 好。

是指问题解决了还是没解决?


C{XX}FLAGS、LDFLAGS 是 Makefile 环境变量,用来指定依赖的头文件、链接库和编译参数。这些变量的值是什么,就成了一大问题。比如依赖 imagemagick 就得设置:

-L/usr/local/Cellar/imagemagick@6/6.9.9-34/lib -lMagickWand-6.Q16 -lMagickCore-6.Q16
-DMAGICKCORE_HDRI_ENABLE=0 -DMAGICKCORE_QUANTUM_DEPTH=16 -DMAGICKCORE_HDRI_ENABLE=0 -DMAGICKCORE_QUANTUM_DEPTH=16 -I/usr/local/Cellar/imagemagick@6/6.9.9-34/include/ImageMagick-6

WTF!什么鬼!?

所有就有了 pkg-config 这么一个统一的管理工具。源码包通常会提供一份 .pc 文件,告诉使用者,如果依赖了这个包,应如何设置 C{XX}FLAGS/LDFLAGS,毕竟包作者最清楚,例如:

⋊> cat /usr/local/lib/pkgconfig/libzip.pc
prefix=/usr/local/Cellar/libzip/1.3.0
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include
libincludedir=${exec_prefix}/lib/libzip/include

zipcmp=/usr/local/Cellar/libzip/1.3.0/bin/zipcmp

Name: libzip
Description: library for handling zip archives
Version: 1.3.0
Libs:  -L${libdir} -lzip -lbz2 -lz
Cflags: -I${includedir} -I${libincludedir}

假如你当前正在编译的源代码依赖 libzip,通过 pkg-config 查询就知道 C{XX}FLAGS/LDFLAGS 该填什么了:

⋊> pkg-config --libs libzip
-L/usr/local/Cellar/libzip/1.3.0/lib -lzip -lbz2 -lz

⋊> pkg-config --cflags libzip
-I/usr/local/Cellar/libzip/1.3.0/include -I/usr/local/Cellar/libzip/1.3.0/lib/libzip/include
1 个赞

我突然想起来一个叫 Linux-Homebrew 的项目,和 macOS 下的 Homebrew 使用体验应该差不多。?这样的话,把 25.3 的 formula 稍微修改一下应该就能编译 27 版的 emacs 了?

冒昧猜测,大概率还是能搞定的。善用一下别人的劳动成果,嘿嘿。


至于 archlinux,我是不碰 Linux 好久,然后趁过年期间尝试了下 manjaro。初步体验是大大超出心理预期的,达到了开箱即用的水平。很想给人安利一下这个发行版 :grin:

Linuxbrew 的 emacs.rb 跟 Homebre 的 emacs.rb 可以说是同步了,就多了两行:

⋊> diff -u0 homebrew-formula-emacs.rb linuxbrew-formula-emacs.rb
--- homebrew-formula-emacs.rb   2018-02-23 13:31:45.000000000 +0800
+++ linuxbrew-formula-emacs.rb  2018-02-23 13:35:27.000000000 +0800
@@ -10,0 +11 @@
+    sha256 "760c34fb38730f2cd9d60fb3e39723c549267d6ad643e952a1fd6e927d8d5a4b" => :x86_64_linux
@@ -43,0 +45 @@
+  depends_on "ncurses" unless OS.mac?

Homebrew 可以判断平台是 macOS 还是 Linux,所以「理论上」两者合二为一,跨平台的包管理器是可能的。实际情况要复杂的多,一想起 Linux 上各种发行版就头大……

还是具体到楼主的问题,看看人家 formula 是怎么处理依赖关系的。修改两三处,编译个支持 imagemagick 的 emacs 27 应该问题不大。

楼主这个问题,从 formula 看不出什么,只有一行 depends_on "imagemagick@6" => :optional,再往上追 [email protected] 也没有什么特别的设置。

Homebrew 安装依赖的时候,把搜索路径都处理好了,所以在 formula 中不体现这些细节,只有一个依赖的名称。

我前面的的 build.sh 实际上是跳过了某些检查步骤,直接设置 IMAGEMAGICK_LIBS & IMAGEMAGICK_CFLAGS,因为我也不知道如何还原 Homebrew 设置的环境变量。

看描述你是计划不安装 Hombrew,继续 wget->config->make->make install 的流程?我的意思是安上 Homebrew,修改一下 emacs formula 的包下载地址和校验值,很有可能就把新版 emacs 编译出来了。

刚才看了下 imagemagick@6 这个 formula,发现里面的版本为 6.9.9-35。也许是 emacs 依赖于这个特定的版本?

又看了下 emacs formula,基本上人家把踩到的坑在注释里都提出来了:

1. 不支持 ImageMagick 7。

# Emacs does not support ImageMagick 7:
# Reported on 2017-03-04: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=25967

2. ImageMagick 有可能找不到路径。但是用 --with-imagemagick 选项却并不会报错,并停止编译。

# Note that if ./configure is passed --with-imagemagick but can't find the
# library it does not fail but imagemagick support will not be available. 
# See: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=24455

3. 在 Vim 和 Emacs 里同时使用 ctags,可能造成冲突。

# Follow MacPorts and don't install ctags from Emacs. This allows Vim
# and Emacs and ctags to play together without violence.

很贴心了,有木有?!