把完美的notify-osd找回来

写在前面: 本文希望通过一个具体的修改编译安装Ubuntu系统软件包的过程 帮助在编译安装时遇到类似问题的盆友解决问题.

恩, 首先呢, 这个问题仅仅针对启用了 ppa:xorg-edgers/ppa 的 alpha tester 盆友…
这个悲剧已经有两个多月(以上)的历史拉(因为两个多月前Felix才忍不住去report了), 我report的错误参见: https://bugs.launchpad.net/ubuntu/+source/pixman/+bug/623272
不过某位大大(Peter Clifton)给出了解决方案, 这里简单解释一下…

首先获得当前版本的notify-osd的源代码:

sudo apt-get source notify-osd

完成后进入目录, 把下面的patch存成文件 然后用patch命令应用上去:

=== modified file 'src/tile.c'
--- src/tile.c	2009-07-31 11:07:29 +0000
+++ src/tile.c	2010-12-06 00:24:55 +0000
@@ -180,7 +180,7 @@
 
 	// top right
 	cairo_matrix_init_scale (&matrix, -1.0f, 1.0f);
-	cairo_matrix_translate (&matrix, -width, 0.0f);
+	cairo_matrix_translate (&matrix, -1.0f * width, 0.0f);
 	cairo_pattern_set_matrix (pattern, &matrix);
 	cairo_rectangle (cr,
 			 width - pad_width,
@@ -193,7 +193,7 @@
 
 	// bottom right
 	cairo_matrix_init_scale (&matrix, -1.0f, -1.0f);
-	cairo_matrix_translate (&matrix, -width, -height);
+	cairo_matrix_translate (&matrix, -1.0f * width, -1.0f * height);
 	cairo_pattern_set_matrix (pattern, &matrix);
 	cairo_rectangle (cr,
 			 pad_width,
@@ -206,7 +206,7 @@
 
 	// bottom left
 	cairo_matrix_init_scale (&matrix, 1.0f, -1.0f);
-	cairo_matrix_translate (&matrix, 0.0f, -height);
+	cairo_matrix_translate (&matrix, 0.0f, -1.0f * height);
 	cairo_pattern_set_matrix (pattern, &matrix);
 	cairo_rectangle (cr,
 			 x,

然后

patch -p1 -i xxx.patch


再然后, 你一定想各种

./configure && make && sudo make install

啦?
先等等, 为了让它和系统包管理和谐相处, 我们需要在configure的时候加上prefix:

./configure --prefix=/usr

这样是不是就可以了呢?
答案是: 不行!
执行到make时, 会出现类似这样的错误:

  CCLD   notify-osd
/usr/bin/ld: notify_osd-bubble.o: undefined reference to symbol 'XDeleteProperty'
/usr/bin/ld: note: 'XDeleteProperty' is defined in DSO /usr/lib64/libX11.so.6 so try adding it to the linker command line
/usr/lib64/libX11.so.6: could not read symbols: Invalid operation
collect2: ld returned 1 exit status
make[3]: *** [notify-osd] Error 1
make[3]: Leaving directory `/home/felix/Sources/notify-osd-0.9.29/src'
make[2]: *** [all] Error 2
make[2]: Leaving directory `/home/felix/Sources/notify-osd-0.9.29/src'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/felix/Sources/notify-osd-0.9.29'
make: *** [all] Error 2

我的解决方法是: configure时带上LIBS环境变量!
先带上提示缺少的libX11吧:

LIBS="-lX11" ./configure --prefix=/usr

让我们试试make?
还是不行!
错误应该和下面的提示类似:

  CCLD   notify-osd
/usr/bin/ld: notify_osd-gaussian-blur.o: undefined reference to symbol 'pixman_image_composite'
/usr/bin/ld: note: 'pixman_image_composite' is defined in DSO /usr/lib64/libpixman-1.so.0 so try adding it to the linker command line
/usr/lib64/libpixman-1.so.0: could not read symbols: Invalid operation
collect2: ld returned 1 exit status
make[3]: *** [notify-osd] Error 1
make[3]: Leaving directory `/home/felix/Sources/notify-osd-0.9.29/src'
make[2]: *** [all] Error 2
make[2]: Leaving directory `/home/felix/Sources/notify-osd-0.9.29/src'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/felix/Sources/notify-osd-0.9.29'
make: *** [all] Error 2

那么是不是再加上 -lpixman 呢? 还是不对…
注意看库文件的文件名: libpixman-1.so.0
因此需要加上的是: -lpixman-1
这样完整的configure命令应该是:

LIBS="-lX11 -lpixman-1" ./configure --prefix=/usr

之后淡定的

make

就好了.
接下来如果用

sudo make install

不怎马和谐(非包管理嘛)
如果像下面这么用checkinstall:

sudo checkinstall --pkgname=notify-osd --pkgversion "0.9.29-0ubuntu5+felix1" --backup=no --default

安装完成后试试更新系统, 会发现提示安装notification-daemon…
因此我们需要指明notify-osd包”提供了”notification-daemon”
完整的checkinstall命令如下:

sudo checkinstall --pkgname=notify-osd --pkgversion "0.9.29-0ubuntu5+felix1" --backup=no --default --provide=notification-daemon

安装完成后, 试试

notify-send test

纳尼? 边框仍然不完整? 事实上, 我们刚才编译的新版本并没有在运行…
先杀掉系统里仍然运行的老版本notify-osd:

sudo killall notify-osd

然后再来测试, OK 成功!

PS: 作为一只懒猫 我深刻理解懒人的想法, 因此我把编译打包好的版本放在了: http://deb.felixcat.net 有兴趣直接拿的盆友们, 伸爪吧!

2 thoughts on “把完美的notify-osd找回来”

  1. fy,我是DB。统计软件又出问题了,你看一下吧~我一个月前就给你发QQ消息了,一直没看到你反应。如果有空,尽快帮忙弄下吧,各个群在等着用~应该是QQ邮箱改版弄的,修改起来也快。谢谢~

    日期:2010-12-22
    Deep Blue 20:33:52
    fy,还好吗?忙不~

    统计软件又出问题了,读取不了邮件,你看下吧~等你的修正~

Leave a Reply

Your email address will not be published. Required fields are marked *

QR Code Business Card