事发原因:
由于我发现自己编译的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 的
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了很多都找不到!
本人非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 个赞
由于之前过年,没有携带自己的个人电脑,所以无法实验你给的解决方案,对于没有及时回复,抱歉。
现在我实验了一下,发现我有以下问题需要你的帮助:
在LINUX环境下我只是知道 ImageMagick的路径是 /usr/bin/convert
不清楚你在bash脚本中的case中的设定方式(ps:我知道你的case是对于macos的 我已经改为linux了)
我使用的ImageMagick 版本是直接从gayhub上克隆后切换成6.9.6-0 版本分支,不知道是否符合你之前告诉我的版本条件。
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
希望得到你的帮助
对 Linux 不了解。
错误信息显示 pkg-config
找不到 imagemagick,有可能:
imagemagick 安装到了 pkg-config
找不到的地方。这就需要像我前面回帖那样设置 PKG_CONFIG_PATH
。
通常一个 pkg 安装之后,都会把配置文件拷贝/连接到 pkg-config
搜索目录,例如在我的 macOS 上是 /usr/local/lib/pkgconfig/
。为什么 homebrew 不把 imagemagick@6 的配置文件拷贝/连接到 pkg-config
搜索目录?可能是考虑 imagemagick7 才是主流版本。
如果 linux 不存在这个问题,看下一条。
需要要安装 imagemagick-devel.XXXX
(名字大概是这种形式)。
谢谢你给了我很大的帮助 ,不过我还是不太明白你所说的,我需要自己从网络中分片搜索你提供的知识点从而学习和了解它们,关于:
什么是pkg-config;它有什么用;它对于编译源码有什么作用。
cflag设定是什么。
我是否需要学习一下关于编译源码的具体知识才能理解这些?如果方便的化,你可以提供给我一个学习引导以便于让我可以在linux平台中理解和解决这个问题吗?
Angelaneia:
很大的帮助
是指问题解决了还是没解决?
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。初步体验是大大超出心理预期的,达到了开箱即用的水平。很想给人安利一下这个发行版
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.
很贴心了,有木有?!