楼主新手一枚,在打包过程中踩了无数坑才打包成功,还不乏自己给自己挖的坑,其中艰辛不必多说,虽然网上教程众多,但可以将过程清楚描述给我这样新手的并不多,而且其中好多坑也都没有指出,今我把我所做的过程记录下来,一来分享给大家,二来以背日后还用。
过程参考https://www.cnblogs.com/lvdongjie/p/4187189.html。
Centos下打包
一.源代码包
主要就是将项目打成压缩包,但有以下注意事项:
1.删除版本管理目录,比如.svn,.git等目录。避免源代码包过大,同时也是为了避免.svn中的个人信息泄露。
2.删除二进制中间文件,即.o文件。主要为避免源文件过大。
3.添加config脚本或者makefile配置文件。两个文件都是为了让用户能够编译,用户可以运行config脚本生成makefile文件,在通过make命令生成可执行文件。如果没有config文件,就需要手写或自动生成一份makefile文件,手写的话,需要将全部源文件写入其中,同时对不太熟悉它的人不友好,所以,我用了Qt自带的qmake工具自动生成了makefile文件,用qmake生成makefile需要有.pro文件,.pro文件可以手写也可以自动生成,因为楼主下的项目中自带了.pro文件,所以并没有深究.pro文件的具体内容和生成命令,因为迟早要用到,所以先留个坑,看过之后回来填上。
4.修改编译目标从debug版本到release版本。这一般意味着 CFLAGS 要改成 -O2 而不是 -g;VS 一般意味着将目标从 debug 转为 release。这样用户生成的可执行程序才能足够小和足够快。
5. 添加知识产权信息,就是授权协议。小程序大家一般都不在乎,但如果是您在这个项目上花了足够的心血,还是最好选择一个自己喜欢的授权协议。可以将协议声明放在每个源文件的最前注释中,也可以在项目的根目录下放一个 license 文件。
6.压缩成tar.gz 或者 .tar.bz2 格式。
tips:
makefile文件主要用来说明如何编译各个源文件并连接生成可执行文件,并指定源文件之间的依赖关系。编写完makefile后,执行make命令,就可以自动将项目编译连接出可执行文件。
二.rpm包
在这里我们用rpmbuild工具来打rpm包。
1.在当前用户目录下创建rpmbuild目录
命令为:mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
其中各目录的用途如下:
BUILD | 解压源代码包和构建软件 |
BUILDROOT | 保存 %install 阶段安装的文件 |
RPMS | 最终生成的可安装二进制rpm包的所在目录 |
SOURCES | 所有源代码和补丁文件的存放目录 |
SPECS | 存放rpm包配置文件(.spec文件)的目录 |
SRPMS | 源码格式rpm(srpm)存放路径 |
2.将准备好的源代码包放在SOURCES目录下
3.在SPECS下编写.spec控制文件
在该文件中有很重要的一点,buildroot目录为虚拟根目录,在此目录下建的目录就是文件想要安装的位置
%define path /home/admin/Weather #定义名为path,内容为/home/admin/Weather 的变量
Name: weather #软件名称
Version: 1.0 #版本号
Release: 1%{?dist} #发布序列号
Summary: WEATHER Client #软件概要
Group: Network #软件类别,可按标准分组进行分组
License: GPL #软件授权协议
URL: http://www.cnblogs.com/u/thePeaceOftheLord/ #软件主页
Source0: weather-1.0.tar.gz #软件源代码包名称,可以有多个,例如Source1,Source2
%description #软件描述
No description
%prep #预处理,在此行下,可以添加有关预处理的命令
%setup -q #宏,将源代码tar包解压到BUILD目录下
%build #编译构建,在此行之下,添加有关编译的命令
%configure
%install #安装,在此行之下可以添加有关安装的命令
make install DESTDIR=%{buildroot} #安装到buildroot目录下
mkdir $RPM_BUILD_ROOT%{path} #注意,此处在buildroot目录下新建了 /home/admin/Weather 目录
cp $RPM_BUILD_DIR/%{name}-%{version}/filename $RPM_BUILD_ROOT%{path} #注意,这一步 将build目录下需要打包的东西复制到了刚才在buildroot下新建的目录下
#注意,以上两行就定义了生成的rpm包在安装时的路径,会安装到 /home/admin/Weather目录下,这里为方便理解只建了一个目录,当你有多个文件需要放在不同目录下时,还可以建立多个目录,然后分别从build目录下复制过来就行。
%files #所有需要被打包进去的文件,写的是buildroot目录下的相对路径
%{path} #在buildroot下需要打包的文件路径,同时,该路径也是安装rpm包时的路径
%doc
%changelog #更改日志
2019.6.25更新
*******************************************
#下面的几步pre、post、preun、postun 提供了安装或卸载时的其他操作
%pre #rpm安装前制行的脚本
%post #安装后执行的脚本
%preun #卸载前执行的脚本
%postun #卸载后执行的脚本
%clean #清理段,删除buildroot rm -rf %{buildroot}
*******************************************
tips:
有的项目没有config文件,就可以不用写%configure和下边的命令,写了会报找不到./configure的错
这篇文章写的很到位,大家可以看看,
这篇文章也是讲.spec文件的,讲的也不错,https://www.jianshu.com/p/fb72b85dfac8
问题:自定义路径后报错,ERROR: No build ID note found in xxxxx
define区添加以下这行
%define debug_package %{nil} #(亲测有效)
参考:https://forums.fedoraforum.org/showthread.php?182293-RPM-Build-Error
添加之后还是不行,出现新的问题:error: Arch dependent binaries in noarch package
注释掉 BuildArch: noarch 或者添加 %_binaries_in_noarch_packages_terminate_build 0
参考:https://stackoverflow.com/questions/21288374/shipping-so-and-binaries-while-building-rpm-package
还有一点,当有多个source时,怎么办
经过测试,在.spec添加一个压缩source文件,然后在pre预编译阶段,用setup -n sourcename 解决不了,用tar解压到build下也执行不了,最后解决方法,不把source压缩,直接在pre阶段cp过去,还有一种解决方法,直接把所有的文件都压缩在同一文件夹内,直接解压,在pre,build阶段不进行操作,直接在build阶段cp过去。(如果你有更好的办法,可以写在评论中,大家共同进步)
4.打包
rpmbuild -ba path #path是.spec文件路径
在运行最后出现exit 0表示生成成功
运行结束后,会在RPMS文件下生成可安装的rpm文件
问题:执行rpmbuild命令报错找不到指定目录或文件
检查一下.spec文件中的%install宏下创建目录,复制文件是否错误。
5.安装测试
rpm -ivh ~/rpmbuild/RPMS/x86_64/weather-1.0-1.el7.x86_64.rpm #安装刚才打包好的安装包
rpm -ql weather #查找安装路径
rpm -qi weather #查询安装应用相关信息
问题:安装时缺少依赖
三种解决方式:
第一种:上网上找相关依赖包,并下载安装
第二种:让其自行解决依赖(没有测试过)
加上--aid,例如: rpm -ivh --aid path/xxx.rpm
第三种:忽略它,或强制安装
加上 --nodeps,意思不考虑依赖,例如: rpm -ivh --nodeps path/xxx.rpm
加上--force,强制安装,例如: rpm -ivh --force path/xxx.rpm
至此,centos下打包完成。
ubuntu下打包
现在说一下debian系的ubuntu下怎么打包,发现debian系下还是比较容易打包的,相较于redhat系,debian系免去了配置文件的麻烦,只需要简单说明软件的一些基本信息就行,甚是容易。
1.将源文件编译
debian打包只是打包,不提供编译功能,所以还需要自己编译。编译过程应该和上文所述的源码包编译一致。
2.整理打包所需文件
1)创建一个空目录
在某目录下,例如我是在/home/lym下建立一个目录,work,现在目录为/home/lym/work
2)指定安装路径
然后将需要打包的文件复制到该目录下,这里有很重要的一点,work这个目录就是一个"假根目录",您在这个目录下所有的修改,最后都会被映射到目标机的根目录 / 下,比如说在该目录下(/home/lym/work)我建立了一个usr/bin这样的目录,然后将我项目中的可执行文件放到usr/bin目录下(/home/lym/work/usr/bin/xxx),当打完包安装的时候,这个可执行文件就会被安装到/usr/bin目录下(注意,这里是绝对路径),同理,想让库文件安装到/usr/lib目录下,就得在当前目录(/home/lym/work)下建立usr/lib目录,然后将库文件放到其下(/home/lym/work/usr/lib/xxx)。
3)配置文件
在work目录下建立一个名为DEBIAN的目录,在其下有两个文件,一个是control,另一个是md5sums,前一个是必须的,其中主要包含软件基本信息和维护者信息,后者是软件的md5校验值,可以有可以没有。
2019.6.25更新
*******************************************
除了有control和md5sums文件外,还可以有还可能有preinst(preinstallation)(安装之前执行脚本)、postinst(postinstallation)(安装之后执行的脚本)、prerm(preremove)(卸载之前执行脚本)、postrm(postremove)(卸载之后执行的脚本)、copyright (版权)、changlog (修订记录)和conffiles等文件。
*******************************************
创建control命令: