Pidgin插件的新CMakeLists.txt

12 views
Skip to first unread message

wks1986

unread,
Jan 22, 2011, 8:46:02 AM1/22/11
to ofe...@googlegroups.com
Pidgin插件现有的CMakeLists.txt中试图检测Pidgin安装路径,但是其代码并不总能正确检测到Pidgin安装的位置。

我认为,可以假设用户聪明一点:假设“pidgin就安装在prefix指定的位置”,而且“用户已经正确设定了prefix”,而不需要自动检测。这样做,就要求用户在编译pidgin-openfetion的时候,在cmake
.这一步加上选项:-DCMAKE_INSTALL_PREFIX:PATH=/usr

实际上其他软件的插件(比如gedit)都必须用户定义prefix的位置。

在给Fedora打rpm包的时候,Fedora的rpmbuild已经定义了%cmake这个宏,这个宏调用cmake,同时已经加了上述prefix选项。关于/usr/lib和/usr/lib64的区别,Fedora目前的宏定义中有LIB_SUFFIX这个宏,它在64位系统上编译时被定义为"64"。

因此可以在CMakeLists.txt中这样定义:

if(NOT DEFINED LIB_INSTALL_DIR)
set(LIB_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}")
endif(NOT DEFINED LIB_INSTALL_DIR)

这样,在64位系统上,如果prefix是/usr,那么LIB_INSTALL_DIR就是/usr/lib64。在32位系统上,就是/usr/lib。

Fedora相关的详情见http://fedoraproject.org/wiki/Packaging/cmake
另外,http://fedoraproject.org/wiki/PackagingDrafts/cmake这里有人建议在构建的时候给cmake定义CMAKE_INSTALL_LIBDIR,
INCLUDE_INSTALL_DIR, LIB_INSTALL_DIR, SYSCONF_INSTALL_DIR,
SHARE_INSTALL_PREFIX这几个宏,这样CMakeLists.txt里就可以直接使用LIB_INSTALL_DIR这个宏。

LIB_INSTAL_DIR这个宏没有出现在cmake的documentation中。但是在kde的邮件组中有人提到。有没有人帮我查一查上述几个宏的最早出处。目前似乎还不是一个标准。

新的CMakeLists.txt在附件中,可以在Fedora14,64位机上编译。还需要测试一下在其他环境中能不能工作。

wks

CMakeLists.txt.new

Aron Xu

unread,
Jan 22, 2011, 10:38:16 AM1/22/11
to ofe...@googlegroups.com
这个问题我今天早上因为接到 bug 报告已经做了一个补丁,方法略有不同,效果大致相同。

bug 报告是这样的,原来用 whereis + sed 的方法,在没有 pidgin-dev 的时候会生成一些无效的路径名,路径里面有换行符(\n)。

我的方法是这样的:
1. 用 pkg-config 来找 libpurple 的位置:
EXEC_PROGRAM("pkg-config --variable=datadir purple 2>/dev/null"
OUTPUT_VARIABLE PURPLE_DATADIR)
EXEC_PROGRAM("pkg-config --variable=libdir purple 2>/dev/null"
OUTPUT_VARIABLE PURPLE_LIBDIR)

后面
SET(RES_INSTALL_DIR "${PURPLE_DATADIR}/purple/openfetion/")
SET(LIB_INSTALL_DIR "${PURPLE_LIBDIR}/purple-${PURPLE_MAJOR_VERSION}")

这样做可以不用理会发行版的不同,因为 libdir 的问题已经有 purple 的维护人员处理过,咱们只要随它安装到哪就放哪,:D

2. 用 CMAKE_INSTALL_PREFIX 指定 Pidgin 的目录:
SET(PIDGIN_PIX_INSTALL_DIR
"${CMAKE_INSTALL_PREFIX}/share/pixmaps/pidgin/protocols/16/")

这个目录必须在 /usr/share 或者 /usr/locale/share 之下,否则不符合 FHS,所以我直接把 share 写到里面了。

--
Regards,
Aron Xu

wks1986

unread,
Jan 23, 2011, 2:36:26 AM1/23/11
to ofe...@googlegroups.com
发现purple.pc里面还有个plugindir变量可以直接用。
我这里purple.pc的内容是:
prefix=/usr
exec_prefix=/usr
libdir=/usr/lib64
includedir=/usr/include
datarootdir=${prefix}/share
datadir=/usr/share
sysconfdir=/etc

plugindir=${libdir}/purple-2

Name: libpurple
Description: libpurple is a GLib-based instant messenger library.
Version: 2.7.9
Requires: glib-2.0
Cflags: -I${includedir}/libpurple
Libs: -L${libdir} -lpurple

> --
> 您收到此邮件是因为您订阅了 Google 网上论坛的“Openfetion ”论坛。
> 要向此网上论坛发帖,请发送电子邮件至 ofe...@googlegroups.com
> 要取消订阅此网上论坛,请发送电子邮件至 ofetion+u...@googlegroups.com
> 若有更多问题,请通过 http://groups.google.com/group/ofetion?hl=zh-CN 访问此网上论坛。
>
>

Aron Xu

unread,
Jan 23, 2011, 2:55:19 AM1/23/11
to ofe...@googlegroups.com
2011/1/23 wks1986 <wks...@gmail.com>:
> 发现purple.pc里面还有个plugindir变量可以直接用。

2.6.x 的 purple.pc 没有这个变量,可以加个测试,如果有就直接用。

prefix=/usr
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include
datarootdir=${prefix}/share
datadir=${datarootdir}
sysconfdir=/etc

Name: libpurple
Description: libpurple is a GLib-based instant messenger library.

Version: 2.6.6


Requires: glib-2.0
Cflags: -I${includedir}/libpurple
Libs: -L${libdir} -lpurple

--
Regards,
Aron Xu

Reply all
Reply to author
Forward
0 new messages