文档库 最新最全的文档下载
当前位置:文档库 › deb打包及automake使用

deb打包及automake使用

Deb打包

方法1:

方法一、用 dpkg -b 命令手工打包 DEB (非正规打包方式)

有网友提到这个问题,存档备查。

引用:

用 dpkg -b 命令手工打包 DEB

代码:

1 下载一个其他的 deb 软件包,解压缩后得到2个压缩包: data.tar.gz , control.tar.gz;

2 解压 control.tar.gz ,得到 control 文件(在这个文件中修改软件包依赖关系),删除另外的

md5sums 文件;

3 date.tar.gz 解开后,按里面的目录结构,放入自己要加入的文件;

4 建议把自已的可执行文件放在 /usr/local/bin/ 目录下(私人制作的可执行文件,建议放在 local 文件夹内,不会与 DEB 系统中自带的文件重名造成冲突或混乱;

----------------

近来我没有在linux平台上工作,以后有机会,可以帮你打包deb

引用:

# /root/deb-src/ 目录下,按安装好后的目录结构位置,放置程序和软件包需要加入的原始文件;

sudo mkdir -vp /root/deb-src/mysoftware/usr/local/bin/ 这里放脚本文件

sudo mkdir -vp /root/deb-src/mysoftware/DEBIAN/ 这里放 control 文件

sudo mkdir -vp /root/deb-src/mysoftware/usr/share/pixmaps/ 这里放程序图标,建议png格式;

sudo mkdir -vp /root/deb-src/mysoftware/usr/share/applications/ 这里放程序快捷方式 xxx.desktop 文件,可参照其它类似文件;

# /root/deb-ok/ 目录下放打好的 deb 软件包文件

sudo mkdir -vp /root/deb-ok/

cp my-run-file/root/deb-src/mysoftware/usr/local/bin/my-run-file

cd /root/deb-src/mysoftware/

sudo dpkg -b . /root/deb-ok/mysoftware_1.0_all.deb

打包完成后,再解压上面打出的deb软件包,检查以上文件和文件夹的权限,

文件夹权限一般为777,可执行文件xxx 权限为 755;文件夹和文件所有者都是root;

有异常,修复后重新打包。

control 文件里的参数,dpkg 的相关命令,baidu即可。

runsak_simple-1

.0.tar.gz

方法2: 很久不深入玩Debian 系的东西了,最近,乘着工作之便,又打了个deb 包,而且是我之前没干过的内核模块的deb 包,恩,记一下吧。

Debian 内核模块的一般构建方法

和 RHEL 不同,Debian 很少提供内核匹配的模块的二进制 deb 包,相反,一般会提供一些比较长用的模块的源码包,并配合 module-assistant 工具,生成与用户使用的内核版本一致的内核模块。

module-assistant 是一个菜单界面的CLI 工具,用户可以在这里选择源码包,当然,也可以用 apt 安装 xxx-source 的源码包(也是deb 包),然后,用命令

?

1 m -a a-i module-name-here

来自动生成模块的二进制 deb 包并安装。

打包模块源码

如果源里没有这个模块的话,就只能自己打包内核模块了。这个工作实际和一般软件的 deb 打包非常相似,可以借助 debhelper 的 dh_make(8) 命令。

生成 Debianize 文件

dh_make 实际上有一个专门的选项/参数 (k),可以用来制作模块的 deb 包,现在,在源码的顶层目录(目录的命名方式是 package-name-x.x.x )运行 dh_make 命令:

?

1 2 # dh_make -e account@https://www.wendangku.net/doc/ca18548379.html, -k --createorig

#

恩,为了方便,我实际在源码的顶层目录里放了一个叫 driver 的目录,内核模块代码就在里面,这样复制的时候可以直接复制整个目录了。

执行玩上面的命令之后,你就可以看到,多了一个 debian 目录,这个目录里有很多文件,它们遵循 debian 的一般打包原则,简单介绍几个重要的,具体的参考《Debian 新维护人员手册》吧:

?

rule :这个最重要,实际是个Makefile ,后面具体介绍; ? control :这个是软件包的描述,照着内容敲吧,section 之要遵循 debian 的约定,比

如 kernel 就是一个 section ,其他自便吧;

? changelog :这个是打包版本的变更,每个版本开头里,目标distro 一般写

unstable ,urgency 一般是 low ;

?

README.Debian :是对这个包的说明,给人看的;

? 可执行脚本:postinst 和 prerm 比较常用,分别是在安装之后进行配置和卸载之前进

行清理的,preinst 和 postrm 一般用的不多。其他文件各有各的用处,.ex 结尾的都是例子,如果用的上就用,用不上的可以考虑删除。

内核模块包的特殊文件

恩,因为这 kernel module 包的做法是先做 source 的 deb 包,用户用 m-a 根据这个 deb 包的内容再做一个二进制的 deb 包,所以需要为他们准备一些配置文件,一般用得上的是这两个:

?

control.modules.in 这个用作模块包的 control 文件; ? ebs-driver1-modules-_KVERS_.postinst.modules.in 这个用作模块包的 postinst 脚

本,比如要插模块、调整 daemon 什么的。

写内核模块包的 rules

这是关键折腾的一步,我也是头一次写,没找到什么现成的文档,自己琢磨的,有什么不对的地方还请指出来啊。

规则里面 kdist_clean, kdist_config, binary-modules 是用来编译内核的,编译内核时,有些规则是从 module-assistant 里导入进来的

?

1 2 3 4 5 6 # modifieable for experiments or debugging m-a

MA_DIR ?= /usr/share/modass

# load generic variable handling

-include $(MA_DIR)/include/generic.make

# load default rules, including kdist, kdist_image, ...

-include $(MA_DIR)/include/common-rules.make

这些会帮助我们在正式打包之前,在上面那几个给模块准备的配置文件里,加入内核版本号信息,并用正式的文件名。当然,在一开始 make kdist_clean 规则的时候,这些文件还没生成,所以应该把 dh_testdir 和 dh_clean 注掉,否则做不成的,如:

?

1 2 3 4 5 kdist_clean:

#dh_testdir

rm -f build-arch-stamp build-indep-stamp configure-stamp

#dh_clean

rm -f driver/*.o driver/*.ko

这里可以根据尝试的情况调整内容,稍稍注意一下即可。正式的 binary-module 目标倒是没什么特殊的,简单根据自己需求调整就行了,这里的安装过程会把模块放到

?

1 d ebian/$(PKGNAME)/lib/modules/$(KVERS)

目录里,如果有配置文件,也可以相应的放进去,debian 在安装包的时候,如果有配置文件的更改,是会提示用户的。

如果制作模块包的时候只要做源码包,不用做用户空间工具包的话,binary 目标只要依赖 binary-indep 就可以了,不需要依赖 binary-arch 了。

打包

写完配置文件之后,在源码顶级目录里,也就是有debian 目录的目录里,运行

?

1 d pkg-buildpackage -uc -us -rfakeroot

就可以生成源码包了,安装之后,就可以像开头那样用module-assistant 制作安装二进制模块了。

小结

实际上做内核模块的deb 包并不难,只要有点debian/ubuntu 经验,细心一点就可以做好里。估计短时间内我是不会更新unleashed 了,就这篇blog 供大家参考吧。

- See more at: http://wangxu.me/blog/p/682#sthash.5vnufqRj.dpuf

命令

rm ../runsak_1.0.orig.tar.xz;dh_make -k --createorig

Dh_make --createorig

然后dpkg-buildpack

生成debian文件夹,修改里面的rules文件,把cp -s 当中的-s去掉

http://wangxu.me/blog/p/682

AutoMake构建

1.创建工程,把源文件放入src目录

2.执行命令autoscan,重命名configure.scan为configure.ac,并修改内容

AC_INIT(程序名称,版本号,空值) AC_CONFIG_SRCDIR(主程序文件

[src/main.c]) AM_INIT_AUTOMAKE(程序名称,版本号) AC_OUTPUT(Makefile 子目录/Makefile 。。。)该过程中,尽量去掉"["和"]"

3.执行aclocal、autoconf和autoheader

4.编写Makefile.am和子目录下的Makefile.am bin_PROGRAMS=可执行文件可执行文件_SOURCES=源文件可执行文件_LDADD=依赖的库 include_HEADERS=头文件(具体参考网上的Makefile.am的字段名称)

5.执行automake --add-missing -a

6.touch 创建缺少的文件(后面带有not found的)

7.再次执行automake --add-missing -a 8. 执行configure生成Makefile AutoMake补充

Automake支持三种目录层次:flat,shadow,deep

1.flat 所有的源文件及相关文件都放在顶层目录中。

2.shadow 主要的源文件存放在顶层目录中,其它的存放在各个子目录中。

3.deep 所有的源文件都分别存放在各个子目录中。

我的程序用了deep模式,所有的源文件都放在了src目录中。下面写一下automake生成Makefile的步骤:

1.运行autoscan命令,生成configure.scan。

configure.scan就是configure.in的模板,对它做一些修改,然后改名为configure.in或者configure.ac就可以了(新版本的automake好像是

configure.ac)。

configure.in:

AC_INIT(src/openfetion.cpp)

AM_INIT_AUTOMAKE(openfetion,0.1)

AM_CONFIG_HEADER(config.h)

AM_PATH_GTK_2_0(,,AC_MSG_ERROR(openfetion 0.1 needs GTK+ 2.0))

AM_PATH_XML2(,,AC_MSG_ERROR(openfetion 0.1 needs LIBXML2))

AC_PROG_CC

AC_PROG_CXX

AC_PROG_INSTALL

AC_OUTPUT(src/Makefile)

AC_INIT宏以任何一个源文件作为参数,它只是检查这个源文件的存在,也说意味着着源文件所在的目录存在

AM_INIT_AUTOMAKE 增加了几个标准的检查,它以程序名称和版本号作为参数

AC_PROG_CC 指出源代码可能是用C写的,如果源代码是用C++写的我们就需要

AC_PROP_CXX

AC_PROG_INSTALL 会生成一个install目录文件,这样用户就可以通过输入“make install”来安装这个软件

AC_OUTPUT 指出将会生成的Makefile文件的名字

AC_CONFIG_HEADER 表示将会使用config.h文件,autoconf需要一个config.h.in 文件,用它来生成config.h,config.h.in可以通过autoheader工具生成

AM_PATH_GTK_2_0(,,AC_MSG_ERROR(openfetion 0.1 needs GTK+ 2.0))

AM_PATH_XML2(,,AC_MSG_ERROR(openfetion 0.1 needs LIBXML2)) 这两句话检查系统中是否安装了程序所需要共享库, GTK+2.0和libxml2,这两个库在安装的时候分别安装了AM_PATH_GTK_2_0和 AM_PATH_XML2这两个宏,所以可以用这种方法检测,如

果系统中没有安装libxml2,configure 脚本就会执行失败,并报错:openfetion 0.1 needs LIBXML2

关于library 的检查可参见文章:Using C/C++ libraries with Automake and Autoconf

其它的就不详细说了,需要的时候可以谷歌。

2.在顶层目录中创建一个Makefile.am ,在其它各级需要的子目录中也创建

Makefile.am 。

我的顶层目录Makefile.am 中只有下面几句话: 1

2

3456789

10 #子目录变量,用于递归处理各级子目录SUBDIRS=src#安装路径,可使

用./configure --prefix=/usr/local/openfetion 修改

prefix=/usr/local#数据文件的安装路径datadir=$(prefix)/skin#数据文件的具体内容,这里的意思是要将skin 目录下的所有文件安装到/usr/local/skin 中data_DATA=skin/* #程序打包时要加入的其它文件,使用make dist 生成tar.gz 文件时会放进去的东西EXTRA_DIST=skin src 目录下的Makefile.am 文件: 1

2

34567891011

1213141516

17#libxml2 , GTK+2.0和GThread-2.0的cflags 和libs#libxml2安装了xml2-config 脚本,GTK+2.0和GThread-2.0安装了.pc pkg-config 文件

AM_CPPFLAGS=`xml2-config --cflags` `pkg-config --cflags gtk+-2.0 gthread-2.0`AM_LDFLAGS=`xml2-config --libs` `pkg-config --libs gtk+-2.0 gthread-2.0`#预定义的目录,prefix 已经说过了

prefix=/usr/local#这个是可执行文件安装的目录bindir=$(prefix)/bin#这个是自定义的目录,用来安装包含协议实现部分的静态库的slibdir=/usr/lib#编译生成可执行文件名称bin_PROGRAMS=openfetion#这里必须以上一步定义的名称为前缀,编译openfetion 所需要的源文件openfetion_SOURCES=openfetion.cpp fetion_ui.cpp ... login_ui.cpp#编译openfetion 所需要的库文件,libfx.a 是我事先编译好了的。openfetion_LDADD=libfx.a#这个变量前面也说

了,要把下面这些文件打包放到tar.gz 中EXTRA_DIST=

fetion_ui.h main_ui.h .... libfx.a#要安装的头文件,执行完make install 后,这些文件将被安装到/usr/include 里面include_HEADERS= fgroup.h flogin.h ... common.h#自定义目录的数据文件,执行完make install 后,这个文件就会被安装到/usr/lib 里面slib_DATA=libfx.a

18

1

9

20

2

1

22

3.生成GNU风格的项目时需要在顶层目录中你创建NEWS、 README、 ChangeLog 、AUTHOR这几个文件。

touch NEWS README ChangeLog AUTHOR

如果不需要生成GNU风格的项目就不需要创建这几个文件,而是需要在Makefile.am中加入

AUTOMAKE_OPTIONS = foreign

这是执行automake命令时的选项

4.执行aclocal。

由configure.in生成aclocal.m4

5.执行autoconf

由configure.in和aclocal.m4生成configure脚本

6.执行automake

由Makefile.am和configure.in生成各级目录下的Makefile.in

./configure执行的时候会扫描各个目录下的Makefile.in生成不同的Makefile。然后就可以执行make和make install了

相关文档
相关文档 最新文档