本文为RPM打包简易指南,只讲解如何将二进制文件或脚本文件进行RPM打包。

准备工作

笔者的打包环境为Ubuntu 12.10,因此后续的打包过程只适用Ubuntu和Debian系统(openSuSE和Fedora等系统有所区别)。

安装打包工具

首先安装RPM打包工具,使用以下命令进行安装:

1
$ sudo apt-get install rpm

注:上述命令适用Ubuntu 12.04、Ubuntu 12.10以及Debian 6,其它发行版本未验证。

创建打包目录

接着自定义打包目录,使用以下命令创建打包目录:

1
2
3
4
5
6
7
8
$ mkdir ~/rpm
$ mkdir -p ~/rpm/BUILD
$ mkdir -p ~/rpm/BUILDROOT
$ mkdir -p ~/rpm/RPMS/i386
$ mkdir -p ~/rpm/RPMS/x86_64
$ mkdir -p ~/rpm/SOURCES
$ mkdir -p ~/rpm/SPECS
$ mkdir -p ~/rpm/SRPMS

其中BUILD是存放编译过程中的临时文件,BUILDROOT存放打包文件(一般为打包二进制文件),RPMS存放根据不同架构生成的rpm包,SOURCES用来存放源码包,SPECS用来存放spec文件,SRPMS用来存放srpm包。

设置环境

创建完打包目录后,还需设置打包路径,可通过修改topdir宏的值来自定打包路径:

1
$ echo %_topdir $HOME/rpm > ~/.rpmmacros

设置完毕后,可以使用以下命令查看自定打包路径:

1
$ rpm --showrc|grep _topdir
-14: _builddir    %{_topdir}/BUILD
-14: _buildrootdir    %{_topdir}/BUILDROOT
-14: _rpmdir    %{_topdir}/RPMS
-14: _sourcedir    %{_topdir}/SOURCES
-14: _specdir    %{_topdir}/SPECS
-14: _srcrpmdir    %{_topdir}/SRPMS
-14: _topdir    /home/yyhoo/rpm

打包

老生常谈,以Hello World为例,开始讲解二进制文件的打包过程。

编写源码

1
2
3
4
5
6
7
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("Hello World!\n");
return 0;
}

将上述文件保存为 hello.c,并使用gcc进行编译:

1
$ gcc hello.c -o hello

创建hello包目录

使用终端进入BUILDROOT目录,并创建hello包目录:

1
2
$ mkdir hello-1.0-1.i386
$ mkdir -p hello-1.0-1.i386/usr/local/bin

将之前生成的hello移至hello-1.0-1.i386/usr/local/bin目录中。

编写spec文件

切换至SPEC目录下,并编写hello.spec文件,内容如下:

Summary: Hello World rpm package
Name: hello
Version: 1.0
Release: 1
License: GPL
Packager: mutse
Group: Application
URL: http://mutse.tk

BuildRoot: %{_builddir}/%{name}
AutoReqProv: no

%description
This is a software for rpm package.

%prep
%build
%install

%pre
%post
chmod 755 /usr/local/bin/hello

%files
/usr/local/bin/hello

打包

一切准备就绪,开始使用rpmbuild工具打包,操作如下:

1
2
$ cd ~/rpm/SPEC
$ rpmbuild -bb --target=i386 hello.spec

输出内容如下:

构建目标平台:i386
构建目标 i386
正在执行 (%prep):/bin/sh -e /var/tmp/rpm-tmp.myHgCr
+ umask 022
+ cd /home/yyhoo/rpm/BUILD
+ exit 0
正在执行 (%build):/bin/sh -e /var/tmp/rpm-tmp.T5dlla
+ umask 022
+ cd /home/yyhoo/rpm/BUILD
+ exit 0
正在执行 (%install):/bin/sh -e /var/tmp/rpm-tmp.Wl7B4S
+ umask 022
+ cd /home/yyhoo/rpm/BUILD
+ /usr/lib/rpm/brp-compress
+ /usr/lib/rpm/brp-strip /usr/bin/strip
+ /usr/lib/rpm/brp-strip-static-archive /usr/bin/strip
+ /usr/lib/rpm/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump
Processing files: hello-1.0-1.i386
正在检查未被打包的文件:/usr/lib/rpm/check-files
 /home/yyhoo/rpm/BUILDROOT/hello-1.0-1.i386
已写入:/home/yyhoo/rpm/RPMS/i386/hello-1.0-1.i386.rpm
正在执行 (%clean):/bin/sh -e /var/tmp/rpm-tmp.1zLS0k
+ umask 022
+ cd /home/yyhoo/rpm/BUILD
+ /bin/rm -rf /home/yyhoo/rpm/BUILDROOT/hello-1.0-1.i386
+ exit 0

至此,打包过程结束。生成的rpm包存放在~/rpm/RPMS/i386目录下。

结语

本文档只作为RPM打包的简易指南,更详细内容请查阅RPM官方最新打包手册。

参考资料:

本文简述如何将 django 从1.4升级至1.5,并解答升级后遇到的问题。

安装/升级

若读者的机器没有安装 django,使用以下命令进行安装:

1
2
$ sudo apt-get install pip
$ sudo pip install Django==1.5

若已安装,则使用以下命令进行升级:

1
$ sudo pip install Django==1.5

遇到的问题

1、数据库初始化失败

1
$ python manage.py syncdb
/usr/local/lib/python2.7/dist-packages/django/conf/init.py:219: DeprecationWarning: You have no filters defined on the 'mail_admins' logging handler: adding implicit debug-false-only filter. See http://docs.djangoproject.com/en/dev/releases/1.4/#request-exceptions-are-now-always-logged DeprecationWarning)

TypeError: init() got an unexpected keyword argument 'verify_exists'

原因:model URLField 中的关键字 verify_exists 在 django 1.5 中已移除django depreciation notes for 1.5

解决方法:在 models.py 中查找 models.URLField,将其参数 verify_exists=True 删掉。

例:

1
2
3
4
5
# 修改前
some_site = models.URLField(verify_exists=True)
# 修改后
some_site = models.URLField()

2、HTML 模板解析异常

raise NoReverseMatch("'url' requires a non-empty first argument. " NoReverseMatch: 'url' requires a non-empty first argument. The syntax changed in Django 1.5, see the docs.

原因django 1.5 模板中 url 语法发生改变

解决方法:根据页面异常提示修改相应的模板html文件。

例:

{{post.title}}

{{post.title}}

参考资料:

Porting source code of the book C++ GUI Programming with Qt 4 from Qt4 to Qt5.

Project Site: qt5-book-code

Porting Qt4 to Qt5

Porting the source code of the book C++ GUI Programming with Qt 4 (second edition) from Qt4 to Qt5 by Mutse Young.

The examples for all chapters with Qt 5.0 will be built on Ubuntu 12.04, and you can install qt5.0 with ppa.

  1. Qt5 入门

    chap01/age

    chap01/hello

    chap01/quit

  2. 创建对话框

    chap02/find

    chap02/gotocell1

    chap02/gotocell2

    chap02/gotocell3

    chap02/sort

  3. 创建主窗体

    chap03/spreadsheet

  4. 实现应用程序功能

    chap04/spreadsheet

  5. 创建自定义构件

    chap05/hexspinbox

    chap05/iconeditor

    chap05/iconeditorplugin

    chap05/plotter

  6. 布局管理

    chap06/findfile1

    chap06/findfile2

    chap06/findfile3

    chap06/mailclient

    chap06/mdieditor

    chap06/preferences

    chap06/splitter

  7. 事件处理

    chap07/ticker

  8. 二维图形

    chap08/cityscape

    chap08/diagram

    chap08/oventimer

  9. 拖放

    chap09/projectchooser

  10. 项视图类

    chap10/booleanparser

    chap10/cities

    chap10/colornames

    chap10/coordinatesetter

    chap10/currencies

    chap10/directoryviewer

    chap10/flowchartsymbolpicker

    chap10/settingsviewer

    chap10/teamleaders

    chap10/trackeditor

  11. 输入/输出

    chap12/imageconverter

    chap12/imagespace

    chap12/tidy

  12. 数据库

    chap13/scooters

    chap13/staffmanager

  13. 多线程

    chap14/imagepro

    chap14/semaphores

    chap14/threads

    chap14/waitconditions

  14. 网络

    chap15/ftpget

    chap15/httpget

    chap15/spider

    chap15/tripplanner

    chap15/tripserver

    chap15/weatherballoon

    chap15/weatherstation

  15. XML

    chap16/domparser

    chap16/saxhandler

    chap16/xmlstreamreader

    chap16/xmlstreamwriter

  16. 自定义外观

    chap19/bronze

    chap19/candy

  17. 三维图形

    chap20/teapots

    chap20/tetrahedron

    chap20/vowelcube

  18. 创建插件

    chap21/basiceffectsplugin

    chap21/bronze

    chap21/bronzestyleplugin

    chap21/cursorplugin

    chap21/extraeffectsplugin

    chap21/textart

  19. 应用程序脚本

    chap22/calculator

    chap22/gaspump

    chap22/htmleditor

  20. 平台相关特性

    chap23/addressbook

    chap23/bouncer

    chap23/mediaplayer

    chap23/tictactoe

  21. 嵌入式编程

    chap24/expenses
    chap24/unitconverter
    

前言

最近网上一直吵得很热闹的 Ubuntu Phone 计划于今年2月推出SDK,本篇参考Create a currency converter phone app一文,讲解如何在 Ubuntu 12.04 下搭建 Ubuntu Phone 开发环境。

搭建开发环境

安装 Qt5

使用 Ctrl+Alt+T 组合快捷键打开终端,并输入以下命令:

1
$ sudo add-apt-repository ppa:canonical-qt5-edgers/qt5-beta1 && sudo apt-get update && sudo apt-get install qt5-meta-full && echo 'export PATH=/opt/qt5/bin:$PATH' >> ~/.bashrc

安装 Ubuntu QML 工具

导入 Ubuntu QML toolkit PPA:

1
$ sudo add-apt-repository ppa:ui-toolkit/ppa

由于上述 PPA 中只提供了 12.10 安装包,所以需要替换下安装源中的’precise’

1
$ sudo sed -i 's/precise/quantal/g' /etc/apt/sources.list.d/ui-toolkit-ppa-precise.list

开始安装 QML toolkit:

1
$ sudo apt-get update && sudo apt-get install qt-components-ubuntu qt-components-ubuntu-demos qt-components-ubuntu-examples qt-components-ubuntu-doc notepad-qml

编写 Ubuntu Phone App

参考Create a currency convert phone app一文,编写QML文件,源码如下:

QML源文件

运行

由于 Ubuntu QML toolkit 使用的是 QML2,因此需要使用 qmlscene 工具运行:

$ qmlscene CurrencyConvertrt.qml

Ubuntu Phone App

参考资料

午休,无意发现一个 git 项目 autotools tutorial python gtk,困扰我一年的问题,终于得以解决,也可说是“柳暗花明又一村”。问题是如何使用 Autotools 工具打包 Python 程序?

准备工作

在使用 autotools 之前,先准备好目录结构:

首先,创建工程根目录,如下:

1
$ mkdir hello-1.0

进入 hello-1.0 目录下,再创建 src 和 hello 目录,用于存放 python 脚本:

1
2
$ cd hello-1.0
$ mkdir -p src/hello

编写 python 源码:

1
2
$ cd src/hello
$ vim app.py

app.py 源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/python
import pygtk
pygtk.require('2.0')
import gtk
class Application(object):
def __init__(self, *args, **kwargs):
for key in kwargs:
setattr(self, key, kwargs[key])
self._create_main_window()
def _create_main_window(self):
self.win = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.win.connect("destroy", gtk.main_quit)
self.win.set_size_request(300, 150)
self.win.set_border_width(20)
self.win.set_position(gtk.WIN_POS_CENTER)
self.win.add(gtk.Label("Hello World"))
def run(self):
self.win.show_all()
gtk.main()

创建一个空白的 init.py 文件:

1
$ touch __init__.py

返回至工程根目录下:

1
$ cd ../../

使用 Autotools

接下来,我们开始使用 autotools 等命令。

(1) 在终端中运行autoscan命令;

1
$ autoscan

(2) 使用mv命令将onfigure.scan重命名为configure.ac或configure.in并修改文件内容:

修改前文件:

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.68])
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])

# Checks for programs.

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_OUTPUT

修改后文件:

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.68])
AC_INIT([hello-pygtk], [0.1], [yyhoo2.young@gmail.com])
AM_INIT_AUTOMAKE
AM_PATH_PYTHON([2.7])

# Checks for programs.

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_CONFIG_FILES([
    Makefile
    src/Makefile
    src/hello/Makefile])

AC_OUTPUT(Makefile)

(3) 在工程根目录下新建Makefile.am文件,文件内容如下:

SUBDIRS = src

(4) 拷贝 py-compile 脚本:

1
$ cp /usr/share/automake-1.11/py-compile .

(5) 在当前目录下使用touch命令新建NEWS、 README、 ChangeLog 、AUTHORS 四个文件,否则运行automake –add-missing命令时将会报错

1
$ touch NEWS README ChangeLog AUTHORS

(6) 创建 src/Makefile.am,其内容如下:

SUBDIRS = hello

bin_SCRIPTS = hello-pygtk
CLEANFILES = $(bin_SCRIPTS)
EXTRA_DIST = hello-pygtk.in

do_substitution = sed -e 's,[@]pythondir[@],$(pythondir),g' \
                  -e 's,[@]PACKAGE[@],$(PACKAGE),g' \
                  -e 's,[@]VERSION[@],$(VERSION),g'

hello-pygtk: hello-pygtk.in Makefile
    $(do_substitution) < $(srcdir)/hello-pygtk.in > hello-pygtk
    chmod +x hello-pygtk

(7) 创建 hello-pygtk.in,内容如下:

1
2
3
4
5
6
7
8
9
10
#!/usr/bin/python
import sys
sys.path.insert(1, '@pythondir@')
from hello.app import Application
if __name__ == "__main__":
app = Application(package="@PACKAGE@", version="@VERSION@")
app.run()

(8) 创建 src/hello/Makefile.am,其内容如下:

hello_PYTHON = \
        app.py \
        __init__.py

hellodir = $(pythondir)/hello

(9) 打开终端,在工程根目录下依次运行以下命令:

1
2
3
$ aclocal
$ autoconf
$ automake --add-missing

(10)如果没有任何错误,继续运行./configure命令:

1
$ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking for a Python interpreter with version >= 2.7... python
checking for python... /usr/bin/python
checking for python version... 2.7
checking for python platform... linux2
checking for python script directory... ${prefix}/lib/python2.7/dist-packages
checking for python extension module directory... ${exec_prefix}/lib/python2.7/dist-packages
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: creating src/hello/Makefile

即生成Makefile文件。

(11) 运行 make

1
$ make

验证

安装

使用一下方式安装

1
$ sudo make install

安装完毕,在终端中运行 hello-pygtk,即可见 python 程序。

卸载

在工程根目录下,使用一下方法卸载:

1
$ sudo make uninstall

源码下载

参考资料

壬辰九月,裳作文《两只猪的故事》。墨阅之,甚悦,遂有改编之意,裳许。后数月,竟忘此事。腊月初一,复阅,遂作文以记之。是为序。

不知何年,有镇名曰,菡梦。有猪二。猪甲志作猪上猪,盖猪舍十八间,养白猪四。墨生炊,源扫舍,浅侍茶,萧养眼,时人赞曰:菡梦四猪。闲时亦可凑麻将一桌解闷。

猪乙志简,愿痴猪养之。然痴猪见,其志亦随絮飞扬矣。感物种之于命运兮,叹本系猪乙,奈何无羽翼兮,亦无絮之婷婷兮。

如何使用 g++ 编译 C11 标准的程序?

在 Ubuntu 系统下,g++4.7 是支持 C11 标准的。笔者用的系统是ubuntu 12.04,默认安装的是4.6.3,很明显不支持C11,好在有 4.7 的 ppa。本篇主要讲述如何安装 g++ 4.7:

### 安装 g++ 4.7

打开终端,并运行以下命令:

1
2
3
$ sudo add-apt-repository ppa:ubuntu-toolchain-r/test
$ sudo apt-get update
$ sudo apt-get install gcc-4.7

配置编译器

安装完毕后,需要重新配置系统默认编译器(如果系统已安装4.6版本)。运行以下命令进行设置:

1
2
3
$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.6
$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.7 40 --slave /usr/bin/g++ g++ /usr/bin/g++-4.7
$ sudo update-alternatives --config gcc

会提示你设置默认 gcc 版本:

有 2 个候选项可用于替换 gcc (提供 /usr/bin/gcc)。

  选择       路径            优先级  状态
------------------------------------------------------------
* 0            /usr/bin/gcc-4.6   60        自动模式
  1            /usr/bin/gcc-4.6   60        手动模式
  2            /usr/bin/gcc-4.7   40        手动模式

要维持当前值[*]请按回车键,或者键入选择的编号:2
update-alternatives: 使用 /usr/bin/gcc-4.7 来提供 /usr/bin/gcc (gcc),于 手动模式 中。

设置完毕,可通过以下命令查询当前 g++ 编译器的版本信息:

1
$ g++ --version

若输出信息如下所示,则设置 OK (否则需重设):

g++ (Ubuntu/Linaro 4.7.2-11precise2) 4.7.2
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

验证 C++11

源码出自:这里

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
char s[] = "Hello World!";
int Uppercase = 0;
for_each(s, s+sizeof(s), [&Uppercase](char c) {
if (isupper(c))
Uppercase++;
});
cout << Uppercase << " uppercase letters in: " << s << endl;
}

编辑以上程序,保存为lambda.cpp。

打开终端,使用以下命令编译:

1
$ g++ -std=c++11 lambda.cpp -o lambda

运行程序:

1
$ ./lambda

输出:

2 uppercase letters in: Hello World!

参考资料

前言

digia.com发布了Qt5已半月有余,本文是在Ubuntu 12.04 环境下,亲自体验qt5编程后整理而成。

安装编译依赖

首先,去Qt Project页面下载 Qt5 源码包。

安装Qt4依赖:

1
$ sudo apt-get build-dep libqt4-dev

安装QtWebkit依赖:

1
$ sudo apt-get install flex bison gperf libicu-dev libxslt-dev ruby

安装xcb依赖:

1
$ sudo apt-get install libxcb1 libxcb1-dev libx11-xcb1 libx11-xcb-dev libxcb-keysyms1 libxcb-keysyms1-dev libxcb-image0 libxcb-image0-dev libxcb-shm0 libxcb-shm0-dev libxcb-icccm4 libxcb-icccm4-dev libxcb-sync0 libxcb-sync0-dev libxcb-xfixes0-dev libxrender-dev libxcb-shape0-dev

编译 QT5

安装好 QT5 编译依赖条件后,需要配置 QT5。打开终端,进入Qt5源码所在目录进行配置:

1
$ ./configure --prefix=/usr -developer-build -opensource -nomake examples -nomake tests -no-c++11 -opengl -qt-xcb

配置完后,开始编译:

1
$ make -j 4

这个过程需要较长的时间,主要依赖CPU性能和速度。

待编译完毕后,使用以下命令进行安装:

1
$ sudo make install

验证 QT5

1、首先编辑一个 main.cpp,其内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <QtWidgets/QApplication>
#include <QtWidgets/QLabel>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QLabel label(QObject::tr("<center><h1><font color=blue>Hello World!</font></h1></center>"));
label.setWindowTitle("QT");
label.resize(200, 50);
label.show();
return a.exec();
}

2、生成.pro

打开终端,进入到 hello.cpp 所在目录,运行以下命令:

1
$ qmake -project

3、编辑.pro

编辑hello.pro文件,并在文件末尾增加以下内容:

QT += core gui widgets

4、编译

1
2
$ qmake
$ make

5、运行
运行程序,屏幕上将出现 QT5 程序:

1
$ ./hello

Qt5 Hello

参考资料

本文主要讲解如何从 Qt 源码创建 Ubuntu deb 安装包。

Qt 程序

编写 Qt4

首先创建一个hello-1.0目录,并在此目录中编辑一个 Qt Hello World 程序,操作如下:

1
2
3
$ mkdir hello-1.0
$ cd hello-1.0
$ vim hello.cpp

hello.cpp 源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <QApplication>
#include <QLabel>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QLabel *label = new QLabel;
label->setText("<center><h1><font color=blue>Hello World!</font></h1></center>");
label->setWindowTitle("QT");
label->resize(200, 50);
label->show();
return app.exec();
}

资源文件

在工程 hello-1.0 目录下新建一个 data 目录(根据实际情况,还可增加 man 和 doc 等目录),用来存放 desktop 和图片等资源文件。

1
$ mkdir data

进入 data 目录,并新建一个 hello.desktop 文件:

1
2
$ cd data
$ vim hello.desktop

hello.desktop 文件的内容如下:

[Desktop Entry]
Version=1.0
Name=Qt Hello World Demo
GenericName=Qt Hello demo
Comment=show a demo of Qt4
Icon=/usr/share/pixmaps/hello.png
Exec=hello
Terminal=false
Type=Application
Categories=Qt;Utility;
X-Ayatana-Desktop-Shortcuts = Hello

[Hello Shortcut Group]
Name = Hello
Exec = hello
TargetEnvironment = Unity

然后将图标文件拷贝至 data 目录下,终端切换至工程目录下:

1
$ cd ..

生成 pro

编辑完 hello.cpp 后,使用 qmake 命令生成 hello.pro:

1
$ qmake -project

在 hello.pro 文件的末尾增加以下信息:

# target 
target.files += hello
target.path = /usr/bin/

# icons
icons.files += data/hello.png
icons.path = /usr/share/pixmaps/

# desktop
desktop.files += data/hello.desktop
desktop.path = /usr/share/applications/

INSTALLS += target icons desktop

安装打包工具

在开始打包前,需要安装 deb 打包工具,可以通过 apt-get 命令安装:

1
$ sudo apt-get install build-essential devscripts ubuntu-dev-tools debhelper dh-make diff patch gnupg fakeroot lintian pbuilder

创建 Deb 包

创建 orig.tar.gz 包

在 hello-1.0 目录下运行 dh_make 命令,创建 orig.tar.gz 包:

1
$ dh_make --createorig --single -e yyhoo2.young@gmail.com -c gpl

回答 dh_make 的问题,然后按下 Enter 确认:

Maintainer name  : mutse
Email-Address    : yyhoo2.young@gmail.com 
Date             : Thu, 27 Dec 2012 22:53:06 +0800
Package Name     : hello
Version          : 1.0
License          : gpl3
Type of Package  : Single
Hit <enter> to confirm: 
Currently there is no top level Makefile. This may require additional tuning.
Done. Please edit the files in the debian/ subdirectory now. You should also
check that the hello Makefiles install into $DESTDIR and not in / .

删除 ex 和 EX 文件

1
2
$ cd debian/
$ ls

debian 目录下的文件如下:

changelog  emacsen-install.ex  hello.doc-base.EX  menu.ex      README.Debian
compat     emacsen-remove.ex   init.d.ex          postinst.ex  README.source
control    emacsen-startup.ex  manpage.1.ex       postrm.ex    rules
copyright  hello.cron.d.ex     manpage.sgml.ex    preinst.ex   source
docs       hello.default.ex    manpage.xml.ex     prerm.ex     watch.ex

删除 debian 目录下后缀为 ex 和 EX 的文件:

1
$ rm *.ex *.EX

创建 Deb 包

在工程 hello-1.0 目录下运行 debuild 命令:

1
2
$ cd ..
$ debuild

输出信息如下:

dpkg-buildpackage -rfakeroot -D -us -uc
dpkg-buildpackage: export CFLAGS from dpkg-buildflags (origin: vendor): -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security
dpkg-buildpackage: export CPPFLAGS from dpkg-buildflags (origin: vendor): -D_FORTIFY_SOURCE=2
dpkg-buildpackage: export CXXFLAGS from dpkg-buildflags (origin: vendor): -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security
dpkg-buildpackage: export FFLAGS from dpkg-buildflags (origin: vendor): -g -O2
dpkg-buildpackage: export LDFLAGS from dpkg-buildflags (origin: vendor): -Wl,-Bsymbolic-functions -Wl,-z,relro
dpkg-buildpackage: 源码包 hello
dpkg-buildpackage: 源码版本 1.0-1
dpkg-buildpackage: 源码修改者 mutse <yyhoo2.young@gmail.com>
dpkg-source --before-build hello-1.0
dpkg-buildpackage: 主机架构 i386
 fakeroot debian/rules clean
dh clean 
dh_testdir
dh_auto_clean
dh_clean
 dpkg-source -b hello-1.0
dpkg-source: info: using source format `3.0 (quilt)'
dpkg-source: info: building hello using existing ./hello_1.0.orig.tar.gz
dpkg-source: info: building hello in hello_1.0-1.debian.tar.gz
dpkg-source: info: building hello in hello_1.0-1.dsc
 debian/rules build
dh build 
dh_testdir
dh_auto_configure
dh_auto_build
make[1]: 正在进入目录 '/home/mutse/workspace/qts/hello/hello-1.0'
g++ -c -pipe -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -D_FORTIFY_SOURCE=2 -Wall -W -D_REENTRANT -DQT_WEBKIT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -o hello.o hello.cpp
g++ -Wl,-Bsymbolic-functions -Wl,-z,relro -o hello hello.o    -L/usr/lib/i386-linux-gnu -lQtGui -lQtCore -lpthread 
make[1]:正在离开目录 `/home/mutse/workspace/qts/hello/hello-1.0'
dh_auto_test
 fakeroot debian/rules binary
dh binary 
dh_testroot
dh_prep
dh_installdirs
dh_auto_install
make[1]: 正在进入目录 `/home/mutse/workspace/qts/hello/hello-1.0'
install -m 755 -p /home/mutse/workspace/qts/hello/hello-1.0/hello /home/mutse/workspace/qts/hello/hello-1.0/debian/hello/usr/bin/
install -m 644 -p /home/mutse/workspace/qts/hello/hello-1.0/data/hello.png /home/mutse/workspace/qts/hello/hello-1.0/debian/hello/usr/share/pixmaps/
install -m 755 -p /home/mutse/workspace/qts/hello/hello-1.0/data/hello.desktop /home/mutse/workspace/qts/hello/hello-1.0/debian/hello/usr/share/applications/
: /home/mutse/workspace/qts/hello/hello-1.0/debian/hello/usr/share/applications/hello.desktop
make[1]:正在离开目录 `/home/mutse/workspace/qts/hello/hello-1.0'
dh_install
dh_installdocs
dh_installchangelogs
dh_installexamples
dh_installman
dh_installcatalogs
dh_installcron
dh_installdebconf
dh_installemacsen
dh_installifupdown
dh_installinfo
dh_pysupport
dh_pysupport: This program is deprecated, you should use dh_python2 instead. Migration guide: http://deb.li/dhs2p
dh_installinit
dh_installmenu
dh_installmime
dh_installmodules
dh_installlogcheck
dh_installlogrotate
dh_installpam
dh_installppp
dh_installudev
dh_installwm
dh_installxfonts
dh_installgsettings
dh_bugfiles
dh_ucf
dh_lintian
dh_gconf
dh_icons
dh_perl
dh_usrlocal
dh_link
dh_compress
dh_fixperms
dh_strip
dh_makeshlibs
dh_shlibdeps
dh_installdeb
dh_gencontrol
dh_md5sums
dh_builddeb
dpkg-deb:正在新建软件包 hello,包文件为 ../hello_1.0-1_i386.deb。
dpkg-genchanges  >../hello_1.0-1_i386.changes
dpkg-genchanges: 上传数据中包含完整的原始代码
dpkg-source --after-build hello-1.0
dpkg-buildpackage: 完整上载(包含原始的代码)
Now running lintian...
W: hello source: superfluous-clutter-in-homepage <insert the upstream URL, if relevant>
W: hello source: bad-homepage <insert the upstream URL, if relevant>
W: hello source: out-of-date-standards-version 3.9.2 (current is 3.9.3)
W: hello: new-package-should-close-itp-bug
W: hello: wrong-bug-number-in-closes l3:#nnnn
E: hello: helper-templates-in-copyright
W: hello: copyright-has-url-from-dh_make-boilerplate
E: hello: copyright-contains-dh_make-todo-boilerplate
W: hello: readme-debian-contains-debmake-template
E: hello: description-is-dh_make-template
E: hello: section-is-dh_make-template
W: hello: superfluous-clutter-in-homepage <insert the upstream URL, if relevant>
W: hello: bad-homepage <insert the upstream URL, if relevant>
W: hello: binary-without-manpage usr/bin/hello
Finished running lintian.
Now signing changes and any dsc files...
signfile hello_1.0-1.dsc mutse <yyhoo2.young@gmail.com>
gpg: failed to create temporary file `/home/mutse/.gnupg/.#lk0x85158d0.mutse.6958': 权限不够
gpg: 密钥块资源‘/home/mutse/.gnupg/secring.gpg’:常规错误
gpg: failed to create temporary file `/home/mutse/.gnupg/.#lk0x85175c0.mutse.6958': 权限不够
gpg: 密钥块资源‘/home/mutse/.gnupg/pubring.gpg’:常规错误
gpg: “mutse <yyhoo2.young@gmail.com>”已跳过:私钥不可用
gpg: /tmp/debsign.hOAkkXC1/hello_1.0-1.dsc: clearsign failed: 私钥不可用
debsign: gpg error occurred!  Aborting....
debuild: fatal error at line 1271:
running debsign failed

上面的 gpg 密钥验证失败可以跳过,切换到 hello-1.0 上级目录,发现生成了一个 deb 包。

验证安装包

1
$ sudo dpkg -i hello_1.0-1_i386.deb

打开 Dash,在搜索栏中输入 hello,即可见 hello 的图标。

参考资料