linux/ubuntu中制作deb安装包

由于要制作一个在arm平台上运行的xorg-server-1.12.4版本的安装包,所以需要学习如何制作deb安装包。这里以一个非常小的工程为例,记录制作的过程。

首先需要一个deb包管理系统,如debian、ubuntu等,这里我使用的是ubuntu14.04LTS,这些系统默认安装了deb包制作所需的工具,没有的话后期也可以通过sudo apt-get install来安装。

1 创建一个简单的源码包

ls -l
total 24
-rw-rw-r– 1 mountzf mountzf 73 Jul 8 14:05 helloworld.c
-rw-rw-r– 1 mountzf mountzf 323 Jul 8 14:32 Makefile

#include <stdio.h>int main()
{printf("Hello World!\n");return 0;
}

C code的内容与deb包的制作关系不大,这里还是先主要看一下makefile的内容,在制作deb包的时候,makfile是需要修改的。

# Sample makefile.PROG=helloworld
CC=gcc
BINDIR=/usr/bin
INSTALL=cp# Compile commands.
$(PROG):helloworld.c$(CC) -o $(PROG) helloworld.c# make clean command.
clean:rm -rf $(PROG)# make install command.
install:$(INSTALL) $(PROG) $(BINDIR)# make uninstall command.
uninstall:rm -rf $(BINDIR)/$(PROG)

2 创建GPG key

GPG key在build包的时候需要用到,ubuntu系统中默认已经安装gpg工具,可以gpg --help查看使用方法。这里gpg --gen-key,然后按照提示依次进行即可。由于我是在虚拟机中运行ubuntu,生成密钥时遇到如下问题:

Not enough random bytes available. Please do some other work to give
the OS a chance to collect more entropy! (Need 288 more bytes)

不要慌,翻阅论坛后发现很多人都说如下命令针对此问题有效:

sudo aptitude install haveged

安装完成haveged之后,顺利生成公钥和私钥,创建完成之后检查一下:

gpg –list-keys
/home/mountzf/.gnupg/pubring.gpg
--------------------------------
pub 2048R/306A7521 2016-07-08
uid mountzf
sub 2048R/17D974A5 2016-07-08

3 环境准备

在对这个源码包进行deb化之前,首先要确保源代码目录绝对干净,为了让软件包能够正确地制作,需要把源代码目录更改为“小写字母-版本号”格式。同时需要export两个环境变量。

~/makeDeb$ ls -l
total 4
drwxrwxr-x 2 mountzf mountzf 4096 Jul 8 14:32 helloworld-0.1

export DEBEMAIL="xxx@xx.xx"
export DEBFULLNAME="xxxx"

注意此处的邮箱和密码必须和你在生成gpg key的时候完全一致,这两个变量的值也会在changelog等多处文件中用到。

4 对源码包进行deb化

如果系统没有安装dh-make工具包,需要执行sudo apt-get install dh-make命令进行安装。dh_make --createorig命令生成制作deb包所需的默认信息并在上一层目录中生成helloworld_0.1.orig.tar.xz源码压缩包(没有源码压缩包的话dh_make将不能成功执行)。

mountzf@mountzf:~/makeDeb/helloworld-0.1$ dh_make –createorig
Type of package: single binary, indep binary, multiple binary, library, kernel module, kernel patch?
[s/i/m/l/k/n] s
Maintainer name : mountzf
Email-Address : xxxx@xxx.xxx
Date : Fri, 08 Jul 2016 15:44:24 +0800
Package Name : helloworld
Version : 0.1
License : blank
Type of Package : Single
Hit to confirm:
Done. Please edit the files in the debian/ subdirectory now. You should also
check that the helloworld Makefiles install into $DESTDIR and not in / .

这里询问安装包类型,我么们这里是单个可执行文件,所以我选择了s。同时系统给出了两个提示信息,我们发现当前目录中多了一个debian目录,同时目录中有些内容需要编辑。

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

这个目录下面的文件很多,不能一一解释。这里列举几个重要的,也是绝大部分软件必须的:

  • control文件: 声明很多重要的变量,dpkg通过这些变量来管理软件包
  • copyright文件: 不用说,版权信息,相当重要
  • changelog文件: 这是一个必需文件,包含软件版本号,修订号,发行版和优先级。
  • rules文件: 这实际上是另外一个Makefile脚本,用来给dpkg-buildpackage用的.
  • compat文件: 这个文件留着是有用的
  • dirs文件:这个文件指出我们需要的但是在缺省情况下不会自动创建的目录

其中control文件我们可能需要修改。删掉后缀是 .ex 和 .EX 的文件,不然如果你没编辑它们并重命名为不带 .ex/.EX 后缀的同名文件,在打包完成的 lintian 检查时会有一条错误叫做:Debin 帮助文件被打包进了 .debian.tar.gz

rm -rf *.ex
rm -rf *.EX

至于 .ex 和 .EX 是干嘛的,看下面这个列表:

  • emacsen 开头的是针对基于 emacs 这个 IDE 的名为 emacsen 的编辑器的安装/删除/启动脚本。是打包类似 emacsen 插件这样的程序才会用到的。但是 emacsen 这个项目 2007 年就不更新了。于是无用。
  • initd.ex 是启动脚本,你的软件要开机自启动,才需要去编辑并重命名它,比如输入法。否则无用。
  • cron.d.ex 定时服务。除非你的软件有服务,并需要按周期运行。否则无用。同理 default.ex 也是这样。
  • doc-base.EX 是 deb 系专用的。大概意思是告诉系统各种不同格式的帮助手册在哪里可以找得到。你在乎手册吗?
  • manpage.*.ex 是具体的各个格式的帮助手册。
  • post*.ex 跟 RPM 系的 post 一样。postinst 管安装,postrm 管删除。一般是库文件会用。而且这个无需你去干预,改名去掉 .ex 就可以,dh_installdeb 会自动帮你填写。
  • watch.ex 是蝶变专有的,意思是关注某个 url,有变化就邮件通知你来升级。跟 OBS 的 auto check 差不多。除了更新狂谁都用不到。而且里面是用正则表达式写的,要是不懂就算了吧。
    接着要删除 README*。
rm -rf README*

其中 README.debian 是类似于 RPM 的 changelog 这样的一个存在。比如你加了补丁,改动了什么,写进去。 README.source 是描述源代码是否满足蝶变策略的文件,我们打的包都不通过蝶变官方分发,所以不用管这个。

5 修改Makefile

根据第二个提示,我们不应该将该程序安装至/根目录中,而应该在$DESTDIR,修改Makefile如下:

BINDIR=$(DESTDIR)/usr/bin
# make install command.
install:mkdir -p $(BINDIR)$(INSTALL) $(PROG) $(BINDIR)

第一处改动是为了在build包的时候把文件安装到正确的目录,第二处修改是$(DESTDIR)/usr/local/bin并不存在,所以在安装之前需要创建安装目录。

注意:Debian要求可执行文件不能安装在/usr/local目录下,因此如果BINDIR设为/usr/local/bin的话,build的时候会出错而不能继续进行。

6 build软件包

基本上所有工作都准备就绪了,下一步我们就可以build软件包了。利用dpkg-buildpackage -rfakeroot命令。

gpg: WARNING: unsafe ownership on configuration file /home/mountzf/.gnupg/gpg.conf
dpkg-buildpackage: warning: failed to sign .dsc and .changes file

切换到root账户,再运如上命令即可。

sudo su
dpkg-buildpackage -rfakeroot

此时源码已经打包完毕,生成了deb安装包helloworld_0.1-1_amd64.deb和.tar.gz压缩包。查看一下生成的文件:

root@mountzf:~# which helloworld
/usr/local/bin/helloworld
root@mountzf:/home/mountzf/makeDeb# ls -l
total 72
drwxrwxr-x 3 mountzf mountzf 4096 Jul 8 16:22 helloworld-0.1
-rw-r–r– 1 root root 1504 Jul 8 16:22 helloworld_0.1-1_amd64.changes
-rw-r–r– 1 root root 2194 Jul 8 16:22 helloworld_0.1-1_amd64.deb
-rw-rw-r– 1 mountzf mountzf 9441 Jul 8 16:22 helloworld_0.1-1.debian.tar.gz
-rw-rw-r– 1 mountzf mountzf 824 Jul 8 16:22 helloworld_0.1-1.dsc
-rw-rw-r– 1 mountzf mountzf 464 Jul 8 15:44 helloworld_0.1.orig.tar.xz

7 检查与安装

最后,做一下检查和安装工作。

root@mountzf:/home/mountzf/makeDeb# dpkg-deb -c helloworld_0.1-1_amd64.deb
drwxr-xr-x root/root 0 2016-07-08 17:15 ./
drwxr-xr-x root/root 0 2016-07-08 17:15 ./usr/
drwxr-xr-x root/root 0 2016-07-08 17:15 ./usr/bin/
-rwxr-xr-x root/root 6128 2016-07-08 17:15 ./usr/bin/helloworld
drwxr-xr-x root/root 0 2016-07-08 17:15 ./usr/share/
drwxr-xr-x root/root 0 2016-07-08 17:15 ./usr/share/doc/
drwxr-xr-x root/root 0 2016-07-08 17:15 ./usr/share/doc/helloworld/
-rw-r–r– root/root 1676 2016-07-08 17:05 ./usr/share/doc/helloworld/copyright
-rw-r–r– root/root 180 2016-07-08 17:05 ./usr/share/doc/helloworld/changelog.Debian.gz

dpkg -i helloworld_0.1-1_amd64.deb安装所制作的deb安装包

root@mountzf:/home/mountzf/makeDeb# which helloworld
root@mountzf:/home/mountzf/makeDeb# dpkg -i helloworld_0.1-1_amd64.deb
(Reading database … 95541 files and directories currently installed.)
Preparing to unpack helloworld_0.1-1_amd64.deb …
Unpacking helloworld (0.1-1) over (0.1-1) …
Setting up helloworld (0.1-1) …
root@mountzf:/home/mountzf/makeDeb# which helloworld
/usr/bin/helloworld

dpkg -r helloworld 卸载刚才安装的deb安装包

root@mountzf:/home/mountzf/makeDeb# dpkg -r helloworld
(Reading database … 95541 files and directories currently installed.)
Removing helloworld (0.1-1) …
root@mountzf:/home/mountzf/makeDeb# which helloworld
root@mountzf:/home/mountzf/makeDeb#

至此,通过一个小的项目实例,验证了利用dh_make和dpkg-buildpackage制作deb安装包的步骤。但是这只是编译和本机架构相同的deb安装包,要在pc上编译适用于arm的安装包,这种方法好像没有成功。后面将继续学习如何利用pc编译适用于arm的deb安装包。

祝枫
2016年7月8日于深圳

参考文章
http://blog.csdn.net/lionzl/article/details/7725190
https://zh.opensuse.org/Packaging_for_Debian_and_Ubuntu

linux/ubuntu中制作deb安装包相关推荐

  1. 使用wine在ubuntu上运行和制作deb安装包

    wine原理 wine通过在linux上模拟windows的API,加载并运行windows程序.那么,wine具体是如何实现的? windows和linux,作为典型的PC操作系统,分为内核态的系统 ...

  2. 从零开始搭建Cydia软件源+制作deb安装包

    Cydia中的软件源地址保存在 /etc/apt/sources.list.d/ 目录下,分为两种: 1. 以软件包形式安装的软件源,如Cydia默认的软件源,Modmyi.BigBoss等,该类软件 ...

  3. dingding for Ubuntu: Ubuntu中钉钉安装包资源及安装

    1.钉钉安装包(zip压缩) dingding for Ubuntu 钉钉 Ubuntu(linux)安装包资源: https://pan.baidu.com/s/17zHNAlA-3Itoxzll4 ...

  4. Ubuntu中虚拟环境pip安装包超时问题

    做爬虫的时使用pip安装一些爬虫框架经常容易报错或者国内镜像资源不足,或者做量化使用开源的vn.py,但只有py27版本的,解决这些问题一个所以这个时候Anaconda中的conda管理工具就非常的必 ...

  5. 搭建Cydia软件源+制作deb安装包

    http://bbs.weiphone.com/read-htm-tid-669283.html 设置源图标 将源图片上传至源目录下并命名为CydiaIcon.png 转载于:https://www. ...

  6. Ubuntu 系统安装.deb安装包

    ubuntu 系统使用dpkg 的方法安装 .deb 安装包 比如在ubuntu 系统下 下载了一个 wps 的 .deb 安装包 打开终端 输入 :sudo dpkg -i .deb 安装包的名字 ...

  7. Linux安装deb安装包

    dpkg -i package.deb Linux安装deb安装包 dpkg -l | grep package 条件查询 grep -r -n name 本地路径查询文件name | 管道:将前一个 ...

  8. 构建ceph deb 安装包

    前言: 本文基于ubuntu 14.04.5 LTS 和ceph v0.94.3 之上做的实验 一.编译ceph包 1.1.克隆ceph代码,切换分支 git clone --recursive ht ...

  9. Linux平台上的AppImage安装包之前世今生

    1 什么是AppImage? AppImage是近些年流行的一种安装包. AppImage继承自Klik,它是这样一个软件:它让你在 linux平台上可以以普通用户的权限安装软件, 然后, 每个软件都 ...

最新文章

  1. Django 状态保持3.5
  2. Function类型
  3. 使用Xcode和Instruments调试解决iOS内存泄露(转)
  4. can a select block a truncate (ZT)
  5. java集群_Kafka多节点分布式集群搭建实现过程详解_java
  6. 分布式离线计算—MapReduce—为什么被淘汰了?
  7. 使用idea编写消费者,接收生产者的持续日志输出【小案例】(三)
  8. C++调用C#的dll
  9. 对于 AttributeError: 'Series' object has no attribute 'sort'的解决办法
  10. messagehub讲解,如何获取MessageHub的其余管理API的API密钥?
  11. Protues闪退解决办法
  12. 胶囊网络之 Found a Reason for me? Weakly-supervised Grounded Visual Question Answering using Capsules论文笔记
  13. insert overwrite出现Table insclause-0 has 9 columns, but query has 10 columns.
  14. python魔法方法指南_2011年最热门的20种方法指南
  15. 重磅|棱镜七彩同CNCERT联合发布开源软件供应链安全风险研究报告了!!
  16. 英语学习真的需要思考
  17. 程序员漫画-加油啊!
  18. hdu2197 本源串
  19. paddle复现pytorch踩坑(二):paddleAPI对照表(百度论文复现营活动提供)
  20. X Window系统

热门文章

  1. Eclipse 的控制台console乱码
  2. 从Paxos到ZooKeeper-四、ZooKeeper技术内幕
  3. 05章项目: QuickHit快速击键
  4. Hadoop Namenode不能启动
  5. Android学习之Intent使用
  6. JZ32变形~剑指 Offer 32 - II. 从上到下打印二叉树 II
  7. ZooKeeper官方文档学习笔记01-zookeeper概述
  8. opencv学习笔记05
  9. 想做数据化转型,为什么必须要上企业级BI?
  10. doctor mysql数据导入_线上环境mysql主从同步的搭建过程