【rpm】源码包制作rpm包|修改rpm、重新制作rpm包

news2024/11/20 8:25:06

目录

前言

安装rpmbuild

rpmbuild制作rpm 包

同时生成devel包

修改rpm、重新制作rpm包

RPM 打包 工具

SPEC文件

rpmbuild的目录和Spec宏变量和参数说明

preamble部分

Body 部分

标题宏变量/工作目录

spec文件信息

符号说明

CMake制作rpm包

HelloWorld

更多SPEC例子

报错记录

前言

打rpm 包需要的东西有 源码、spec文件(打rpm包的脚本)、rpmbuild工具。

官网教程:RPM Packaging Guide--https://rpm-packaging-guide.github.io/#rpm

安装rpmbuild

$yum install rpmbuild
$yum install rpmdevtools 
$rpmdev-setuptree

rpmbuild制作rpm 包


1,整理源码
tar -zcvf hello-1.0.tar.gz hello-1.0

hello-1.0 源码打包为.tar.gz压缩包,放到 SOURCE 文件夹下。我门的源码可能是一个tar.gz 的包、也可能是几个文件。
tar.gz源码包的名字格式应该为 helloword-1.0.0.tar.gz (其实就是名字-版本号.tar.gz)

2,编写spec文件
在SPECS文件夹下新建 xxx.spec 打包脚本,其实也就是把我门的源码编译打包成rpm 的一个过程。
(有个rpmdev-newspec工具可以自动生成一个.spec 模板)

vi  xxx.spec 

Name:           hellorpm           #名字为源码tar.gz 包的名字 
Version:        1.0.0             #版本号,一定要与tar.gz包的一致哦 
Release:        1%{?dist}         #释出号,也就是第几次制作rpm 
Summary:       helloword   #描述信息/软件包简介,最好不超过50字符 

#生成rpm包名:${Name}-${Version}-${Release}.${BuildArch}.rpm

License:        GPL                   #许可,GPL还是BSD等  
URL:            #自定义该信息,可以写一个网址 
Packager:       abel 
Source0:        %{name}-%{version}.tar.gz   
#定义用到的source,也就是你的源码

BuildRoot:      %_topdir/BUILDROOT         
#这个是软件make install 的测试安装目录.

BuildRequires:  gcc,make                           #制作过程中用到的软件包 
Requires:       python-apscheduler >= 2.1.2-1.el7,python-daemon >= 1.6-1.el7  #软件运行依赖的软件包,也可以指定最低版本如 bash >= 1.1.1 
%description                #描述,随便写                 
%prep                          #打包开始                    
%setup -q                      #这个作用静默模式解压并cd                               


%build              #编译制作阶段,主要目的就是编译,如果不用编译就为空 
./configure \                                     
 %{?_smp_mflags}          #make后面的意思是:如果就多处理器的话make时并行编译 

%install                        #安装阶段//安装之前需初始化安装目录                        
 rm -rf %{buildroot}             #先删除原来的安装的,如果你不是第一次安装的话 
 cp -rp %_topdir/BUILD/%{name}-%{version}/*  $RPM_BUILD_ROOT 
#将需要需要打包的文件从BUILD 文件夹中拷贝到BUILDROOT文件夹下。

#下面的几步pre、post、preun、postun 没必要可以不写 
%pre        #rpm安装前制行的脚本 

%post       #安装后执行的脚本//安装之后需要执行的动作 
cp  /usr/local/httpd/bin/apachectl /etc/init.d/myhttpd
sed -i '1a # chkconfig:  2345 85 15' /etc/init.d/myhttpd

%preun      #卸载前执行的脚本//卸载该rpm包所执行的一些操作
/etc/init.d/myhttpd stop
%postun     #卸载后执行的脚本 

%clean #清理段,删除buildroot 
rm -rf %{buildroot} 

%files  #rpm要包含的文件//安装之后生成的文件 
%defattr (-,root,root,-)   #设定默认权限,如果下面没有指定权限,则继承默认 
/etc/hello/word/helloword.c           #将你需要打包的文件或目录写下来
/usr/local/httpd/bin/*
%dir  /usr/local/httpd/logs
%doc  /usr/local/httpd/man/*
%doc  /usr/local/httpd/manual/*

###  7.chagelog section //定义一些日志文件,可以使用:rpm -q  --changelog httpd查看到
%changelog 
* Wed Mar 26 2014  zhangzhg <zsp@tarena.com> 2.2.25
- first rpm from  httpd-2.2.25

(这spec里面的%build ,%install 容易写错而报错,所以我们可以不配置 %build ,%install,不让rpmbuild代我们执行build 和install ,我们在外面make install,然后rpmbuild 打包结果)

注意:
以上阶段如果没有操作的话,为空,但是不能有空行,例如build阶段为空应写为
 

%build              
%install  
xxxxxxxx   
错误示例:
%build   

%install  
xxxxxxxx

rpm包制作阶段
在这里插入图片描述

3, build rpm包

 spec 文件编写好以后就可以进行打包了。

在SPECS文件夹下执行命令:
rpmbuild -ba hello.spec

如果出错了可以通过 不同的命令来看是在打包的那一步出了问题。

rpmbuild -ba spec_name.spec    <--编译,既生成源码src.rpm又生成二进制rpm 
rpmbuild -bb spec_name.spec    <--编译,只生二进制的rpm 
rpmbuild  
-bs 只生成src的rpm 
-bp 执行到pre 
-bc 执行到 build段 
-bi 执行install段 
-bl 检测有文件没包含 

可以先rpmbuild -bp ,再-bc 再-bi 如果没问题,rpmbuild -ba 生成src包与二进制包。
 

4, 安装
rpmbuild -ivh hello.rpm

5, 查询
rpm -qi hello
 rpm -qa|grep hello

本文参考:
http://laoguang.blog.51cto.com/6013350/1103628/
http://blog.chinaunix.net/uid-23069658-id-3944462.html

原文链接:https://blog.csdn.net/u012373815/article/details/73257754

另外的打包教程:https://blog.csdn.net/weixin_33875564/article/details/92785284
 

同时生成devel包

devel是以子包的形式出现的,所以只需在spec文件里面增加%files devel配置段即可

Name:      kmymoney
Summary:   The Personal Finances Manager for KDE.
Version:   0.8
Release:   1.%{disttag}%{distver}
#生成rpm包名:${Name}-${Version}-${Release}.${BuildArch}.rpm
License:   GPL
Packager:  %packer
Group:     Productivity/Office/Finance
Source0:   %{name}2-%version.tar.bz2
BuildRoot: %{_tmppath}/%{name}2-%{version}-%{release}-build
BuildRequires: kdebase3-devel
Prereq: /sbin/ldconfig
 
%description
 
Description goes here...
 
%package devel
 
#Requires:
Summary: KMyMoney development files
Group: Productivity/Office/Finance
Provides: kmymoney-devel
 
%description devel
 
This package contains necessary header files for KMyMoney development.
 
... more to go here ...
 
%files
 
... some files ...
 
%files devel
 
... the devel files ...

示例:

http://kmymoney2.sourceforge.net/phb/rpm-example.html
参考: https://stackoverflow.com/questions/2913130/building-both-devel-and-normal-version-of-a-rpm-package
(摘自:https://phpor.net/blog/post/5673)

修改rpm、重新制作rpm包


提取spec文件
rpmrebuild -s helloworld.spec helloworld.x86_64.rpm

解压原rpm包,得到helloworld
rpm2cpio helloworld.rpm|cpio -div

修改or替换helloworld里面的内容

创建文件夹/tmp/rpmbuild
mkdir /tmp/buildrpm

把helloworld和helloworld.spec 都放入其中<----------------------这一步很关键

cp -r helloworld helloworld.spec /tmp/buildrpm

重新编出rpm包

rpmbuild -ba --buildroot /tmp/buildrpm/ /tmp/buildrpm/helloworld.spec
 

RPM 打包 工具


rpmdevtools包提供的打包RPM的工具。要列出这些工具,请运行:
$ rpm -ql rpmdevtools | grep bin

标题创建打包工作目录
执行
rpmdev-setuptree

$ tree ~/rpmbuild/
/home/user/rpmbuild/
|-- BUILD
|-- RPMS
|-- SOURCES
|-- SPECS
`-- SRPMS

目录名 说明 macros中的宏名
BUILD 编译rpm包的临时目录 %_builddir
BUILDROOT 编译后生成的软件临时安装目录 %_buildrootdir
RPMS 最终生成的可安装rpm包的所在目录 %_rpmdir
SOURCES 所有源代码和补丁文件的存放目录 %_sourcedir
SPECS 存放SPEC文件的目录(重要) %_specdir
SRPMS 软件最终的rpm源码格式存放路径(暂时忽略掉,别挂在心上) %_srcrpmdir

SPEC文件


Spec文件用于告诉rpmbuild如何构建RPM或者SRPM包。(RPM,SRPM区别参见:http://cn.linux.vbird.org/linux_basic/0520rpm_and_srpm.php#intro_whatisrpm)
Spec文件包含preamble和body两部分,preamble部分主要包含一些包的元数据,body部分主要用于打包,安装等

rpmbuild的目录和Spec宏变量和参数说明

preamble部分

SPEC 指令

说明

Name

The base name of the package, which should match the SPEC file name.

包的基本名称,应与SPEC文件名匹配。

Version

软件的上游版本号。

Release

The number of times this version of the software was released. Normally, set the initial value to 1%{?dist}, and increment it with each new release of the package. Reset to 1 when a new Version of the software is built.

此版本软件的发布次数。通常,将初始值设置为1%{?dist},并该版本的每次新发布递增。生成新版本的软件时,重置为1。

Summary

一个简短的、单行的包摘要。

License

The license of the software being packaged. For packages distributed in community distributions such as Fedora this must be an open source license abiding by the specific distribution’s licensing guidelines.


正在打包的软件的许可证。对于在社区发行版(如Fedora)中分发的包,这必须是一个开源许可证,遵守特定发行版的许可准则。

URL

The full URL for more information about the program. Most often this is the upstream project website for the software being packaged.

有关该程序的详细信息的完整URL。通常,这是打包软件的上游项目网站。

Source0

Path or URL to the compressed archive of the upstream source code (unpatched, patches are handled elsewhere). This should point to an accessible and reliable storage of the archive, for example, the upstream page and not the packager’s local storage. If needed, more SourceX directives can be added, incrementing the number each time, for example: Source1, Source2, Source3, and so on.

上游源代码压缩包的路径或URL(未修补,补丁在其他地方处理)。这应该指向可访问且可靠的包路径,例如,上游页面,而不是打包程序的本地存储。如果需要,可以添加更多的SourceX地址,每次递增数字,例如:Source1、Source2、Source3等。

Patch0

The name of the first patch to apply to the source code if necessary. If needed, more PatchX directives can be added, incrementing the number each time, for example: Patch1, Patch2, Patch3, and so on.

必要时应用于源代码的第一个补丁的名称。如果需要,可以添加更多的PatchX,每次递增数字,例如:Patch1、Patch2、Patch3等。

BuildArch

If the package is not architecture dependent, for example, if written entirely in an interpreted programming language, set this to BuildArch: noarch. If not set, the package automatically inherits the Architecture of the machine on which it is built, for example x86_64.

如果包不依赖于平台架构,例如和硬件平台无关的脚本,请将其设置为BuildArch:noarch。如果未设置,软件包将自动设置为 机器的平台结构,例如x86_64。

BuildRequires

A comma- or whitespace-separated list of packages required for building the program written in a compiled language. There can be multiple entries of BuildRequires, each on its own line in the SPEC file.

编译程序用到的文件的列表,用逗号或空格分隔。在SPEC文件中,可以有多个BuildRequires条目,,每个条目单独一行

Requires

A comma- or whitespace-separated list of packages required by the software to run once installed. There can be multiple entries of Requires, each on its own line in the SPEC file.

installed后需要打包进rpm的文件列表,用逗号或空格分隔。在SPEC文件中,可以有多个Requires条目,每个条目单独一行

ExcludeArch

If a piece of software can not operate on a specific processor architecture, you can exclude that architecture here.

如果某个软件不能在特定的处理器架构上运行,则可以在此处排除该架构。

例如:要生成的包名是 python-2.7.5-34.el7.x86_64,则

Name:python,

Version:2.7.5,

Release:34.el7

最后一个标记是x86_64,表示体系结构。体系结构标记不受RPM打包器的直接控制,而是由rpmbuild构建环境定义。唯一的例外是要构建的RPM与硬件平台无关时,自己可以填写BuildArch:noarch.

Body 部分

SPEC 指令

说明

%description

A full description of the software packaged in the RPM. This description can span multiple lines and can be broken into paragraphs.

RPM中软件包的完整描述。此描述可以跨越多行,并可以拆分为段落。

%prep

Command or series of commands to prepare the software to be built, for example, unpacking the archive in Source0. This directive can contain a shell script.

构建之前的处理,例如,创建or删除目录,解压从Source0获取到的压缩包……可以包含shell脚本。

%build

Command or series of commands for actually building the software into machine code (for compiled languages) or byte code (for some interpreted languages).

编译生成程序的的命令或一系列命令。

%install

Command or series of commands for copying the desired build artifacts from the %builddir (where the build happens) to the %buildroot directory (which contains the directory structure with the files to be packaged). This usually means copying files from ~/rpmbuild/BUILD to ~/rpmbuild/BUILDROOT and creating the necessary directories in ~/rpmbuild/BUILDROOT. This is only run when creating a package, not when the end-user installs the package. See Working with SPEC files for details.


用于将所需的生成工件从%builddir(生成发生的位置)复制到%buildroot目录(包含要打包的文件的目录结构)的命令或一系列命令。这通常意味着将文件从~/rpmbuild/BILD复制到~/rpmuild/BILDROOT,并在~/rmbuild/BILDLOOT中创建必要的目录。这仅在创建包时运行,而不是在最终用户安装包时运行。有关详细信息,请参见使用SPEC文件:https://rpm-packaging-guide.github.io/#working-with-spec-files。

%check

Command or series of commands to test the software. This normally includes things such as unit tests.

测试软件的命令或一系列命令。这通常包括单元测试等内容。

%files

The list of files that will be installed in the end user’s system.

将安装在最终用户系统中的文件列表。(也就是需要打包进rpm包的文件列表--绝对路径)

%changelog

A record of changes that have happened to the package between different Version or Release builds.

不同版本或发行版本之间对包所做更改的记录。

标题宏变量/工作目录


默认工作路径的确定,通常由在/usr/lib/rpm/macros这个文件里的一个叫做%_topdir的宏变量来定义。

在%_topdir目录下一般需要建立6个目录:
$_topdir /root/rpmbuild

目录名 说明 macros中的宏名
BUILD 编译rpm包的临时目录 %_builddir
BUILDROOT 编译后生成的软件临时安装目录 %_buildrootdir
RPMS 最终生成的可安装rpm包的所在目录 %_rpmdir
SOURCES 所有源代码和补丁文件的存放目录 %_sourcedir
SPECS 存放SPEC文件的目录(重要) %_specdir
SRPMS 软件最终的rpm源码格式存放路径(暂时忽略掉,别挂在心上) %_srcrpmdir

Spec文件的宏定义:
rpmbuild --showrc | grep topdir #工作车间目录:_topdir /root/rpmbuild
-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 /root/rpmbuild

rpmbuild --showrc显示所有的宏,以下划线开头:

一个下划线:定义环境的使用情况,
二个下划线:通常定义的是命令,
为什么要定义宏,因为不同的系统,命令的存放位置可能不同,所以通过宏的定义找到命令的真正存放位置

spec文件信息

Name: 软件包的名称,在后面的变量中即可使用%{name}的方式引用
Summary: 软件包的内容
Version: 软件的实际版本号,例如:1.12.1等,后面可使用%{version}引用
Release: 发布序列号,例如:1%{?dist},标明第几次打包,后面可使用%{release}引用
Group: 软件分组,建议使用:Applications/System
License: 软件授权方式GPLv2
Source: 源码包,可以带多个用Source1、Source2等源,后面也可以用%{source1}、%{source2}引用
BuildRoot: 这个是安装或编译时使用的临时目录,即模拟安装完以后生成的文件目录:%_topdir/BUILDROOT 后面可使用$RPM_BUILD_ROOT 方式引用。
URL: 软件的URI
Vendor: 打包组织或者人员
Patch: 补丁源码,可使用Patch1、Patch2等标识多个补丁,使用%patch0或%{patch0}引用
Prefix: %{_prefix} 这个主要是为了解决今后安装rpm包时,并不一定把软件安装到rpm中打包的目录的情况。这样,必须在这里定义该标识,并在编写%install脚本的时候引用,才能实现rpm安装时重新指定位置的功能
Prefix: %{_sysconfdir} 这个原因和上面的一样,但由于%{_prefix}指/usr,而对于其他的文件,例如/etc下的配置文件,则需要用%{_sysconfdir}标识
Requires: 该rpm包所依赖的软件包名称,可以用>=或<=表示大于或小于某一特定版本,例如:
libxxx-devel >= 1.1.1 openssl-devel 。 注意:“>=”号两边需用空格隔开,而不同软件名称也用空格分开

%description: 软件的详细说明
%define: 预定义的变量,例如定义日志路径: _logpath /var/log/weblog
%prep: 预备参数,通常为 %setup -q
%build: 编译参数 ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx/……
%install: 安装步骤,此时需要指定安装路径,创建编译时自动生成目录,复制配置文件至所对应的目录中(这一步比较重要!)
%pre: 安装前需要做的任务,如:创建用户
%post: 安装后需要做的任务 如:自动启动的任务
%preun: 卸载前需要做的任务 如:停止任务
%postun: 卸载后需要做的任务 如:删除用户,删除/备份业务数据
%clean: 清除上次编译生成的临时文件,就是上文提到的虚拟目录
%files: 设置文件属性,包含编译文件需要生成的目录、文件以及分配所对应的权限
%changelog: 修改历史
 

详细介绍在:https://www.cnblogs.com/ilanni/p/4312581.html

https://blog.51cto.com/luweiv998/2354385
————————————————
原文链接:https://blog.csdn.net/csdn_763871244/article/details/99937600

符号说明


什么是 1%{?dist} : 如果%{dist}未定义返回1,否则返回1%{dist},

if 0%{?flag}; then
foo
fi

如果%{flag}被定义了,条件语句为:0%{flag},执行if block; 反之,条件语句为:0, 不执行if block。
注意:%{?flag}前必须加0,否则如果%{?flag}未定义,if语句停止执行并退出。
%{?flag: …}:如果%{flag}被定义,则展开"…"部分

作者:weiee
链接:https://www.jianshu.com/p/f1e36e4a152c
 

Note:

rpm --eval %{kernel_module_package_buildreqs}->kernel-devel
rpm --eval %{kernel_module_package} 会输出一些关于制作linux驱动的一些代码和一些依赖
重要的是包含了%files 路径,%files包含了需要打包进入rpm包里的文件,如果是 / 开头那么其实是BUILDROOT路径
制作的时候%install 是安装到~/rpmbuild/BUILDROOT的,最后发布rpm后运行yum install rpm会
把驱动安装到lib/modules/( u n a m e − r ) / u p d a t e s B u i l d R o o t : 在 e x p o r t I N S T A L L M O D P A T H = (uname -r)/updates BuildRoot: 在 %install 阶段(%build 阶段后)文件需要安装至此位置。Fedora 不需要此标签,只有 EPEL5 还需要它。默认情况下,根目录为 “%{_topdir}/BUILDROOT/”。 %_buildrootdir 最终安装目录 ~/rpmbuild/BUILDROOT 保存 %install 阶段安装的文件 export INSTALL_MOD_PATH=(uname−r)/updatesBuildRoot:在exportINSTALL 
MOD PATH=RPM_BUILD_ROOT export INSTALL_MOD_DIR=updates 这两句话说明了安装的时候的路径,是~/rpmbuild/BUILDROOT ,最后里面会生成对应的lib/modules/$(uname -r)/updates 下面

在这里插入图片描述

如果%clean 不加会默认把BUILDROOT给删掉

原文链接:https://blog.csdn.net/Wang20122013/article/details/122498396

CMake制作rpm包


(摘自:https://blog.csdn.net/qq_29493353/article/details/90205415)

也可以使用cmake 制作rpm包,CMake中包含的三个工具(cmake cpack ctest)中的cpack工具。他可以帮助快速的打包发布你的程序。

HelloWorld


目录结构

在这里插入图片描述

CMakeList.txt

cmake_minimum_required(VERSION 2.8)
# 设置项目名称
project(HelloWorld)
 
# 设置安装路径, 默认/usr/local。也可以是idc经常安装的/data/home/user00/xxxserver等
# set(CPACK_PACKAGING_INSTALL_PREFIX /opt)
 
# 如果不是CMake构建的,设置CMAKE_CURRENT_BINARY_DIR为Makefile的构建目录
set(CMAKE_CURRENT_BINARY_DIR ..)
 
# 批量的安装指令,目录、程序、库文件、头文件等
install(PROGRAMS bin/hello DESTINATION bin)
install(FILES bin/hello.a DESTINATION lib)
install(FILES src/hello.h DESTINATION include)
 
# 以下为RPM信息的设置,包名,概述,供应者,版本, 分组等等信息,通过其变量名称可以知道意思
set(CPACK_PACKAGE_NAME "wetest-helloworld")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Simple CPack HelloWorld")
set(CPACK_PACKAGE_VENDOR "WeTest")
set(CPACK_PACKAGE_VERSION "1.0.0")
set(CPACK_PACKAGE_VERSION_MAJOR "1")
set(CPACK_PACKAGE_VERSION_MINOR "0")
set(CPACK_PACKAGE_VERSION_PATCH "0")
set(CPACK_RPM_PACKAGE_GROUP "WeTest")
set(CPACK_RPM_PACKAGE_URL "http://wetest.qq.com")
set(CPACK_RPM_PACKAGE_DESCRIPTION "WeTest Server Dependencies")
set(CPACK_PACKAGE_RELEASE 1)
set(CPACK_RPM_PACKAGE_LICENSE "WeTest Licence")
 
# 设置默认生成器,RPM生成器会构建RPM安装包,其它还有TGZ/ZIP等
set(CPACK_GENERATOR "RPM")
 
# 安装前和安装后执行的shell脚本, 会打包到RPM中,安装时执行。这里可扩展性很强, 放在源码目录下即可
# set(CPACK_RPM_PRE_INSTALL_SCRIPT_FILE ${CMAKE_CURRENT_SOURCE_DIR}/pre_script.sh)
# set(CPACK_RPM_POST_INSTALL_SCRIPT_FILE ${CMAKE_CURRENT_SOURCE_DIR}/post_script.sh)
 
# 引入CPack模块,必须的
include(CPack)

构建

mkdir build && cd build
$ cmake …
$ make install
$ cpack

其中capck支持其他的打包格式,比如tar.gz和zip,只需要执行cpack -G TGZ 或者 cpack -G ZIP就可打包成相应的格式。

结论
以上主要是用cpack打包开发程序,其实可以针对很多东西制作rpm包,比如很多依赖已经用源码安装好的开发坏境,也可以打包,公司tlinux的提供了兼容性。比如mysql++已经装在系统/usr/local/当中,替换模板中的描述和install指令如下即可:

file(GLOB mysqlppso /usr/local/lib/libmysqlpp*)
install(DIRECTORY /usr/local/include/mysql++ DESTINATION include)
install(PROGRAMS ${mysqlppso} DESTINATION lib)
希望能够帮助大家快速部署,也推荐使用CMake来完成构建任务,如果有用的话之后介绍下ctest + boost unit test做单元测试。
 

更多SPEC例子

#前期准备:       yum -y install rpmdevtools pcre-devel   
#-------------------------------------------------------
# 查看默认宏:   rpmbuild --showrc  |  grep  "_topdir"
#  _builddir      %{_topdir}/BUILD
#  _buildrootdir %{_topdir}/BUILDROOT
#  _rpmdir       %{_topdir}/RPMS
#  _sourcedir    %{_topdir}/SOURCES    --->  原材料,如源码包,文档所在目录,需事先将打包的源文件或脚本存放在此目录内......
#  _specdir      %{_topdir}/SPECS   --->  管理rpm制作过程的描述文件所在的目录
#  _srcrpmdir    %{_topdir}/SRPMS
#  _topdir        %{getenv:HOME}/rpmbuild   --->  rpmbuild目录的顶层入口
#-------------------------------------------------------
#生成~/rpmbuild及子目录:    rpmdev-setuptree
#生成rpmbuild的spec模板:    rpmdev-newspec -o Name-version.spec  --->   生成的SPEC文件主要用于描述RPM包的制作和生成过程
#eg:
#[root@localhost ~]#  rpmdev-setuptree && cd rpmbuild ; tree
#.
#├── BUILD
#├── RPMS
#├── SOURCES
#├── SPECS
#└── SRPMS
#------------------------------------------------------------------------------------------------------------------------- 以下是spec文件内容:
 
#自定义宏,相当于Linux中"Key-Value"变量形式
%define Name nginx  #--->  名称
%define Version 1.2.2  #--->  版本
%define CONFIGFILE 1.conf   #--->   本rpm包中需更换的配置文件......
%define InstallPath /usr/local/nginx  #--->   本rpm包默认安装的路径
 
#定义软件包信息,即:"rpm -qi name.rpm " 查看到的内容
Name:           %{Name}   #--->   引用宏
Version:        %{Version}   #--->   引用宏
Release:        1%{?dist}   #--->   引用宏(自带宏)
Summary:        ....................................... #--->  一些描述信息
#生成rpm包名:${Name}-${Version}-${Release}.${BuildArch}.rpm
License:        GPLv2  #--->  授权协议
URL:            inmoonlight@.163.com
buildroot:      %{_topdir}/BUILDROOT   #--->  指定生产车间(非常重要,因在生成rpm过程中执行make install时会把软件安装到此路径,打包时同样依此目录为“根目录”进行操作)
Source0:        %{Name}-%{Version}.tar.gz   #---> 指定源码编译的文件,默认路径:%{_topdir}/SOURCES  
SOURCE1:        %{CONFIGFILE}  #---> 指定要替换的配置文件,默认路径:%{_topdir}/SOURCES  
BuildRequires:      gcc,make,automake,binutils  #--->  软件依赖信息
Requires:      bash >= 2.0 #--->  定义软件依赖信息,该rpm包所依赖的软件包名称,可用>=或<=表示大或小于特定版本
%description
This is %{Name} .....Just a test rpm suite.............
 
#安装前的准备工作,此处可写入执行脚本
%pre
useradd %{Name} -s /sbin/nologin
 
#安装前的准备:此段默认将Source目录内的源码包在BUILD目录解压为%{Name}-%{Version}格式的目录
%prep
%setup -q -n %{Name}-%{Version}  #---> 参数:-c 解压缩之前先产生目录,-n newdir 将软件包解压在newdir目录
 
#定义config动作
%build
./configure --prefix=%{InstallPath} --user=%{Name} --group=%{Name} 
make %{?_smp_mflags}
 
#定义执行make install时的动作
%install
rm -rf %{buildroot} #---> 删除生产车间内的残留文件
%{__make} install DESTDIR=%{buildroot} #---> 将软件安装至指定的目录
%{__install} -p -D -m 0755  %{SOURCE1} %{buildroot}/usr/local/nginx/conf/%{CONFIGFILE} #--->  替换指定的配置文件
 
#赋予文件的默认权限及设置需在RPM包中保留的文件
%files
%doc
%defattr(-,root,root,-)  #---> 指定包装文件属性,分别是(mode,owner,group),- 表示默认值,文本文件是0644,可执行文件0755
%attr(0755,root,root) /usr/local/nginx/sbin/nginx  #--->  针对单一文件设置权限
%{_prefix}/*
%{_prefix}/local/nginx/conf/%{CONFIGFILE}
 
#制作完成后的清理工作
%clean
rm -rf %{buildroot}
 
#安装后的执行工作,此处可写入执行脚本
%post
chkconfig --add nginx
chkconfig --level 345 nginx on
 
#变更日志
%changelog
 
#---------------------------------------------------------------------------------------------
#    2.1 介绍区域的SOURCE0下增加如下
#    Source0:        %{name}-%{version}.tar.gz 
#    Source1:        index.html 
#    Source2:        init.nginx 
#    Source3:        fastcgi_params 
#    Source4:        nginx.conf 
 
#    2.2 安装区域增加如下
#    make install DESTDIR=%{buildroot} 
#    %{__install} -p -D %{SOURCE1} %{buildroot}/usr/html/index.html  #%{__install}这个宏代表install命令
#    %{__install} -p -D -m 0755 %{SOURCE2} %{buildroot}/etc/rc.d/init.d/nginx 
#    %{__install} -p -D %{SOURCE3} %{buildroot}/etc/nginx/fastcgi_params 
#    %{__install} -p -D %{SOURCE4} %{buildroot}/etc/nginx/nginx.conf 
 
 
将脚本制作成为RPM包的例子:
 
Name: eee
Version: 1
Release: 1%{?dist}
Summary:1111
 
License:GPLv2
URL:    inmoonlighy.11.cn
Source0: eee
 
%description
.....
 
%install
rm -rf %{buildroot}
mkdir -p %{buildroot}/bin/
cp -rf  %{SOURCE0} %{buildroot}/bin
 
%files
/bin/eee
 
%changelog
 
#注:安装时失败应加“rpm -ivh --force ***.rpm 进行尝试”
#---------------------------------------------------------------------------------------------
#rpmbuild:
#    -bl          检查spec中的%file段来查看文件是否齐全
#    -ba         建立二进制包&源码
#    -bb         建立二进制包
#    -bp        执行到 prep 阶段
#    -bc         执行到 build 阶段
#    -bi         执行到 install 阶段

#制作:    cd /usr/src/redhat/SPECS/ ; rpmbuild -ba nginx.spec   --> 生成:/usr/src/redhat/RPMS/i386/nginx-1.2.1-1.el5.ngx.i386.rpm
#测试:    rpm -ivh /usr/src/redhat/RPMS/i386/nginx-1.2.1-1.el5.ngx.i386.rpm
 

《使用cpack打包源码并编写自动化脚本上传到仓库》
https://blog.csdn.net/weixin_34319640/article/details/87972767

报错记录


make: *** No rule to make target `install’


(摘自:https://www.cnblogs.com/chenyaling/p/5806965.html)

遇到最大的坑就是%install部分的make install

网上的资料是这样说的:

本段是安装段,其中的命令在安装软件包时将执行,如make install命令。
%makeinstall 这不是关键字,而是rpm定义的标准宏命令。也可以使用非标准写法:引用make DESTDIR=R P M B U I L D R O O T i n s t a l l 或引用 m a k e p r e f i x = RPM_BUILD_ROOT install或引用make prefix=RPM BUILD ROOTinstall或引用makeprefix=RPM_BUILD_ROOT install
需要说明的是,这里的%install主要就是为了后面的%file服务的。所以,还可以使用常规的系统命令:
引用install -d $RPM_BUILD_ROOT/
cp -a * $RPM_BUILD_ROOT/
但是我每次使用make install时候都会报错make: *** No rule to make target ‘install’。换成install -d的写好就可以,我也不明白是为什么。

后来发现,使用make install是在已经编写过Makefile的前提下进行的,报错中的install其实是Makefile中的写好的target。

举个例子,在Makefile中编写,如下:

install-oem:
mkdir -p $(LIBDIR)/xsconsole/plugins-oem
则在%install中就可以这样写:

%install
make install-oem DESTDIR=$RPM_BUILD_ROOT
否则,当然会报错找不到target。

朱老师说现在使用Makefile已经有点过时了。我是觉得Makefile很烦,写错了,还要重新打包,生成压缩文件才行。改多了之后根本受不了,不如直接在%install里面直接写内容,这样改起来也方便。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/147534.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序开发——小程序的宿主环境—组件

一.小程序的宿主环境—组件1.小程序中组件的分类小程序中的组件也是由宿主环境提供的&#xff0c;开发者可以基于组件快速搭建出漂亮的页面结构。官方把小程序的组件分为了9大类&#xff0c;分别是&#xff1a;1.视图容器 2.基础内容 3.表单组件 4.导航组件5.媒体组件 6.map 地…

企业寄件管理系统使用教程

专为企业量身打造的寄件管理类平台&#xff0c;也就是企业寄件管理系统。其存在的意义在哪里&#xff1f;又是如何运用的&#xff1f;我们往下看看......讨论它存在的意义在哪里&#xff0c;我们先来看看企业普遍存在的寄件场景痛点&#xff1a;1、最早的手写快递单&#xff0c…

一维差分(例acwing重新排序)

一维差分是为了解决访问一个数组中的几个区间&#xff0c;降低时间复杂度使用的差分就是前缀和的逆运算&#xff08;a[i]b[1]b[2]…b[i]&#xff09;差分的作用就是快速实现将数组部分加上一个数。例如给定一个数组 A 和一些查询 Li,Ri&#xff0c;求数组中第 Li 至第 Ri 个元素…

Maven高级-属性-版本管理-资源配置-多环境开发配置-跳过测试

Maven高级-属性 4.2)属性类别 1.自定义属性 2.内置属性 3.Setting属性 4.Java系统属性 5.环境变量属性 4.3)属性类别&#xff1a;自定义属性 作用 等同于定义变量&#xff0c;方便统一维护 定义格式&#xff1a; <!--定义自定义属性--> <properties><…

STM32MP157驱动开发——Linux ADC驱动

STM32MP157驱动开发——Linux ADC驱动0.前言一、ADC 简介1.ADC 简介2.STM32MP157 ADC简介二、ADC 驱动源码解析1.设备树下的 ADC 节点2.ADC 驱动源码分析1&#xff09;stm32_adc 结构体2&#xff09;stm32_adc_probe 函数3&#xff09;stm32_adc_iio_info 结构体三、驱动开发1.…

【深度学习】经典算法解读及代码复现AlexNet-VGG-GoogLeNet-ResNet(二)

链接: 【深度学习】经典算法解读及代码复现AlexNet-VGG-GoogLeNet-ResNet(一) 4.GoogLeNet 4.1.网络模型 GoogLeNet的名字不是GoogleNet&#xff0c;而是GoogLeNet&#xff0c;这是为了致敬LeNet。GoogLeNet和AlexNet/VGGNet这类依靠加深网络结构的深度的思想不完全一样。Go…

创建Vue3项目以及引入Element-Plus

创建Vue3项目以及引入Element-Plus 前提条件&#xff1a;本地需要有node环境以及安装了npm&#xff0c;最好设置了镜像&#xff0c;这样下载包的时候会快些。 1、安装vue脚手架vue-cli3 npm install vue/cli -g2、安装后查看vue的版本 vue -V3、创建Vue项目&#xff0c;项目…

通信电子、嵌入式类面试题刷题计划01

文章目录001——什么是奈奎斯特采样定理&#xff1f;002——有源滤波器和无源滤波器的区别是什么&#xff1f;003——什么是反馈电路&#xff1f;请举出相关应用004——什么是竞争冒险现象&#xff1f;如何消除和避免此类现象005——什么是基尔霍夫定理&#xff1f;006——if e…

揣着一口袋的阳光满载而归--爱摸鱼的美工(13)

-----------作者&#xff1a;天涯小Y 揣着一口袋的阳光满载而归&#xff01; 慷懒周末 睡到自然醒&#xff0c;阳光洒在书桌上 套进宽松自在的衣服里 出门&#xff0c;去楼下坐坐 在阳光里吃午餐 在阳光里打个盹 在阳光里看猫咪上蹿下跳 在阳光里点个咖啡外卖 虚度时光&#xf…

【CANN训练营第三季】TBE算子开发

文章目录直播学习结业考核直播学习 安装准备&#xff1a;https://www.hiascend.com/document/detail/zh/mindstudio/50RC3/instg/instg_000022.html 开发参考: https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/600alpha003/operatordevelopment/opdevg/atla…

基础算法(八)——离散化

离散化 介绍 这里的离散化&#xff0c;特指整数的、保序的离散化 有些题目可能需要以数据作为下标来操作&#xff0c;但题目给出的数据的值比较大&#xff0c;但是数据个数比较小。此时就需要将数据映射到和数据个数数量级相同的区间&#xff0c;这就是离散化&#xff0c;即…

Java学习笔记——继承(上)

目录继承入门继承的好处继承的特点继承中成员变量的访问特点this和super访问成员的格式继承中成员方法的访问特点方法重写概述和应用场景方法重写的注意事项权限修饰符继承入门 继承的好处 好处&#xff1a; 提高了代码的复用性。 提高了代码的维护性。 让类与类之间产生了关系…

static关键字分别在C和C++中的作用

static用于实现多个对象之间的数据共享 隐藏使用静态成员不会破坏隐藏规则默认初始化为0 1. C语言中static的特性&#xff08;面向过程设计中&#xff09; 局部变量&#xff1a;在任意一个函数内部定义的变量&#xff08;不加static&#xff09;&#xff0c;初始值不确定&am…

11、JS笔记-内置内置对象

1.内置对象 js中对象分为三种&#xff1a; 自定义对象、内置对象、浏览器对象&#xff08;js独有&#xff09; 内置对象&#xff1a; js语言自带的对象&#xff0c;供开发者使用&#xff0c;提供一些常用或基本的功能&#xff08;属性和方法&#xff09; 2.Math对象 Math中所…

Docker核心概念总结

文章目录容器容器概念物理机,虚拟机与容器的区别Docker简介Docker介绍Docker思想Docker容器的特点使用Docker的原因容器VS虚拟机对比图容器与虚拟机总结容器与虚拟机可以共存Docker 基本概念镜像&#xff08;Image&#xff09;一个特殊的文件系统容器&#xff08;Container&…

SpringSecurity认证功能的快速上手

简介 SpringSecurity是Spring家族中的一个安全管理框架。相比于另外一个安全框架Shiro&#xff0c;它提供了更丰富的功能&#xff0c;社区资源也比Shiro丰富。一般来说中大型项目都是使用SpringSecurity来做安全框架&#xff0c;小项目用Shiro的比较多&#xff0c;因为相比于S…

LabVIEW VI服务器功能

LabVIEW VI服务器功能VI 服务器是在LabVIEW 5.0中引入的&#xff0c;它提供了允许用户动态控制前面板控件、VI和LabVIEW环境的一系列函数。使用VI服务器&#xff0c;您还可以在同一台机器或通过网络动态加载运行VI和LabVIEW。 VI服务器函数位于 函数应用程序控制 子面板上。所有…

3-1内存管理-内存管理概念

文章目录一.内存管理的基本原理和要求1.逻辑地址和物理地址2.程序的装入和链接/从写程序到程序运行/将程序和数据装入内存/将用户源程序变为可在内存中执行的程序需要经过的步骤3.程序的链接方式4.内存的装入模块在装入内存时的方式5.操作系统对内存的管理二.覆盖与交换三.连续…

C#,图像二值化(17)——全局阈值的ISODATA算法(亦称作InterMeans法)及其源程序

二值算法综述请阅读&#xff1a; C#&#xff0c;图像二值化&#xff08;01&#xff09;——二值化算法综述与二十三种算法目录https://blog.csdn.net/beijinghorn/article/details/128425225?spm1001.2014.3001.5502 支持函数请阅读&#xff1a; C#&#xff0c;图像二值化&…

Smart Finance成为火必投票竞选项目,参与火必投票获海量奖励

最近&#xff0c;Huobi推出了新一期的“投票上币”活动&#xff0c;即用户可以通过HT为候选项目投票&#xff0c;在投票截止后&#xff0c;符合条件的优质项目将直接上线Huobi。而Smart Finance成为了新一期投票上币活动的竞选项目之一&#xff0c;并备受行业关注&#xff0c;与…