易陆发现互联网技术论坛

 找回密码
 开始注册
查看: 447|回复: 1
收起左侧

make编译安装,将tar转rpm包

[复制链接]
发表于 2022-10-20 15:00:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?开始注册

x
gcc相关知识# _7 e" J% I& c  k! a/ N
先编写一个C文件,其第一行表示包含文件在/usr/include/stdio.h下,如果没有申明,则需要使用参数-I /usr/include指定。* D0 O' g1 x7 w* O# ?
8 Z5 H" q# ?7 T$ i' m# a% L8 o
[root@home ~]#cat sin.c) M; l: L5 ?0 D) d1 e+ F2 o
#include <stdio.h>
8 f3 p' ~+ D) J$ [. T, ^. H9 Oint main(void), s+ L# U. n% f$ L; t# F5 M  u6 X
{
" F2 }5 M9 J9 \0 U' ?7 W& J% D. s        float value;, V$ P* d4 @( _
        value=sin(3.14/2);3 \% G- q+ {8 ?* c# b
        printf("%.2f\n",value);3 |. Z; W$ |$ g4 v
}6 \0 w  X& T0 Y3 T$ G

$ W- H5 K# K; `5 t* {" p[root@localhost src]# gcc -c sin.c8 ~1 O8 J4 y, e1 t& Q
sina.c: In function ‘main’:& n- b- ?: R% I% d: E1 i9 I
sina.c:5:8: warning: incompatible implicit declaration of built-in function ‘sin’ [enabled by default]! G8 o* p8 d: N/ Z0 ^. A( |* z
  value=sin(3.14/2);) r' P8 c$ f9 D6 j! D  z# U- P
        ^3 H8 x( m* W3 ~, m7 \$ ^, o4 w
[root@7ftbv7mdz7cdpc ~]# gcc -c sin.c -lm -L /lib/64 -L /usr/lib64  ~1 A5 f9 m( t" |+ I6 |/ v6 k+ t0 f
sin.c: In function ‘main’:" Q2 h' X. x- m. W
sin.c:5: warning: incompatible implicit declaration of built-in function ‘sin’
6 `  A3 ?! W1 o, D[root@localhost src]# gcc -o sin sina.o
% Y0 `: H- Y- J  T7 m, m1 u[root@localhost src]# ./sin
1 f! G% M8 u6 a8 @8 w/ c; F+ n1.00: S$ J3 |# S  r; A
gcc sin.c全产生a.out运行文件,加上参数-c则生成二进制文件sin.o,再加上-o则生成运行档sin。
2 ]' j# V) q5 h9 @: V8 B. a, S; a: |7 ]' V
但是如果出现以下错误,这是因为 C 语言里面的 sin 函示是写在 libm.so 这个函式库中,而我们并没有在原始码里面将这个函式库功能加进去,可以使用以下命令gcc -c sin.c -lm -L /lib/64 -L /usr/lib64
, U5 s2 U7 `* h2 E8 b: Q' L" \: j; g1 E7 X) N4 f
gcc -O 为产生最佳化的参数% O2 e6 ^* p' q. m% g# J
3 m9 ?8 Y. B6 A8 U. Z1 I
gcc -Wall 为产生更详细的编译过程资讯
/ `1 k/ V! g. K, V8 c% Y0 C( \
; x+ ?# l7 R4 r/ C-l :是『加入某个函式库(library)』的意思,7 N7 h8 j1 H% n6 h0 u) H. f
+ z- o% A: L' x- Z; n
m :则是 libm.so 这个函式库,其中, lib 与扩展名(.a 或 .so)不需要写
" D( F- x- r( e$ D3 v* l" B-I /path 后面接的路径( Path )就是配置要去搜寻相关的 include 文件的目录啦# O- y- y; w) |$ J: ?! D
-L 后面接的路径表示函式库 libm.so 请到 /lib 或 /usr/lib 里面搜寻2 V5 n" Z; n9 i1 A$ [1 h# ?
总结:0 {1 W( R  o9 y3 N3 ]9 \4 K
/ ?- z! k* h* H9 z7 m5 P7 p8 c
# 仅将原始码编译成为目标档,并不制作连结等功能:; v7 \, O; f* H9 H" H
[root@www ~]# gcc -c hello.c
: C% F5 X5 o. ^* u1 y# 会自动的产生 hello.o 这个文件,但是并不会产生 binary 运行档。  p9 \; u0 ]: [0 H7 }2 N

+ n$ y* u# I/ m& o1 M& |2 o# 在编译的时候,依据作业环境给予最佳化运行速度' d# W; j* B* ]7 c6 {& K, ^
[root@www ~]# gcc -O hello.c -c5 Z& ^4 ?3 {1 w* |: |7 J
# 会自动的产生 hello.o 这个文件,并且进行最佳化喔!/ A# P' e1 [* ?1 Y. T! Z
( J; o8 e5 R1 z% x! c" b3 b: U* `
# 在进行 binary file 制作时,将连结的函式库与相关的路径填入
0 O& v0 o/ p. V3 f! M% a[root@www ~]# gcc sin.c -lm -L/usr/lib -I /usr/include
3 F. R6 p4 C: r# 这个命令较常下达在最终连结成 binary file 的时候,- F  \: F$ |& Q5 t# N, t$ m! G4 @
# -lm 指的是 libm.so 或 libm.a 这个函式库文件;
$ e7 L  o$ D: w, c" K9 q# -L 后面接的路径是刚刚上面那个函式库的搜寻目录;
3 G: q  i, z5 J  d# -I 后面接的是原始码内的 include 文件之所在目录。1 Z! w# }2 T3 c7 j6 c! U

# b" p7 w" o# @# 将编译的结果输出成某个特定档名
* l, B9 O$ ]# a; |& P[root@www ~]# gcc -o hello hello.c
! @9 [! ]. Q/ E" j' m3 W# -o 后面接的是要输出的 binary file 档名
) y7 ?2 ^9 S0 H$ K/ z
0 {8 R6 S2 s0 q; j" G8 n* q6 ]# 在编译的时候,输出较多的信息说明7 m9 I, h: L+ M8 U# C
[root@www ~]# gcc -o hello hello.c -Wall, _7 r) u  v$ K& x# g6 q8 L
# 加入 -Wall 之后,程序的编译会变的较为严谨一点,6 D4 L" z$ L- r, Q$ ^
# 所以警告信息也会显示出来!4 g2 h% }2 `1 t) e2 Y1 Y
另外,我们通常称 -Wall 或者 -O 这些非必要的参数为旗标 (FLAGS),因为我们使用的是 C 程序语言,所以有时候也会简称这些旗标为 CFLAGS。+ A" y5 l, D* z7 W" [4 `7 W
3 W- e) g  A7 V' h! x* ~/ o
makefile介绍
; [7 H4 \: L* r8 k3 Y4 r: J5 S) u+ t实例3 r1 L. M3 a6 j7 L
首先,下载wget http://linux.vbird.org/linux_basic/0520source/main.tgz然后开始编译:; s& w7 v) y% t( C  i% S
$ E3 L" ?3 J) V, ?( Q( C# A
[root@localhost main]# cat makefile
' @* w% m& X( u! z8 |main: main.o haha.o sin_value.o cos_value.o
$ o; V/ Z/ r! G! a. I. M        gcc -o main main.o haha.o sin_value.o cos_value.o -lm
/ J& s# H8 ~5 k1 yclean:: D3 V, U0 x! x! y$ A8 ~
        rm -f main main.o haha.o sin_value.o cos_value.o5 O+ d8 I6 D$ v1 [2 A7 J) i4 X
       
: F$ n3 t9 L- l[root@localhost main]# make
- }: F4 C# j( V( D' _: ncc    -c -o main.o main.c
4 r$ y7 [6 q; P1 ]9 icc    -c -o haha.o haha.c
3 z! ~/ }6 @2 g" C9 O8 `cc    -c -o sin_value.o sin_value.c
5 K8 Z& U- t; O% @6 icc    -c -o cos_value.o cos_value.c5 i# k. O& P7 z9 d8 T
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
- s/ f/ x! o* e! L; q9 Z1 M
, [4 P; w( X) j: N[root@localhost main]# ./main
1 {, _  g, \  R7 Z+ ?Please input your name: fdm+ ]* l! Y$ V  f5 q4 f
Please enter the degree angle (ex> 90): 33  n2 r& @- W7 Q$ [# Z" Q, {, E
Hi, Dear fdm, nice to meet you.7 @, Y$ ]) n/ s/ \9 w
The Sin is:  0.540 N  I9 D  P/ ~- S
The Cos is:  0.84! m3 A9 u- d4 [1 s+ \
6 g1 B0 y! S0 Q" P1 R" Q5 L. t/ u
[root@localhost main]# make clean( V% k, l/ H0 D: E" j+ \% X9 N4 N
rm -f main main.o haha.o sin_value.o cos_value.o+ o! _6 J8 V3 I/ |" e
makefile 的基本语法与变量
* `% g% ?& J* z" C8 qmake 会主动的去判断每个目标档相关的原始码文件,并直接予以编译,最后再直接进行连结的动作。- d* k5 c) x% r* W/ f

" U# Q# I- f- M9 \) f" Y' `在 makefile 当中的 # 代表注解;
  H, O7 d' r0 h2 t  I需要在命令行 (例如 gcc 这个编译器命令) 的第一个字节;, L* ?4 p" }& D1 q5 [- H+ L0 a
标的 (target) 与相依文件(就是目标档)之间需以『:』隔开。就是可执行程序的文件名。4 g1 V+ L; D( o
标的(target): 目标档1 目标档2- Y, v& T+ `( r1 B
        gcc -o 欲创建的运行档 目标档1 目标档2
! r6 ^+ U3 _4 J, W. m* H" G如下,makefile 里面就具有至少两个标的,分别是 main 与 clean ,如果我们想要创建 main 的话,输入『make main』,如果想要清除有的没的,输入『make clean』即可!而如果想要先清除目标档再编译 main 这个程序的话,就可以这样输入:『make clean main』
' M7 A  Y* O5 T/ _, ?1 m; l
  p; s4 |: B5 @; \2 p还可以进行简化,使用变量来减少程序的修改量。$@:代表目前的标的(target);gcc 在进行编译的行为时,会主动的去读取 CFLAGS 这个环境变量,可以写到makefile
& m9 Q3 t2 ~4 B! P: C$ M% r  m& |
, W/ O' ~+ F6 M4 {. v[root@www ~]# cat makefile
. o" U3 S% w3 }7 x7 QLIBS = -lm
, W0 f: a* F- \$ p6 i2 r- {% AOBJS = main.o haha.o sin_value.o cos_value.o
7 q! U, m5 x$ x: XCFLAGS = -Wall& O* D  g1 |# i5 ]! k
main: ${OBJS}2 Y! U9 ?- l. B
        gcc -o $@ ${OBJS} ${LIBS}9 r3 |& r, ?( m2 H; Y" G3 d( s
clean:" e. m6 h& m6 f9 A7 s# t
        rm -f $@ ${OBJS}9 c; L  T. @* A, y( p
由於 gcc 在进行编译的行为时,会主动的去读取 CFLAGS 这个环境变量,所以,你可以直接在 shell 定义出这个环境变量,也可以在 makefile 文件里面去定义:0 w7 y: k) Z  R0 [8 T

& ^, O$ M( {7 Z: y/ B" N[root@www ~]# CFLAGS="-Wall" make clean main7 P( R( C. q) S3 O9 i( I7 m
# 这个动作在上 make 进行编译时,会去取用 CFLAGS 的变量内容!
9 C# v( h  {, q: ymake与Dockerfile相接合
, O2 Q7 h4 N+ G; i此小节内容来源于 high-iowait-process 。
# C6 |" T# I6 c" M9 z- m$ F( P& s" N* R9 w0 A  B: p
如有下列Makefile文件内容:
' \0 c3 [3 L1 B; Y+ s8 q- Z& S! y: c9 w; `) I
.PHONY: build
6 Z. ^, M3 L! K% v+ n- ^+ S  ~2 wbuild:
* |3 l, c8 g' D" N$ X' t- R        gcc -o app app.c
. `! K' a- N; `  H: f! ]+ K        docker build -t feisky/app:iowait -f Dockerfile .
, l3 g+ u7 c0 }3 |        gcc -o app app-fix1.c5 ?( K' N" [  D' Z
        docker build -t feisky/app:iowait-fix1 -f Dockerfile .6 x6 e$ w9 U/ ]6 |- g7 [
        gcc -o app app-fix2.c
/ }* w- G- b! d& m% H1 z        docker build -t feisky/app:iowait-fix2 -f Dockerfile .) r  G$ d" a9 I1 J( t( G

/ v' ]8 J* |# C+ E" k! P9 ].PHONY: push
  H3 E$ G9 s5 o7 T; \1 X. |! tpush:' X0 [1 v; h8 R& L! _- p( B
        docker push feisky/app:iowait
! T6 {( n$ }  B5 d& ]        docker push feisky/app:iowait-fix1( P+ H( ?9 Z: s6 d) ~! q7 L' T
        docker push feisky/app:iowait-fix2
, Y% m( l! ^% p5 p, ]/ ^3 R8 J9 g' @3 m( c0 O& i7 \
.PHONY: run
# W; R5 n, G7 K7 d# f9 arun:
. r3 w4 H$ p+ R7 K9 ^        docker run --privileged --name=app -itd feisky/app:iowait
3 B4 Q' N' S/ {3 \+ c! ?* f$ n  v
0 L) }  w& c: G.PHONY: run-fix1
& R6 I- _( q2 x, P1 j* d! B" jrun-fix1:8 v) c$ a: {6 D- f7 R: b$ I
        docker run --privileged --name=app -itd feisky/app:iowait-fix1
$ N" m. _& S8 a5 a+ ~: m
* d0 q- S4 @; J! h% E.PHONY: run-fix2# {' S3 F! k7 l& r7 w
run-fix2:/ _. a; _: l5 ~' ?
        docker run --privileged --name=app -itd feisky/app:iowait-fix2
2 p- n. u9 L, q7 [. H1 W) ^
$ ]6 F& r6 Y5 c* ].PHONY: clean
' A4 a& ]5 J  ^/ r7 M6 [6 ]clean:
4 P( J! s. M" B2 |, d        rm -f app
  g$ l. F/ p- w% _* a0 _        docker rm -f app || echo "Container app already deleted."
3 V8 A3 R  ~- |% g/ z) ^6 y& g这样写好之后,就可以使用 make bulid 来生成镜像,使用 make run 来运行镜像,使用 make clean 来删除镜像。所以这看上去就有点像脚本的函数一样了。, m+ D( x: Z% X0 H1 S
; h3 {+ ]( Z2 v' E5 P
变量的基本语法
) v" Z" h7 T' }; |$ n5 j, C变量与变量内容以『=』隔开,同时两边可以具有空格;1 Q0 b6 d; i7 n
变量左边不可以有 ,例如上面范例的第一行 LIBS 左边不可以是 ;
' C4 }" Y; E) `! j! B变量与变量内容在『=』两边不能具有『:』;8 y; L- f, U8 g4 P/ l  a" R
在习惯上,变量最好是以『大写字母』为主;
+ O. c' n; d, H) U; {8 {  r7 T运用变量时,以 ${变量} 或 $(变量) 使用;0 v: O1 S: p/ z: \
在该 shell 的环境变量是可以被套用的,例如提到的 CFLAGS 这个变量!
6 ^- u8 _  f5 P& e. |. G3 B在命令列模式也可以给予变量。
' _/ k- @$ C" f; ^! Byum安装相关环境. u5 k8 [2 p; y! }1 u5 V9 x! L# Q
如果是要安装 gcc 等软件发展工具,请使用『 yum groupinstall “Development Tools” 』' ]. L1 {2 Z/ o$ L5 m
若待安装的软件需要图形介面支持,一般还需要『 yum groupinstall “X Software Development” 』. o; [) j- E" k% }; I% W0 y
若安装的软件较旧,可能需要『 yum groupinstall “Legacy Software Development” 』
& N# v( A4 O( S+ Y编译软件步骤
$ R  F0 Y5 j9 l./configure 创建Makefile文件/ _) G6 \3 |! c. f! S5 o3 t! ~* e
make clean 会读取 Makefile 中关於 clean 的工作,可有可无
& y" P- }, [- b) Amake make 会依据 Makefile 当中的默认工作进行编译的行为, d  c6 ?& e8 ]2 n- q$ R
make install
0 z3 N; E* j4 j* p9 A/ ~8 c7 U) J5 E如果未指定安装路径,则编译安装的目录是放在/usr/local/etc、/usr/local/bin、/usr/local/lib、/usr/local/man下。
# z. u4 {. w. D$ M; |; s! q$ Y5 X6 ^* G
rpm知识
& y& h. f2 l; ^9 L6 K6 y此内容与编译无关。可以跳过,同时此内容也来自于鸟哥私房菜,是一本好本啊~  r" z/ s2 n# b- d8 S& ^

+ e  j5 t0 e+ i5 ?+ I2 A4 \+ {RPM 安装 (install)- N3 n, q  s  h* K2 ~1 a# `& Z
[root@www ~]# rpm -ivh package_name
: t. s- p+ }. S4 P- J选项与参数:
7 h1 I; [% F2 s/ M3 e; ~. `-i :install 的意思+ ^7 }3 W4 N2 Q8 U# c
-v :察看更细部的安装资讯画面
2 {; V  Q6 E- k1 a* }-h :以安装资讯列显示安装进度
. A3 b/ C, }1 n+ b( T( B6 g4 X
4 w. r! s, j7 P% m% i! a-Uvh        后面接的软件即使没有安装过,则系统将予以直接安装; 若后面接的软件有安装过旧版,则系统自动升级至新版;  P, X1 ]/ G0 T" s
-Fvh        如果后面接的软件并未安装到你的 Linux 系统上,则该软件不会被安装;亦即只有已安装至你 Linux 系统内的软件会被『升级』
5 n/ n! z: {! H. q. S* F. i( i+ _# k$ ]( G4 O
[root@www ~]# rpm --rebuilddb   <==重建数据库
6 i: n, N0 {4 `3 i1 Urpm 安装时常用的选项与参数说明! f, I% L, T. P3 e; x
. _2 Y! |0 \+ W3 h3 _
—nodeps:当发生软件属性相依问题而无法安装,但你执意安装时5 X* o2 a6 Y2 z, T  F
—replacefiles:如果在安装的过程当中出现了『某个文件已经被安装在你的系统上面』的资讯,又或许出现版本不合的信息 (confilcting files) 时,可以使用这个参数来直接覆盖文件。
0 |- I  E3 v# k7 @$ ]% W& q—replacepkgs:重新安装某个已经安装过的软件!如果你要安装一堆 RPM 软件文件时,可以使用 rpm -ivh *.rpm ,但若某些软件已经安装过了, 此时系统会出现『某软件已安装』的资讯,导致无法继续安装。此时可使用这个选项来重复安装喔!
/ T. @5 l$ r0 c0 V  W—force:这个参数其实就是 —replacefiles 与 —replacepkgs 的综合体!1 E& z0 K0 N; G
—test: 想要测试一下该软件是否可以被安装到使用者的 Linux 环境当中,可找出是否有属性相依的问题。1 S) ?6 D2 n0 |# g+ ]" \
—justdb 使用时机: 由於 RPM 数据库破损或者是某些缘故产生错误时,可使用这个选项来升级软件在数据库内的相关资讯。! r4 _+ g0 B4 C/ B9 ~8 M0 M
—nosignature 使用时机: 想要略过数码签章的检查时,可以使用这个选项。
6 _3 R5 p4 e# d8 L$ \! j—prefix 新路径 使用时机: 要将软件安装到其他非正规目录时。举例来说,你想要将某软件安装到 /usr/local 而非正规的 /bin, /etc 等目录, 就可以使用『 —prefix /usr/local 』来处理了。
# H) Y0 g( ?- H. |( K; l—noscripts 使用时机:不想让该软件在安装过程中自行运行某些系统命令。
2 y$ U. ~2 e6 \* |2 @RPM 查询 (query)3 O6 l+ \6 }1 h5 n" Z; p9 `' m
RPM 在查询的时候,其实查询的地方是在 /var/lib/rpm/ 这个目录下的数据库文件。) W6 ], w: x" i1 S  H6 i) ~+ R

5 [- p4 [/ _) r# U) @; L[root@www ~]# rpm -qa                           <==已安装软件5 d3 ?+ [" o, l6 v9 M7 G3 y0 d9 A
[root@www ~]# rpm -q[licdR] 已安装的软件名称       <==已安装软件
+ f3 p0 Y  R9 ^1 Z/ ][root@www ~]# rpm -qf 存在於系统上面的某个档名      <==已安装软件
7 x2 R3 H" g# @% n/ V[root@www ~]# rpm -qp[licdR] 未安装的某个文件名称  <==查阅RPM文件1 Z- u  u( O& _0 m# g9 ^
-q :仅查询,后面接的软件名称是否有安装;; k, `6 J) _9 Z6 V+ M- b; i
-qa :列出所有的,已经安装在本机 Linux 系统上面的所有软件名称;
( [; |1 J* h1 U" `; X' f; L-qi :列出该软件的详细资讯 (information),包含开发商、版本与说明等;
3 U; j2 s$ l" f9 N! b( F5 ^-ql :列出该软件所有的文件与目录所在完整档名 (list);2 T0 _& S8 c7 l2 A
-qc :列出该软件的所有配置档 (找出在 /etc/ 底下的档名而已)" @+ m! f0 t0 p' T- @: M/ w- t4 w. B
-qd :列出该软件的所有说明档 (找出与 man 有关的文件而已)
+ ^8 q( p: [* v-qR :列出与该软件有关的相依软件所含的文件 (Required 的意思)
' [8 |8 u9 x) X& _-qf :由后面接的文件名称,找出该文件属於哪一个已安装的软件
) U  f1 g1 D- U. r# N-qp[icdlR]:注意 -qp 后面接的所有参数以上面的说明一致。但用途仅在於找出某个 RPM 文件内的资讯,即未安装的名称
; q; Y4 c+ W( k! j# Z- i/ P& C1 D2 W( nRPM 验证与数码签章
0 m6 W: H0 l3 c验证
, _; y' s7 C1 M, t4 }! i: \% U验证 (Verify) 的功能主要在於提供系统管理员一个有用的管理机制!作用的方式是『使用 /var/lib/rpm 底下的数据库内容来比对目前 Linux 系统的环境下的所有软件文件 』也就是说,当你有数据不小心遗失, 或者是因为你误杀了某个软件的文件,或者是不小心不知道修改到某一个软件的文件内容
% R% t5 a7 s; b3 ~- m" o
, j  S' B  i; L/ T[root@www ~]# rpm -Va6 y! C1 c3 M0 j' h2 c6 q
[root@www ~]# rpm -V  已安装的软件名称
5 g( [8 _/ `6 d6 R# n[root@www ~]# rpm -Vp 某个 RPM 文件的档名
) i8 l; q' F) |+ Z* Z2 w[root@www ~]# rpm -Vf 在系统上面的某个文件
. `. M7 D% O. S1 f+ L  l0 U5 V4 @  c/ M
选项与参数:. s, W3 @0 i( t* a* ~* N
-V  :后面加的是软件名称,若该软件所含的文件被更动过,才会列出来;5 ~0 Q  I0 X* C1 w# A; v. D. A
-Va :列出目前系统上面所有可能被更动过的文件;
1 f7 R- Y2 G5 S( R+ ]4 t2 G( k-Vp :后面加的是文件名称,列出该软件内可能被更动过的文件;" H: _8 G" i. t  K. a% d$ H
-Vf :列出某个文件是否被更动过~
0 C; `  d3 i/ m$ l
8 C) T& N( u9 W  ~[root@www ~]# rpm -V logrotate
0 f* s! F# w" Q( f9 }, S. u..5....T  c /etc/logrotate.conf, N$ J. X3 U0 d" E% I# E% \
第一列的含义有以下几种:5 n  l- k9 L  u3 Q/ i; Y- x
+ f, N+ z( {" b9 K& g9 y& x: x7 w
S :(file Size differs) 文件的容量大小是否被改变8 B: l5 M7 H3 [3 B/ o: R$ _" E
M :(Mode differs) 文件的类型或文件的属性 (rwx) 是否被改变?如是否可运行等参数已被改变
9 D8 \/ A4 d' k/ ]5 :(MD5 sum differs) MD5 这一种指纹码的内容已经不同
8 ~% W0 X; E) ?  a1 R( nD :(Device major/minor number mis-match) 装置的主/次代码已经改变5 h, f2 T  n. }; s0 \# X4 \" g
L :(readLink(2) path mis-match) Link 路径已被改变
) z+ U! L& k3 Y  X  ?0 x9 Y4 W- yU :(User ownership differs) 文件的所属人已被改变6 b& L/ w9 R. J) b3 Y  X
G :(Group ownership differs) 文件的所属群组已被改变: P- s  k2 ]3 t5 V0 C* \4 _  n
T :(mTime differs) 文件的创建时间已被改变* z* `5 {" J+ v( ?- E* D* e% @
第二列的含义有以下几种:/ s( a# p5 e; _+ f$ g+ t6 I
. `1 z$ w' f$ ~) z
c :配置档 (config file)7 j' c* @/ g" H! {/ ^5 f
d :文件数据档 (documentation)
0 P. _+ |. T) C& i' jg :鬼文件~通常是该文件不被某个软件所包含,较少发生!(ghost file)
6 d+ r5 N. q# ll :授权文件 (license file)1 H0 L, y/ P) J% I) H3 i
r :读我文件 (read me)+ B- D4 V2 _* e, |; c
数码签章
3 d% X: T4 |, |9 c软件开发厂商可以数码签章系统产生一个专属於该软件的签章,并将该签章的公钥 (public key) 释出。 当你要安装一个 RPM 文件时:3 v2 ~' h# n$ B, e: H: r

# x6 ]7 |1 v) G& b) S8 p# m首先你必须要先安装原厂释出的公钥文件;实际安装原厂的 RPM 软件时, rpm 命令会去读取 RPM 文件的签章资讯,与本机系统内的签章资讯比对,若签章相同则予以安装,若找不到相关的签章资讯时,则给予警告并且停止安装喔。
/ R! W4 q7 h! R
. U. a* `$ _4 q7 V; Z$ Z1 @9 v[root@localhost ~]# ll /etc/pki/rpm-gpg/RPM-GPG-KEY-*; \  Y6 q( A+ V- @$ y
-rw-r--r--. 1 root root 1690 Nov 23 08:16 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7) ]- L' L9 T5 P4 B, s. t: a
-rw-r--r--. 1 root root 1004 Nov 23 08:16 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Debug-71 ?# Z) D. p2 g7 D7 g- q' v% S) R4 S
-rw-r--r--. 1 root root 1690 Nov 23 08:16 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Testing-72 x# Z. p; u; g" F# |# {
-rw-r--r--. 1 root root 1662 Oct  2  2017 /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
. w9 e3 W+ p. S1 H! v) o+ y7 O-rw-r--r--. 1 root root 1340 Mar 23  2017 /etc/pki/rpm-gpg/RPM-GPG-KEY-remi
! M! a" D$ d3 y* i. H* V) T, h-rw-r--r--. 1 root root 3100 Mar 23  2017 /etc/pki/rpm-gpg/RPM-GPG-KEY-remi2017
: z+ F$ R0 Q* ], D5 |-rw-r--r--. 1 root root 3143 Jan 16  2018 /etc/pki/rpm-gpg/RPM-GPG-KEY-remi2018& N4 U. v" M8 g% ^
SRPM相关知识
3 M/ ?6 g7 E5 J3 Nrpm的全称是Redhat Package Manager,SRPM是指 Source RPM 的意思,这个 RPM 文件里面含有原始码,特别注意的是,这个 SRPM 所提供的软件内容『并没有经过编译』。通常 SRPM 的扩展名是以 *.src.rpm 这种格式来命名的。srpm跟tarball的区别就是srpm提供了这个软件所需要的相依性软件说明、以及所有 RPM 文件所提供的数据。3 Q) O% F. @8 P7 T6 r1 U

( U/ x4 A' j( Q7 P: Krebuild直接安装
+ K# N* I' R3 V下载src.rpm包之后,可以在不修改配置的情况下,直接使用以下参数直接操作:
( U# R8 {- \3 J- }0 c" K$ V) }8 a7 ?  j% e1 \$ ]: k2 m
—rebuild:这个选项会将后面的SRPM进行『编译』与『打包』的动作,最后会产生RPM的档案,但是产生的RPM档案并没有安装到系统上。当你使用—rebuild的时候,最后通常会发现一行字体:Wrote: /root/rpmbuild/RPMS/x86_64/pkgname.x86_64.rpm这个就是编译完成的RPM档案啰!这个档案就可以用来安装啦!安装的时候请加绝对路径来安装即可5 q+ p4 d! c2 \' b
—recompile:这个动作会直接的『编译』『打包』并且『安装』啰!请注意, rebuild 仅『编译并打包』而已,而recompile 不但进行编译跟打包,还同时进行『安装』了
8 l+ x( Q. v7 I7 u( {2 X7 x示例:" A# X- j* {" E9 W8 m( ~" p$ U
5 |( ~8 M  M- Z# ]0 b
先下载软体:# O% r4 G. w; V1 y
wget http://vault.centos.org/7.1.1503 ... l7.centos.1.src.rpm1 C  h$ y; B6 i( J/ }( w7 a& w: k
再尝试直接编译看看:
6 f9 N; K: |- o5 e8 Yrpmbuild --rebuild ntp-4.2.6p5-19.el7.centos.1.src.rpm8 s9 H. B& |, J+ Z: R+ V4 g5 e) A
上面的动作会告诉我还有一堆相依软体没有安装~所以我得要安装起来才行:
6 _0 V! t# R" G2 B" Oyum install libcap-devel openssl-devel libedit-devel pps-tools-devel autogen autogen-libopts-devel" a/ ?3 x$ D7 g
再次尝试编译的行为:
; g5 J6 K3 g& Q! Prpmbuild --rebuild ntp-4.2.6p5-19.el7.centos.1.src.rpm+ O+ q* J: o# [1 W
最终的软体就会被放置到:
1 l/ J* t7 K& [" I5 k/root/rpmbuild/RPMS/x86_64/ntp-4.2.6p5-19.el7.centos.1.x86_64.rpm! h6 \7 M3 ^/ `
SPEC编译安装
: F2 _9 k0 O. e目录说明" ^) X. E$ h( a1 X- o
如果你的rpm的版本<=4.4.x,那么rpmbuid工具其默认的工作路径是/usr/src/redhat,这就使得普通用户不能制作rpm包,因为权限的问题,在制作rpm软件包时必须切换到root身份才可以。所以,rpm从4.5.x版本开始,将rpmbuid的默认工作路径移动到用户家目录下的rpmbuild目录里,即$HOME/rpmbuild。) w: k1 v) [0 v) y
' u& P9 c: _/ T0 K: a/ D
首先yum -y install rpm-build rpmdevtools,然后rpmdev-setuptree来创建工作目录,也可以不安装rpmdevtools,直接使用mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}来创建。具体的各目录的含义如下:
" q) s1 b% a  }# o7 ?( h/ V" {% m* `6 `$ x+ E
默认位置        宏代码        名称        用途, b) v" P* o, G1 c
~/rpmbuild/SPECS        %_specdir        Spec 文件目录        保存 RPM 包配置(.spec)文件; Z( k6 j, b$ F! d# k) `: Z
~/rpmbuild/SOURCES        %_sourcedir        源代码目录        保存源码包(如 .tar 包)和所有 patch 补丁- o2 s1 @( `+ L, E4 E
~/rpmbuild/BUILD        %_builddir        构建目录        源码包被解压至此,并在该目录的子目录完成编译
$ n: Q8 J5 I+ g  ~! ]; o~/rpmbuild/BUILDROOT        %_buildrootdir        最终安装目录        保存 %install 阶段安装的文件3 z# z5 s2 B/ @& j- m' l7 C1 h
~/rpmbuild/RPMS        %_rpmdir        标准 RPM 包目录        生成/保存二进制 RPM 包
0 y; S. n1 ]  k4 x* ~0 D/ R~/rpmbuild/SRPMS        %_srcrpmdir        源代码 RPM 包目录        生成/保存源码 RPM 包(SRPM)
+ @) U7 E! G# T. p" b1 u使用rpm -ivh来安装srpm包时,会生成很多文件在/root/rpmbuild下:
* n, k/ ?" X9 r& W3 {* r  ~5 v2 x9 v( x  w) G8 X
[root@localhost ~]# rpm -ivh ntp-4.2.6p5-19.el7.centos.1.src.rpm
& {/ ]2 \( p- V# Z/ C1 j* H2 y4 Z/ vUpdating / installing...; }# A: M# n" O
   1:ntp-4.2.6p5-19.el7.centos.1      ################################# [100%]
' t  u9 U, `0 t7 P[root@localhost ~]# tree /root/rpmbuild/1 A& M& K1 q( y" |
/root/rpmbuild/
9 O7 U' t0 j: T9 ?9 d' k! P├── BUILD
* l' t5 j6 L2 j1 ]0 W! u├── BUILDROOT7 R* Y; }& J3 g7 t4 {$ ^& T8 |
├── RPMS
) |' J9 |2 b) n4 t' g7 {├── SOURCES
+ g/ y: B  E' W& ]0 O3 l│   ├── ntp-4.2.4p7-getprecision.patch
+ Y& c# w0 ~- N6 J, Y' |│   ├── ntp-4.2.6p1-cmsgalign.patch
. j% B+ d: f5 K- _# w/ k。。。. K9 K( `# L  l% G9 A1 V4 M8 T0 h7 q
│   └── sntp.sysconfig
8 u# N6 D$ r, d5 v. o4 r5 U) z├── SPECS; ~$ y4 y& K2 a. Y  N% K6 }& ^5 N
│   └── ntp.spec
' \* I6 W# x! {: q└── SRPMS; y  s2 g* S. r, R, Y
解压完成之后,srpm本身就提供了spec文件,可以直接通过以下方式直接安装:+ r0 X3 ~$ l: M3 b3 D2 s9 Z) O5 o
" H, t; M0 M  H  x5 }
[root@study ~]# rpmbuild -ba ntp.spec   <==编译并同时产生RPM与SRPM档案 1 B# u" n+ z# Q8 _% E" X
[root@study ~]# rpmbuild -bb ntp.spec   <==仅编译成RPM档案
$ c( g) Z0 j5 a9 z& q1 f) ?9 X% Bspec打包流程9 A- P* L: e5 a5 H$ q
SPECS下是RPM包的配置文件,是RPM打包的“图纸”,这个文件会告诉rpmbuild命令如何去打包。“宏代码”这一列就可以在SPEC文件中用来代指所对应的目录,类似于编程语言中的宏或全局变量。当然~/rpmbuild这个文件夹也是有宏代码的,叫做%_topdir。
, U; ?& {- ^- I1 J5 ~- e' s
6 M# T, [1 Q2 E# I5 E" f打包的过程有点像是流水线,分好几个工序:
8 d6 v& z  O. `/ n9 S% O$ d
1 N7 l% ^  K. u9 N* F首先,需要把源代码放到%_sourcedir中;
; I3 Z# Y' m, }0 Z+ \1 A" M然后,进行编译,编译的过程是在%_builddir(~/rpmbuild/BUILD)中完成的,所以需要先把源代码复制到这个目录下边,一般情况下,源代码是压缩包格式,那么就解压过来即可;6 r) [/ Q$ n0 C' I3 V' |! {
第三步,进行“安装”,这里有点类似于预先组装软件包,把软件包应该包含的内容(比如二进制文件、配置文件、man文档等)复制到%_buildrootdir(~/rpmbuild/BUILDROOT)中,并按照实际安装后的目录结构组装,比如二进制命令可能会放在/usr/bin下,那么就在%_buildrootdir下也按照同样的目录结构放置;4 {( W: Y/ ~7 }4 E) d# F5 X1 A& r
然后,需要配置一些必要的工作,比如在实际安装前的准备啦,安装后的清理啦,以及在卸载前后要做的工作啦等等,这样也都是通过配置在SPEC文件中来告诉rpmbuild命令;9 n, Y+ Z7 j  }! \. A. ^
还有一步可选操作,那就是检查软件是否正常运行;
% L& y1 L- m6 b' A最后,生成的RPM包放置到%_rpmdir,源码包放置到%_srpmdir下。' l/ u* n0 n. _0 [" _- @) p  A
spec文件内容& K2 V% I# B, `) f1 l7 O
使用vim a.spec之后,会自动生成spec的结构体,内容如下:
7 T4 O- n' E* e& @5 P; V* I0 i& W$ q1 K
Name:                                                                ==>软件包的名字,后续可以用%{name}来引用
6 h7 R: @1 w7 XVersion:                                                        ==>软件版本
8 i$ e& \9 ^( K9 @8 hRelease:        1%{?dist}                                ==>发布的序号8 C4 [/ h$ e6 K) x+ v% y
Summary:                                                        ==>软件包的摘要信息
4 c, }; H$ S. x$ e2 b: G$ \/ E- C$ u. c4 x7 |
Group:                                                                ==>软件包的安装分类,参见/usr/share/doc/rpm-4.x.x/GROUPS这个文件
8 ~4 Q; G  U( r. s1 OLicense:                                                        ==>GPLv2,授权方式( R8 F1 m' y# f& {
URL:                                                                ==>这里本来写源码包的下载路径或者自己的博客地址或者公司网址之类,无实际用处
9 P  q3 Q. |) T) X6 ]7 S( C8 u5 aSource0:                                                        ==>%{name}-%{version}.tar.gz源代码包的名称,这里的name和version就是前两行定义的值。如果有其他配置或脚本则依次用Source1、Source2等等往后增加即可。# T% e& |3 ?% c* G

% {% r) L) ~( s. D( B4 O  yBuildRequires:                                                ==>在本机编译rpm包时需要的辅助工具,以逗号分隔。假如,要求gcc的版本至少为4.4.2,则可以写成gcc >=4.2.2。( }1 W& Z# N& p0 J
Requires:                                                        ==>编译好的rpm软件在其他机器上安装时,需要依赖的其他软件包,也以逗号分隔,有版本需求的可以8 o( [6 ?1 H* h; @9 y( h) A( ?

2 W& p: b5 W- b%description                                                ==>软件包的详细说明信息,但最多只能有80个英文字符。
" b5 M2 W3 o5 W" |0 K* [: z. j) y8 L& W, h* O! N3 I
%prep                                                                ==>读取位于 %_sourcedir 目录的源代码和 patch 。之后,解压源代码至 %_builddir 的子目录并应用所有 patch。
: t! H1 T/ o* l# M  F%setup -q                                                        ==>使用这个语句实现%prep功能,仅能解压Source 或 patch 定义好的文件" K+ B% o/ j- J& o9 h" E' ?
1 L' Z( c5 u4 }  G2 |
%build                                                                ==>编译位于 %_builddir 构建目录下的文件。通过执行类似 ./configure && make 的命令实现。4 e+ Z2 ]+ ]5 o" m  m+ `$ m  _, r: l
%configure# a8 S, [( F  x1 E; O
make %{?_smp_mflags}
: B: s9 r$ k/ `8 D' K7 {& i# `4 n
7 @& f' _  B8 O9 O%install                                                        ==>读取位于 %_builddir 构建目录下的文件并将其安装至 %_buildrootdir 目录。这些文件就是用户安装 RPM 后,最终得到的文件。注意一个奇怪的地方: 最终安装目录 不是 构建目录。通过执行类似 make install 的命令实现。
* t- ~- \  x3 Y3 bmake install DESTDIR=%{buildroot}9 ?; k/ g) {- p7 M9 m1 m# {

3 D; m' h& H* t$ ~# l7 F0 U%files                                                                ==>软件文件和目录
. t1 ]% {8 K) u' s%doc                                                                ==>软件说明文件% S; Y( \! I7 ?* i7 n0 g6 `! p5 D
* ?( F, u3 V  P; U; X; r0 t
%changelog                                                        ==>更新说明,星号(*) 后面应该要以时间,修改者, email 与软体版本来作为说明, 减号(-) 后面则是你要作的详细说明啰% r0 m2 }5 p! p; K1 Q  {
除了以上这些,还是以下阶段:
8 M1 L! G- y* |( S$ P
' y- k) L& ?/ c# W! O* A) l%pre 在目标系统上安装软件包之前执行的Scriptlet。注意跟%prep的区别。
+ x4 S+ n' y5 k, z%post 在目标系统上安装软件包完成之后执行的Scriptlet。! H" E$ }6 _  D; Z" ^9 \, `- Q, s
%preun 在从目标系统卸载软件包之前执行的Scriptlet。0 M9 ]/ w. Q+ G$ }+ ?- ?# H  s: s9 T
%postun 从目标系统卸载软件包完成之后执行的Scriptlet。5 h+ o2 w+ v* F2 S+ s
以下介绍一下比较重要的阶段。
# u0 }/ Y; i# C3 y7 e+ E) u) ?/ i1 ^$ I
%prep阶段& b. A3 ?. `! J9 e
这个阶段里主要完成对源代码包的解压和打补丁(如果有的话),而解压时最常见到的就是一句指令:%setup -q。这句指令可以成功执行的前提是你位于SOURCES目录下的源码包必须是name-version.tar.gz的格式才行,它还会完成后续阶段目录的切换和设置。如果在这个阶段你不用这条指令,那么后面每个阶段都要自己手动去改变相应的目录。1 o# s5 f$ w$ ?8 d% h2 ~5 w

/ B" X% c7 A+ E2 t( i如果在%prep阶段,只使用了%setup这个宏变量,代表了会运行以下操作(假设Source为cdplayer-1.0.tgz):0 Y- m* I+ l$ t+ q
7 `* v/ Z3 \' Y
cd /usr/src/redhat/BUILD; k- u0 X0 k% q3 V9 _
rm -rf cdplayer-1.0
5 D9 C* ^1 n0 Y4 P2 g8 }. Jgzip -dc /usr/src/redhat/SOURCES/cdplayer-1.0.tgz | tar -xvvf -1 b) T' O- H5 }( B, ]6 _, ~
if [ $? -ne 0 ]; then
( ^0 r/ }% E. R: V/ x4 j  exit $?
/ t: a  P' o( N; [4 w9 B  Zfi
$ H" W. k) h1 x* Qcd cdplayer-1.0# m  Q4 ?4 a" V2 u* x5 ]
cd /usr/src/redhat/BUILD/cdplayer-1.0) K( ^0 ]( q: i- D
chown -R root.root .
- }& F& j* `% o: h4 C1 P8 S% J5 Xchmod -R a+rX,g-w,o-w .
- Z0 T( n' X; \$ W$ Z# q- M可以看到,默认操作为先进入BUILD目录,然后再删除%{name}-%{version},再解压,最后再修改权限、属主等。参数-q是指不输出运行的过程,还有其他参数如下:
) k8 u* U; T0 I% c+ m- H( Q; o5 \* ~- W1 S( S3 _8 h' X
%setup -n newdir 先删除/usr/src/redhat/BUILD/newdir目录,然后将软件包解压在newdir目录;再进行这个目录进行权限设置
# i1 F" C0 i+ `%setup -c 先创建目录,进入这个目录后再解压。与不加参数的%setup比较,仅仅是多了mkdir 以及 cd 这2个命令
. C  S3 o, w6 ^6 Y%setup -D 解压缩时,不会去删除目录。与不加参数的%setup比较,少了rm -rf操作
+ u; ~7 ?0 H% Q4 E% U; \! h%setup -T 不进行解压的操作。与不加参数的%setup比较,少了gzip以及if判断语句8 [9 q0 h9 M- ]

3 V' U) q. ^! b% i2 c" k%setup -b num 将第num个source文件解压缩。如果是 %setup -b 0,就会解压2次,可以使用 %setup -T -b 0,这样就只会解压一次了。但只效果跟 %setup 不加参数的效果是一样的。
! l3 J# p1 P/ ?0 d%setup -T -a num 先进入目录再解压第num个source文件8 V% |& U6 o" }, S7 Z! E
, _+ V& Z7 p/ W5 J$ j4 m

# j1 `+ x8 u+ k/ `% A9 T% r1 @- ?%patch 最简单的补丁方式,自动指定patch level。- S0 l, n& C* e. l, n
%patch 0 使用第0个补丁文件,相当于%patch ?p 0。) P1 Z" H- V' E- f) r: o$ o7 W; u
%patch -s 不显示打补丁时的信息。
7 b: p4 j4 f" x  q%patch -T 将所有打补丁时产生的输出文件删除。5 N) M% e# }0 K1 }
*************************************/
4 D  V3 y6 ]5 X, M  r0 c* q8 U7 x%setup -q -n %{name}-%{version}
! ^' k% j# D5 d4 H& c7 x/ }2 ?( @. G# J% Z6 J/ S4 c
/* 如果原来只有一个“Patch:”,您增加“Patch1:”,则在SPEC文件%setup行后面的+ a$ }: _9 n, M0 U$ z  |
   %patch -p1后面新增一行: %patch1 -p1 依此类推.) a, ~4 i' m# m  Q
*/  Q  S7 t8 ^* ]- Q3 ~4 x1 z
%patch0 -p1
5 R1 T7 g2 l) E" X实例,如果%prep的内容如下:5 d. [: z! q1 Z6 u( B+ X4 U0 |
9 A& l0 s* [7 i0 N4 e/ T
%prep0 Z2 ]3 Y5 E1 n: W+ m
%setup# [6 w: A9 h, o6 h% A) ?1 \
%setup -T -D -a 14
/ |7 S' r. q, l5 S% p%setup -T -D -a 15
6 `# j9 W! J( O- `  t7 V" ?其运行的过程如下:
- B* V* C, C6 T" ?1 E
& B, h8 A7 Q9 D- X) ][root@localhost SPECS]# rpmbuild -bb nginx.spec% o* f& L; q0 |, @. o; m
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.N1Tdpo
- l& ?+ H" Q5 Z7 ?% A7 I+ umask 022$ w0 _( h) A8 v* a
+ cd /root/rpmbuild/BUILD) o8 P" e" ?$ `
+ cd /root/rpmbuild/BUILD
% l1 \4 F& o3 \0 s/ g+ rm -rf nginx-1.16.1
& _9 |- M+ P# r/ f2 f" K+ /usr/bin/tar -xvvf -/ H! D. w1 v, x
+ /usr/bin/gzip -dc /root/rpmbuild/SOURCES/nginx-1.16.1.tar.gz% p5 Q) p4 s% i2 o! Y1 p
...: W# t( l  h% H, J6 x# @
+ STATUS=0- R! o3 i4 H; Y- [# g, o1 F, y
+ '[' 0 -ne 0 ']'
. a# q3 l' x% l8 E; p7 \+ cd nginx-1.16.1. p4 r2 Y8 ^) m8 N- ]. B
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .8 @2 P* S; G; M8 i
+ cd /root/rpmbuild/BUILD0 N" _2 j, Z+ k( ^
+ cd nginx-1.16.1& `3 w; g  C* U9 D* r
+ /usr/bin/tar -xvvf -
* S+ i' B5 c; E" }* Q+ /usr/bin/gzip -dc /root/rpmbuild/SOURCES/nginx-http-concat.tar.gz( k2 h% F3 C% W  ]4 S) i; n
...
1 {+ g  i2 }7 ]/ s) J+ STATUS=0
6 v. v$ j8 l, }$ Q. |+ '[' 0 -ne 0 ']'
6 G6 a& C4 t) G! m7 z; B+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
8 Y4 g& R1 O8 o% C" ~+ cd /root/rpmbuild/BUILD
) ^! j6 `  k7 I+ K0 N, o+ cd nginx-1.16.1( H# H6 l1 U5 [2 N. t
+ /usr/bin/tar -xvvf -7 S4 x0 A& \+ ?- w( y8 I2 l3 \
+ /usr/bin/gzip -dc /root/rpmbuild/SOURCES/ngx_cache_purge.tar.gz
0 h7 C9 B1 q! I; _& S  |% T1 @..., N  {% N7 p5 [, Y
需要注意的是,%setup -q 是指解压不输出任何提示消息,只会解压source0的文件,即第0个source文件。%setup -T -a num 先进入目录再解压第num个source文件,进入目录的意思是进入%{name}-%{version}这个目录,即spec前面定义好的Name以及Version。
. B/ t/ V1 a2 {  W5 A4 e6 H5 Z8 t9 v; c) x" @% e9 m: S4 \
https://book.huihoo.com/maximum-rpm/s1-rpm-inside-macros.html
& R$ ?1 l" }4 Y6 f: }5 C/ J+ i
3 e) W: T4 ^# f" R- ~9 k3 v7 ?5 x) H%build阶段, r! I2 r# ^) K+ E7 d. p
这个阶段就是执行常见的configure和make操作,如果有些软件需要最先执行bootstrap之类的,可以放在configure之前来做。这个阶段我们最常见只有两条指令:' w; ]$ \8 [" e. W
% j0 u: J# `4 v1 g
%configure
8 Y+ x# M! Q! f1 }/ t/ Mmake %{?_smp_mflags}! V* V* d% l# y
这里的%configure是个宏常量,会自动将prefix设置成/usr。另外,这个宏还可以接受额外的参数,如果某些软件有某些高级特性需要开启,可以通过给%configure宏传参数来开启。如果不用 %configure这个宏的话,就需要完全手动指定configure时的配置参数了。同样地,我们也可以给make传递额外的参数,例如: make %{?_smp_mflags} CFLAGS="" …% O0 E' ]- ^4 S8 i2 K( c. w0 k
9 T2 Q0 c( i+ h7 R* J3 G5 ?
%install阶段
" x/ u7 w- P, a+ w这个阶段就是执行make install操作。这个阶段会在%_buildrootdir目录里建好目录结构,然后将需要打包到rpm软件包里的文件从%_builddir里拷贝到%_buildrootdir里对应的目录里。这个阶段最常见的两条指令是:
$ C, j) F& Q6 N% g% f0 v- e* m( J+ T0 {3 B* N
rm -rf $RPM_BUILD_ROOT2 R6 U  A' m+ [! I7 ~& N7 n
make install DESTDIR=$RPM_BUILD_ROOT8 R% P/ N/ |/ r) \2 |( E
其中$RPM_BUILD_ROOT也可以换成我们前面定义的BuildRoot变量,不过要写成%{buildroot}才可以,必须全部用小写,不然要报错。2 ^+ v, T: O4 A/ ]( E+ h

0 E$ S* A5 A9 }+ S, S4 s2 ]如果软件有配置文件或者额外的启动脚本之类,就要手动用copy命令或者install命令你给将它也拷贝到%{buildroot}相应的目录里。用copy命令时如果目录不存在要手动建立,不然也会报错,所以推荐用install命令。. W) z/ w' z3 Q9 t8 U4 \+ m6 q2 s" q
" m* ?/ x; ]$ l/ N0 U8 [
制作rpm软件包的阶段
$ y9 L& L, ]+ D+ p( y这个阶段必须引出下面一个叫做%files的阶段。它主要用来说明会将%{buildroot}目录下的哪些文件和目录最终打包到rpm包里。- W0 ]" g. b" h2 V# {  N! O8 w

. x' s$ s! B$ H, p7 W%files; ?0 w: e2 e: s( N
%defattr(-,root,root,-)
. l6 R7 T2 L0 U. _- {, v%doc) t  d3 k3 S- B) t& y7 \
%defattr 表示的意思是: %defattr(文件权限,用户名,组名,目录权限) ,如果不牵扯到文件、目录权限的改变则一般用%defattr(-,root,root,-)这条指令来为其设置缺省权限。
* D4 w0 J2 h- v8 }! `1 c! L) E1 m; R$ [7 r
关于%files阶段有两个特性要牢记:
) U) d" a' n  k4 S6 U6 _$ ^1 E: [6 V7 X, ?) h
%{buildroot}里的所有文件都要明确被指定是否要被打包到rpm里。什么意思呢?假如,%{buildroot}目录下有4个目录a、b、c和d,在%files里仅指定a和b要打包到rpm里,如果不把c和d用exclude声明是要报错的;7 X$ h5 l5 T; P0 _/ ]
如果声明了%{buildroot}里不存在的文件或者目录也会报错。
0 X( h+ i( @7 g' n$ D* z: y代表路径的宏列表
, N* Q6 i* x/ U8 [1 U如果您看到一个不熟悉的宏,您可以使用rpm --showrc 或者 rpm --eval %{_bindir}以下方法对其进行查看:
9 x7 n2 u# R0 O" w% y: Q* k8 U: F3 B  J" H$ b
$ rpm --eval %{_bindir}0 ~% \, `1 n0 O: M- B6 i
/usr/bin3 a8 x+ s7 e; c( r5 y9 E
4 ~4 t6 U; X9 {
[root@localhost noarch]# rpm --showrc |grep buildrootdir, [5 C/ ]4 N7 r% j
-14: _buildrootdir        %{_topdir}/BUILDROOT
0 k/ f, l5 M: Z3 v: O1 }-14: buildroot        %{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch}
: h" P- d! c4 O2 C& p. p+ @也可以直接查看/usr/lib/rpm/macros文件,以下是常见的宏:; I9 A1 H; s  z& v
, B$ X3 r2 E' b" B7 [
%{_sysconfdir}        /etc, J/ O! \! n: ?6 \- b0 v
%{_prefix}            /usr5 z8 I( B/ @. \) c3 w
%{_exec_prefix}       %{_prefix}
, ^7 }+ {+ e+ ~: N& G$ V2 f%{_bindir}            %{_exec_prefix}/bin: ?# H# `, L4 K; t% o& L
%{_libdir}            %{_exec_prefix}/%{_lib}9 A+ z6 {$ H3 Q& J" f* O
%{_libexecdir}        %{_exec_prefix}/libexec5 ~* N! F$ v. }
%{_sbindir}           %{_exec_prefix}/sbin. P! ~5 e# S1 o1 u
%{_sharedstatedir}    /var/lib
  q8 R: }' }* J%{_datarootdir}       %{_prefix}/share. u8 E; Y  p. P
%{_datadir}           %{_datarootdir}2 U; T3 t. M4 `: z% y; k
%{_includedir}        %{_prefix}/include
: Q+ u* Y4 G6 h4 \; s%{_infodir}           /usr/share/info+ q0 U9 G% s4 p& Q! Q: g* |
%{_mandir}            /usr/share/man4 o  b- a1 n) T, i9 R  R4 F6 @# }
%{_localstatedir}     /var
; T4 m& V4 l$ \, Z( C& a%{_initddir}          %{_sysconfdir}/rc.d/init.d
+ e7 [; @. E$ W* f5 U%{_var}               /var
$ ]: {) I" ~$ ], E6 Z3 ~%{_tmppath}           %{_var}/tmp( r5 r8 e  D2 G/ _. g4 Q% r
%{_usr}               /usr
! M' ^6 W& y# |/ G% A%{_usrsrc}            %{_usr}/src
, N& W! G" w# ~) H% n%{_lib}               lib (lib64 on 64bit multilib systems)2 a7 ?" ?; m8 {( M9 y& i& C1 q
%{_docdir}            %{_datadir}/doc
) Z% T3 D1 \9 N! Q& Z6 e* {%{buildroot}          %{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch}
3 W# ^2 @1 C7 d. b4 g( B6 M$RPM_BUILD_ROOT       %{buildroot}
5 W' b; B3 M# M! N' L4 F要注意的是%{buildroot} 跟%{_buildrootdir}不同。%{_buildrootdir}对应的目录是~/rpmbuild/BUILDROOT;而%{buildroot}是%{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch},有关其他内容可以参考 https://fedoraproject.org/wiki/P ... PM_directory_macros5 b$ c7 L3 a/ g6 G; }6 K' _* ]! y( n
! w. b5 j6 e' B, w( I
实例1:打包shell$ s0 i. P! Y" w
可以把一个平时写的一个脚本打包成一个rpm包,spec文件如下:
  u' \* C; t) a# [+ e" Z: C8 A
" U2 {* _! Y, j5 k2 c* X3 @) H[root@localhost SPECS]# cat disk.spec
9 l) `" Z  }- XName:                showdiskinfo. a6 S: L. h2 o( c1 U* I, f, M
Version:        1.0
4 O# U, Z5 y$ s0 ]5 q' t& fRelease:        1%{?dist}
, N& x' T9 l1 BSummary:        Show Raid and Disk info
3 e! A+ y3 b0 Q9 y) T% {License:        GPL  C- J* j* G1 \
URL:                http://www.wumingx.cn/ J) j8 f- Y5 r; y* l4 U: A
Source0:        showdiskinfo.sh6 X  i8 c  Q$ j( F' G

' B/ E: _4 g8 c/ K9 P#BuildRequires:; o. k1 f; L1 t! j4 a
Requires:       bash
) M, ]8 M# M7 G  [# F
) E8 S/ V, r& G9 s3 W% H%description4 L- Y3 u7 A- R6 E1 a  x) y0 ?
showdiskinfo shell script.
4 q) a! V  n" `: ~' ~* B. q4 Z: i$ T1 @# O5 b, g
%prep
8 A  V+ l0 a2 C$ H; }9 A9 _#%setup -q5 f* |7 E; h# X8 t
/ p5 k, M/ r5 V. Y1 A! z& e( h
%build
3 [, }0 b% q  D+ e1 i* R! Ecp %_sourcedir/showdiskinfo.sh %_builddir/showdiskinfo
8 z$ T! c: ^# |& K( {' k, V: V- e+ ~2 y# @
%install% y8 b" a2 E7 p) m5 {- Q6 ~9 \
mkdir -p %{buildroot}/usr/local/bin# o3 _" o% Q) H2 S$ O4 r
install -m 755 showdiskinfo %{buildroot}/usr/local/bin
* P; h( X8 d" ^2 o: M7 {, x7 q7 r) ^- g
%files0 |$ Z3 `, w6 X0 s+ p( t7 E
/usr/local/bin/showdiskinfo7 N. k# z  }! e/ h" v3 t6 n
%doc9 s" P1 Z- w2 v8 ~! j4 I% h8 w. Z
%changelog3 I1 `* s9 P5 b
开始编译:
0 ]/ {" u* Q* ~$ m( {. n
0 H7 q* y$ z0 k2 \! n5 s, l[root@localhost SPECS]# rpmbuild -bb disk.spec/ l9 G/ P1 L0 O' G/ u* g
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.agda2b
  E3 t, c) \/ H+ umask 022
, ~1 ?" Q! z, g# L3 Q( R; i+ cd /root/rpmbuild/BUILD7 \6 S5 e3 u7 W3 F/ n6 ~+ w
+ exit 0
0 }' M& m' @0 _( Q3 kExecuting(%build): /bin/sh -e /var/tmp/rpm-tmp.spexQx
4 ~' o( N2 w$ y+ h3 r+ umask 022' m4 v0 n. t+ M5 u/ A* Z$ b+ d8 X
+ cd /root/rpmbuild/BUILD
; f8 x0 ~5 o, C: C& P3 T+ cp /root/rpmbuild/SOURCES/showdiskinfo.sh /root/rpmbuild/BUILD/showdiskinfo) G- ]1 g2 ^$ K* Q2 b
+ exit 0" h$ U$ Y- |- l% b3 b
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.grcfHT
& V$ s( ]% o0 T" h+ umask 022
$ U% H& @. t0 ~9 J+ cd /root/rpmbuild/BUILD$ }2 E! P& |  L4 L8 z
+ '[' /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64 '!=' / ']'
5 X/ N0 b9 Q7 m& z0 h! B( z+ rm -rf /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64
% {+ q% d% O  a++ dirname /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64+ V, r( X* u0 H+ _% M! K- t
+ mkdir -p /root/rpmbuild/BUILDROOT
4 A5 k5 i8 J! O/ L6 u; i+ mkdir /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64
, o' n: H9 B1 Y5 G1 P+ mkdir -p /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64/usr/local/bin
5 C! e8 W" _  y+ install -m 755 showdiskinfo /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64/usr/local/bin
8 P" _. K  N/ f9 C& a+ /usr/lib/rpm/check-buildroot
4 r) |' b' V9 X7 f: @+ /usr/lib/rpm/redhat/brp-compress& {) P1 J0 |. @% W1 _6 Y' Q$ l
+ /usr/lib/rpm/redhat/brp-strip /usr/bin/strip
- N8 d# @2 ^3 X+ /usr/lib/rpm/redhat/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump
6 m! y% G5 Q2 H5 h8 d! g+ /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip' x  [) x/ d- a: k# Y2 F/ f5 S
+ /usr/lib/rpm/brp-python-bytecompile /usr/bin/python 1
" s7 ^) \: i- y1 ?- |* p+ /usr/lib/rpm/redhat/brp-python-hardlink2 @! `. x6 `0 R
+ /usr/lib/rpm/redhat/brp-java-repack-jars0 ~1 E& T0 a4 Q. w% z
Processing files: showdiskinfo-1.0-1.el7.x86_64
) z) u3 l7 G1 c  ^Provides: showdiskinfo = 1.0-1.el7 showdiskinfo(x86-64) = 1.0-1.el7: m7 Y- v) O8 H( r: w6 H( \
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
* @: U3 p5 T! R' M$ IRequires: /bin/bash
& m0 d, `2 e# w- I5 wChecking for unpackaged file(s): /usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64
# x" r% C2 S8 V2 ^0 ^3 ~7 rWrote: /root/rpmbuild/RPMS/x86_64/showdiskinfo-1.0-1.el7.x86_64.rpm
) p" |% n7 @* k4 j6 H# L( x# D5 ?Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.4uHq3D0 s2 ~/ e8 e: J1 }
+ umask 0220 K2 v- L  {, d
+ cd /root/rpmbuild/BUILD+ F# W/ m& i  e" ]$ X/ i
+ /usr/bin/rm -rf /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_645 j* \$ P* M6 l- X
+ exit 0
1 ]7 o" j7 Z, \* j8 A可以看到编译成功了,文件保存在Wrote: /root/rpmbuild/RPMS/x86_64/showdiskinfo-1.0-1.el7.x86_64.rpm下,开始查看:7 i- D2 \* @: A! i6 ?! c
& w$ U5 ~- m/ f( |9 k/ A! O* G. S& f& @
[root@localhost SPECS]# cd ../RPMS/x86_64/# m( }8 c, G  G, q) i
[root@localhost x86_64]# rpm -qpi showdiskinfo-1.0-1.el7.x86_64.rpm5 q: Y  u% ^2 [6 u
Name        : showdiskinfo; S- F# X+ g- l. K2 j8 J8 ^0 _, I
Version     : 1.0
/ Q) d7 A  {+ y- }Release     : 1.el78 \# m4 u" w9 }3 D$ y
Architecture: x86_64+ S* s6 Y  d3 X
Install Date: (not installed)
6 f$ A- J" L  b! SGroup       : Unspecified
5 I+ t1 y6 U, j5 v6 c4 {Size        : 383900 c' A2 K$ k7 z
License     : GPL& ]0 r$ H( Y6 B
Signature   : (none)  t$ q0 K- ]6 J
Source RPM  : showdiskinfo-1.0-1.el7.src.rpm# Q! g( l# _; A$ r! i1 d7 N) j
Build Date  : Fri 08 Mar 2019 06:41:42 PM EST
1 q8 F3 _) Z" ?& s: m( nBuild Host  : localhost/ M+ }! D  z5 u/ N' J$ t
Relocations : (not relocatable)
; @2 C- b. r" P' B& S6 OURL         : http://www.wumingx.cn
9 U/ ^, V/ r. u" F% u$ z+ HSummary     : Show Raid and Disk info
+ v" N' v- j3 Y0 [+ fDescription :
: H, o( g) e, S5 o" g+ j+ v/ j+ \* gshowdiskinfo shell script.
  G: V: i0 b9 F: `9 U[root@localhost x86_64]# rpm -qpl showdiskinfo-1.0-1.el7.x86_64.rpm1 `5 @9 [- v* U" T* ], t4 L; {
/usr/local/bin/showdiskinfo
1 o2 s% Y- l/ S( n6 s3 X( Z1 [2 ]#开始安装( A' U& t- {/ J1 a# B. F+ K: n
[root@localhost x86_64]# rpm -ivh showdiskinfo-1.0-1.el7.x86_64.rpm+ I) U8 g1 Y' {! l( P6 v: D4 T# f
Preparing...                          ################################# [100%]) }/ E1 \4 J9 T6 C8 |. D
Updating / installing...
3 L" `2 w5 \+ I3 I& V+ z0 N   1:showdiskinfo-1.0-1.el7           ################################# [100%]
7 {/ w% R3 m7 `6 X5 X% W# d4 q[root@localhost x86_64]# ll /usr/local/bin/" m8 d0 C. W0 \% T7 D% W& }
total 40" ~9 a) N# \* ?0 @+ w4 ?8 Y% Z& h
-rwxr-xr-x. 1 root root 38390 Mar  8 18:41 showdiskinfo
  ~) n6 `- Z- V3 Q. O. J- ~[root@localhost x86_64]# showdiskinfo! Z5 H$ c9 y0 }4 ]6 s- V# h
no raid4 _8 Q3 u# |9 i6 Z# j* H
此内容参考了 https://rpm-packaging-guide.github.io/#hello-world ,可以阅读原版。
5 _; m5 s, q3 E+ ?, n& V$ N2 Y2 ?9 F& {0 x; w7 x
实例2:打包main9 k1 q- l, B" Z& ^! T5 z8 b0 T6 I
此代码来源鸟哥私房菜,先来处理原始码的部份:( d: M/ |8 _  I/ S; c0 X, |- C2 B

7 D9 h" H2 |- X2 ^7 Z% U  Y[root@study ~]# cd /root/rpmbuild/SOURCES / t  W/ s/ ~& V9 g: k% {
[root@study SOURCES]# wget http://linux.vbird.org/linux_basic/0520source/main-0.1.tgz
9 P  z7 `% S. q; r9 O[root@study SOURCES]# wget http ://linux.vbird.org/linux_basic/0520source/main_0.1_to_0.2.patch
% h4 [8 T3 P6 o/ o) B- J  {4 X[root@study SOURCES]# ll main*
3 w& f; l" f0 ?" |-rw-r--r--. 1 root root 703 Sep 4 14:47 main-0.1.tgz
- ]- R$ I, Z9 ^5 X1 u-rw-r--r--. 1 root root 1538 Sep 4 14:51 main_0.1_to_0.2.patch1 v/ k3 q5 m0 L- _
到SPECS目录下创建main.spec文件,建议使用vim创建,会自动生成格式。也可以用rpmdev-newspec -o Name-version.spec命令来生成SPEC文件的模板2 W3 z( ~! n4 n  S. q
# X& r, A$ p' z' ?3 s
[root@localhost SPECS]# cat main.spec% i# \# b7 ?9 o: e
Name:                main
3 @/ h5 q! S4 l% V. M; @0 tVersion:        0.10 L* I$ }! y+ [/ b
Release:        1%{?dist}
, p7 h% x4 Z- m% R; L1 x0 nSummary:        Shows sin and cos value
# [. r8 k3 P8 [# K# W3 `! p, c# Q  ]; i# k* D. L
Group:                Scientific Support4 L! J8 a- \( S
License:        GPLv20 t7 C5 p* X( A
URL:                http://www.fangdm.com/! d, d$ S$ O( b- j; |
Source0:        main-0.1.tgz# }& q7 y' K- h
Patch0:                main_0.1_to_0.2.patch
& ?. ~6 C: b5 y+ R' O- S% V8 j1 ^3 y# \4 p# X8 L) _! F" f% i
#BuildRequires:$ n" I0 {! k% ]# B% K
#Requires:
- B% A9 v7 L' }% x  ^6 M+ I3 Z
/ ?' E* k8 a. _8 o, i%description
+ P( D' E  y" `0 o& p' T" HThis package will let you input your name and calculate sin cos value.0 J' {5 w" s4 {0 C$ k% I) Z9 e: v

  c6 B# l" G% W1 k% R% h%prep
3 {1 C+ ^. n$ B- B/ X%setup -q, v6 a3 Q. S* Y3 h* v
%patch0 -p18 i2 X% ]& v; b
$ d6 ~$ g7 C$ ]9 n
%build$ N; ]# C" S. ^2 ^$ E! t
make clean main* S% h0 ]4 ^+ L4 ?+ V
/ a. f7 q0 v+ s( P% H6 j% ]& {; y: G
%install
5 w5 k8 q; V, @8 Gmkdir -p %{buildroot}/usr/local/bin
; \' f+ H+ D) o1 V  K" Y! linstall -m 755 main %{buildroot}/usr/local/bin2 E4 c3 w2 j. L9 ^6 ]) \$ z6 Q9 h

" \9 |& [$ f# |" v& p; h# s%files
7 i3 n3 w: v3 \5 y: l# ~/usr/local/bin/main3 b5 _' @; b/ q
%doc
' \/ x* ^0 N4 e1 c3 n! a
5 T; K  Q. i' n0 ?  S* v%changelog9 U4 o% q: {# v" ~
* Wed Sep 09 2015 VBird Tsai <vbird@mail.vbird.idv.tw> 0.2( k" v5 N  R, w, d% |5 d* ?, H8 R0 S% q
- build the program+ v+ g% C5 o/ s! Y$ }$ d, a
然后就直接编译rpmbuild -ba main.spec,再安装rpm -ivh main-0.1-1.el7.x86_64.rpm( ^# V# f( l' |. H

3 ]2 v2 v. h# ^# e[root@localhost x86_64]# rpm -qi main, c1 G4 d9 {: \1 e
Name        : main2 V3 }+ R1 C1 T1 V. ^
Version     : 0.1
6 K4 W. o9 p$ r6 QRelease     : 1.el7
4 n3 g8 s0 @1 @9 t+ \Architecture: x86_641 ?& d6 {; S6 u8 D- Z
Install Date: Thu 07 Mar 2019 05:42:50 PM EST
8 n) y; [* [8 y5 o2 a; FGroup       : Scientific Support1 n* {( `3 f* W- |0 h  ~7 F; s
Size        : 7272
; @, @( h& l6 J2 bLicense     : GPLv20 P$ Y" p. j. d& @
Signature   : (none)
9 S6 [' s# F" i% X, zSource RPM  : main-0.1-1.el7.src.rpm, b9 ]9 g0 p; s
Build Date  : Thu 07 Mar 2019 05:42:07 PM EST
: s2 `: X/ L5 D0 Q8 t, p: z1 |Build Host  : localhost" H! |8 A" t1 G9 W
Relocations : (not relocatable)
! A( O/ `5 V6 l. ]5 Z# ^; h9 DURL         : http://www.fangdm.com/! H9 H8 H/ Z7 y4 ]/ R! a
Summary     : Shows sin and cos value
6 ]: W$ Z" ]3 m6 b6 x6 xDescription :
, l/ n, G- T, q4 L* b1 ?! l! m6 tThis package will let you input your name and calculate sin cos value.
# @2 s7 I6 G/ ^8 T实例3:打包hello
/ z7 v" U0 H! a6 a使用区域语言(Locale)文件的程序应遵循 处理 i18n 文件的建议方法:6 g! e1 o: R. Z; K( ^# p" z( G
: y2 x" y$ I) a  z
在 %install 步骤中找出文件名: %find_lang ${name}
) x7 t# E- C+ r2 ?添加必要的编译依赖: BuildRequires: gettext
+ ?3 w4 b8 B5 h- X% ^- d% y使用找到的文件名: %files -f ${name}.lang
0 o7 y3 [, C6 e2 W%find_lang此宏将找到属于您的包的所有语言环境文件(按名称),并将此列表放在一个文件中。然后,您可以使用该文件包含所有语言环境。: \' b6 L. s8 \2 }% y

  X% n+ T( ?" \% s; t* y[root@localhost SPECS]# rpm --eval %find_lang
* l0 t1 H/ q6 ?# f9 v! q/usr/lib/rpm/find-lang.sh /root/rpmbuild/BUILDROOT/%{name}-%{version}-%{release}.x86_64
8 o2 v$ F/ V: ~3 @% i5 F3 g[root@localhost SPECS]# rpm --eval %make_install
5 O9 Q- u5 c% y2 w5 V5 W" o' H/usr/bin/make install DESTDIR=/root/rpmbuild/BUILDROOT/%{name}-%{version}-%{release}.x86_644 g3 g' M+ j' O& P# I+ X' I
%find_lang %{name}在这个spec里面等价于/usr/lib/rpm/find-lang.sh /root/rpmbuild/BUILDROOT/hello-2.10-1.el7.x86_64 hello
. |. E6 u/ w$ s1 q" S& F& I3 s
& r# Y1 e  p( d" @& }而引用的方法是:%files -f %{name}.lang即可。+ o9 G) t8 r: h6 M5 U+ [0 P

8 l7 t/ f1 M5 n* n4 t& U%make_install是等价于make install DESTDIR=%{buildroot}。, G5 h  X( v6 r  Z' L# V) r7 S4 K

) [  w/ [' O3 |+ n6 r[root@localhost SPECS]# cat hello.spec
5 v$ u% q" n6 T5 q  Y! u! uName:           hello
( h& C3 ^" @1 y+ M* t( _( A/ YVersion:        2.10+ C" P  R4 |% ]7 d% b! n
Release:        1%{?dist}4 |5 q% y) z" \0 j! A8 _  S
Summary:        The "Hello World" program from GNU
; _( d- \& E& }& k" y! o, y; c" h/ B8 X
License:        GPLv36 l4 Q* U3 X# L7 I% l
URL:            http://ftp.gnu.org/gnu/hello/: W6 p+ I5 ^/ {. e
Source0:        hello-2.10.tar.gz
+ M% |# {' S9 P3 Z! [
" K9 o9 k! b; [( A/ z8 jBuildRequires: gettext& Z8 L- G  n% Y- ~
#Requires:/ Y8 k, L9 q6 _$ d% m# ]

; d7 x+ k- M; I- P%description# T  y6 @7 ~  r
The "Hello World" program, done with all bells and whistles of a proper FOSS# W* d/ C' H" H+ E5 _4 _+ F
project, including configuration, build, internationalization, help files, etc.
" M1 B1 }0 s  G) \% F* h1 W: x, E/ ~. l
# s/ A  I) d* r; E%prep
! U" @/ S0 H' C+ f. B, X" D%setup -q3 I: B* g; P$ J- n3 O8 X

( p4 }% @$ y, d) O1 B3 B5 ?9 A9 y# \! D( y6 n9 ~' \
%build# C, Q7 C. a/ j1 c5 M0 f
%configure
3 [6 l' \: ^' ~' Jmake %{?_smp_mflags}0 f. _' A) K) F! L' u. y3 w
6 t, C; }2 s( W& ?/ G! F4 s
%install* j1 s- j9 e; x9 r: E7 y/ d
%make_install
9 ~, `* B) Q- M; ^6 h%find_lang %{name}
$ q* i- k6 ~3 A, s% @rm -f %{buildroot}/%{_infodir}/dir
$ C3 {4 O) b: `+ w) R. J) q, D. R, H, b7 ]$ {6 r/ h" l7 y
%post9 _* e: W4 R! U3 D# T
/sbin/install-info %{_infodir}/%{name}.info %{_infodir}/dir || :
+ m' p+ }5 q1 ^( K; {; e0 g3 y2 t$ u& @6 L3 f
%preun9 A$ C) B; f$ z) j; x4 c, h9 |
if [ $1 = 0 ] ; then: j0 A( v+ J- @5 n5 e' y
/sbin/install-info --delete %{_infodir}/%{name}.info %{_infodir}/dir || :
" p3 p0 U$ ?/ W1 F" v# [fi& h/ `* d! M: ^5 u3 w/ }
# w: z8 a/ L+ @) G( w) v
%files -f %{name}.lang
. v  @. u2 V# \1 H& c$ o%{_bindir}/%{name}2 ^& x+ a  {* U: P: e( a- T0 b
+ F8 q1 m) x4 t5 i. A2 R8 c7 y$ j2 x
%doc
. |7 W$ K/ P( V' r6 k%{_infodir}/%{name}.info.*
3 o. Y4 [0 z) z%{_mandir}/man1/%{name}.1.*
. M7 ~( h6 M. w4 W  U
" ]) \$ y, j: _6 P: n%changelog
- n! |4 z% b+ v, c! C然后直接rpmbuild -bb hello.spec进行编译,此实例来源于:https://fedoraproject.org/wiki/H ... o_RPM_package/zh-cn2 d# Y0 F; U6 }8 r6 H  a* ~

2 |; {9 R+ y3 L: e实例4:打包smartmontools
3 J$ S8 R% J3 C/ Lsmartmontools 7.0已经支持json格式的输出,对于采集的话,有很大的优势。目前在centos官方上面可以找到centos7的包,如https://cbs.centos.org/koji/buildinfo?buildID=25069,但是还没有centos6的,所以需要自己写一个spec。1 j/ v. a" i+ D2 B

3 Z. |/ _. o4 p访问https://cbs.centos.org/koji/buildinfo?buildID=25069,先下载src.rpm包,然后`rpm -ivh smartmontools-7.0-3.el7.src.rpm`就可以提取到smartmontools.spec,这个是centos7下面环境编译的,不能直接使用。需要再下载 http://yum.aclub.net/pub/linux/c ... s-6.3-1.el6.src.rpm smartmontools 6.x的版本,就可以对比开工改写spec文件了。1 t( ]( T" B# p, d, p
. h% q4 F; F, F$ b7 O& E! u
[root@7ftbv7mdz7cdpc ~]# cat smartmontools.spec9 ?! W! }0 i9 F1 |' D* y6 ^4 q
Summary:        Tools for monitoring SMART capable hard disks3 K7 y3 Q* [! r/ w. m1 U; I
Name:                smartmontools' \* G# h- O$ K5 F
Version:        7.0& X" O1 k* ]' a0 X  I
Release:        3%{?dist}
: a! P4 j7 g& @9 v1 s- CEpoch:                1
* O4 E1 y/ A+ \, j# l0 g0 I/ ]. BLicense:        GPLv2+
8 Z5 G$ F+ d0 j+ J9 w" N2 q; W6 }URL:                http://smartmontools.sourceforge.net/+ L$ d2 Y/ p" J- F! W
#Source0:   http://downloads.sourceforge.net/%{name}/%{name}-%{version}.tar.gz
7 j+ |7 w* `& I) Z8 ~Source0:        %{name}-%{version}.tar.gz
+ j" g: s) A6 P  GSource1:        smartd.initd6 Q# D$ r( C; |3 m9 M! }! e& O
Source2:        smartmontools.sysconf; T' e) ?% a; T; \/ W- o
Source4:        smartdnotify2 X  c* d7 V5 a- z5 J. v4 e  H
#semi-automatic update of drivedb.h
. N1 I- N$ o9 ~9 H%global                UrlSource5        https://sourceforge.net/p/smartm ... rivedb.h?format=raw
% _1 U/ T2 k' P' O; W7 ]Source5:        drivedb.h3 m; X9 T7 ?/ q- V! H- F- ]
5 m+ G* h  C: ^5 Y' K/ v7 M1 a
#fedora/rhel specific; v$ l! g" }' Z6 k6 a5 Z
Patch1:                smartmontools-5.38-defaultconf.patch9 r* b' J/ ?; f4 E# w. D# j3 j
  D. C9 E+ f3 Z9 w
#BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
$ d0 m4 O- {2 P+ J! gRequires:        fileutils chkconfig initscripts+ F" |% U" R2 l: _% q' T
BuildRequires:        readline-devel ncurses-devel automake util-linux groff gettext
: x0 P, \* b; ~7 x4 ^BuildRequires:        libselinux-devel libcap-ng-devel
( u# Z4 @8 Z: N& M) @5 W
# q  i3 ^: I# l- w! g: ]# |. ^& T, b%description
- W) n& L2 [% H! f% z( j1 zThe smartmontools package contains two utility programs (smartctl
  v% n) u7 p- K! E5 _% Iand smartd) to control and monitor storage systems using the Self-. ]6 _1 S0 u2 _' m. f
Monitoring, Analysis and Reporting Technology System (SMART) built  L2 ?( @# d& e% _; Y
into most modern ATA and SCSI hard disks. In many cases, these/ F3 k* F3 X  x1 C& B# L
utilities will provide advanced warning of disk degradation and/ Q1 C& `2 O/ Q/ E, q
failure.
; |9 z4 t. O4 {9 S
9 P8 [+ Z( D# O- c3 u. j. `( [%prep
& P4 \  j1 c0 u# W: y& W- M0 ~%setup -q; S* l+ U' M1 A( c' p" g
%patch1 -p1 -b .defaultconf8 f3 v# i# M3 M( t% f8 O; a
1 [2 f+ P! y$ t" {2 ^3 \
# update SOURCE5 on maintainer's machine prior commiting, there's no internet connection on builders6 q  X9 f) p9 d$ B" m5 I
#curl %{UrlSource5} -o %{SOURCE5} ||:
/ X9 |" T$ ~) Hcp %{SOURCE5} .
" f: E& T  ], E7 t8 n6 B( H  O
9 X. l6 n4 x1 {%build8 T* h% u$ b' K0 i
autoreconf -i  I$ Q) @* y; u* D
%configure --with-selinux --with-libcap-ng=yes --with-systemdsystemunitdir=no --with-cxx11-option=no
/ G; Q, g( `: S%ifarch sparc64
  n, E2 T" B* M" M+ F3 K/ emake CXXFLAGS="$RPM_OPT_FLAGS -fPIE -fno-strict-aliasing" LDFLAGS="-pie -Wl,-z,relro,-z,now": o1 t/ M7 f& s3 E( _# q: S  L
%else
9 t* T$ |- T! s! Z; x$ u% [make CXXFLAGS="$RPM_OPT_FLAGS -fpie -fno-strict-aliasing" LDFLAGS="-pie -Wl,-z,relro,-z,now"% C4 n* c* N7 S$ }" t
%endif$ ?4 p) p9 ~- T) s& d5 Z; |5 L3 I0 I
9 ~  K  J( r0 e4 m$ R/ H7 P
%install
7 q- V  M: `% C# Hrm -rf $RPM_BUILD_ROOT
4 i9 |# f+ @7 E$ n$ P8 emake DESTDIR=$RPM_BUILD_ROOT install
$ ~9 T- v8 l( \3 p4 g1 b8 B+ x! c8 y5 H) {% a( V/ k' t2 O
rm -f examplescripts/Makefile*
& v; K$ l* B3 P6 l) ?. b' e$ s* Pchmod a-x -R examplescripts/*  k. L: k! e- R
mkdir -p $RPM_BUILD_ROOT/%{_sysconfdir}/%{name}/smartd_warning.d
* c& e) H1 ^! F6 d' @1 z  M: Oinstall -D -p -m 755 %{SOURCE1} $RPM_BUILD_ROOT%{_sysconfdir}/rc.d/init.d/smartd! c& w! O# m% e3 Q9 |5 Y
install -D -p -m 644 %{SOURCE2} $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/smartmontools5 X  D7 d. t+ f) a
install -D -p -m 755 %{SOURCE4} $RPM_BUILD_ROOT%{_sysconfdir}/%{name}/smartd_warning.d/smartdnotify
( [1 [7 f7 s0 d' T! U" \( arm -rf $RPM_BUILD_ROOT%{_docdir}/%{name}3 t: J# W. P  o# b+ y
mkdir -p $RPM_BUILD_ROOT%{_sharedstatedir}/%{name}  P5 i; c5 M+ e. u: B
6 i' s% D" W! v4 i; J% I
%clean0 I# n& P0 q( i4 j% Q
rm -rf $RPM_BUILD_ROOT: x( c2 x: P: f1 f6 d2 ~

- e% P; J0 ?2 L6 P%preun
+ i% ^  }0 [5 ?6 Uif [ "$1" = "0" ] ; then8 l& Q( h7 b2 h
/sbin/service smartd stop >/dev/null 2>&15 U8 Y2 i8 T6 G) z& K9 h4 i: W
/sbin/chkconfig --del smartd
( G4 n" W! z; p0 _; N: zfi
- A+ g8 k7 s* O8 z* E6 P* }# I9 H" S% ^. {( P8 W0 h& U  w+ p
%post! Y# H) u* _' K' a
/sbin/chkconfig --add smartd6 r. Y# |8 N- C, O* S3 s2 z
% Q: {; f' H- w8 @4 j! f8 x3 p
/ {( T+ h2 w) N; M: K
%files
$ {% R& `' l6 n8 T+ R# j# i7 w%defattr(-,root,root,-)! e# o0 D  p# _' e, d% R
%doc AUTHORS ChangeLog COPYING INSTALL NEWS README  w: U* e8 e4 U1 V: \  v! `4 n4 q$ Z
%doc TODO examplescripts smartd.conf
) W% D: K' x/ C$ R%{_sbindir}/smartd
8 N( m0 K& T# q, @( J0 D%{_sbindir}/update-smart-drivedb
/ M$ ?0 D$ Y0 x%{_sbindir}/smartctl/ G  X& N* ?4 b- U# a0 ]' I
%{_initddir}/smartd* v7 m6 h1 f1 M0 O
%{_mandir}/man?/smart*.*
, n8 @5 [5 t# g- d3 J- x+ y%{_mandir}/man?/update-smart*.*
$ _4 ?. F& T' @. z. l%{_datadir}/%{name}
# D' e: G* @* {  U! [%{_sharedstatedir}/%{name}
+ R: Q, O& l! I8 q8 ~: B%dir %{_sysconfdir}/%name
0 }. W8 r2 Y* u. T%dir %{_sysconfdir}/%name/smartd_warning.d
- u2 A2 _! |& o- z3 s* E3 T0 O2 N%config(noreplace) %{_sysconfdir}/smartd.conf
" _9 B. H; r9 Z3 L% k%config(noreplace) %{_sysconfdir}/smartd_warning.sh
9 m, I5 S4 g' Z5 l%config(noreplace) %{_sysconfdir}/%{name}/smartd_warning.d/smartdnotify: U+ C; b5 V+ j# K; `( |8 z) m
%config(noreplace) %{_sysconfdir}/sysconfig/smartmontools
  n) ?0 o* C  Y
8 _! R3 n, z+ I- w0 K%changelog
! V& `9 T5 N( g- ^. d* Thu Sep 26 2019 fangdm <8@8994.cn> - 1:7.0-3
# O4 O1 U7 @& c/ J2 R: t. V- create smartmontools 7.0 base on centos 60 Z( Z1 G- R8 I- i6 W
注意,Source这几个文件一定要存在,从上可以得知,加入了启动脚本、配置文件等,准备好了之后就可以使用rpmbuild -bb smartmontools.spec来编译,经过多次失败后,根据报错信息进行调整之后,终于编译成功了。+ }4 D! A$ o# A8 m4 r$ U3 b; V" U' t
# x! T8 @, A, B2 V' J% X
[root@7ftbv7mdz7cdpc SPECS]# rpm -qp --changelog /root/rpmbuild/RPMS/x86_64/smartmontools-7.0-3.el6.x86_64.rpm
" z; i  j# `' K; l8 J+ @9 u* Thu Sep 26 2019 fangdm <8@8994.cn> - 1:7.0-3
# d" r3 w: t( G5 A% _- create smartmontools 7.0 base on centos 6
6 H$ k$ ]6 e7 I' v) p
/ l! l" k1 n- s4 h6 U$ l' k[root@7ftbv7mdz7cdpc SPECS]# rpm -qpi /root/rpmbuild/RPMS/x86_64/smartmontools-7.0-3.el6.x86_64.rpm
: L: A* O# O  v5 IName        : smartmontools                Relocations: (not relocatable)! n4 q  k- g$ y0 y) _6 Y
Version     : 7.0                               Vendor: (none)
9 j- H, X, |4 [; }' ZRelease     : 3.el6                         Build Date: Thu 26 Sep 2019 10:53:19 PM CST
4 ?  w2 q6 e# W7 Z2 t( L% ~! r& ^: {Install Date: (not installed)               Build Host: 7ftbv7mdz7cdpc9 \6 p  X+ {! W5 v: _% ?% h
Group       : System Environment/Base       Source RPM: smartmontools-7.0-3.el6.src.rpm
6 g0 W( ~. A% X2 D- H2 d, j1 WSize        : 2081911                          License: GPLv2+9 b0 G& T4 y: z$ R6 _2 d
Signature   : (none)2 c1 O6 f9 N  l9 O
URL         : http://smartmontools.sourceforge.net/
& j; f% d; W  g' J# a8 Q; z$ FSummary     : Tools for monitoring SMART capable hard disks8 l- c' ^. E* b$ J& s! Q- k
Description :2 x; C2 Q) J5 I) h, x  G  l% D
The smartmontools package contains two utility programs (smartctl
# N6 L6 B6 @" s! W  D1 `and smartd) to control and monitor storage systems using the Self-6 ], R# E% L& |! @  w! g6 }5 d  d1 i
Monitoring, Analysis and Reporting Technology System (SMART) built( x& C8 A2 d( G' F9 T
into most modern ATA and SCSI hard disks. In many cases, these3 H4 C) u# W, T  P' b. U
utilities will provide advanced warning of disk degradation and
8 O6 m8 J% B; w, s: ]- bfailure.
9 b9 A) D5 y0 W& ]另外,在%preun阶段有使用了if [ "$1" = "0" ],表示的意思是uninstall,如下图:
4 _- @# F1 U9 C+ s5 O6 [, h- t: t. t: ?9 n/ W7 @
" ]* i- r. n% _) ]1 |
2 W( U% v" u% `. e$ W% o6 g* T" E
实例5:打包nginx+ @! T6 f; ?! ^$ ?& c
用tar包打包成rpm的最简单的方法就是在网上找到相对应src.rpm的版本,这里面有包括了spec文件,可以少走很多弯路。nginx官方在释放tar包之后,也会相应提供的rpm以及srpm包,这次我们先在 http://nginx.org/packages/centos/7/SRPMS/ 下载好nginx-1.16.1-1.el7.ngx.src.rpm,使用rpm -ivh nginx-1.16.1-1.el7.ngx.src.rpm进行安装。有生成了如下内容:
9 k5 z  R& y6 q
7 I- n8 x& _& }- o7 j% l3 ]* E  x[root@localhost rpmbuild]# tree
# u  C  I, C) T" g3 h1 ?.
$ U5 `) y1 p# X+ g|-- BUILD
+ W+ J+ _0 n) J# F- r|-- BUILDROOT6 n4 E) j1 w0 B& H: O
|-- RPMS
/ h. x2 P: Z" A. ?+ C6 E|-- SOURCES
3 D/ a1 K& z8 i+ a' a) [|   |-- COPYRIGHT/ Z9 k  p6 T) D' i, `( r& R
|   |-- logrotate
0 F' m+ m; {0 n|   |-- nginx-1.16.1.tar.gz
/ \. t* U; T* I& k0 o# [|   |-- nginx-debug.service
% f; s* {: D3 ]8 B" Z# M|   |-- nginx-debug.sysconf; O2 A/ T7 W' Z( m) _3 j! ~$ p
|   |-- nginx.check-reload.sh% d- d7 G+ [+ Q2 l! r5 Z7 d
|   |-- nginx.conf  ]! C1 P6 E3 s
|   |-- nginx.init.in5 r$ w# E+ q. H9 d
|   |-- nginx.service9 ^) b6 ?7 _0 ?& b3 O& W' G
|   |-- nginx.suse.logrotate$ d# ^  [# f2 Z) E* _2 w) t: f( Z8 h
|   |-- nginx.sysconf! L& t' l  }7 E: b7 |
|   |-- nginx.upgrade.sh5 F! G# m4 t1 p* |, ~. L
|   `-- nginx.vh.default.conf
1 c9 ]2 {. s3 o% `5 Y$ ?/ n|-- SPECS
" j. t3 g- w. N% `9 H7 |- i1 C* A|   `-- nginx.spec
3 n1 k4 k' m7 w: X5 r5 l`-- SRPMS) f' P2 |& z1 F3 o, q9 [. |0 [% W
主要是SPECS以及SOURCES这些文件。查看nginx.spec之后,大部分都有写好了,并且都兼容了centos 6/7。添加了gperftools GeoIP-devel ngx_cache_purge nginx-http-concat这四个模块,修改如下:( Q, ?( E0 d1 H4 R
% r$ D* {; {/ |  S8 M
[root@localhost SPECS]# cat nginx.spec
1 T" {; V; p, K( ^2 H$ z#& N5 P* u: g+ \
%define nginx_home %{_localstatedir}/cache/nginx
3 ~+ c" i3 t, U3 {6 L%define nginx_user nginx2 Z. F) J0 R: X9 Y% B) c( ~2 I
%define nginx_group nginx
( _8 D& R6 I, L; W) x%define nginx_loggroup adm0 R' y" G7 V" \- K2 ~
% [, }  j! Q) _: E( D4 N  Q8 T
# distribution specific definitions
4 u" Y9 z( f, q5 v. q* H. K%define use_systemd (0%{?rhel} >= 7 || 0%{?fedora} >= 19 || 0%{?suse_version} >= 1315 || 0%{?amzn} >= 2)8 m' ]3 e3 e0 E0 x* ]
+ X) p4 q! }4 f: K& Q% V, p% J
%if %{use_systemd}
! v  N9 @4 H; u, l7 \/ S4 IBuildRequires: systemd
1 I# m7 S3 {3 i3 ?, WRequires(post): systemd5 C0 {3 d1 \5 i4 B: w
Requires(preun): systemd  C2 ^2 o& X2 c3 F
Requires(postun): systemd
6 d( v. N4 N1 Y! W  j" Q8 X& v%endif- G5 X) z- n, f+ t$ a. ?, T
% Q3 v3 m: ]" b) x
%if 0%{?rhel}5 m9 F5 v; _# y4 B# |
%define _group System Environment/Daemons
' V% h% S/ t9 p( L' T%endif
8 d$ U0 L9 C% ~& t" m+ Q+ Z5 W. `/ k1 i% t% b% s" s$ G# c: `
%if 0%{?rhel} == 6
# g8 ~6 w# \+ {8 \( ?Requires(pre): shadow-utils5 @& ]* k4 t: c# P8 R9 n8 e) K
Requires: initscripts >= 8.36# Q9 ^: I7 [8 ^; ]4 h8 A8 {! w
Requires(post): chkconfig
  E9 g3 A8 z( `" i; v2 ^Requires: openssl >= 1.0.1  {& H1 @  ~% w# I8 f( j( x4 ^
BuildRequires: openssl-devel >= 1.0.1
+ }: W' B' Z6 A" e+ f7 |%endif
. ^- E% o% v, S2 j7 J2 h5 j( ~+ a7 G- i1 g; S9 H# A7 a# J
%if 0%{?rhel} == 71 P2 y$ L0 a1 o# T7 d& T
%define epoch 1. e4 `2 i2 L2 u: q  s/ X2 }) u5 U+ S8 l
Epoch: %{epoch}
, y1 x' N, y7 S4 KRequires(pre): shadow-utils gperftools GeoIP-devel
# Q# u) j# W% v! x% t: R# o4 ]6 XRequires: openssl >= 1.0.28 i! P! J+ ~, M& H  Q& Y- c
BuildRequires: openssl-devel >= 1.0.2
8 A" N& }$ S& k% V/ i) d7 nBuildRequires: GeoIP-devel gperftools
5 `. B; k( C5 \' D%define dist .el77 E; [/ x! V; D, \! ~. G
%endif% y; ], ^  Y. M/ q8 T

' P) P1 j. n8 f, p%if 0%{?rhel} == 82 m& h! Z) d, Y8 ?  q% e. _
%define epoch 1
% H% \- u9 C( D+ A# jEpoch: %{epoch}+ C7 m  @* w! [4 `6 |
Requires(pre): shadow-utils
2 `" u2 S4 a7 x" E+ v5 jBuildRequires: openssl-devel >= 1.1.1$ y. v* n8 x; I2 A
%define _debugsource_template %{nil}0 f% v  T! P3 Z6 k
%endif
$ Y4 `8 l* `0 C% J; L, ?) B, q) B6 s
%if 0%{?suse_version} >= 1315
, L- N% A  |6 ?%define _group Productivity/Networking/Web/Servers
& \$ e5 O1 j7 c! E! y+ ]%define nginx_loggroup trusted. X, n- g  \) ]
Requires(pre): shadow1 v) N+ [. m. r% \
BuildRequires: libopenssl-devel
! z' Q, a. f* x& y/ r2 D%define _debugsource_template %{nil}1 F# T$ M! C% O2 P+ S' W
%endif5 \5 ^1 P" o: G, r1 ^1 c; ]& I

* ?7 _2 {6 [% A/ B$ H$ y5 f. r# end of distribution specific definitions
5 q) H4 `# `' r5 F. H5 n) j7 @2 j( ~+ T
- ]! J1 `8 c; \' _3 V% M%define main_version 1.16.1+ G1 O( b8 x- ^/ {7 G
%define main_release 1%{?dist}.ngx
5 Z9 a7 j' k/ q. O8 d
$ g: R# ^" H5 R%define bdir %{_builddir}/%{name}-%{main_version}
8 S' ~; e5 R$ A4 D9 \, z) ]4 b8 R# M/ t* B9 F
%define WITH_CC_OPT $(echo %{optflags} $(pcre-config --cflags)) -fPIC
9 A. G2 _+ ^" R, n& `%define WITH_LD_OPT -Wl,-z,relro -Wl,-z,now -pie1 \8 E" n7 q' m( n) |' N
$ F( s8 D' D) h: y% p0 E; r
%define BASE_CONFIGURE_ARGS $(echo "--prefix=%{_sysconfdir}/nginx --sbin-path=%{_sbindir}/nginx --modules-path=%{_libdir}/nginx/modules --conf-path=%{_sysconfdir}/nginx/nginx.conf --error-log-path=%{_localstatedir}/log/nginx/error.log --http-log-path=%{_localstatedir}/log/nginx/access.log --pid-path=%{_localstatedir}/run/nginx.pid --lock-path=%{_localstatedir}/run/nginx.lock --http-client-body-temp-path=%{_localstatedir}/cache/nginx/client_temp --http-proxy-temp-path=%{_localstatedir}/cache/nginx/proxy_temp --http-fastcgi-temp-path=%{_localstatedir}/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=%{_localstatedir}/cache/nginx/uwsgi_temp --http-scgi-temp-path=%{_localstatedir}/cache/nginx/scgi_temp --user=%{nginx_user} --group=%{nginx_group} --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module")
4 g4 ]; @" A) l+ Q8 F5 ?$ @! g2 C7 q- L$ k7 P( K3 b
Summary: High performance web server
4 Q9 c7 {4 ~$ A) y# tName: nginx
; Q3 e1 e( f. _( T- iVersion: %{main_version}4 p  X: w- a7 c6 d4 v
Release: %{main_release}' Y" x2 `& A: D* t
Vendor: Nginx, Inc.
" \, W; z& T+ P8 i8 ~6 p' HURL: http://nginx.org/0 b& ], x, V$ U$ y  h- j1 j. p( R& }
Group: %{_group}
4 |2 B# ?' ~3 x1 c, N# P2 A5 r9 [# X
0 H3 S* w9 a; [! F* I* A* uSource0: http://nginx.org/download/%{name}-%{version}.tar.gz
( d3 Y3 K4 I0 q- i) D6 [; hSource1: logrotate
$ p3 [' w: t. b- c9 VSource2: nginx.init.in
1 e2 d5 Z; W  }5 d( y# I8 ASource3: nginx.sysconf
9 Z; F$ f1 D1 {( p  kSource4: nginx.conf+ S5 M6 v! L' a( e7 ^2 y8 m
Source5: nginx.vh.default.conf
) J2 d6 E) v, d5 P* R4 RSource7: nginx-debug.sysconf
3 }9 e$ C: j2 v( g: jSource8: nginx.service
6 L$ e1 B  _" v: XSource9: nginx.upgrade.sh/ s* F' y# M3 k: F6 x# [! z. {
Source10: nginx.suse.logrotate
: R" j; L: _" h; q2 d+ ^+ x% VSource11: nginx-debug.service. _! x4 S' M6 h  B* M  ~$ ^6 i
Source12: COPYRIGHT
$ ?5 \. y# ]3 p7 ?# X0 LSource13: nginx.check-reload.sh
3 V# A: H- E, ]- t# d' _8 C, {Source14: nginx-http-concat.tar.gz! g, M; [0 U# u5 ^6 b; [, n' Q6 U; w
Source15: ngx_cache_purge.tar.gz( O* |/ u& W7 T

7 K& X; A  V& m2 e: nLicense: 2-clause BSD-like license
1 ]8 S# L7 E& I! o; M9 w- T, g' i
BuildRoot: %{_tmppath}/%{name}-%{main_version}-%{main_release}-root
, q) a# D6 A3 _5 X  m2 W5 IBuildRequires: zlib-devel
& W2 h% ~- g% m2 q; Q3 tBuildRequires: pcre-devel
7 W; C0 G2 ]5 }4 {  S$ J7 L, \
) \3 y! _4 `& P4 Q+ w8 k* vProvides: webserver
1 ~+ B8 c& L% s1 L0 ?0 D8 G& j
) E2 }/ j) A6 y4 L%description
' e5 v  h2 o6 Y( Z  B/ b8 Xnginx [engine x] is an HTTP and reverse proxy server, as well as
/ r! a( K* B; }a mail proxy server.6 h* `9 N1 N" |9 E4 w/ ]
# W) Z  j! d9 ?
%if 0%{?suse_version} >= 1315
! V" f/ {% E( n0 y2 c5 W6 i* p! I%debug_package
$ S, I* f3 |* _! S6 O%endif" L, I' W0 Y: e: L, H& ~# I: k1 D
1 d9 I7 r2 M' [8 p1 B* U9 D
%prep' \$ c2 ^) G. _" u9 U7 f3 M
%setup4 z* w# i) F. @0 d# ~5 ~: g
%setup -T -D -a 14
4 T& z( ]/ D- L) U( r! i; H: i. \%setup -T -D -a 15
# K7 f0 J2 ^* O+ c5 i2 W, d: qcp %{SOURCE2} .5 V! T' \; ~9 z9 i8 h3 F
sed -e 's|%%DEFAULTSTART%%|2 3 4 5|g' -e 's|%%DEFAULTSTOP%%|0 1 6|g' \* ]2 C1 r& W4 Y8 Z. v
    -e 's|%%PROVIDES%%|nginx|g' < %{SOURCE2} > nginx.init8 U2 Z, ]2 A, R/ [" d" Y, F
sed -e 's|%%DEFAULTSTART%%||g' -e 's|%%DEFAULTSTOP%%|0 1 2 3 4 5 6|g' \- m" |1 ~) A1 Q( h$ B# ]$ u; c/ R
    -e 's|%%PROVIDES%%|nginx-debug|g' < %{SOURCE2} > nginx-debug.init8 T9 C/ n+ ~* K' A

$ H$ q% b/ B2 i2 q$ a0 _' O, P. w" P( n%build2 h) W3 F! U; e, m
./configure %{BASE_CONFIGURE_ARGS} \! B# [7 o7 v& g5 _' s& L
    --with-cc-opt="%{WITH_CC_OPT}" \% R- G9 P( Y* ~5 e" W
    --with-ld-opt="%{WITH_LD_OPT}" \
% Q: C# `0 a6 T, _5 c5 N    --with-debug \
7 F, V; U: J/ A2 n" T! V3 n        --with-google_perftools_module \
' C! w3 D5 ]$ u6 n        --add-module=ngx_cache_purge \/ E) @8 T9 o* X/ r" R) a+ ~, v
        --add-module=nginx-http-concat \4 o' r1 {  _  J: h9 e# ]. ^: h
        --with-http_geoip_module
* y8 E9 N- {0 h' D+ {# y1 B! U0 L! O% B
make %{?_smp_mflags}" p; T) v" T2 g0 P% c0 e
%{__mv} %{bdir}/objs/nginx \
2 a+ j+ f. E8 P: a    %{bdir}/objs/nginx-debug
$ ^1 r- p9 j' o$ ?./configure %{BASE_CONFIGURE_ARGS} \
7 G* y. B& u7 [" s    --with-cc-opt="%{WITH_CC_OPT}" \
: a" f8 k/ F& b/ j    --with-ld-opt="%{WITH_LD_OPT}"
2 d' I+ Y! e$ ^. cmake %{?_smp_mflags}
1 u+ W; H* p! X" r3 h! V% s; C1 h! b9 d7 z. ^: c: j( i
%install5 h; N- ^5 U! H1 q0 G
%{__rm} -rf $RPM_BUILD_ROOT
3 K- H1 }, P- _1 v- G6 q%{__make} DESTDIR=$RPM_BUILD_ROOT INSTALLDIRS=vendor install
: y. E/ X8 T  L  S$ e) F  X9 R7 B2 p" ~" w& k4 m9 K$ A
%{__mkdir} -p $RPM_BUILD_ROOT%{_datadir}/nginx7 o+ o" m" p: j/ _6 q6 q  ~- b
%{__mv} $RPM_BUILD_ROOT%{_sysconfdir}/nginx/html $RPM_BUILD_ROOT%{_datadir}/nginx/+ w- N* @& C3 u

3 E; V+ q% e. r; k/ r" ?%{__rm} -f $RPM_BUILD_ROOT%{_sysconfdir}/nginx/*.default
; W# x* K0 D% I/ b5 B/ v  f%{__rm} -f $RPM_BUILD_ROOT%{_sysconfdir}/nginx/fastcgi.conf! `+ H% z, f/ T: q& s: r  A

; P4 K; ^# I  ]1 |5 u%{__mkdir} -p $RPM_BUILD_ROOT%{_localstatedir}/log/nginx2 s! n$ Q; L( `9 c
%{__mkdir} -p $RPM_BUILD_ROOT%{_localstatedir}/run/nginx& G# k" H$ j1 s% x2 M
%{__mkdir} -p $RPM_BUILD_ROOT%{_localstatedir}/cache/nginx/ j4 o7 h6 M5 X& J- F( M- O1 G
1 m) b0 M( m; F% o6 a* I* `
%{__mkdir} -p $RPM_BUILD_ROOT%{_libdir}/nginx/modules$ Y5 \) `. {' w3 S
cd $RPM_BUILD_ROOT%{_sysconfdir}/nginx && \$ _- K/ B. v: |9 \# {
    %{__ln_s} ../..%{_libdir}/nginx/modules modules && cd -+ O0 N. j3 I0 a
, [1 ?4 T( t: ~: N& m( B* b% @- |
%{__mkdir} -p $RPM_BUILD_ROOT%{_datadir}/doc/%{name}-%{main_version}! i( a2 w5 w3 C7 ~- E1 k* b( y
%{__install} -m 644 -p %{SOURCE12} \
- Z: ]# e' R1 Y# m2 n    $RPM_BUILD_ROOT%{_datadir}/doc/%{name}-%{main_version}/
  M( }4 a; \5 Q, H
; b; u' I7 S/ t; S+ T%{__mkdir} -p $RPM_BUILD_ROOT%{_sysconfdir}/nginx/conf.d2 P9 n! U2 R' X$ L/ B1 w$ a
%{__rm} $RPM_BUILD_ROOT%{_sysconfdir}/nginx/nginx.conf
( K  \  O( f) Y. W- o%{__install} -m 644 -p %{SOURCE4} \9 T- L6 N) X* e; v9 i
    $RPM_BUILD_ROOT%{_sysconfdir}/nginx/nginx.conf' m, q2 Z9 ^0 t8 F- ^9 `, `
%{__install} -m 644 -p %{SOURCE5} \
" ?- U) _. ]0 `! \1 l    $RPM_BUILD_ROOT%{_sysconfdir}/nginx/conf.d/default.conf8 |; B  D& u* m
' c6 [/ I: S* k) C6 v
%{__mkdir} -p $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig
( |6 K2 R. e& S; Q) K%{__install} -m 644 -p %{SOURCE3} \4 N  t9 a! M  l3 w/ ?
    $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/nginx
# ^1 r+ U( Y1 ^" I& O%{__install} -m 644 -p %{SOURCE7} \( n* t. r/ j* P0 E+ x- A
    $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/nginx-debug* d8 p7 C1 a/ ~3 f6 _# Z' ]2 D
2 N( q, x! {7 u$ y  b
%{__install} -p -D -m 0644 %{bdir}/objs/nginx.8 \2 r. R9 e: h& H* O9 p8 j5 t8 w
    $RPM_BUILD_ROOT%{_mandir}/man8/nginx.84 V, G. D. N1 H  l" p

: a: G, e3 O; X1 a%if %{use_systemd}, q! l: ^  e& k
# install systemd-specific files- q0 r/ M9 Q; g# E* |4 Q3 K, c1 K
%{__mkdir} -p $RPM_BUILD_ROOT%{_unitdir}  b4 _! ~# ^6 |
%{__install} -m644 %SOURCE8 \
3 V/ |+ h- D5 m    $RPM_BUILD_ROOT%{_unitdir}/nginx.service1 H$ A) f& j+ _! U. V
%{__install} -m644 %SOURCE11 \
# g7 `  O6 z! ~( O7 ~: M# Y9 q6 |    $RPM_BUILD_ROOT%{_unitdir}/nginx-debug.service/ |8 ~- b  `& [1 a- D2 B: i8 X  d7 K
%{__mkdir} -p $RPM_BUILD_ROOT%{_libexecdir}/initscripts/legacy-actions/nginx% Y) V/ X2 G/ n1 T' g* G1 G
%{__install} -m755 %SOURCE9 \! K& N* n6 i* H. D5 C
    $RPM_BUILD_ROOT%{_libexecdir}/initscripts/legacy-actions/nginx/upgrade0 L% f& |9 e, j7 J8 e" |
%{__install} -m755 %SOURCE13 \
# d: I7 ?- D- B: |    $RPM_BUILD_ROOT%{_libexecdir}/initscripts/legacy-actions/nginx/check-reload
% S. r, R3 Y+ ^%else  U! s! o$ @) t3 @1 C
# install SYSV init stuff. G; v1 Q+ s! S2 T
%{__mkdir} -p $RPM_BUILD_ROOT%{_initrddir}8 W6 M5 C" \. i: L- t  s0 _! {
%{__install} -m755 nginx.init $RPM_BUILD_ROOT%{_initrddir}/nginx
; Q7 F0 M; m; |0 t%{__install} -m755 nginx-debug.init $RPM_BUILD_ROOT%{_initrddir}/nginx-debug: D0 y2 U1 h1 s; y1 z. Y1 b/ C/ e5 [
%endif
5 f# v  z# l6 E+ R! |, V
0 ?* ]$ w* m; K+ p- w# install log rotation stuff
) x4 n5 \: x2 Z4 }7 V! ~1 h5 K%{__mkdir} -p $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d
$ L$ g" u8 J# `%if 0%{?suse_version}
2 U' Q$ @3 Y9 {# y$ d%{__install} -m 644 -p %{SOURCE10} \+ r0 r2 T. M3 D$ ~9 o# R
    $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/nginx# u( X& {4 T) p4 e( P7 ~
%else
% Z/ X/ U% o  U8 |4 T3 F, w%{__install} -m 644 -p %{SOURCE1} \
/ E( U2 Z! S; U5 n    $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/nginx
* I& z3 V% i! R% M%endif' u! x6 z6 R( y/ z2 \* ]& J# T& A

4 w: a7 w4 _% E9 r# k5 y%{__install} -m755 %{bdir}/objs/nginx-debug \
, c0 f1 m0 g4 w/ ~4 {1 E    $RPM_BUILD_ROOT%{_sbindir}/nginx-debug
% _& @! E- O+ A$ k! ^7 Z0 n, N4 W( C3 |
%check
0 p3 C# b# i! G8 r# C%{__rm} -rf $RPM_BUILD_ROOT/usr/src7 X$ O+ i) q: F6 T) u! V$ G, S
cd %{bdir}( F; \6 G6 r" q
grep -v 'usr/src' debugfiles.list > debugfiles.list.new && mv debugfiles.list.new debugfiles.list
' ?5 z  L% U2 ^# Kcat /dev/null > debugsources.list
# o- |( S# M/ s4 c" d%if 0%{?suse_version} >= 1500
$ \8 ?& I# r6 u; d: V# l6 hcat /dev/null > debugsourcefiles.list3 R# {/ C# A: a
%endif8 l  m3 ~  e, ^. k/ x4 O' ]

8 u& v% o9 M) G$ Z% E; T: u%clean
, Q# {8 q5 v8 M1 ~0 e: R) P%{__rm} -rf $RPM_BUILD_ROOT; }( C' F6 B' ?! @9 P) d! b' E
, B2 t: i+ q4 i+ H5 g' {
%files; Y' ]4 P; d: K1 b8 P. I3 I9 N
%defattr(-,root,root)
. t) D" z4 L  X9 L  @5 K+ a& O3 {+ u1 b8 e$ _4 X0 a1 c
%{_sbindir}/nginx
' p9 {6 t1 E' x+ s%{_sbindir}/nginx-debug5 g1 V8 B: a: N7 F+ |2 a' F
  D6 g3 R2 S) n' D
%dir %{_sysconfdir}/nginx
5 F6 Z5 M0 ^# q: R%dir %{_sysconfdir}/nginx/conf.d
& x) S! [+ O6 G) `# @1 B+ S3 X%{_sysconfdir}/nginx/modules
0 n  O' d1 q  D2 p  w& M" ~& r6 }2 _4 v. {4 E: t
%config(noreplace) %{_sysconfdir}/nginx/nginx.conf
$ ~& k4 v* I  o+ `7 p; O%config(noreplace) %{_sysconfdir}/nginx/conf.d/default.conf) c- K* _# A; Z8 f. S
%config(noreplace) %{_sysconfdir}/nginx/mime.types! D# c8 H/ D/ P6 u
%config(noreplace) %{_sysconfdir}/nginx/fastcgi_params7 c, I/ m9 ^2 T# k- e2 m
%config(noreplace) %{_sysconfdir}/nginx/scgi_params7 F0 n( ^+ F. A( {  S1 e
%config(noreplace) %{_sysconfdir}/nginx/uwsgi_params3 z1 u# @2 I+ ?9 ]2 C
%config(noreplace) %{_sysconfdir}/nginx/koi-utf
3 o. u% u- h' I9 P  z% W/ k%config(noreplace) %{_sysconfdir}/nginx/koi-win0 u; Q# Q4 r. T4 P
%config(noreplace) %{_sysconfdir}/nginx/win-utf$ `5 d5 q: h4 ^) v8 h
$ Q5 b1 H2 M; }; w# L- u/ E
%config(noreplace) %{_sysconfdir}/logrotate.d/nginx  p; h% x' \. W8 Z
%config(noreplace) %{_sysconfdir}/sysconfig/nginx) Y4 m& C9 P% N& J8 F
%config(noreplace) %{_sysconfdir}/sysconfig/nginx-debug
/ G; ^4 N  S$ U' W! K/ r, \%if %{use_systemd}
5 h/ ^3 S4 i  b% ^- r4 o%{_unitdir}/nginx.service
9 D0 P1 P8 ?. h6 O* G1 ?6 y$ D+ A* q%{_unitdir}/nginx-debug.service/ e- [6 p. ~' O- a# n
%dir %{_libexecdir}/initscripts/legacy-actions/nginx
5 }/ B9 \$ N5 Q% I%{_libexecdir}/initscripts/legacy-actions/nginx/*  g7 n, B* r; D( c! G' A8 X
%else8 j. X+ a: k6 |3 l" @1 T- L* p  c
%{_initrddir}/nginx1 ^9 Y+ t9 {& w* M
%{_initrddir}/nginx-debug
- U6 s/ U2 i# J5 U; z%endif$ Z4 b: e  ?" w( F9 Z

7 d% \1 R, B$ l; A' r%attr(0755,root,root) %dir %{_libdir}/nginx
" U* S& N# U& g* m% g: Y" e% K* p- h: m%attr(0755,root,root) %dir %{_libdir}/nginx/modules
( X0 u. l" r$ b! g8 r%dir %{_datadir}/nginx7 u* u) N6 k! @: S+ {2 x
%dir %{_datadir}/nginx/html( }( K2 z: H* V" t) ?- J
%{_datadir}/nginx/html/*
7 U9 J' Q8 N0 Q0 u' l$ E2 y) Z0 P# ]; t# ?0 ^! {( G
%attr(0755,root,root) %dir %{_localstatedir}/cache/nginx( V1 E- v" q( s) p& i# I/ `
%attr(0755,root,root) %dir %{_localstatedir}/log/nginx% e! J# o9 @& I3 }0 ]: ^0 x

. J2 A& ~. C3 s3 E7 V%dir %{_datadir}/doc/%{name}-%{main_version}/ w8 L- B2 v2 M
%doc %{_datadir}/doc/%{name}-%{main_version}/COPYRIGHT
8 {1 Y! @5 ^! t% G%{_mandir}/man8/nginx.8*  R+ c# h* T' B( i) E* I: I# `" |
+ G# G0 Y  C- T* o' T; Q5 h) F- m
%pre
$ _- w  @5 r. B# Add the "nginx" user
1 G: s# |  X, b4 Ngetent group %{nginx_group} >/dev/null || groupadd -r %{nginx_group}
0 [7 @, M' k  Sgetent passwd %{nginx_user} >/dev/null || \
: |1 Y& M4 |4 ~    useradd -r -g %{nginx_group} -s /sbin/nologin \7 l" W3 p% r8 v  z# r3 n
    -d %{nginx_home} -c "nginx user"  %{nginx_user}0 T+ T) U. F& i% v  h
exit 0
; Z9 M. {* X5 f+ s4 E
  f8 w1 l9 g  l0 C$ V%post
4 p! z8 Z. g1 A9 O2 T# Register the nginx service
5 ]& ?: _5 I1 @+ p7 Qif [ $1 -eq 1 ]; then1 l! l" {/ l4 K
%if %{use_systemd}
- L/ O6 i& R' C2 x' }9 I; `' ~    /usr/bin/systemctl preset nginx.service >/dev/null 2>&1 ||:0 _! c% F3 ^5 x% z2 q" B/ p
    /usr/bin/systemctl preset nginx-debug.service >/dev/null 2>&1 ||:3 h6 G: q4 |3 F6 D
%else
/ }6 b5 R# q5 r7 B( c8 M    /sbin/chkconfig --add nginx2 B8 ~5 f; j7 y) G4 U
    /sbin/chkconfig --add nginx-debug
1 Z% P7 j6 D* a6 s%endif' ]1 W1 b' C% `* m- S( W2 D
    # print site info8 \$ ^$ |; j' C2 M- h- E: {
    cat <<BANNER# f7 [- b* T0 r/ v  l
----------------------------------------------------------------------
8 l9 Z( k3 |- y. y  J! ^/ ?+ k- M% c& \: T5 W, g7 B1 i
Thanks for using nginx!
; a9 C- O$ v  p$ }) V7 _) Z- m  t# a- ]+ o: ]9 B! ?
Please find the official documentation for nginx here:
' B& ]/ d( I& ^3 K' ?: k; t) M7 _* http://nginx.org/en/docs/: |7 }( j) X: L5 G- k7 m
% E" s4 y1 `0 ~1 F: Q- S
Please subscribe to nginx-announce mailing list to get1 x* E# z0 w4 N1 ]
the most important news about nginx:
. z9 R6 M% c0 _( `5 e0 |* http://nginx.org/en/support.html/ A1 F; U" [0 @2 t0 A% g% Q

5 I8 c/ ]  k1 }6 J$ a% YCommercial subscriptions for nginx are available on:
7 f6 h8 [- ?: |  O4 Z! O9 Q% G$ s' \* http://nginx.com/products/
4 V: M" B. D( `+ |2 O: w4 e* i. K. O& ^) U
----------------------------------------------------------------------
% p4 Z7 }! x- xBANNER/ D% K2 _6 l5 k8 f7 A) y) I8 T

6 c6 o2 V! l# t5 l    # Touch and set permisions on default log files on installation
3 E3 w5 w( k& r2 ?1 g! X5 _% l$ _; D7 o8 b- w
    if [ -d %{_localstatedir}/log/nginx ]; then8 }6 ?, M2 t& ^2 Y2 o$ O0 n
        if [ ! -e %{_localstatedir}/log/nginx/access.log ]; then
7 Q$ ^. ]: E4 a0 |! j( I- `            touch %{_localstatedir}/log/nginx/access.log1 P; F% Q$ ^4 f7 g* A4 t* z
            %{__chmod} 640 %{_localstatedir}/log/nginx/access.log5 I" S6 O3 O3 q/ B+ M+ F& @
            %{__chown} nginx:%{nginx_loggroup} %{_localstatedir}/log/nginx/access.log; E$ z% @5 S9 Z
        fi
. B0 K0 o' d, N5 l! ?# Q6 u+ H: s5 V( v3 \7 X
        if [ ! -e %{_localstatedir}/log/nginx/error.log ]; then
* o- k6 ~/ \4 h7 m' S5 |+ M2 N            touch %{_localstatedir}/log/nginx/error.log
0 Y- C3 I9 w( c, V$ o# J2 Y( E            %{__chmod} 640 %{_localstatedir}/log/nginx/error.log
( q9 ~5 I  a% \- V5 a# i            %{__chown} nginx:%{nginx_loggroup} %{_localstatedir}/log/nginx/error.log
$ X3 _2 _. v9 C. }& `        fi
, r2 w8 u9 i7 G. k' H    fi6 Z: u/ j% J: @" C" Y8 _
fi
; |. l, U0 o9 v/ }
* C/ ~. B! w: z4 J. B; X  [6 o%preun( ?: @/ S: o! C5 E. |% d$ Q/ h4 w; E$ n
if [ $1 -eq 0 ]; then
+ Q9 ^) E- b. z# P( B& |%if %use_systemd$ n7 i3 e) I( d
    /usr/bin/systemctl --no-reload disable nginx.service >/dev/null 2>&1 ||:* e0 f/ L0 ]6 N  `$ Q
    /usr/bin/systemctl stop nginx.service >/dev/null 2>&1 ||:
! L: u$ R% h: m' _) G%else
4 m% w. E" D' F, A7 [, F    /sbin/service nginx stop > /dev/null 2>&1
$ F$ n" Q9 b6 o0 Z* w. L8 l    /sbin/chkconfig --del nginx7 o+ c) c+ O6 g: N( w( }
    /sbin/chkconfig --del nginx-debug
- y6 N+ Q6 ?' m  Z3 e8 ?%endif. R' d) L- m2 L% m- r5 {
fi# [+ X4 B3 `, @% U

; j6 X" a0 L" Q" H%postun
$ l" x4 T, g! j%if %use_systemd& I) R8 x! E1 f% {5 R5 _
/usr/bin/systemctl daemon-reload >/dev/null 2>&1 ||:6 x- b: P! K+ W# e" v' x5 B
%endif  l, R# x: N; R" B
if [ $1 -ge 1 ]; then
. A. W6 c* C3 h0 F  \, L( o9 W7 r    /sbin/service nginx status  >/dev/null 2>&1 || exit 0
, b: t" W. a* C9 _! d, B    /sbin/service nginx upgrade >/dev/null 2>&1 || echo \
4 l. J9 K& G/ H  e5 L        "Binary upgrade failed, please check nginx's error.log". Y4 m5 u8 Y6 b
fi7 [6 Y% n* ~4 j  @+ h: B

' `' K/ @- @, u  `%changelog9 F* \8 O, ?/ p. M/ ]
* Tue Sep 30 2019 fangdm <8@8994.cn># u, C+ e) _& E4 x; M
- Add modules nginx-http-concat and ngx_cache_purge7 h% D! d* r* i6 X+ ]

3 Z# d1 m" j2 `% L% D0 r. m6 U* Tue Aug 13 2019 Andrei Belov <defan@nginx.com>
9 ~7 M$ m  {1 k$ A) d! ]1 a- 1.16.10 g8 @, P( v7 V* e1 Q% w
编译完成之后,查看changelog,是成功了。, o' f5 B8 W0 A# h% [
) p) v0 X8 z+ |' }4 {9 k  u3 Q
[root@localhost SPECS]# rpm --changelog -qp /root/rpmbuild/RPMS/x86_64/nginx-1.16.1-1.el7.ngx.x86_64.rpm4 k* @5 a  o+ O
* Mon Sep 30 2019 fangdm <8@8994.cn>
/ T& I* U: Q' k; M# L7 M- Add modules nginx-http-concat and ngx_cache_purge! _/ S/ B& i( e  S; P

* Z, R" V# f) a, C* Tue Aug 13 2019 Andrei Belov <defan@nginx.com>
" i% R7 O' `3 x$ J- 1.16.1
5 w  r% `8 c5 u/ f( X' T! ?* u' Q" Bfpm打包方法
1 b  P( O; D! a* b) C: R( j使用fpm这个方式也是可以将tar打包为rpm包,其打包流程大致是这样的:) }! T0 b. a0 b$ J  a: g" d
% q5 g  y' u' F9 T: w: S
编译安装被打包软件,指定安装的临时目录,如指定--prefix=/fpmbulid: C- `) n4 m! ]( F; L# ], p
创建安装脚本、卸载脚本
9 j! z; h7 r/ X安装FPM工具5 b! R/ R+ m3 Z; O8 n
使用fpm打包3 W' A# l) |; }! C+ P/ A( W
# M% E8 o, v! h4 t0 g9 W! S) V6 X
 楼主| 发表于 2022-10-20 15:00:06 | 显示全部楼层
gcc相关知识
先编写一个C文件,其第一行表示包含文件在/usr/include/stdio.h下,如果没有申明,则需要使用参数-I /usr/include指定。
复制
1
% Z6 {8 C8 s" Q9 j) {27 T& j& W0 E8 m
3( u7 I4 a6 K% A8 k
42 t6 ]- X/ |& Y* \; i/ B+ b6 o0 A" z
5( ?8 F1 y9 k. W( _2 ~
69 [# t4 X; L! R3 \0 x0 T* X& e
75 u& }/ q  q; S; v  z
8
$ C# o3 z% v7 @) h/ c' |  V9$ v( [6 w2 G2 l, N) Q8 u# Y
10/ h8 P; N" }1 g3 M* ^
11
2 [' ^0 y1 J# s+ ~: e+ ^12
, L8 ]1 O6 ?$ H$ `1 D. s13
$ W$ v: G' h$ w7 b) S4 F7 X4 X14
6 R; O/ `  r& m5 j* s! H152 V! W; A& U7 P: ?$ I
16
2 D- x/ N( Q/ t+ i: i17% d; x/ @& H2 y
185 z( a8 A7 q! F! i) O7 j6 }
19
6 c: }! p3 A1 {: U. T20
) n3 a0 r2 y1 W2 t) p6 C- @
[root@home ~]#cat sin.c
. W; |2 b/ n* G9 K9 n+ m#include <stdio.h>
4 r0 r3 b' }6 h/ z* |6 _2 Fint main(void)
3 x% ~7 y! \: e" p- A: |6 I/ U# Q{6 n7 v. {* \6 t/ {7 `" S
        float value;6 ^7 g+ P/ X) d: r  F
        value=sin(3.14/2);
  ?& p+ `4 J$ G" z1 x        printf("%.2f\n",value);# V( t7 m" }) X5 s' ~' S  x8 r9 i
}1 N+ j3 m6 ~. {# r- e0 ]2 ]) x
3 @4 e0 P3 T( v
[root@localhost src]# gcc -c sin.c
; g6 F- @9 E3 m% }, Rsina.c: In function ‘main’:0 S# Z& I8 o: p  O
sina.c:5:8: warning: incompatible implicit declaration of built-in function ‘sin’ [enabled by default]) Y8 O, A* S% g* e7 P1 P
  value=sin(3.14/2);4 o$ |5 |1 f$ W! b1 v7 l# T
        ^! h( b4 ?. `- F! d8 K& e$ q
[root@7ftbv7mdz7cdpc ~]# gcc -c sin.c -lm -L /lib/64 -L /usr/lib64
" L7 \8 C# `9 P8 F- q" o2 Ksin.c: In function ‘main’:! g6 e8 W: |7 R
sin.c:5: warning: incompatible implicit declaration of built-in function ‘sin’
! {* j, b  Y4 V8 f[root@localhost src]# gcc -o sin sina.o
% l2 ?' E9 ?3 C& U. A* `[root@localhost src]# ./sin( L4 O: v# q( s5 l; u$ R9 O
1.00
' s1 m5 o, R* v+ i8 b

2 @* ?  D7 V( ]% r) o

2 N( n8 P, Z1 F3 z: W! Z3 G
gcc sin.c全产生a.out运行文件,加上参数-c则生成二进制文件sin.o,再加上-o则生成运行档sin。
但是如果出现以下错误,这是因为 C 语言里面的 sin 函示是写在 libm.so 这个函式库中,而我们并没有在原始码里面将这个函式库功能加进去,可以使用以下命令gcc -c sin.c -lm -L /lib/64 -L /usr/lib64
  • gcc -O 为产生最佳化的参数
  • gcc -Wall 为产生更详细的编译过程资讯
  • -l :是『加入某个函式库(library)』的意思,
  • m :则是 libm.so 这个函式库,其中, lib 与扩展名(.a 或 .so)不需要写
  • -I /path 后面接的路径( Path )就是配置要去搜寻相关的 include 文件的目录啦
  • -L 后面接的路径表示函式库 libm.so 请到 /lib 或 /usr/lib 里面搜寻1 I" V" W3 U2 h3 u; \
总结:
1 @% J/ z4 ~5 w  U  ]! ]
复制
1/ ]) \4 q7 [( u' P' f& H0 Q
2) `* G; |( }3 S: ]% v5 R7 L
3
- e: z; u& |6 T8 D3 a  t+ v/ Z+ @4
' `* v& n, m: f+ j8 B: T! @5
' k& U6 w7 W% J6; w2 J. O  s7 f5 x( j. [
7
  v  k; B/ ^  J( g0 t87 W& S/ k' _$ Y' P7 N
9
0 _+ G& l) R8 F! h: x10! e0 \" g3 u, a7 Y4 B; |8 G/ O
11: L. _2 o( K+ ~8 `: F
12
4 {( h$ @/ C; z2 x13
) s  q2 q; x, f# _+ |' M% N& A14
0 S" c, t+ Z. _& K! v% f/ Q156 k7 Q2 e4 R* s& ?8 \
16
$ l& i* B/ f) D* N7 P4 ^4 O. r! o* M17
/ |3 a1 x  C7 N( s$ S( w18
3 b& K+ w! ^4 L! U4 a! i: t19
; k( \2 ^) f6 U9 N/ k2 i20
! S3 p  d. d. D4 }* w217 }: j; ^3 q2 o2 q7 G1 k& |
220 g6 |3 h& Z' t) X1 N0 q
23& W1 @; D$ x6 a$ W; p
# 仅将原始码编译成为目标档,并不制作连结等功能:
9 B$ X+ p6 |; }; \' _1 R[root@www ~]# gcc -c hello.c; o+ A1 x  c& k1 _+ A4 {5 n
# 会自动的产生 hello.o 这个文件,但是并不会产生 binary 运行档。  q( o# ?1 G/ z# Z* @
# \# x3 o+ _% p' h, C. T# S
# 在编译的时候,依据作业环境给予最佳化运行速度' n8 f5 f2 X( ^3 L' Z
[root@www ~]# gcc -O hello.c -c
* A2 w8 b: N+ j# 会自动的产生 hello.o 这个文件,并且进行最佳化喔!& q0 m% _& G9 _
: Y0 f$ j. x  _% N6 c1 D0 J
# 在进行 binary file 制作时,将连结的函式库与相关的路径填入
3 W& q6 J. q# r[root@www ~]# gcc sin.c -lm -L/usr/lib -I /usr/include1 t' E4 [2 I5 v$ m6 s
# 这个命令较常下达在最终连结成 binary file 的时候,
% F2 k6 \$ r& I; {4 h4 S# -lm 指的是 libm.so 或 libm.a 这个函式库文件;  s" I5 a# H+ K+ V
# -L 后面接的路径是刚刚上面那个函式库的搜寻目录;
( G+ ^- r0 m. V# D6 j( N7 Z# -I 后面接的是原始码内的 include 文件之所在目录。2 W- [! P& b1 ^) C4 m& \
6 V: m' X8 @/ M6 l
# 将编译的结果输出成某个特定档名
8 y4 p2 @+ }7 P3 V, [8 m& l[root@www ~]# gcc -o hello hello.c/ g0 U9 L8 ~" j
# -o 后面接的是要输出的 binary file 档名
8 G; N% U- ^! s% ?6 S' Y* C: W: i. Y% E, a
# 在编译的时候,输出较多的信息说明6 |5 u/ ^& _  v
[root@www ~]# gcc -o hello hello.c -Wall5 E- R$ O: b8 M
# 加入 -Wall 之后,程序的编译会变的较为严谨一点,; }  c+ R7 F  u+ T" D
# 所以警告信息也会显示出来!
& [5 u/ [. U( Y3 z( Z. q: C+ b* v
$ r2 e5 b5 H3 b5 g# i; C

) ?. _/ p& i8 v' n; D5 w8 L  g7 ?: R  e# _  L; `
另外,我们通常称 -Wall 或者 -O 这些非必要的参数为旗标 (FLAGS),因为我们使用的是 C 程序语言,所以有时候也会简称这些旗标为 CFLAGS。) R4 \3 R% x, i
' s0 Q. l8 D! l  ]) m3 C
makefile介绍实例
首先,下载wget http://linux.vbird.org/linux_basic/0520source/main.tgz然后开始编译:
复制
1
3 i0 x- ]1 `$ S4 l4 M2* z3 k+ r; ?5 Y9 `
3; A& P7 P5 \( J
4
" V. L- T+ `4 q' M57 l( N2 Z3 u+ |' t
6
8 D! W, Q' P+ o3 t* M/ h7
, x( w$ l. ?* I3 x  L& ?7 I9 E84 f2 J9 ]& {* V" |$ F" F
9
3 f3 u0 V& N9 C- f! ~3 w103 g& j' W5 p& n- C, t
11
- c+ S0 R% f  S  P+ Z; u) ~12! [; O* Q8 d/ [7 t- s6 O- @
13
0 J; E* ?  A+ D, F14' a9 ?* q3 Y' j8 B5 @
157 ^8 I9 F  e, i$ B
16
, x' W  x8 n; k7 e, o; r+ v% p17* ?- B  N' B6 K8 R! d  n( Y
18
5 h# {5 w2 S7 P. [19
4 }8 J! J/ x: C8 ]: j20
; W+ k) k- t4 Q) L; W: Q5 V8 o21
& C5 t- j) K# d" t& Y8 \22
+ B  M/ U% K1 y
[root@localhost main]# cat makefile! d# t' n# C5 {& k% Q; c
main: main.o haha.o sin_value.o cos_value.o
/ b" Z, S$ [6 R! n" e9 A/ h& P        gcc -o main main.o haha.o sin_value.o cos_value.o -lm% A7 J' n# L, i" k
clean:+ W* V- ?- `5 i' S# N6 Q+ Y
        rm -f main main.o haha.o sin_value.o cos_value.o
) e9 @, ]# S. T: l3 Z. t, t. U$ U       
' s1 ?4 x5 m5 Y) O4 c& B: n3 F; ^, I[root@localhost main]# make
5 P+ a+ ]" ?; _( C8 @$ F+ O0 e: Fcc    -c -o main.o main.c
1 E/ v  `+ P" K3 o2 g+ b) Q9 {cc    -c -o haha.o haha.c: r. h) _  v4 {1 s/ D3 l
cc    -c -o sin_value.o sin_value.c2 G$ J  X+ u. R
cc    -c -o cos_value.o cos_value.c: A$ z' s8 d% a8 S( n# d
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
$ \( R6 o: _0 {/ N$ r9 [+ }: e7 S! G8 N3 L/ c! _4 O
[root@localhost main]# ./main. v9 h- u% D- E4 S
Please input your name: fdm
) e7 _3 j4 R! x& L. K3 @% V/ PPlease enter the degree angle (ex> 90): 33
! q5 n% M3 ~6 f$ G/ I, m6 {9 k1 cHi, Dear fdm, nice to meet you.
- v1 j+ H: q, v  ~2 s' G1 qThe Sin is:  0.54
) K+ d) T9 p4 S2 c: ~( F# lThe Cos is:  0.84& @2 c' G! w# [( O' y9 h

4 Z4 g1 j. e" H6 U[root@localhost main]# make clean/ s  a' W& F* N0 e# E& s
rm -f main main.o haha.o sin_value.o cos_value.o
8 n$ o! y2 t+ }

' C/ V7 W& M, L4 [. g

- E; C: T5 F  s1 b$ j2 H* I! Bmakefile 的基本语法与变量
make 会主动的去判断每个目标档相关的原始码文件,并直接予以编译,最后再直接进行连结的动作。
  • 在 makefile 当中的 # 代表注解;
    7 g) J1 J. K) g+ c3 c' c. n# V
    • 需要在命令行 (例如 gcc 这个编译器命令) 的第一个字节;
    • 标的 (target) 与相依文件(就是目标档)之间需以『:』隔开。就是可执行程序的文件名。复制
      1. W9 T, B2 l/ Y3 x
      25 E# \8 ]- @0 v- q$ m2 J( v# Y
      标的(target): 目标档1 目标档2
      5 b6 Z6 }3 x+ ^" N% k  k; G        gcc -o 欲创建的运行档 目标档1 目标档2
      & P, V* D' T& A: J7 s
      ! ^( }7 B( x  S, ^+ x& }

      4 G. a- U' C4 A, n- X5 {) L3 L+ }9 P# y# [/ w
如下,makefile 里面就具有至少两个标的,分别是 main 与 clean ,如果我们想要创建 main 的话,输入『make main』,如果想要清除有的没的,输入『make clean』即可!而如果想要先清除目标档再编译 main 这个程序的话,就可以这样输入:『make clean main』
还可以进行简化,使用变量来减少程序的修改量。$@:代表目前的标的(target);gcc 在进行编译的行为时,会主动的去读取 CFLAGS 这个环境变量,可以写到makefile2 D% a) A( L0 W  N, ~. e1 _$ y
复制
1, S/ b0 I1 j/ k5 u( W# R9 w
2
. j3 {) h3 l& j) Y! P0 F/ U3
/ A8 T: y' T8 @3 O7 H4
* D6 R7 Z+ @  j0 Q4 Z  F2 X0 K+ I5
' W! O, X) Q! X1 \/ z* t6
6 m/ H; o7 x% ~; F: w$ ~1 U& R7: k& R0 l$ `" a1 X
8
1 H9 K3 R. G- s1 q  j- w
[root@www ~]# cat makefile
9 K  E& t" }' }( o4 p9 N, DLIBS = -lm/ M. P  U. q1 I+ h
OBJS = main.o haha.o sin_value.o cos_value.o
$ k. }6 A* o* i1 Y0 R" S8 s% L! FCFLAGS = -Wall
1 B. [% O) k9 V- Z& c! i! _main: ${OBJS}1 Z7 ]; S' p; C& v3 G
        gcc -o $@ ${OBJS} ${LIBS}8 Y) n0 I* Q+ j
clean:
! b( |! D* y3 t8 y) v6 \) a3 w        rm -f $@ ${OBJS}
- ~7 G0 C" M0 g
5 |: a& ]# V+ A: F
9 B, o1 ^3 b+ U. _5 m) R
8 a( [+ K$ J$ H$ a% d+ t$ t( R
由於 gcc 在进行编译的行为时,会主动的去读取 CFLAGS 这个环境变量,所以,你可以直接在 shell 定义出这个环境变量,也可以在 makefile 文件里面去定义:
5 o4 n# ?" |+ X2 e! C5 p  L
复制
1
$ ?/ _# ]4 S5 v2
+ [$ }& B# B$ M
[root@www ~]# CFLAGS="-Wall" make clean main
5 E5 v3 l( ]6 S& y# 这个动作在上 make 进行编译时,会去取用 CFLAGS 的变量内容!
9 o6 W! X& t  R2 p" {! e
2 g, H8 `+ N& t+ k2 Q& }. |
  w8 v. e) N5 T; p  T4 p

9 S7 |) p. ^( k) w; Imake与Dockerfile相接合
此小节内容来源于 high-iowait-process
如有下列Makefile文件内容:
复制
1
% N# y. \- b  a  H0 X: J- {2% z9 H7 S7 P, e! P% L7 R' \
3
7 }' W% w- P# e3 F1 v! V4, [+ ?8 H) _, ~, R
5
- K9 c  ?# v* g2 t/ E' `% O69 A; q( V: L  L0 ^* N& ]4 u! [% N
7
$ @& I3 T. }( T( j  |2 V/ e8
2 f- Q6 i& h9 G/ t9
, [+ N, e: Z  g7 p10# B" I, [( X# c5 y( j. q2 v/ Q! ^: N
11
% D9 N0 a* l0 K8 ]7 S12
' x* q6 \# P" H: P" Y4 M! I13; k+ V4 v$ M3 b' W+ P
147 R; e+ E: w; D+ V% _# l5 w: s
15
6 [9 j  f) J* P16
, e) g! v- V: O" z, W3 `* l! y17
1 A3 u. }* \4 w1 \9 `, Z& t18. V) S( [* Y( q4 \
199 J% i: u; v  B9 h# [+ p/ {
20$ k+ d8 ~2 I/ k7 b" b) y
21; `0 l. g+ x7 p& i7 |$ j. I
22# S" |: I  o- P& X6 ^; Z
23# f7 B+ ~' j6 ]  m
24
& h1 T3 }6 b0 t5 g! n; z25& n% z2 Z4 R& O) a. @
26
6 I& O1 M' c) W: Y% \27
8 w; H1 G& K  Q- T" f, D0 r% A28
- B+ f% b* N+ z2 F29
3 x! o+ ~4 y; k8 r307 f, X# S( G8 p* g( j% \
31
6 L1 W/ \+ F& C- K5 L# D" a5 N
.PHONY: build4 U! o* @1 c" F
build:
. l. @% i% V1 B; B: I4 C& Q        gcc -o app app.c3 u" E% a2 S6 l0 `
        docker build -t feisky/app:iowait -f Dockerfile .; X5 |, X4 R$ E; j
        gcc -o app app-fix1.c
9 w8 j8 I' T, C+ r# y& U        docker build -t feisky/app:iowait-fix1 -f Dockerfile .) I5 Z! z- B' L$ W/ e: v" Y/ G1 w
        gcc -o app app-fix2.c$ g( X& }$ M* [* ~5 T. o- ^# r
        docker build -t feisky/app:iowait-fix2 -f Dockerfile .
( d+ ^# M/ }4 m3 p) ~
) E' N$ F' x5 M! G3 C) {.PHONY: push
0 t2 o9 l, |! g5 i5 R8 upush:
) Z  q  \* f1 e2 e- p8 N3 c8 b        docker push feisky/app:iowait7 @/ H7 ?6 p6 n; U4 P. X
        docker push feisky/app:iowait-fix1
" g) T% y4 {3 F% q0 ], r9 `        docker push feisky/app:iowait-fix2- ?. E( g4 b( N& u
2 K+ b7 k: E5 G" s% N- |
.PHONY: run
0 D. K; Q+ S$ _4 N6 }/ _run:
- Z% _6 }1 D3 p8 W/ o9 D        docker run --privileged --name=app -itd feisky/app:iowait
: Y, z/ K. [4 K' [  S! P2 ?/ D+ ~1 ~$ v/ ~* V
.PHONY: run-fix1' ?/ e0 M0 V7 @% g9 Q6 M6 u9 Z
run-fix1:
: J( T( }4 p* k9 e8 u: ]        docker run --privileged --name=app -itd feisky/app:iowait-fix1
3 R' e; m) v' o6 [" V& V9 x4 m! X' P2 P" S) H! y7 E/ [
.PHONY: run-fix2
8 x& v. {; V# n+ }7 j7 Y4 krun-fix2:) ^" u  @( R2 C! X; u2 f; }. M
        docker run --privileged --name=app -itd feisky/app:iowait-fix2# r4 l; D, R9 k* J+ O3 u# I; \
8 s/ w9 x% [, H% ^
.PHONY: clean" h* u# i% e0 b! y) B2 u
clean:
' Z- @1 V6 f/ B/ A# N        rm -f app, \+ b) N( q# c
        docker rm -f app || echo "Container app already deleted."
' s: Q; U" C9 d/ P
  l8 m2 p5 c% Q! H

% {& J8 K& H2 L6 H+ \/ V
这样写好之后,就可以使用 make bulid 来生成镜像,使用 make run 来运行镜像,使用 make clean 来删除镜像。所以这看上去就有点像脚本的函数一样了。
变量的基本语法
  • 变量与变量内容以『=』隔开,同时两边可以具有空格;
  • 变量左边不可以有 ,例如上面范例的第一行 LIBS 左边不可以是 ;
  • 变量与变量内容在『=』两边不能具有『:』;
  • 在习惯上,变量最好是以『大写字母』为主;
  • 运用变量时,以 ${变量} 或 $(变量) 使用;
  • 在该 shell 的环境变量是可以被套用的,例如提到的 CFLAGS 这个变量!
  • 在命令列模式也可以给予变量。
    1 G. T' M$ ]5 @1 }  l
yum安装相关环境
  • 如果是要安装 gcc 等软件发展工具,请使用『 yum groupinstall “Development Tools” 』
  • 若待安装的软件需要图形介面支持,一般还需要『 yum groupinstall “X Software Development” 』
  • 若安装的软件较旧,可能需要『 yum groupinstall “Legacy Software Development” 』8 l# X* g: }2 F; B: V
编译软件步骤
  • ./configure 创建Makefile文件
  • make clean 会读取 Makefile 中关於 clean 的工作,可有可无
  • make make 会依据 Makefile 当中的默认工作进行编译的行为
  • make install
    * Z+ @7 G4 A! c8 ?5 x9 A9 Y) V- R
如果未指定安装路径,则编译安装的目录是放在/usr/local/etc、/usr/local/bin、/usr/local/lib、/usr/local/man下。
rpm知识
此内容与编译无关。可以跳过,同时此内容也来自于鸟哥私房菜,是一本好本啊~
RPM 安装 (install)复制
1# s- T; k) ~! D* t
2  _0 R( P! |# p; h& F
3
: M1 U4 L; ]. ^& t/ f7 s  X43 t' n! V, V& R" k- x7 S3 a7 m: [
5
3 A9 S0 P) l# ]) [9 A% I6$ `: G7 W+ b& J# I0 {2 w
7
% ]3 v5 I: V+ R& G, f/ `: h7 u1 K80 k% y" r. b) t" V. B
9
% a' C" L# o. c- T9 W9 Z* B9 T10) \( ?2 y- L. \4 p0 V4 Z( R6 q( R+ T
[root@www ~]# rpm -ivh package_name- B: M) k- K" y5 v* m
选项与参数:
) u" @2 S  P$ J' v8 U* J2 R9 v-i :install 的意思& V# m, b* K/ @( a5 r
-v :察看更细部的安装资讯画面
+ j( k% x# O6 H0 |-h :以安装资讯列显示安装进度
2 i6 A. o2 N7 g: k1 p) N! B  _- l% P" P$ D& J  l6 G+ t
-Uvh        后面接的软件即使没有安装过,则系统将予以直接安装; 若后面接的软件有安装过旧版,则系统自动升级至新版;
6 g7 x# U& L* _8 }-Fvh        如果后面接的软件并未安装到你的 Linux 系统上,则该软件不会被安装;亦即只有已安装至你 Linux 系统内的软件会被『升级』: [: C" M$ c$ T% R
* f& E% u$ a& C' y
[root@www ~]# rpm --rebuilddb   <==重建数据库
& A: _( j) X( E! c6 @0 j3 k

, F! o4 G, \- G. L% N. C

: U+ S3 I" W  |" C# e. I
rpm 安装时常用的选项与参数说明
  • —nodeps:当发生软件属性相依问题而无法安装,但你执意安装时
  • —replacefiles:如果在安装的过程当中出现了『某个文件已经被安装在你的系统上面』的资讯,又或许出现版本不合的信息 (confilcting files) 时,可以使用这个参数来直接覆盖文件。
  • —replacepkgs:重新安装某个已经安装过的软件!如果你要安装一堆 RPM 软件文件时,可以使用 rpm -ivh *.rpm ,但若某些软件已经安装过了, 此时系统会出现『某软件已安装』的资讯,导致无法继续安装。此时可使用这个选项来重复安装喔!
  • —force:这个参数其实就是 —replacefiles 与 —replacepkgs 的综合体!
  • —test: 想要测试一下该软件是否可以被安装到使用者的 Linux 环境当中,可找出是否有属性相依的问题。
  • —justdb 使用时机: 由於 RPM 数据库破损或者是某些缘故产生错误时,可使用这个选项来升级软件在数据库内的相关资讯。
  • —nosignature 使用时机: 想要略过数码签章的检查时,可以使用这个选项。
  • —prefix 新路径 使用时机: 要将软件安装到其他非正规目录时。举例来说,你想要将某软件安装到 /usr/local 而非正规的 /bin, /etc 等目录, 就可以使用『 —prefix /usr/local 』来处理了。
  • —noscripts 使用时机:不想让该软件在安装过程中自行运行某些系统命令。# k. m" l2 v+ d: P: K4 A
RPM 查询 (query)
RPM 在查询的时候,其实查询的地方是在 /var/lib/rpm/ 这个目录下的数据库文件。+ p. g* w6 V2 T( ~9 c: ]# z
复制
1
4 {3 D  D, _7 O& Z/ S% `2
0 G" p, [7 h: F( b- U# C3
; i1 X* S% S: f+ K6 Y4
+ g8 e$ P- b; Q' {) C
[root@www ~]# rpm -qa                           <==已安装软件
  }9 I1 y& j; o[root@www ~]# rpm -q[licdR] 已安装的软件名称       <==已安装软件" k, ?. w6 G! p, `! C4 n# C1 x
[root@www ~]# rpm -qf 存在於系统上面的某个档名      <==已安装软件8 c9 N! p* ], J6 i, c/ B. r3 M$ f$ X! a
[root@www ~]# rpm -qp[licdR] 未安装的某个文件名称  <==查阅RPM文件
% t# b5 S- {. l3 X0 B; q
) V2 j- {" z8 Q" V* `
4 q/ p8 |: ]4 j6 D: T+ z4 N

1 Q6 q0 l! u1 K/ w
  • -q :仅查询,后面接的软件名称是否有安装
  • -qa :列出所有的,已经安装在本机 Linux 系统上面的所有软件名称;
  • -qi :列出该软件的详细资讯 (information),包含开发商、版本与说明等;
  • -ql :列出该软件所有的文件与目录所在完整档名 (list);
  • -qc :列出该软件的所有配置档 (找出在 /etc/ 底下的档名而已)
  • -qd :列出该软件的所有说明档 (找出与 man 有关的文件而已)
  • -qR :列出与该软件有关的相依软件所含的文件 (Required 的意思)
  • -qf :由后面接的文件名称,找出该文件属於哪一个已安装的软件
  • -qp[icdlR]:注意 -qp 后面接的所有参数以上面的说明一致。但用途仅在於找出某个 RPM 文件内的资讯,即未安装的名称/ S% q+ F: {  W; t
RPM 验证与数码签章验证
验证 (Verify) 的功能主要在於提供系统管理员一个有用的管理机制!作用的方式是『使用 /var/lib/rpm 底下的数据库内容来比对目前 Linux 系统的环境下的所有软件文件 』也就是说,当你有数据不小心遗失, 或者是因为你误杀了某个软件的文件,或者是不小心不知道修改到某一个软件的文件内容
复制
1
: ~% S' l9 n* p/ N+ ~2
% G6 \8 i6 N7 K- B1 ]3
) C9 _  q" y1 |' E$ L4 d4 u4
+ G. }# u+ g; q0 a. q5
& C# x: i2 t2 F, O, B6; j2 m/ b. V1 O" N5 C
7
7 C0 \7 x' U0 H' U8; O; H! L3 Q, ?8 |& s- N5 M
9
/ I* U( _  W# e2 Y/ v10( n# i. ?) \3 i" B! K0 E- w; g4 Q
116 G0 y! \3 u& H# |7 J, q
12
' x  p: b; u8 J' f13
9 @8 {( G! L4 L; K' d9 P
[root@www ~]# rpm -Va
( s6 K( z5 L" @0 B[root@www ~]# rpm -V  已安装的软件名称
" i2 w( S* w% E5 r( l! A3 S[root@www ~]# rpm -Vp 某个 RPM 文件的档名
, K" o/ e- |/ z  M[root@www ~]# rpm -Vf 在系统上面的某个文件
# {' W) v0 \0 C. E: A; o4 F  q- h2 {, |) ]: b/ v1 ~( n% c" ]
选项与参数:
5 W5 o9 _9 Y9 a2 F4 r( z-V  :后面加的是软件名称,若该软件所含的文件被更动过,才会列出来;
" Z5 O9 [7 o. R+ W$ |# l0 s3 u-Va :列出目前系统上面所有可能被更动过的文件;# ^* ]1 N6 V& V# ?
-Vp :后面加的是文件名称,列出该软件内可能被更动过的文件;) ]9 Y0 z7 ^3 k; n+ Z5 G: P4 g' R
-Vf :列出某个文件是否被更动过~
9 i* D7 K0 U; ^9 H# i' y* ]4 O; Y0 C$ D" L( R6 d
[root@www ~]# rpm -V logrotate
: b3 e. c/ p0 ~+ v# U7 \( b: o6 G..5....T  c /etc/logrotate.conf5 I( B, f  Z6 z  S! Q/ D
8 n. G" u. w7 ^! h9 L! a% Y, v4 c! l

  J  G( ^5 d0 a" l1 g. e& j4 w" L
第一列的含义有以下几种:
- K* p/ @/ f- Z
复制
1
5 A0 }) p6 }% Y2+ m6 \4 N, ?" a
3
/ M' V3 H1 t( j- U5 j, K+ X40 [0 _3 Y# D3 z. S
5& }4 v# N. R( L: t
67 m( b) f6 P6 I" a4 m
7) }! Z' }$ J, a8 J8 u
8% c9 q% Y5 ~" k$ U
S :(file Size differs) 文件的容量大小是否被改变
! h9 [* m" s; g7 U7 e* X$ r# ZM :(Mode differs) 文件的类型或文件的属性 (rwx) 是否被改变?如是否可运行等参数已被改变
. n, Q$ P7 K. ]3 F/ q* d5 :(MD5 sum differs) MD5 这一种指纹码的内容已经不同. O! U# J' C* Z. ]& R) W9 F
D :(Device major/minor number mis-match) 装置的主/次代码已经改变# z4 T( A: o& e- }$ x  H. i
L :(readLink(2) path mis-match) Link 路径已被改变
1 Y7 T7 K5 O3 L! ~5 W1 UU :(User ownership differs) 文件的所属人已被改变& v1 {4 R3 Y# b) `( J' @
G :(Group ownership differs) 文件的所属群组已被改变6 l) F( N: M7 p& \* E4 }) u
T :(mTime differs) 文件的创建时间已被改变
) l  {- j' }9 M; u- r+ @/ _
/ U0 v1 R. x4 A$ `- w- O$ d
! a0 t# j5 D- z

; {" V+ x: ^, N4 x
第二列的含义有以下几种:
复制
1! I, q1 Y; u+ \" N' Q
21 Z/ }! R* j, P! i
3
7 Q$ e) N7 f  X# ?* R4
  @' O- ~5 X7 K4 y: Q9 K# _$ |5" H0 T9 |+ f" b- z, r  C
c :配置档 (config file)! L9 d6 G& {: Y6 N
d :文件数据档 (documentation)
9 N; X7 z9 z( c/ p/ G8 Tg :鬼文件~通常是该文件不被某个软件所包含,较少发生!(ghost file)7 c! V) M2 o6 X1 f4 }4 I9 {
l :授权文件 (license file)
! t- [6 [$ I) n- |2 }r :读我文件 (read me)
& V, e$ G/ B' x" A
& W. T. \6 m# r$ |( K/ ?

2 B( U+ E9 c# W7 ]* R2 b数码签章
软件开发厂商可以数码签章系统产生一个专属於该软件的签章,并将该签章的公钥 (public key) 释出。 当你要安装一个 RPM 文件时:
首先你必须要先安装原厂释出的公钥文件;实际安装原厂的 RPM 软件时, rpm 命令会去读取 RPM 文件的签章资讯,与本机系统内的签章资讯比对,若签章相同则予以安装,若找不到相关的签章资讯时,则给予警告并且停止安装喔。
复制
18 ~7 J" j0 j& h; {  l) u; A/ t
2
; Z( g! G2 s0 l& p+ Q6 N' Q7 ?3
9 o/ l1 t( l: J- ^! A7 [4  L& V1 \- f+ c( O
55 a/ o1 {0 Q! @. R7 ]7 H# L9 P
6& H6 h$ q& \" N8 C
7
" c+ _, z/ W  s$ ^# k2 ]  i8
" ^' _. N- [/ k/ S8 L) s: Z
[root@localhost ~]# ll /etc/pki/rpm-gpg/RPM-GPG-KEY-*% j1 r/ E- n4 y) L! j6 T/ i
-rw-r--r--. 1 root root 1690 Nov 23 08:16 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
6 a' c9 ?/ U# V( U* X& B7 k! B# H-rw-r--r--. 1 root root 1004 Nov 23 08:16 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Debug-7
! m3 w% R6 E  H( g8 R3 i-rw-r--r--. 1 root root 1690 Nov 23 08:16 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Testing-7
3 B" X* J0 Y9 q+ }-rw-r--r--. 1 root root 1662 Oct  2  2017 /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
1 L% t* U% b& ~- h/ x' b0 j' F% R! i-rw-r--r--. 1 root root 1340 Mar 23  2017 /etc/pki/rpm-gpg/RPM-GPG-KEY-remi
0 U0 v' t# P& ]1 a. q-rw-r--r--. 1 root root 3100 Mar 23  2017 /etc/pki/rpm-gpg/RPM-GPG-KEY-remi2017. N* |4 O# c- W2 A
-rw-r--r--. 1 root root 3143 Jan 16  2018 /etc/pki/rpm-gpg/RPM-GPG-KEY-remi2018
, P' T. \" L$ |
0 p3 o. A8 s6 x, F6 Z0 c
/ I! b+ O, m. u2 M2 r- r
SRPM相关知识
rpm的全称是Redhat Package Manager,SRPM是指 Source RPM 的意思,这个 RPM 文件里面含有原始码,特别注意的是,这个 SRPM 所提供的软件内容『并没有经过编译』。通常 SRPM 的扩展名是以 *.src.rpm 这种格式来命名的。srpm跟tarball的区别就是srpm提供了这个软件所需要的相依性软件说明、以及所有 RPM 文件所提供的数据。
rebuild直接安装
下载src.rpm包之后,可以在不修改配置的情况下,直接使用以下参数直接操作:
  • —rebuild:这个选项会将后面的SRPM进行『编译』与『打包』的动作,最后会产生RPM的档案,但是产生的RPM档案并没有安装到系统上。当你使用—rebuild的时候,最后通常会发现一行字体:Wrote: /root/rpmbuild/RPMS/x86_64/pkgname.x86_64.rpm这个就是编译完成的RPM档案啰!这个档案就可以用来安装啦!安装的时候请加绝对路径来安装即可
  • —recompile:这个动作会直接的『编译』『打包』并且『安装』啰!请注意, rebuild 仅『编译并打包』而已,而recompile 不但进行编译跟打包,还同时进行『安装』了/ S6 y/ I4 _. |. r1 U2 k$ f
示例:
复制
1
* C4 i  {9 R/ P! v& @: L4 J27 @9 ^& i3 ?1 D0 a$ ~! q  Z. I
3
- W2 f6 e: @" g' F4
! W4 p  G% Q4 d: J; i2 G* d8 _5$ G! j; `; i# K0 x% d3 v/ M
6, x& c4 l- k* \9 j
7+ |7 ~( _) L: c1 O4 x. _  n
8% r9 D& O" Y5 I+ C/ K* G
9
: {$ B" E% Q0 \10* c8 h. Z1 }3 X7 B) r: k
先下载软体:; {/ P8 [$ T( k, e) x
wget http://vault.centos.org/7.1.1503 ... l7.centos.1.src.rpm  u; @8 G, X, I7 d. m: X- F* ~
再尝试直接编译看看:
/ q5 O3 i. C# W; F/ ~1 mrpmbuild --rebuild ntp-4.2.6p5-19.el7.centos.1.src.rpm
4 o* z  M1 j' i' k上面的动作会告诉我还有一堆相依软体没有安装~所以我得要安装起来才行:2 H+ z% v8 i% S0 C. K
yum install libcap-devel openssl-devel libedit-devel pps-tools-devel autogen autogen-libopts-devel% q9 x7 q& y1 ]
再次尝试编译的行为:
  n: W8 q* B9 F+ Yrpmbuild --rebuild ntp-4.2.6p5-19.el7.centos.1.src.rpm
5 w: E/ ~; y5 [! i9 t& K  J最终的软体就会被放置到:0 |0 c+ s' l& W+ }$ ^% b
/root/rpmbuild/RPMS/x86_64/ntp-4.2.6p5-19.el7.centos.1.x86_64.rpm
5 y( _9 F& s0 g' q
! R2 j# T( _  F7 t3 w& O

" _/ R, Y8 c1 s5 R& z6 ySPEC编译安装目录说明
如果你的rpm的版本<=4.4.x,那么rpmbuid工具其默认的工作路径是/usr/src/redhat,这就使得普通用户不能制作rpm包,因为权限的问题,在制作rpm软件包时必须切换到root身份才可以。所以,rpm从4.5.x版本开始,将rpmbuid的默认工作路径移动到用户家目录下的rpmbuild目录里,即$HOME/rpmbuild。
首先yum -y install rpm-build rpmdevtools,然后rpmdev-setuptree来创建工作目录,也可以不安装rpmdevtools,直接使用mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}来创建。具体的各目录的含义如下:
默认位置
宏代码
名称
用途

" j  A: q7 o" I7 |4 g. F
~/rpmbuild/SPECS
%_specdir
Spec 文件目录
保存 RPM 包配置(.spec)文件
6 d9 i. x9 ]' T" b/ ^
~/rpmbuild/SOURCES
%_sourcedir
源代码目录
保存源码包(如 .tar 包)和所有 patch 补丁
8 D- @5 P9 R6 @3 I
~/rpmbuild/BUILD
%_builddir
构建目录
源码包被解压至此,并在该目录的子目录完成编译
9 ]: D9 l- ?6 r4 R0 B/ H7 Z
~/rpmbuild/BUILDROOT
%_buildrootdir
最终安装目录
保存 %install 阶段安装的文件

. N/ Y' ~% M0 ~6 v- M
~/rpmbuild/RPMS
%_rpmdir
标准 RPM 包目录
生成/保存二进制 RPM 包

9 ^# D4 ?+ h( b
~/rpmbuild/SRPMS
%_srcrpmdir
源代码 RPM 包目录
生成/保存源码 RPM 包(SRPM)
9 x9 p- U$ z7 i- i$ x4 e

+ L3 p$ z# U& }# C
使用rpm -ivh来安装srpm包时,会生成很多文件在/root/rpmbuild下:
5 J4 l& E8 Y3 ^' A: F( j
复制
16 j+ m8 d6 o0 c. N6 n& d
2& E& a9 i7 D* r8 y7 q' O4 O
3
: ]! G) {  \! v49 X2 O! G8 D& U& _
5
1 C6 q$ M5 c3 p+ m, Y8 m, u9 q$ b61 ~% n, e& _& ?, q1 _8 V
7& u7 i6 X/ O8 l* H
8
6 {5 `+ s5 U2 l2 v, M1 ]9
$ F0 D0 Z, V; ]2 n( t) g10
) _1 E' U7 P  w11
# {0 G8 z- f, }$ W+ C2 k0 C125 Q' s; m* _% J9 g
13+ |9 H4 G+ m) ?
14
/ w3 _" \3 x8 @; w15
$ ]& [, x, E) [8 I9 Z16; |1 O8 |: N- b+ s' b* X( _- Z
[root@localhost ~]# rpm -ivh ntp-4.2.6p5-19.el7.centos.1.src.rpm" k1 l/ k: z; [1 o1 E0 N0 l
Updating / installing...
% [; N  H7 M9 L; I! R  C# e/ _/ H   1:ntp-4.2.6p5-19.el7.centos.1      ################################# [100%]
% a# m+ C: P6 n* Z0 F+ W[root@localhost ~]# tree /root/rpmbuild/, }9 t% @4 e5 G/ O; }
/root/rpmbuild/$ ^! X/ `2 Y" L! s) x  n  a; U
├── BUILD
7 l2 r2 [7 _" S( o├── BUILDROOT
) i: \, p! I3 N7 D├── RPMS2 T' N9 E! k3 S3 l
├── SOURCES. A3 C' B: s8 e: t4 m" F8 ?
│   ├── ntp-4.2.4p7-getprecision.patch9 w% K0 o7 O! X4 p0 z% c
│   ├── ntp-4.2.6p1-cmsgalign.patch6 p# M( v$ i2 _
。。。& z, ]' t, e$ R5 l
│   └── sntp.sysconfig( S: U" f5 Q4 P# O. r" ^
├── SPECS; O6 J: [* o0 y# e3 S. V
│   └── ntp.spec' s  B' m$ h- Q, ~  N  B
└── SRPMS
) o* [- o; ^1 H8 Z
. ~/ _, J4 G) ^. f" p9 a$ X
) {8 A, A) s' s/ q$ P$ l
. T% K8 F* n, R
解压完成之后,srpm本身就提供了spec文件,可以直接通过以下方式直接安装:
复制
16 E  E) t" L  M* b5 D" T- }
2
3 ]& }  x3 O0 x; B
[root@study ~]# rpmbuild -ba ntp.spec   <==编译并同时产生RPM与SRPM档案
( W* }$ G1 S" j! q, `. y[root@study ~]# rpmbuild -bb ntp.spec   <==仅编译成RPM档案" g4 Y( ]8 M9 H: D" v# j

5 V4 u/ X7 d" P) J3 _; U6 @6 j

# Y' K7 A5 X1 `' x' _spec打包流程
SPECS下是RPM包的配置文件,是RPM打包的“图纸”,这个文件会告诉rpmbuild命令如何去打包。“宏代码”这一列就可以在SPEC文件中用来代指所对应的目录,类似于编程语言中的宏或全局变量。当然~/rpmbuild这个文件夹也是有宏代码的,叫做%_topdir。
打包的过程有点像是流水线,分好几个工序:
  • 首先,需要把源代码放到%_sourcedir中;
  • 然后,进行编译,编译的过程是在%_builddir(~/rpmbuild/BUILD)中完成的,所以需要先把源代码复制到这个目录下边,一般情况下,源代码是压缩包格式,那么就解压过来即可;
  • 第三步,进行“安装”,这里有点类似于预先组装软件包,把软件包应该包含的内容(比如二进制文件、配置文件、man文档等)复制到%_buildrootdir(~/rpmbuild/BUILDROOT)中,并按照实际安装后的目录结构组装,比如二进制命令可能会放在/usr/bin下,那么就在%_buildrootdir下也按照同样的目录结构放置;
  • 然后,需要配置一些必要的工作,比如在实际安装前的准备啦,安装后的清理啦,以及在卸载前后要做的工作啦等等,这样也都是通过配置在SPEC文件中来告诉rpmbuild命令;
  • 还有一步可选操作,那就是检查软件是否正常运行;
  • 最后,生成的RPM包放置到%_rpmdir,源码包放置到%_srpmdir下。
    : i9 H, I* y; x4 Q8 J3 V$ H
spec文件内容
使用vim a.spec之后,会自动生成spec的结构体,内容如下:
复制
1
1 w& Y: A# v6 Z, j1 Q2
' @6 A+ t9 V) M$ F7 _& k' k32 L2 S5 r$ ~+ C4 B: f9 ]# k
4
) E4 ~7 _0 }" d5 f% {: y' Z+ g5
2 R# c6 [- J9 y! D6
9 F# `) H7 w+ m/ S; ^  E74 }  k  N' i' I* @! ?% N
8( e: k: ]1 }: E& P4 U
9
* G: a% O' q3 Z( |10+ k$ R" B4 V4 @7 ?5 K3 @. Y
113 ]/ ?2 _. u" @3 w
12
! k- Q, ^8 F# `, S4 Z13
/ L: T0 n8 v9 q, a; ^/ D14: n: X  a' V7 ]
15) M7 T1 x5 B2 o2 N  e5 M
163 F$ a$ E' O' t# [! O3 W+ f
17/ F+ i8 q- Q1 f5 }& l
18/ [2 J. ^) }, X! Q* p- A( U( M
19
* H- ~: k6 J" H9 e: w  l0 d6 X3 [20! q  |$ p( O- F; l3 [
21; I. N' r3 @. w" B  l
22: U: e# ?8 S/ m# B5 `, Z
23
1 R9 M% f/ g+ M! J$ z2 X24# P; f  k% a8 m) c
25
4 G1 s, Y, R- l2 J26" L' `% C0 `# x! @, N
27( n- `; m8 l1 L  ~$ f$ h& Q
28
- C2 X1 j' M5 Y& Z  T# l29
% b' b* L0 h) u8 F& R% y1 J
Name:                                                                ==>软件包的名字,后续可以用%{name}来引用
( H+ X# ?9 k: F. ^" y" _Version:                                                        ==>软件版本- q/ T4 @! r# |; {: ]8 H# b
Release:        1%{?dist}                                ==>发布的序号* e; r  M% K# `# J
Summary:                                                        ==>软件包的摘要信息- I3 x  Q1 b1 K6 K" _+ V" [

, Z5 u2 |1 U1 ?" XGroup:                                                                ==>软件包的安装分类,参见/usr/share/doc/rpm-4.x.x/GROUPS这个文件) w9 e6 p2 w( [, q, P6 V3 O: i
License:                                                        ==>GPLv2,授权方式
, I! v) H+ |+ ?( F7 MURL:                                                                ==>这里本来写源码包的下载路径或者自己的博客地址或者公司网址之类,无实际用处
# p( K' W% D( ^3 ZSource0:                                                        ==>%{name}-%{version}.tar.gz源代码包的名称,这里的name和version就是前两行定义的值。如果有其他配置或脚本则依次用Source1、Source2等等往后增加即可。& B; D5 |6 s7 z" x
4 `% R/ A4 _2 T
BuildRequires:                                                ==>在本机编译rpm包时需要的辅助工具,以逗号分隔。假如,要求gcc的版本至少为4.4.2,则可以写成gcc >=4.2.2。
, ?" R$ y- q0 a0 h; ^$ cRequires:                                                        ==>编译好的rpm软件在其他机器上安装时,需要依赖的其他软件包,也以逗号分隔,有版本需求的可以
" E% j8 ?: P+ E9 @% z4 U7 r( [$ L8 ?# M: g1 C
%description                                                ==>软件包的详细说明信息,但最多只能有80个英文字符。( Q8 o+ x# A( S& I* {

5 d) J4 n% h% |%prep                                                                ==>读取位于 %_sourcedir 目录的源代码和 patch 。之后,解压源代码至 %_builddir 的子目录并应用所有 patch。
9 c* Y& E& B5 ?7 y8 K9 Z/ [%setup -q                                                        ==>使用这个语句实现%prep功能,仅能解压Source 或 patch 定义好的文件
1 {& R; A2 e1 B  Z* P: g! p( y2 r2 b* ~5 I
%build                                                                ==>编译位于 %_builddir 构建目录下的文件。通过执行类似 ./configure && make 的命令实现。
1 J) L: a3 n9 `" d) X" w%configure  F0 y7 R% p  \7 R/ C
make %{?_smp_mflags}* w7 s) q1 s: [9 h+ ~! O: \
, l1 X$ `' ~* T. S/ M
%install                                                        ==>读取位于 %_builddir 构建目录下的文件并将其安装至 %_buildrootdir 目录。这些文件就是用户安装 RPM 后,最终得到的文件。注意一个奇怪的地方: 最终安装目录 不是 构建目录。通过执行类似 make install 的命令实现。
* P# U& j7 |6 z8 e0 g% ~make install DESTDIR=%{buildroot}
$ y5 \, h0 h1 a8 f3 a( u5 h
+ ]5 }- C  P3 R9 Z; L# O%files                                                                ==>软件文件和目录
. D! X7 l6 J- C6 w: I! W%doc                                                                ==>软件说明文件
9 N" b/ b( b2 _9 q5 I" r
3 b2 ?& {0 |, x%changelog                                                        ==>更新说明,星号(*) 后面应该要以时间,修改者, email 与软体版本来作为说明, 减号(-) 后面则是你要作的详细说明啰
# o  }6 F# Q' g. A. h$ Y
1 q- \& S2 l2 ]# N: v% d5 c9 O
! n" U) J8 i3 s' f. h8 Q
除了以上这些,还是以下阶段:
  • %pre 在目标系统上安装软件包之前执行的Scriptlet。注意跟%prep的区别。
  • %post 在目标系统上安装软件包完成之后执行的Scriptlet。
  • %preun 在从目标系统卸载软件包之前执行的Scriptlet。
  • %postun 从目标系统卸载软件包完成之后执行的Scriptlet。+ \  l" n3 K8 U
以下介绍一下比较重要的阶段。
%prep阶段
这个阶段里主要完成对源代码包的解压和打补丁(如果有的话),而解压时最常见到的就是一句指令:%setup -q。这句指令可以成功执行的前提是你位于SOURCES目录下的源码包必须是name-version.tar.gz的格式才行,它还会完成后续阶段目录的切换和设置。如果在这个阶段你不用这条指令,那么后面每个阶段都要自己手动去改变相应的目录。
如果在%prep阶段,只使用了%setup这个宏变量,代表了会运行以下操作(假设Source为cdplayer-1.0.tgz):
复制
1
2 l$ S$ ^4 @- S! p3 G( [2
7 x" H7 {9 @9 \3
4 n% f2 ~* G: G3 E4
8 a2 P# O+ E( j8 V: X5 H57 f& P' e/ I7 \" `8 [) A
6; B( }& [/ w+ \) b, ^
7& O/ J# m. @! t) Q" N: n
8- b4 e7 m1 s4 L" b
9
& h5 O/ l1 x$ T. s10  {4 ]! K* h+ {
cd /usr/src/redhat/BUILD9 F2 ^* |; D  V) v
rm -rf cdplayer-1.0# r6 ?& A$ e0 l
gzip -dc /usr/src/redhat/SOURCES/cdplayer-1.0.tgz | tar -xvvf -2 G. r7 Z- x6 g8 p0 g; Z/ [, L
if [ $? -ne 0 ]; then
3 V7 w( f! H6 q) j' k' T) `  exit $?
; M  S/ T  ?2 N6 \1 L$ Tfi
& C5 V/ e0 p8 A( v& n- u/ }& [' }cd cdplayer-1.0
8 P* D8 F, J2 x# a$ I) ncd /usr/src/redhat/BUILD/cdplayer-1.0- q. A6 Q& _0 m( x
chown -R root.root .
! W% i/ [" I! tchmod -R a+rX,g-w,o-w .
/ W$ X# ?2 W; @4 N9 q$ `1 h( s; e

- F- I2 p: h. }6 i) N) ^

9 K4 x4 y+ a, V
可以看到,默认操作为先进入BUILD目录,然后再删除%{name}-%{version},再解压,最后再修改权限、属主等。参数-q是指不输出运行的过程,还有其他参数如下:
复制
1
; q8 F7 r- g' c5 w3 R  ?2# n0 E2 _* j5 ?; V; P1 D
3; X5 s( T" r2 O; ^) ?7 b' C
4: V5 S% Q3 F# k- L! n0 q
5
" u5 p  {4 [8 _/ m/ [6
2 d# c- d- J- t/ i7
( E$ Z- u' [* q% ~+ F7 U8/ t6 V# V5 S8 ^' r
9: s5 g& l+ @( @0 V/ t+ P8 `; X
10
) L% s7 D( `3 h( I6 v6 H% `11
, S6 v  v5 z9 q! ~0 @! R- r3 C( `12: R) o3 Z1 x& L& p1 C" |5 e
13
  s* J! L$ T) e, ~; `' K" I* G$ V14
4 W% }. i& Z; o' ]8 G9 i: N% R15! S+ G1 s( p) G! Q4 M8 ~' W6 r
16
& ]7 ?# ^- I4 |, R9 D17
; |1 W. ?8 [, d1 \' T1 W1 v+ O! t; Q18( c3 b# }" l6 U+ g+ i
19! k5 Q3 i9 {" T( f: L( G! S; {
20! r9 _3 R6 k$ I( u' |2 G: |
%setup -n newdir 先删除/usr/src/redhat/BUILD/newdir目录,然后将软件包解压在newdir目录;再进行这个目录进行权限设置
3 E% f8 Z6 Q0 Z. G9 k8 M%setup -c 先创建目录,进入这个目录后再解压。与不加参数的%setup比较,仅仅是多了mkdir 以及 cd 这2个命令. _' o% S* c# A$ T  g8 n
%setup -D 解压缩时,不会去删除目录。与不加参数的%setup比较,少了rm -rf操作
" I! }/ r7 I( ]9 n$ z/ b3 |5 l! m& y7 {%setup -T 不进行解压的操作。与不加参数的%setup比较,少了gzip以及if判断语句
6 P! |: m$ y, v1 {" N
" O( ^' G$ X! X& g%setup -b num 将第num个source文件解压缩。如果是 %setup -b 0,就会解压2次,可以使用 %setup -T -b 0,这样就只会解压一次了。但只效果跟 %setup 不加参数的效果是一样的。
; g6 E% w) g7 E- E%setup -T -a num 先进入目录再解压第num个source文件7 [3 e  Y2 F$ M" k$ `% ]# ^
; r) \* J- C( _5 Y/ q/ @$ T6 P
; T1 o' r0 v4 g2 @2 w0 n3 V* D
%patch 最简单的补丁方式,自动指定patch level。) _2 T, W9 T  A  d  }" i& d8 S0 a
%patch 0 使用第0个补丁文件,相当于%patch ?p 0。
# R8 ~. t) @/ q- p8 h1 d& a%patch -s 不显示打补丁时的信息。( O( n- }+ C! W1 x7 h1 y; T
%patch -T 将所有打补丁时产生的输出文件删除。5 t, S& u- L  w7 P  r5 C, y* X
*************************************/+ X( }3 m' D. G# D: Y# ^
%setup -q -n %{name}-%{version}
: O4 s! W7 T7 L( i3 o$ i( T$ X+ n- _0 o
/* 如果原来只有一个“Patch:”,您增加“Patch1:”,则在SPEC文件%setup行后面的
3 Q% n$ o4 ]0 V9 H   %patch -p1后面新增一行: %patch1 -p1 依此类推.
6 I6 I' z. E$ {; E! A; F */
0 o7 I& L# F- i8 o4 p5 ^" n%patch0 -p1
5 @  J7 i! A' x$ l9 k% G

" \  \, i0 C: d: t% A, e- n
0 j, ?5 h' ~& B8 e9 Q( L1 j* D
实例,如果%prep的内容如下:
复制
1
5 ~" n8 b6 R/ @: n7 ~: I2
. e" p- M$ P. E) Y3
9 {0 e' A- G* }: E# b4# p* m" `3 Z: P7 Y/ F# _
%prep
, B) _+ ]6 V/ S% z1 U" U) `  f% J%setup' Q% T+ W, Z0 F. T& e
%setup -T -D -a 14% O; v. \  z3 W/ P( Y) O
%setup -T -D -a 15
$ E1 H' y& ^! D

* U. ^( `2 l/ ]' F, Z

4 l! s3 y. V# `" P
其运行的过程如下:
复制
1. ]+ q7 {' P, b% r
2+ P6 I3 z$ Q& `1 C
3
4 i/ P3 w. E  v: }) D4 d; c4
3 |, f( C5 Y9 w7 p' z7 l5
. @4 \0 U$ z+ n/ w/ J; a62 m$ c4 s' N& F, e
79 }' L. C" j( j# l" p: q
8, [: k* d+ o& t8 C7 \
9
3 ?( p0 A5 R( U9 i& R10
: @; s9 `4 v- n+ C! N  J119 J- d! [2 j( o6 ~8 _
127 L0 J0 W+ K3 J2 }
134 C3 P/ ^! n, K) Y& X
14
: d1 Y1 f. n# \7 M. T15) |( H' J3 O$ S  y6 i3 I
16. K( P  u$ n# p* s' ^% j
17
9 b0 d  p1 H+ y+ e  n3 \# G  `3 n18
* i5 A5 l7 X- t3 H6 C19
; p9 E3 k1 |/ ~20
$ f+ |: ~/ p7 `& O* H21
. _+ p* r' O7 c, r22
& M$ w0 b( F9 r' [7 Q5 J# i23
+ Q+ G7 E  M% f  q7 d* {1 D! x2 L24$ k/ \$ _) w6 l9 l8 }% |
25% H6 L2 }4 G. G+ |2 G
26( x% M% {1 ?' j7 d, h: i# p" N
[root@localhost SPECS]# rpmbuild -bb nginx.spec8 c6 K* G% z! J7 A$ i
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.N1Tdpo
8 Z7 T# [5 T+ S  m, a8 F+ umask 022
; j. e) ^) m/ J6 o8 W) t, v/ N8 h+ cd /root/rpmbuild/BUILD
7 f& I5 y- k0 K  G+ cd /root/rpmbuild/BUILD. ?4 W$ O# @# q9 ]
+ rm -rf nginx-1.16.1
8 V9 W( }: v5 c4 V- Q2 A+ /usr/bin/tar -xvvf -! H: y& P4 C; I' _( M
+ /usr/bin/gzip -dc /root/rpmbuild/SOURCES/nginx-1.16.1.tar.gz" u, E' b' e& c9 H+ Z) v& k
...
* C  O/ u0 Y( g7 p+ STATUS=0
, v% g* y0 U4 q# N' t) T& l+ '[' 0 -ne 0 ']'
1 K4 j0 L0 h3 ]$ a* X6 o+ cd nginx-1.16.1
( R+ l- X, U- T; p' N- x) ~+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .9 i0 Z- F# D. E# v; ^: N. T
+ cd /root/rpmbuild/BUILD0 ?5 X, U0 |$ I) T
+ cd nginx-1.16.1
' ^1 p# {: V9 T4 K! h+ /usr/bin/tar -xvvf -% N# I( w. e) C# N7 |
+ /usr/bin/gzip -dc /root/rpmbuild/SOURCES/nginx-http-concat.tar.gz3 ?- T" B+ U4 Q; s% D3 t5 v; p" w
...
* n' Q/ j5 n- J+ STATUS=0
/ H+ ?2 H8 a: [4 t; h. j# c/ N8 u+ '[' 0 -ne 0 ']'
1 X: `+ R6 ?/ r, f+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .$ K4 v7 A& j/ W$ l4 k8 V- w% j
+ cd /root/rpmbuild/BUILD/ X, Q1 }) t/ p, g0 T: v
+ cd nginx-1.16.1
1 \8 b3 _2 `1 u% C7 r+ /usr/bin/tar -xvvf -
* s" I1 E) v' O$ Z' R+ /usr/bin/gzip -dc /root/rpmbuild/SOURCES/ngx_cache_purge.tar.gz
$ e" b& c3 _+ G+ [0 t7 l6 u...
8 h8 j8 z' m4 D4 T' V; `
% M% u7 y2 i; \4 C1 Y1 m& L
. [- N7 F( d  z# _+ |
需要注意的是,%setup -q 是指解压不输出任何提示消息,只会解压source0的文件,即第0个source文件。%setup -T -a num 先进入目录再解压第num个source文件,进入目录的意思是进入%{name}-%{version}这个目录,即spec前面定义好的Name以及Version。
2 p0 s2 S3 d, @) |
1 h' X& z& f+ ?0 r. h9 U
%build阶段
这个阶段就是执行常见的configure和make操作,如果有些软件需要最先执行bootstrap之类的,可以放在configure之前来做。这个阶段我们最常见只有两条指令:
复制
1
5 c5 q4 L( t# F+ Z8 W, h2
3 \9 P& w0 S# a2 Z- i! ~+ u( O
%configure; E# A% k6 p; z* s) r. h# \
make %{?_smp_mflags}
% P" S+ O! s3 D) Y( X1 P$ g

# f6 }. W( P" V
, [% I; N: I  Y4 _, O" w5 e3 _
这里的%configure是个宏常量,会自动将prefix设置成/usr。另外,这个宏还可以接受额外的参数,如果某些软件有某些高级特性需要开启,可以通过给%configure宏传参数来开启。如果不用 %configure这个宏的话,就需要完全手动指定configure时的配置参数了。同样地,我们也可以给make传递额外的参数,例如: make %{?_smp_mflags} CFLAGS="" …
%install阶段
这个阶段就是执行make install操作。这个阶段会在%_buildrootdir目录里建好目录结构,然后将需要打包到rpm软件包里的文件从%_builddir里拷贝到%_buildrootdir里对应的目录里。这个阶段最常见的两条指令是:
复制
10 z2 j1 z$ g- v
2( M8 ?8 _( ~$ Q* E2 Y# ~
rm -rf $RPM_BUILD_ROOT) f4 O9 ?: f# x1 u& {* V
make install DESTDIR=$RPM_BUILD_ROOT
" R( w* ~: R* B3 S" E& O! ?
" |1 q+ s! m& A* E) N
) k1 {* u' p9 c( @# I# P
其中$RPM_BUILD_ROOT也可以换成我们前面定义的BuildRoot变量,不过要写成%{buildroot}才可以,必须全部用小写,不然要报错。
如果软件有配置文件或者额外的启动脚本之类,就要手动用copy命令或者install命令你给将它也拷贝到%{buildroot}相应的目录里。用copy命令时如果目录不存在要手动建立,不然也会报错,所以推荐用install命令。
制作rpm软件包的阶段
这个阶段必须引出下面一个叫做%files的阶段。它主要用来说明会将%{buildroot}目录下的哪些文件和目录最终打包到rpm包里。
复制
1
" H8 g; `: g- e$ G2' L- \% W& ^8 |6 O9 \2 J
36 Q2 `! o- u- C* t& |
%files
3 o9 D. J+ _5 I" f, m4 @5 `%defattr(-,root,root,-)( ?7 V( h# [" f% }
%doc" v. }9 T. x2 D% y) V; U5 v; h7 K
0 `/ j3 y  l1 |; R) F
' T7 ^* I3 _$ W% ]9 p/ C
%defattr 表示的意思是: %defattr(文件权限,用户名,组名,目录权限) ,如果不牵扯到文件、目录权限的改变则一般用%defattr(-,root,root,-)这条指令来为其设置缺省权限。
关于%files阶段有两个特性要牢记:
  • %{buildroot}里的所有文件都要明确被指定是否要被打包到rpm里。什么意思呢?假如,%{buildroot}目录下有4个目录a、b、c和d,在%files里仅指定a和b要打包到rpm里,如果不把c和d用exclude声明是要报错的;
  • 如果声明了%{buildroot}里不存在的文件或者目录也会报错。
    . }. B3 m# p1 ?" N
代表路径的宏列表
如果您看到一个不熟悉的宏,您可以使用rpm --showrc 或者 rpm --eval %{_bindir}以下方法对其进行查看:
1 Y# F: ~+ R4 S4 O4 X' |0 |9 w
复制
1
. ^+ D  y$ M, X* `2. Y) u( A: h, @7 B
3
" ~$ E5 f# S0 J" O4
/ R# {9 y5 D, r, H5, ~; o+ }' O( S$ _; X
6( L- e; L4 W$ R5 y$ F# S% A
$ rpm --eval %{_bindir}% Z. ~, x( s* m$ p
/usr/bin) E2 Q+ [. _9 C0 q0 {: V9 S3 w
! }) `( m0 ?5 a* b- I9 ^
[root@localhost noarch]# rpm --showrc |grep buildrootdir
. O5 \! ^# S2 h  ^" K2 v-14: _buildrootdir        %{_topdir}/BUILDROOT4 ^, f# Z" J8 N2 G0 \5 K: {
-14: buildroot        %{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch}
7 Q  u! B2 T# v" i$ I3 p: y5 S, V6 {
! T) \& m0 J' `1 `

: t; ]. m. n: \' N4 ?# P8 ], j. g( p  u! i% Z  ?
也可以直接查看/usr/lib/rpm/macros文件,以下是常见的宏:
复制
1
& w$ _) u" b. X2 I" v. N2
- I! ?, {! [7 q1 D# c# r3
7 ?6 H6 j( g% A: T2 [; s2 d: w+ n0 E3 t8 Y4
. U2 O( l8 f) i5' h: U6 x! A  i5 }" d/ W' F
6
# U; M0 _2 e! ]+ d; Y, K6 c7' T7 ^3 l7 ^# G
87 H1 G6 [, U$ B) l
9
5 I7 C6 O7 G$ b: @/ P10
' J8 W) p3 v; V11
; \/ F& `5 B/ O! p/ [6 d1 e12" _+ R; d9 S- `1 @
13% D' v0 n1 X/ O
14. |0 i8 ]$ @$ \4 V8 _4 X
15/ m2 T  [5 B# b8 Q& H: A( o1 q
16
/ b4 B0 b- ^$ t7 {7 t17
+ W' {$ I) E+ |7 Z0 `4 l18
( h6 ~9 B1 l& M# R19
& u  f/ H1 Y; x' n2 k; G6 o20
; p3 q  W4 I7 ~6 v9 ~& Y7 Z, P! u21
" c+ j9 N& s; K$ s& ?22
) O9 Q3 [% J9 s( u* L23
* N' H0 K$ l0 c7 F
%{_sysconfdir}        /etc
1 }6 w7 [' l1 P%{_prefix}            /usr
. Z% x4 U; l5 J% J%{_exec_prefix}       %{_prefix}6 j2 c6 J: i4 z% M: `7 I
%{_bindir}            %{_exec_prefix}/bin
! \$ G* `, s, E/ l%{_libdir}            %{_exec_prefix}/%{_lib}
" X& c0 B4 n6 X& d%{_libexecdir}        %{_exec_prefix}/libexec- b7 F3 o9 f; h3 Z, ]' R, K
%{_sbindir}           %{_exec_prefix}/sbin0 z# p! |& n) J2 L
%{_sharedstatedir}    /var/lib
. f4 d4 }0 B2 H1 _% N; `* `5 n%{_datarootdir}       %{_prefix}/share
0 S& C/ v' s. T/ O%{_datadir}           %{_datarootdir}+ M2 Y& q+ U' o1 @
%{_includedir}        %{_prefix}/include
. b. d. S+ w* o* Z# }%{_infodir}           /usr/share/info
$ J3 ?# H' D" v7 }. u%{_mandir}            /usr/share/man( i( r9 ?7 e) H9 V8 R9 m0 y
%{_localstatedir}     /var2 L5 ~5 }* [. \8 b
%{_initddir}          %{_sysconfdir}/rc.d/init.d
! i7 H( J9 ~) w# `) k' Z7 m%{_var}               /var
. W9 {# Q2 `) `! n- f%{_tmppath}           %{_var}/tmp4 Q1 e' y8 i3 c4 t8 @0 A. _: ^7 ^/ ~, l
%{_usr}               /usr
. |$ @% z# R4 n# P5 M) p7 c+ K%{_usrsrc}            %{_usr}/src
3 ?- V- K& L& ^) G3 e% D%{_lib}               lib (lib64 on 64bit multilib systems)
; Q2 t  |1 q7 a%{_docdir}            %{_datadir}/doc
' i& z' d1 r3 V! j  v& k%{buildroot}          %{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch}$ g3 Z2 \7 l* s- C
$RPM_BUILD_ROOT       %{buildroot}0 B5 n+ d6 B8 }8 x$ b  `
, p/ I* C0 X( y& p7 B2 o7 t* A

( K6 P3 \# A  ]8 Q+ ?1 j& ?3 E要注意的是%{buildroot} 跟%{_buildrootdir}不同。%{_buildrootdir}对应的目录是~/rpmbuild/BUILDROOT;而%{buildroot}是%{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch},有关其他内容可以参考 https://fedoraproject.org/wiki/Packaging:RPMMacros?rd=Packaging/RPMMacros#RPM_directory_macros
2 D2 R, W9 l% `* c5 W1 A

$ i4 ?4 ]; J+ A1 S: V* R8 G- O实例1:打包shell
可以把一个平时写的一个脚本打包成一个rpm包,spec文件如下:
复制
1- P4 I1 g" A2 j( u  }+ J
2: w$ F, x/ Z, F. {& A3 q
34 R' L. k9 `' j; \) B
4
/ p/ r* j3 N: X3 w5 m/ N. W57 X+ t7 C$ V# \6 E& J. W/ h
6
" i2 r! d7 o5 H1 H8 g+ P/ C7* s- e" B6 d9 _) m% O# ?
8
& X/ S& r- |1 j6 D- a' i) d9) F. r) b# l( Z7 K, M
10. n' G. M+ J* ?, J
11( {$ Y6 h7 e% ^: ]7 x8 d
12
/ C$ S, C# h9 m6 S13
; _) [2 m/ @& S: J14* g2 R  a7 j% J/ K
15
, A1 Y6 v+ d# Z0 N& E# I162 y2 X4 P+ i2 x& J5 J
171 g  c6 i$ F4 a( ?
18
' I- F0 ~: ?4 k19
. F/ p( l$ F$ h2 ^20
( q4 {' V6 T& `! l, t# l3 J  ~21
4 `" H$ A3 E% ]. B2 p1 r1 W& F4 a# u22% [2 d& F" r3 }. G# J6 h
23- z0 O5 Y# \& ^8 W
24
: G3 H. P8 L' q) D! \# S4 B256 U0 ]: M- [$ U. ?" e4 k2 W
26: _0 E+ }: o# ~0 W5 Z5 F, y4 K
279 L2 g% a$ M* }3 W2 t
28
- J0 U( @( a2 r; e29
8 d9 O1 N3 R9 }' e! V3 t9 j
[root@localhost SPECS]# cat disk.spec
0 ~# W3 n2 w4 }0 `# ?  v) EName:                showdiskinfo
$ Z9 w7 z: r" k9 x: _; `; P4 rVersion:        1.0* K* d" R/ m! K$ d4 {
Release:        1%{?dist}
4 _& C# `8 n- V: v0 X. d: s6 JSummary:        Show Raid and Disk info. {& a% k, P5 ]& T1 ]( L3 c
License:        GPL
% p6 v- B. d1 }8 c, C# Y' jURL:                http://www.wumingx.cn( A" r5 F+ P& O. Y7 L
Source0:        showdiskinfo.sh
( p7 v# z$ v3 A7 D" Y" A; e# V5 G' a. _) h8 s- e! u/ \! I
#BuildRequires:
4 T& d3 a1 N# I0 q" s4 t+ J$ X, E* zRequires:       bash, j, w4 U) v- q
( ^1 i* _! B6 c9 e! a% @
%description5 r. Q* E2 m) n2 w# F* H" w
showdiskinfo shell script.
% r  C+ Q, v; S- K4 Q5 `" A6 N/ T% j$ ]! \
%prep- H4 @) n. @+ ?7 m- H* K8 T% A9 [
#%setup -q* M; Z/ C% s: [5 O, W) A6 v8 T

1 i% i4 Z5 Q5 K; k%build
2 ^/ ]7 z( }9 s, e1 acp %_sourcedir/showdiskinfo.sh %_builddir/showdiskinfo1 @) \7 K" {0 q0 @7 u  J) ~" g
& `5 _- W8 p+ F7 P7 ^6 ]" H
%install) P- p1 E, i$ @3 _
mkdir -p %{buildroot}/usr/local/bin
( E2 D2 w$ p7 _# F1 Tinstall -m 755 showdiskinfo %{buildroot}/usr/local/bin& o8 ]& N, E: C

+ ~6 C, f& p8 ?& C%files9 Y% u6 q1 C& _5 W
/usr/local/bin/showdiskinfo
2 i/ C. e+ ]4 M8 P: K% z! o%doc
6 H/ n/ Y" _0 R%changelog
9 o* D6 m; `1 z1 J/ e. y# ~2 L3 Z
7 `; w& I* `9 A3 h7 {5 B

4 \  M# T7 o4 [' M. J
开始编译:
复制
1. T* ]6 i3 A* M$ g( G$ H
29 }! t0 [  p* w: Q6 W
3( X5 f2 p# c) W: k
4( A7 l% A: L9 g3 I# _! [: h
5
3 [$ }8 y- p% K6
7 X! t1 m$ k  D. t/ {; S+ S7
1 |4 X8 ]( h  u- _  s8
7 q3 W* c0 z/ ?( x9
& d0 k3 m/ h. }7 z4 ~% C10
, W$ Y. @6 t+ m. n! U; T11
6 K% W7 H# a5 o, O" ^12. _1 M( P' t# E, v# C* Q: l
13
! X+ K5 D9 I, z/ u( U6 M5 c14+ H) ?  c- O+ |* S9 K1 g
15* O+ O) q2 ]0 @, V4 _4 S
166 T$ e( y# s7 v3 B( U1 R( S
17+ [. _# w" r* [+ i& d  f1 \, P; I0 J! N
185 D7 {' T* I5 s! \& O
195 `! Y* S3 u- y3 B9 q2 W
20
4 Y( Y: j2 ^) R9 E9 H21
! l( o% l9 k/ s8 b22
6 h4 Y' f6 ~( U1 f# y23
5 H, X3 m1 D# T( b9 n, f24" j0 V- k  l. F3 c! R9 x% D
25
! `- |% r8 E* [& Z26
0 y; A' o( }9 g& a% E279 _% y* ~# U5 V; A( a
28
# m/ ]3 T2 U1 a- w" p: h( v0 `9 |29
6 E3 |  V7 s. g9 @3 @7 q) f30; x5 v# t! |: g* h' b
31! e. Y3 w5 `1 D+ @1 d: ~. `
32
9 r8 {& [' ]# x$ A8 `6 X3 a6 x33
+ Z, s5 o/ }6 Q) Q34$ P4 M- g6 E- B* l) S
35) C, Q- [# W, t* V& c2 h  i/ ]( D
36
7 R" H& p  f  q' R# G37& g9 B: g' m. N. k" y
384 e6 f1 N* v' u/ m
39& \( d! {3 r" \
[root@localhost SPECS]# rpmbuild -bb disk.spec
  c( x- T5 M4 }2 J" FExecuting(%prep): /bin/sh -e /var/tmp/rpm-tmp.agda2b$ R- k$ j4 A3 Z; E6 A! s# X
+ umask 0227 \5 W, ~7 k1 E% V" m
+ cd /root/rpmbuild/BUILD) z- a1 ~2 U4 P' j4 L
+ exit 0
% c+ f0 Y0 j3 ~6 r( v: V& W7 aExecuting(%build): /bin/sh -e /var/tmp/rpm-tmp.spexQx. l- G: n# o4 o0 R
+ umask 022* I  P0 k' d* e9 s* d) e# z
+ cd /root/rpmbuild/BUILD
% d% R" n( C& b8 t" S$ s- ?+ cp /root/rpmbuild/SOURCES/showdiskinfo.sh /root/rpmbuild/BUILD/showdiskinfo: g4 z" L" a  @
+ exit 0
' f, }' n- g$ t) f) r9 R' ~2 lExecuting(%install): /bin/sh -e /var/tmp/rpm-tmp.grcfHT9 ~) Y! K" Q0 s
+ umask 022' M0 w! m7 f2 p8 E" t
+ cd /root/rpmbuild/BUILD. C7 G8 g" T3 J
+ '[' /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64 '!=' / ']'
, I) S7 v8 M, ^  g& c+ rm -rf /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64
; s% x0 k7 H: ]& d9 P: `++ dirname /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64
/ W; Y+ d: V' |4 Z- z, n1 q+ mkdir -p /root/rpmbuild/BUILDROOT
. P# B$ b0 x% |- ]- u7 \0 J+ w* j+ mkdir /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64
% a! k1 ~+ `3 g$ ?# M0 V+ mkdir -p /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64/usr/local/bin
! f5 q3 T: O; \  C0 U9 l+ install -m 755 showdiskinfo /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64/usr/local/bin
( z  A& Z. G2 u+ /usr/lib/rpm/check-buildroot: t6 e( I* }2 Y; C6 x) H
+ /usr/lib/rpm/redhat/brp-compress
0 A3 ^, _9 B( W  z( @/ z. z+ /usr/lib/rpm/redhat/brp-strip /usr/bin/strip
7 A3 i2 J$ \3 e+ {' b% w+ /usr/lib/rpm/redhat/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump# n: c# j4 I: ]$ Q8 d4 R3 f
+ /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip
% d4 z' e: k/ g; ^+ /usr/lib/rpm/brp-python-bytecompile /usr/bin/python 1
# r) f0 C4 P0 l" f' @+ /usr/lib/rpm/redhat/brp-python-hardlink
; R: i: }( e% D$ ]3 q& x! v+ /usr/lib/rpm/redhat/brp-java-repack-jars
$ N6 n0 V9 J* S+ Y# PProcessing files: showdiskinfo-1.0-1.el7.x86_64- W1 a  C) r9 F! }
Provides: showdiskinfo = 1.0-1.el7 showdiskinfo(x86-64) = 1.0-1.el7
0 e) K) W$ N- R9 m+ A4 \Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
& ?: \, X( q& X4 ^( x* FRequires: /bin/bash" j0 p! K- \# {8 A
Checking for unpackaged file(s): /usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64
* @/ ]& d3 r/ |' [Wrote: /root/rpmbuild/RPMS/x86_64/showdiskinfo-1.0-1.el7.x86_64.rpm
0 E6 U; N, Z9 SExecuting(%clean): /bin/sh -e /var/tmp/rpm-tmp.4uHq3D
& U$ B! p9 m; c+ k6 K, r+ umask 022
& b3 ]) f' O1 y9 k; [/ I/ ^+ cd /root/rpmbuild/BUILD
0 K4 m5 ~6 X1 j, |- B+ /usr/bin/rm -rf /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64
6 _+ c. V3 ~; i, L% U7 H3 j+ exit 0$ e! u' p1 M6 j& Y" `6 c9 v
: i) z. |# _  U7 S' ~; j9 g) }
" U! |, \$ R' O2 \
可以看到编译成功了,文件保存在Wrote: /root/rpmbuild/RPMS/x86_64/showdiskinfo-1.0-1.el7.x86_64.rpm下,开始查看:
复制
1% V. k2 z6 i3 ?) U) w* G6 `
2, D! y! a5 ?7 A$ G
3" x8 b/ L5 ]6 g7 ?
4
3 A% J: h( M  u- Q0 x6 d58 H8 w) L6 u9 x3 P( B% T
6# p: s; t* o# q7 i0 G# }+ _2 w
7
, }" L+ ?7 f+ h" X8
( l( R' G  N" J9
+ M9 @* `+ \2 }# J+ }10! k6 B  w1 t8 W5 ?
11
' m! s. W6 y. S5 \/ N8 Y12
  @! n  s& n* [3 c- N6 K13
/ c" x+ M8 f2 x9 g# Z* n1 |9 ]14
: ^$ ]! A2 A- K" r$ _+ A15; s4 Y% S8 p; {2 V3 }% u; B1 D
16
1 y/ D4 L) o. Z) s( s  N17" A* x" R& ]8 m3 Q& E
18
! `/ ?, G5 B) d! ^4 R19
; R$ b9 o- D9 |& r) V5 @! n# `20
* M, D7 t6 P( U21
" D0 F) ]! f# R. A7 _( g+ Q# b/ B3 \22
) t7 V$ Z& M/ s/ D( y0 T# O23
& Z# K& D9 ]6 U4 Q2 Y24
, ~- X% P' ]0 ?25
. a+ ?  @) L, e  l; j7 o+ f: I26
- o" f- q2 I# a4 s* S* v4 G# J, U274 k0 M0 v4 y7 `- [3 W* v
28
4 A& O1 S3 X/ Z! Q4 F/ Y29  s' E2 I9 \5 h. }  l; \; D  i
30
5 J& ^, h/ H( r. ^$ ]' e  k31+ {* `# p* e) s$ c7 E
[root@localhost SPECS]# cd ../RPMS/x86_64/
4 \" q0 {; M  g  X8 J[root@localhost x86_64]# rpm -qpi showdiskinfo-1.0-1.el7.x86_64.rpm
8 V$ b# p0 I  P2 XName        : showdiskinfo
5 I  x$ D( F8 w! Z5 P: @) z: YVersion     : 1.0! F" G% d8 M& `- G% Z8 Y$ p
Release     : 1.el7# h, H: |- C1 _. D9 U
Architecture: x86_64; \9 p6 X  k' I' E. c
Install Date: (not installed)4 E2 y+ P* l# L+ |: ^
Group       : Unspecified
( a8 O7 i$ j. v( g1 n7 O6 c% ~) O# NSize        : 383902 B" D/ Y6 a+ G) x/ t( C
License     : GPL8 J/ D( ]4 \( R5 c
Signature   : (none)% Z7 V2 `+ P1 {/ a
Source RPM  : showdiskinfo-1.0-1.el7.src.rpm0 H& C# N+ y* E# z" j, j
Build Date  : Fri 08 Mar 2019 06:41:42 PM EST
4 d' k0 n" K4 ]& p/ _# XBuild Host  : localhost, {3 E* L) P# B" x! i
Relocations : (not relocatable)7 T/ d! [' A6 L* c
URL         : http://www.wumingx.cn
! F8 B" p8 b( U2 ~4 iSummary     : Show Raid and Disk info) g. b4 Y& @% H0 j9 a
Description :
! n$ W; a( V. {- {  ^showdiskinfo shell script.
* j" V& A, ^  ]5 e$ M[root@localhost x86_64]# rpm -qpl showdiskinfo-1.0-1.el7.x86_64.rpm! n1 U% A% ^# K; I8 R7 ?
/usr/local/bin/showdiskinfo! Q3 J& b+ W" b# ~. J
#开始安装
: d& B3 k4 V) k  P! ]$ A2 S1 v[root@localhost x86_64]# rpm -ivh showdiskinfo-1.0-1.el7.x86_64.rpm: v: {. t  U& f
Preparing...                          ################################# [100%]* Z+ Y# o! f2 _
Updating / installing...
$ o$ m1 R5 B' w   1:showdiskinfo-1.0-1.el7           ################################# [100%]/ [3 @, `" H; @1 J2 F
[root@localhost x86_64]# ll /usr/local/bin/
1 r8 r4 M& n7 y% {total 40
2 V3 A$ a$ e) a! c8 M) ]9 M6 f$ a-rwxr-xr-x. 1 root root 38390 Mar  8 18:41 showdiskinfo
9 @3 |- @+ n# K  R* k[root@localhost x86_64]# showdiskinfo0 L9 L, b0 y! ^* F
no raid
% j* c' V, W4 W9 |# |3 i

# ~1 ^6 H4 I& B4 H3 E" m
0 U9 D3 X# p$ `6 t9 Q* \
此内容参考了 https://rpm-packaging-guide.github.io/#hello-world ,可以阅读原版。
实例2:打包main
此代码来源鸟哥私房菜,先来处理原始码的部份:
复制
18 C/ L# D7 z' e1 N1 ^+ m2 ~$ Q" ^/ v
20 x8 \7 q. Z% K6 t# }
3( n4 G8 y2 [! r4 T  |
4. w  S# B0 m( i, A, U/ e5 R2 ?
52 c' w* G8 d( E8 r* n
68 t4 _# F; e' v2 b6 R
[root@study ~]# cd /root/rpmbuild/SOURCES & v# Y" d3 c6 ?. e; B% \
[root@study SOURCES]# wget http://linux.vbird.org/linux_basic/0520source/main-0.1.tgz
# S0 u8 j+ p) i6 U; p[root@study SOURCES]# wget http ://linux.vbird.org/linux_basic/0520source/main_0.1_to_0.2.patch $ |( Q, D2 g8 B2 t6 v: O! X2 H+ Y2 P
[root@study SOURCES]# ll main*
1 l; F: B0 D; @: J-rw-r--r--. 1 root root 703 Sep 4 14:47 main-0.1.tgz
* C; d2 }; q  g8 J8 L% ]-rw-r--r--. 1 root root 1538 Sep 4 14:51 main_0.1_to_0.2.patch
9 o& |5 u* U1 H) X4 }* o" [% i
, U7 X- u/ f3 x1 U, G

+ S/ H# ]# y( |' e
到SPECS目录下创建main.spec文件,建议使用vim创建,会自动生成格式。也可以用rpmdev-newspec -o Name-version.spec命令来生成SPEC文件的模板
复制
1& {% y/ [% q, M  Z4 \
2
' m3 {3 Z( }; \  P6 _3
, e9 m* {7 c% ]' \; x$ i4
) E3 ^" f/ W! m6 {  ~/ r5
# z6 ^  }) M: F6
5 V) W. U' a8 Q- {3 F9 `8 E7$ b, ]$ ~  O6 J! D* }! G) H- c$ k
8
$ A" `+ n# @7 b% Z9
' Q' a; L4 O- }: s2 d10+ B# r+ y- N' G9 R# B4 ?
11% c$ [1 {7 c; L7 h* ~2 p: k. A
124 Z% v7 I$ T+ N0 q: s8 Z+ L. O) p
130 H# `5 Y* q8 r* P3 q$ o0 {
14
: q; C  v! Z$ y( u1 C8 Z5 M158 }9 t. }0 T7 c6 h9 P9 o
16
; x  Z5 J$ C2 j; j3 a9 N172 k( M; C2 K' m. e
18, ~) M8 O; W9 I5 q1 m. k% @
19) G: {3 @& x9 N
20
- i5 V: }0 i1 I5 K: Q; W% ~0 W214 k) A6 Y& F* R
22* w( z$ B5 J+ @3 [6 R! d$ Z, i: s
23
4 n2 d) g4 T+ r2 Y% ~242 u# [2 M; j5 g- s/ t
25/ @/ C- q- \; D7 _& O8 ]- j
26
$ H$ r) `( C7 k27. w3 H8 V8 S. Y& s% |4 p
28
% a: R$ A0 ^% K2 i8 A: j7 p29
/ s" J; i% ?- |- }1 p2 o$ d6 [30
( w" y$ W  I4 G1 Y1 g1 c. Z315 T; n. l. o/ X; b
32$ W, x8 f0 t, P
33
3 B4 o. ~+ A, F& o, }34
0 o+ k0 A( C3 U( W( o35$ d2 [7 l" n( d6 y# I/ l' |
36" i' y/ t$ L0 ]2 V
[root@localhost SPECS]# cat main.spec6 n# p, P' ^* [& L
Name:                main* }# A0 [3 j" }" z2 O. p
Version:        0.1
. K$ h; ?* d( x' m4 ?) y3 MRelease:        1%{?dist}
) \1 l2 w) [* w( n4 BSummary:        Shows sin and cos value8 w1 O  c& L/ l7 s9 [

1 C7 _4 ~4 D, H3 q- pGroup:                Scientific Support
. _+ l- a- V1 {( t2 i$ VLicense:        GPLv2
3 K4 k3 v5 C, ?; W) L+ |0 b% oURL:                http://www.fangdm.com/
5 t2 \2 x$ L" p  ~. W9 bSource0:        main-0.1.tgz
8 C% c" J0 p5 v2 lPatch0:                main_0.1_to_0.2.patch1 j5 W: H  {: R+ ?
8 T' I7 A5 W1 |+ n
#BuildRequires:
* B3 W4 W5 [5 s4 g#Requires:7 G# H9 i0 S0 K1 R+ h

, N* s' b% z, ~7 K$ F/ ?& t7 c%description
# U+ ?2 e; J; K+ k: K' \$ y1 NThis package will let you input your name and calculate sin cos value./ R2 n& }6 w1 c! S3 w
1 M6 z1 a8 v  G& J
%prep
; a: N0 L& ?/ o* Z+ u%setup -q
! r; u1 N" X, d4 e, X& d% T; N% |%patch0 -p1. N6 ?3 u# w: z9 ]

- k, ~) ]- o2 v6 d  q+ G0 T% q%build; y+ m) Y  [9 H; F+ C. F5 ~
make clean main
* o% q* o4 \" s# q" |: ~7 o0 g* u, A% p3 [8 A
%install
* ?% n. O+ l  r- Smkdir -p %{buildroot}/usr/local/bin' l$ G; N0 V+ W- z  D$ q1 f
install -m 755 main %{buildroot}/usr/local/bin
2 R: z4 U7 b: h8 e" p! m  z7 h8 v  t! n4 A6 O/ [3 g: [5 Q( y( F
%files2 Q6 R5 H; l: l4 n1 b6 _
/usr/local/bin/main6 R0 M# E8 E1 S2 @0 h) N2 L
%doc9 Y, g" o4 \9 v  \& Y

2 r' P" j7 \$ N' C%changelog/ T* _( A! o2 I2 _
* Wed Sep 09 2015 VBird Tsai <vbird@mail.vbird.idv.tw> 0.25 O/ X  E. }8 a; \; {2 h
- build the program2 Z% z% f4 E) F

6 l- L) {/ t2 U; W+ f

! @7 d7 ?/ [; E( I* T
然后就直接编译rpmbuild -ba main.spec,再安装rpm -ivh main-0.1-1.el7.x86_64.rpm
复制
1
( _2 v* e2 r) G( W( b" X8 N2- Y: u+ w8 @2 @% _) O6 ^
3
. b; @; a( F2 @. F# f& {4: k' f, Q% c3 i& Y7 y
54 s0 m9 N: V. T1 `7 l4 M
6
& ^5 O0 e/ `- M7( ?3 o, B: u2 n8 N
80 u' z% ]: F- D" w
9# A; S; N) a2 |0 O$ e; v
10
7 F: O: Q+ {4 `% I* ^11
% I) P) A" q/ }* h  S3 o. C* h8 W12* k" z  s6 p/ m8 h' g% h
13
' h* j$ I9 M5 G6 H/ a14
+ n0 G" d  `9 E7 P( \- f9 v15
6 E3 M' K$ R& ^: B# a# m% N5 W16' o, E* K6 F6 Q7 G# \7 P- A
17
& J7 ]  P% Y) U1 S18; R/ n7 i" b6 L0 `7 A
[root@localhost x86_64]# rpm -qi main6 H0 K, I& z8 g: j5 V
Name        : main0 l0 d+ ?2 b- h; p
Version     : 0.1+ q) }5 K' V$ J! O5 l2 |
Release     : 1.el7
2 n9 D' Y* G- @- R9 p0 o8 ~Architecture: x86_64
  f  T: r0 J8 kInstall Date: Thu 07 Mar 2019 05:42:50 PM EST, |7 d+ X2 V- a" [' R
Group       : Scientific Support9 t* e! Z' x* N+ U5 G& b
Size        : 7272  }5 F/ V0 h( I3 g) v+ G
License     : GPLv2  f8 M7 @. A6 B( t
Signature   : (none)% c9 c0 u3 Q6 O% D; V3 \6 h
Source RPM  : main-0.1-1.el7.src.rpm
1 o# G7 [- ^, V- I6 z$ `Build Date  : Thu 07 Mar 2019 05:42:07 PM EST
! {  H  U$ H; q+ bBuild Host  : localhost
. [7 K# }, N$ v* h# PRelocations : (not relocatable)
" Z. }3 e. H) |URL         : http://www.fangdm.com/
& x' K( \" j5 {+ LSummary     : Shows sin and cos value
/ T  m: h$ n+ ?6 |8 NDescription :
! _7 G% w- L* `3 zThis package will let you input your name and calculate sin cos value.5 }. j  p) e% v: q- o0 f* a
1 S/ V: w, `# n4 Z

! J9 _6 @' J$ \6 ~/ ?实例3:打包hello
使用区域语言(Locale)文件的程序应遵循 处理 i18n 文件的建议方法:
  • 在 %install 步骤中找出文件名: %find_lang ${name}
  • 添加必要的编译依赖: BuildRequires: gettext
  • 使用找到的文件名: %files -f ${name}.lang# t8 Z+ |* G* C& O$ V
%find_lang此宏将找到属于您的包的所有语言环境文件(按名称),并将此列表放在一个文件中。然后,您可以使用该文件包含所有语言环境。
$ C. y% S: Z9 {. s/ c( U
复制
1* {" v9 \" L( y: p3 g7 _* h' Y8 q/ ~
24 X" o4 W2 H$ b6 q+ K
3: X: p  p% A8 E1 u1 I* D4 ~4 l
4
8 n% y' o, {3 I( U" t! A
[root@localhost SPECS]# rpm --eval %find_lang
, [# H+ @  L: U/usr/lib/rpm/find-lang.sh /root/rpmbuild/BUILDROOT/%{name}-%{version}-%{release}.x86_646 [" y' _/ p& e
[root@localhost SPECS]# rpm --eval %make_install
, K: L- l5 m* C, j5 y, ^/usr/bin/make install DESTDIR=/root/rpmbuild/BUILDROOT/%{name}-%{version}-%{release}.x86_648 j' s7 ^4 T( u$ I. {
0 E& B' }) V( i0 u- C  _

4 ^; T% z+ U9 Z4 b) Z! c; q* E3 T; D4 I! g
%find_lang %{name}在这个spec里面等价于/usr/lib/rpm/find-lang.sh /root/rpmbuild/BUILDROOT/hello-2.10-1.el7.x86_64 hello
而引用的方法是:%files -f %{name}.lang即可。
%make_install是等价于make install DESTDIR=%{buildroot}。
复制
1% M- M$ n3 i- U! \0 Y
26 {8 j* s1 w. [& e6 z$ ~6 L9 F1 x  m% U
3
% T$ s* U0 y0 M4
, m5 S/ c. g* r# U1 E0 ~/ r6 Q5; k% y3 P4 I# B% Y3 f4 b
6
) Q1 B9 }2 V- C, n* n1 G76 w5 H/ k+ @/ m7 Y6 ~
8
5 X- ^" ~# Z3 d. R9
: b1 p) ~* Q4 ?10
4 s8 `" ^8 U9 \0 S( [0 ^. R0 E) W11$ q8 b' t! |7 A0 h4 v7 O' ]1 K: S/ v
12
. e6 w. ?0 ^: G! A13
5 ]. y2 Q6 D, w# g) i  D14+ }" M# q/ N  [5 y% g- u/ {
15
7 Q  `' w# V3 l* G- Q" m. K3 B16
4 }% U' S+ `, j; B17
- p$ w5 p8 N. r8 Y  B9 w18
4 S4 R8 Q0 \4 m; e19
1 _( i8 f1 U! u& R3 I4 @20, b/ n' ?6 E) \; a( F2 i
21
8 Q9 c% {7 H1 i7 m' f/ I* d22
( B) O! j+ I4 R/ g$ V; |/ s230 b9 U4 Y9 V5 W
24% q1 r! G: T! e! s7 [
25
% t# J+ ]+ n4 T  K26: m' v6 j2 b. f- U6 _* Z, M
27: h# u& j7 N; t: b
28% T) o" }4 Q9 q' n! \9 N  Z
29
& }; t  Y1 U0 z$ s305 e/ c9 o0 R1 O0 @3 j$ ^( g- {) t0 P
31. o- Q: @+ A7 E' O3 z
32
  H3 o3 n* @$ M" n33
5 |* L% {1 H8 z8 k* J# c& c34
8 z: ^4 p/ z% ?, g' i* \) Y35
% K1 a/ `! a; }' J36
0 t  \6 i! u1 ~6 c7 B5 c4 P% f37
- H0 \% c  x5 y0 K0 E8 S' G9 v38) g1 [) E$ G& A# I0 c: O: l1 n
39
6 h3 V9 D# X% M, Q40
! Y+ f0 S6 [8 z0 o2 A& L) t415 I. @  X- H* g6 L5 u
42
2 j, m" L- ?/ b& g43
7 s; g* P3 [6 M3 u44
; y- j! H, \% y1 |/ p( W* p$ v45
; x2 S/ h1 r' H  Z1 Q2 w46
# A7 Z" J- @) D! E4 v
[root@localhost SPECS]# cat hello.spec' Y, ~1 S/ \: I
Name:           hello1 T9 G9 y9 @1 a
Version:        2.10
7 x+ P/ f/ ~6 U6 h! g2 c& ]$ rRelease:        1%{?dist}
( v2 L$ f3 ?8 J8 T) G. `5 SSummary:        The "Hello World" program from GNU& r8 |0 P  z. B

8 W4 h3 i+ O9 FLicense:        GPLv39 p+ o/ ]. L4 @4 H
URL:            http://ftp.gnu.org/gnu/hello/* J$ S4 N+ ?* f- Z6 u% _) }% x
Source0:        hello-2.10.tar.gz/ F4 B1 M: z! a- o

' c3 ?7 q0 X0 {. Q, k) l: f( J- ZBuildRequires: gettext  M) h2 k' t& U* I7 Z: S
#Requires:
1 e" w1 B: v4 }0 K, f: @# j' J  ~& s& O: _' g  h6 `) o+ s
%description
+ o4 F& t; y, ?. [The "Hello World" program, done with all bells and whistles of a proper FOSS
+ T0 @) F, x3 hproject, including configuration, build, internationalization, help files, etc.
% F( E9 T7 }$ ^$ H4 D- F/ i* [9 @, |) ]9 h. y
%prep# k$ T9 G, j) x
%setup -q( h+ b- C7 c: e$ r! T$ A* I

; T5 G7 U7 d) v, z7 X+ _6 z3 w* |, O: a4 f" x! ]$ R8 z
%build
; R! H4 m% _2 N4 J: T%configure
- q8 [+ |4 G3 E+ v: O/ W5 imake %{?_smp_mflags}
, c- |" l" T: L" ^" c9 F) {* c, k+ z7 d7 o
%install
6 O# I% T2 ]8 E%make_install* o& v; A4 m& v, h
%find_lang %{name}
; b2 q" i3 N# _9 s2 lrm -f %{buildroot}/%{_infodir}/dir
6 r* C7 l$ M) P, X& D# _5 r% B/ U
- D+ i$ b8 E# _  ^8 D% ?! T%post
* m0 l) @; z" u% o. K( n/sbin/install-info %{_infodir}/%{name}.info %{_infodir}/dir || :- w9 C* }& X$ o2 e
" y$ g$ ^" s$ v/ G1 a
%preun, G/ m' }. j) a8 |) X
if [ $1 = 0 ] ; then4 R& e$ V$ j2 l4 ^" q
/sbin/install-info --delete %{_infodir}/%{name}.info %{_infodir}/dir || :, L* y) M3 u. D1 j; \! j
fi
& v, E& ^/ ?3 t( u7 ^1 z/ l& n) g- J& e5 @
%files -f %{name}.lang% _& K* T* q2 e6 C
%{_bindir}/%{name}
. i0 r; U. ^" k: Z0 t$ q9 n& g8 e6 {3 p1 c. v
%doc: |$ q/ L' ]* W
%{_infodir}/%{name}.info.*' ]$ W6 O8 @" \5 e: Z8 T2 w7 \4 q
%{_mandir}/man1/%{name}.1.*
4 G: G+ z  E+ ]. W2 R2 l  o( K9 m$ D& l
%changelog
' a1 y4 K" |; O. d3 K+ L8 ^  W1 d

; v+ [" ~" `" X# ]
7 A* K% ^* U* P% c5 q& h5 A
然后直接rpmbuild -bb hello.spec进行编译,此实例来源于:https://fedoraproject.org/wiki/How_to_create_a_GNU_Hello_RPM_package/zh-cn
实例4:打包smartmontools
smartmontools 7.0已经支持json格式的输出,对于采集的话,有很大的优势。目前在centos官方上面可以找到centos7的包,如https://cbs.centos.org/koji/buildinfo?buildID=25069,但是还没有centos6的,所以需要自己写一个spec。
访问https://cbs.centos.org/koji/buildinfo?buildID=25069,先下载src.rpm包,然后`rpm -ivh smartmontools-7.0-3.el7.src.rpm`就可以提取到smartmontools.spec,这个是centos7下面环境编译的,不能直接使用。需要再下载 http://yum.aclub.net/pub/linux/centos/6/umask/SRPMS/smartmontools-6.3-1.el6.src.rpm smartmontools 6.x的版本,就可以对比开工改写spec文件了。
复制
1- @; x2 j5 Y0 I6 P3 b5 G3 F0 A2 q
2
4 e4 L4 j& }; ?: Q, }- z% W3
9 d. @+ Y- \) C6 T: k) `- m! P4+ d8 w$ x4 k/ \$ l% W! I8 j
54 G0 y, S$ q1 ?
6
1 F1 p  T4 B8 U) z: ], g7
2 |8 {+ ^( B: {, E* {% `. D8" i# u# f  S- j# m# p; Y2 K
9" D: n2 Y) w2 B$ [. [" \
10
' N* w; D3 {0 j: C  N116 Z; c+ p7 T2 ^0 k/ x2 Z; N8 A
121 n& O: K: F5 ]  v4 h' q
134 T' `% L' ?' q1 W0 [" `, O
14' ?8 d/ W3 q$ t  o) H2 Z
15
) L( p' N& ?9 }/ C# \( N: H16
" y- H6 Y" Z0 _6 W17
' O! {' t. v- f. v% D18/ O3 N& W  _# G3 \5 _5 L# X6 j! O+ Z
19
$ k, g2 J! E4 t" v, P2 `0 k( `7 f: R20+ p; T* m1 p- c, o# @- _0 L
21
% i' |  _8 E" \. i1 L9 x: v6 G# ]22
/ h9 V2 M& U) P5 b5 y231 J6 M; L# y. l" W4 H* K. H
24
5 y  l3 I) P8 i9 P% y: z256 @0 d1 E, J5 i# X6 W0 u
26
6 m' G, C; X0 V$ J4 B. I  p& Z: u27& i  _1 H9 F4 c/ M7 p
28+ ]+ M  {, R% q: A
29! Z0 h1 O9 R6 s  i, k* }( Q
30
/ N/ i1 Z* w5 u- m" a5 j2 G31
( Y+ E- t1 q7 n) n4 i( h32
& `# F- c9 q) P" Z2 q337 ]- o4 P. h2 J
34
& l+ z1 o  R6 ]2 ~35) v6 u$ Y  j: h8 r9 ~0 q
36/ `' L" r) G) z7 B
37, W. t; ~- `; S- d8 q4 o
38
5 d5 [7 ]. `, W: T- Z396 j5 n' o- f- }& r
408 X& m. T0 w% \8 r
41
4 G; a9 [" `4 w7 U420 W" W3 I7 _6 M7 z6 ^
43! S+ V, t' E* W. ^+ ^$ K5 i
44
" \- z* K/ o; R& ^45
" l. B: f: K) X- i! B46. X- {/ k" P/ A' S1 A7 J
47- \0 h* O4 A3 z0 x
48
: ]1 [8 g$ |* e6 P; m7 b499 a  k- p) K) m4 Q
50
: P" A0 I, z! F51
  u2 I- w8 K0 K/ x529 m% E) j6 v' P2 x8 s- {/ `
531 v' ?2 l0 j# S& m
54
9 Z5 K; M  Y5 q4 z55: v, u# f, b+ U( [; x& z$ f- X, }/ B
56
$ C8 X2 A# q6 W1 g8 i570 q8 r' E4 G) @* T* E
58/ P+ |0 C) O1 M. ]8 E& R/ `
59
' Q" D, L5 ]0 v9 z3 p60, h: f" x4 d# x8 ~/ c9 {. m+ x* p
61
9 X" k( @7 E: ]; z" D9 W; E62
9 L) h, B* l4 H  p63
9 A4 K! i: S. u) C$ w5 Y$ h646 S7 T0 b( b) F; Y4 K/ [( _- r
65" N1 G( _$ Z6 T9 z
66
8 o, C1 f. C6 L0 f67% }: u; o" W$ A/ S. J$ K# H. a
68! l2 X; ]0 Y$ ]3 _
699 f, f5 s8 p2 {4 l- J( K
70
3 n  ^# b1 N9 T  \715 Q) x9 l0 l  P% x% C
729 b# p: y7 i2 w8 f
73
/ [& ?. g' R5 ?74
4 l/ s- W, r" h* s2 `& l$ _* D' n# Z/ C" j75/ S* n0 K5 h% K/ N
76
- B6 W# d4 x* l, J77
+ t1 O$ M- `* w/ X: J0 q" {78
8 ]5 w) j; B8 U7 W79* ]) d7 Z" _5 h3 |* p- k
80
3 _& M1 H6 ~) K* M- ^; @! Y81& _% _% k4 L3 m
82
; L5 \9 }# b" c" J1 |* N+ B& E) C- j  q2 r83
! C( P/ J: b5 f  l* S9 w846 o+ d; I, L1 Z4 t
85* `! c6 s1 @8 f+ p4 f
86* ^7 }' `2 Z# x7 X+ M( f3 ~
87) N* {, ?. Z% x4 o( W* n
88# E# S) @0 `! _2 v1 S9 \6 a
89
" V* f1 D* q* h1 l. i8 J7 N8 C90! W# Y% m$ X. a* g" A* f) ^
910 D. S; L6 H7 U; `) p' P0 r, K
92
8 x5 L+ x9 L# |( }/ j( N/ h  a93
: ?, t2 T( I# M8 _- f946 A) ]6 _. \$ u0 h: R1 u
95
* T- A6 B, e* I8 p$ b8 i* `96: H5 d, _8 P7 p1 k+ O6 W1 a; d5 T
97
+ v! ]$ o- r& X1 m& @$ F5 m98
+ F- |7 K2 t/ h! T$ m
[root@7ftbv7mdz7cdpc ~]# cat smartmontools.spec' M% E7 m. ~- ]1 |1 p( [
Summary:        Tools for monitoring SMART capable hard disks/ b0 h/ m9 z3 I% j& D& E6 s2 T
Name:                smartmontools
6 {8 l* w: C( `& w/ m9 SVersion:        7.0
- ]! ^% d5 n$ v; `  |4 PRelease:        3%{?dist}. v. I4 r) V/ ?0 N# Y) ~
Epoch:                1# Z/ I6 |0 z" e6 R& R1 g* S, I3 X
License:        GPLv2+7 t0 A% U( a' w
URL:                http://smartmontools.sourceforge.net/4 @$ D' N& ?8 |. }2 I
#Source0:   http://downloads.sourceforge.net/%{name}/%{name}-%{version}.tar.gz+ ]( c" f; R, ^' k. J$ Y  k) t
Source0:        %{name}-%{version}.tar.gz
( }8 @" Q8 m- _. p/ d5 {% ]& YSource1:        smartd.initd+ ^  a8 s. T, m0 \8 q! G, S
Source2:        smartmontools.sysconf
- k, n% W. F  R* Y. w0 U  [- @$ DSource4:        smartdnotify
+ n9 Q' ?. _* I6 T9 B  @; \#semi-automatic update of drivedb.h" J& ~8 O7 r0 z9 P9 Z4 ~
%global                UrlSource5        https://sourceforge.net/p/smartm ... rivedb.h?format=raw
7 |8 L. B# Z: D+ j2 J( hSource5:        drivedb.h: [6 O$ z4 K  h/ X! c- K4 W
! ?/ W  v( O/ c$ o0 e
#fedora/rhel specific+ {0 U( ]% O& X+ t0 Y
Patch1:                smartmontools-5.38-defaultconf.patch$ t5 m4 S8 V5 M7 I( k" ~
( b! F# J* {* ~( B/ j
#BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)6 P0 U3 K3 \9 }4 L# O1 w+ A9 s, o9 Q
Requires:        fileutils chkconfig initscripts! P1 K3 Z9 \& Z8 \1 j
BuildRequires:        readline-devel ncurses-devel automake util-linux groff gettext/ ?# [" ?6 O0 n4 ~) ?% ~
BuildRequires:        libselinux-devel libcap-ng-devel
' }+ i( `7 G9 J  p* c+ Z9 K; m+ M2 Z0 Q. j4 q. P  s$ h+ [
%description" i2 T3 \7 d; f; l+ b# r- `: q6 I
The smartmontools package contains two utility programs (smartctl
% M$ L  l& g& {. C1 ]) Q- j6 Aand smartd) to control and monitor storage systems using the Self-+ @, y& F8 h! t+ S  c
Monitoring, Analysis and Reporting Technology System (SMART) built
. U9 L. i) U  w$ C7 Minto most modern ATA and SCSI hard disks. In many cases, these) Z! q: X0 a9 |9 h/ \" r
utilities will provide advanced warning of disk degradation and
. I) V+ U$ @% o4 q! D* w4 o8 a7 bfailure.% u, ?* |) O5 p2 U

" }: Z1 ]8 p  X6 f0 O%prep
# O. z4 H9 q6 g; K5 i& s# ~%setup -q( x! m7 n; e, b7 Y
%patch1 -p1 -b .defaultconf
9 c9 A  B6 ~* f) c
8 K! z3 W8 i/ j; g# update SOURCE5 on maintainer's machine prior commiting, there's no internet connection on builders( }& i) I1 U/ s& R, i9 f+ c
#curl %{UrlSource5} -o %{SOURCE5} ||:
0 q+ r8 v3 W) ^2 }( Wcp %{SOURCE5} .
& u& J$ i/ e0 [( t6 n( B! [
1 z4 I$ ?. C  M8 n. W  H  h% h%build
$ a, z* S/ [  m1 yautoreconf -i
( K( J/ L$ T3 F8 M8 H) a8 U%configure --with-selinux --with-libcap-ng=yes --with-systemdsystemunitdir=no --with-cxx11-option=no/ E( G- r; `0 Q/ P, X6 B3 I3 i+ `
%ifarch sparc64
% s$ \8 ]% s7 E" f4 h8 i  dmake CXXFLAGS="$RPM_OPT_FLAGS -fPIE -fno-strict-aliasing" LDFLAGS="-pie -Wl,-z,relro,-z,now"- L9 e" S9 E& A, Y5 ]& B, U: b
%else; l& N' d! y( o+ T' `
make CXXFLAGS="$RPM_OPT_FLAGS -fpie -fno-strict-aliasing" LDFLAGS="-pie -Wl,-z,relro,-z,now"
/ Q, o$ ]7 a( B4 V% X5 b, U%endif
: d! B5 E8 A( |8 i7 T) c1 k+ S( E+ b+ B; H* [
%install$ n$ A7 _4 p) e  d, x1 f! ?
rm -rf $RPM_BUILD_ROOT
3 D' e# Q7 j% F/ Jmake DESTDIR=$RPM_BUILD_ROOT install
; @( l/ j) n4 L3 E1 X: G
6 U" d) m. x2 Mrm -f examplescripts/Makefile*
3 Q1 ?7 q0 z  Z6 r/ c2 F& Hchmod a-x -R examplescripts/*
! m7 X: P' E. ~4 w5 i- Ymkdir -p $RPM_BUILD_ROOT/%{_sysconfdir}/%{name}/smartd_warning.d
( h4 `, A( s  Y2 _9 f+ c; e# _install -D -p -m 755 %{SOURCE1} $RPM_BUILD_ROOT%{_sysconfdir}/rc.d/init.d/smartd
4 Z1 Y8 ~/ k# Xinstall -D -p -m 644 %{SOURCE2} $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/smartmontools
5 Y+ s4 Z& b' m8 _0 ]! C. @install -D -p -m 755 %{SOURCE4} $RPM_BUILD_ROOT%{_sysconfdir}/%{name}/smartd_warning.d/smartdnotify1 H$ h. ?/ W  U. u
rm -rf $RPM_BUILD_ROOT%{_docdir}/%{name}8 _" P8 s4 E0 [  |+ d8 h6 Z; c
mkdir -p $RPM_BUILD_ROOT%{_sharedstatedir}/%{name}, `, M- r. K: n* _# t  f' N
1 C  U3 o/ l% ?# i  Z1 i
%clean& B! Z8 r% A) r/ ]' M1 P
rm -rf $RPM_BUILD_ROOT) @/ X. L" D8 r& z, x2 @
, ?- I1 o( R/ H/ \% G& p3 @
%preun$ _* F, h9 Z1 h) X8 ]* B+ R5 N' |
if [ "$1" = "0" ] ; then' D! e* D- r6 w' d0 w& |
/sbin/service smartd stop >/dev/null 2>&1: N  p2 D# i" o. T2 }) `2 d- n
/sbin/chkconfig --del smartd  Q2 {( ]7 c/ r) ~6 a! M6 n' i
fi% t. z4 H. }" H8 U; |/ O

! L0 P9 @  B: A. k8 G+ K%post6 _& k! x6 k% f$ |7 a: H2 V, K# I! ^
/sbin/chkconfig --add smartd* z9 F' o+ H1 C0 Z% R5 o9 _

& c. g9 q1 C, r* z# e2 Q$ Q3 R0 w  n* O# Z9 U
%files: _: S3 b1 D9 f4 E% K- k. @0 n! f" o
%defattr(-,root,root,-)
" e. V" E, Q5 y+ D. }& h; b+ f%doc AUTHORS ChangeLog COPYING INSTALL NEWS README
1 q+ Q7 S. H5 d' {) P" R%doc TODO examplescripts smartd.conf) W( L; b  O3 M9 H0 w! _# Q& U
%{_sbindir}/smartd
" t2 D! `$ |' I/ d. Q, r3 p%{_sbindir}/update-smart-drivedb( z0 K/ z, C3 q" E4 Z
%{_sbindir}/smartctl
& _, Q: s; E  ~' A4 x3 A%{_initddir}/smartd! S2 L0 k4 j( C2 j; {( w
%{_mandir}/man?/smart*.*
8 s% I6 f+ v4 [" L; H%{_mandir}/man?/update-smart*.*
9 z' ~# _( ~0 Z+ J. _%{_datadir}/%{name}
: Z2 v8 \$ t9 ~8 @7 _, `%{_sharedstatedir}/%{name}- _  b9 a$ M0 r! U* H
%dir %{_sysconfdir}/%name7 w7 u+ I% a! H9 ]. A( v
%dir %{_sysconfdir}/%name/smartd_warning.d
& H  [; [' Q; [) g: w$ Q; K%config(noreplace) %{_sysconfdir}/smartd.conf7 W* h; f3 b, @: w, Y" i- w
%config(noreplace) %{_sysconfdir}/smartd_warning.sh0 ?: H( Y1 A3 E: k  j
%config(noreplace) %{_sysconfdir}/%{name}/smartd_warning.d/smartdnotify
& I: V6 g8 s5 z& G& ^; }%config(noreplace) %{_sysconfdir}/sysconfig/smartmontools6 h/ `: N9 q% b5 B
) d; \* x, |# k# a7 \" d
%changelog7 w( H& v9 {1 ]  n+ P
* Thu Sep 26 2019 fangdm <8@8994.cn> - 1:7.0-3
- E0 E. t* s0 v; s) Y: {- create smartmontools 7.0 base on centos 6: S& H% Q$ ?" A" I! S

! ^% X, o/ K8 F& Y9 d
& }  G. a) h; h6 ~. }, Z6 D
注意,Source这几个文件一定要存在,从上可以得知,加入了启动脚本、配置文件等,准备好了之后就可以使用rpmbuild -bb smartmontools.spec来编译,经过多次失败后,根据报错信息进行调整之后,终于编译成功了。
复制
1* e9 i, l7 ?; e: I- T: \
2
* q, z, _4 y: P5 o3 n3 f3
, c  {& }$ R! h3 r4
5 t/ n% u- b" U8 |, c# s& p- h/ @51 b+ Q! c# [/ V; H7 o' [
6
. E% O/ w* x1 ?7
- a0 v6 b/ J8 L# |3 R1 @* V5 m2 U8
4 r+ _7 d# ]7 H9
  ~& C, `2 U- e10
1 E: ^5 m0 N" O3 p1 i11
& e" v: M; p/ u4 R  i! X8 X/ @' u12
/ I; y* o$ L: Z/ m' X5 T13
4 L4 ?; d$ T- Y1 }% w6 u# q! h14
& _; x) _7 \) \8 E" Z2 m15
7 L6 Y9 X0 ?# [160 m& B+ i8 m4 x  w% r: c4 A' e% V
176 Q0 [1 J7 k2 n" s; U. `5 i/ u
18" O' ]. {( W7 |4 Z; N( x. X
196 X6 I6 ~! u, l& w+ f4 O
20
2 |# U- k, Z5 N, z8 p; r7 Q: i) q21
% ~( d- \8 @. c7 ]6 w7 D; T' |
[root@7ftbv7mdz7cdpc SPECS]# rpm -qp --changelog /root/rpmbuild/RPMS/x86_64/smartmontools-7.0-3.el6.x86_64.rpm
9 T2 [% A. |( [7 Y& }8 {* Thu Sep 26 2019 fangdm <8@8994.cn> - 1:7.0-3
5 ?2 I+ s. z  X3 c- create smartmontools 7.0 base on centos 6
4 t. Y1 i2 `# ?; a$ |0 o9 ]
) Y1 L' X/ k4 H! P) j[root@7ftbv7mdz7cdpc SPECS]# rpm -qpi /root/rpmbuild/RPMS/x86_64/smartmontools-7.0-3.el6.x86_64.rpm
4 M% G7 j& _( y# t9 p0 \4 \& ?4 W* a5 XName        : smartmontools                Relocations: (not relocatable)
) Z" t. Y2 l4 R, A2 i/ x0 g# BVersion     : 7.0                               Vendor: (none)
" X3 M5 n/ K* W" L5 \$ D' `4 ~Release     : 3.el6                         Build Date: Thu 26 Sep 2019 10:53:19 PM CST. G4 [6 }9 V% Q( c4 ]9 a
Install Date: (not installed)               Build Host: 7ftbv7mdz7cdpc
3 u- u1 H4 N8 ?7 U# c# \6 |4 a( tGroup       : System Environment/Base       Source RPM: smartmontools-7.0-3.el6.src.rpm0 d; `2 O! k( H/ m  h- s
Size        : 2081911                          License: GPLv2+- z% O7 e, c( z" v/ L
Signature   : (none)
: d! i/ ]3 d9 G4 n6 W9 u" p2 J# @7 ]URL         : http://smartmontools.sourceforge.net/
2 f( J4 }7 Z% aSummary     : Tools for monitoring SMART capable hard disks
2 V  K7 U, p& n: [Description :
' _9 ]$ o9 ]6 A$ p1 q0 n5 b1 M5 C  ^The smartmontools package contains two utility programs (smartctl* ?9 f: Q/ ^% c1 J$ t/ ?
and smartd) to control and monitor storage systems using the Self-7 A& E9 u) o$ g, o2 Z
Monitoring, Analysis and Reporting Technology System (SMART) built: N" ~! r  j3 E
into most modern ATA and SCSI hard disks. In many cases, these& j4 s3 Z! h5 D" j; A
utilities will provide advanced warning of disk degradation and
; T- V. B7 w; m+ r& I, B+ [) Gfailure.! x" n6 F1 r- [' C( y, l9 a
9 P& M. c: Y5 R  Z, E/ P

: }2 K$ a2 |% q) f. [" O
另外,在%preun阶段有使用了if [ "$1" = "0" ],表示的意思是uninstall,如下图:
实例5:打包nginx
用tar包打包成rpm的最简单的方法就是在网上找到相对应src.rpm的版本,这里面有包括了spec文件,可以少走很多弯路。nginx官方在释放tar包之后,也会相应提供的rpm以及srpm包,这次我们先在 http://nginx.org/packages/centos/7/SRPMS/ 下载好nginx-1.16.1-1.el7.ngx.src.rpm,使用rpm -ivh nginx-1.16.1-1.el7.ngx.src.rpm进行安装。有生成了如下内容:
复制
1! D$ {* O- [# D+ u7 h6 y- D
2; O* o+ R! K/ E# f1 q) K
3
( h0 ^3 }7 X% T. P4
5 Y. Y: o) E7 W' g8 L/ z5/ H  A- p2 q5 M% [: ~( b  n1 }
68 J8 b/ ?, A, y( H& O
7
1 {- S3 `$ y5 L# d( n6 s& O! |( g, Z8! R* _5 E4 G  K+ _
9
# k4 [  F6 Y( v10# b0 W% m% u5 r$ v0 s4 H' ]
11
2 N. i, |: }& Z  a# H124 Y# M4 S& `6 p; f8 W
13- m8 z1 j9 w1 Z
146 D2 `9 M# y7 b, \
15( l2 q- n- W9 ?4 x# e' R) a2 J
16! ?; \/ f% Y. Q0 M3 S' a
17
  |: i1 I8 n  n" l18# S: r2 z8 K4 d
19( i2 d1 i8 h. s% u9 I4 K9 k
202 @+ K8 M* N6 {; @. O
217 }8 c! C: }! c5 F  |
225 f( p3 |- U# {( V) D6 V7 Q
[root@localhost rpmbuild]# tree
$ `& V8 m$ X8 ?" q.
! e4 k# U8 P# [- r" d% w# W6 q/ ~* J|-- BUILD, g. G% Q  ?1 I# _8 c, x. j. d
|-- BUILDROOT
. p! [  ^2 i9 M( Q4 z- q|-- RPMS( G' r: F* @1 B
|-- SOURCES9 q5 L6 J% w& b
|   |-- COPYRIGHT2 T' e1 c1 F1 U4 f  Y
|   |-- logrotate
6 r0 q/ m9 L) F" L' @|   |-- nginx-1.16.1.tar.gz2 c0 I! o( E3 t( E0 T# h, \
|   |-- nginx-debug.service! m" Z8 I+ `* U, x* u7 p% V# n
|   |-- nginx-debug.sysconf& G1 T  C! S  `2 j9 z
|   |-- nginx.check-reload.sh
( P- t) _$ k/ D0 S2 h|   |-- nginx.conf  P3 S/ E8 y* g
|   |-- nginx.init.in7 H6 W; I2 _% e8 e' s
|   |-- nginx.service6 [0 `, e. X9 P) j
|   |-- nginx.suse.logrotate
, S9 a$ Z6 Q/ @0 E( n6 A! C9 c|   |-- nginx.sysconf9 b2 ?" x2 A, S2 @# p/ T
|   |-- nginx.upgrade.sh6 [( {9 N% }/ l- j$ ~" ^
|   `-- nginx.vh.default.conf+ w( n' w; c) [' c
|-- SPECS
* s5 a$ Y5 R5 d8 u1 \' B2 e|   `-- nginx.spec
4 k; h" g) c3 R0 s`-- SRPMS
7 ~/ O! w/ }+ k

. K7 z% B! l! f; }

% N  g( G/ S9 j+ G# F: R  B; B
主要是SPECS以及SOURCES这些文件。查看nginx.spec之后,大部分都有写好了,并且都兼容了centos 6/7。添加了gperftools GeoIP-devel ngx_cache_purge nginx-http-concat这四个模块,修改如下:
复制
1* C7 i: r  {! f/ D& C
2
9 e. e6 o7 i3 `. r3
% z) b6 [% [  V3 v5 S2 ^! {: N) I4
; K3 M4 k8 ]9 E* Z3 [6 u5
' f3 |$ U6 H4 Y' A1 v) m1 l/ w, [6
. K" n6 d0 U/ S6 m* a8 ?7; T% H  G$ B" c/ q8 L& [
8
/ B4 \4 [5 F+ a$ n) I: E4 Q/ }98 \$ Q1 X: i9 L2 \
10% g( {( l( N! X
118 C, p; P5 u5 ^% h8 L5 W* u
12
: [) F( a. O# F3 H# I3 p13/ {. u" [4 t8 r( V8 ~
14
; a+ ?6 b- g+ Y9 s8 `15( A" x$ _" E( s  X1 x
16
& ~8 f  ^3 C. O& O/ o17  m/ b  W4 t8 f5 x" y' e$ Z9 m
186 [) f; y. Y1 T; l0 U6 }2 V
19
# X7 {2 _( G- C, P" g# x5 C! @20% J- h+ g# f4 P' S9 u, I
21
; d. b6 ^. t# R, V! ]$ x' i7 ~22
6 }9 F  J- B2 S, y4 i! k1 M23( g7 w/ \+ S# l+ K- q/ |6 s) [
24
; l5 c) }0 X" z/ y* v25! m$ o0 w8 ]  K! ^8 `2 y0 b' w" W
26! I  p, m6 T2 p& `1 y: J
27
+ ~3 g; t' T1 j; A1 ?; O7 }/ E9 Y289 O) a1 R8 ?+ M1 y! h
29$ s7 C: t  Z+ Q& t5 y; l. c4 F
30) D" \2 z4 U& s3 B4 @) a
31
, @! a) T% p5 E1 M32& B9 K; s3 J1 \& z* E3 A' J
33" v3 }$ u1 V$ {  E& B* T8 v* Z
34. m. W# w* L  b1 N* O
35' ^0 Z2 G2 c; v
36
& V9 C8 r* B) i5 ^& u4 M8 Z) I/ r# ]37
. F% H  G$ u4 x383 _6 M1 m& n! h- M
39" C5 u( H- u9 j5 c
40) b8 G" o5 t" F' N$ P( D
41' r+ N0 K- G1 s5 X3 ~' a% H
42
$ z; ~, p/ Q! S+ S0 P3 t7 B4 v0 r+ k43
- |% \. d3 d" k( ]! Y44! P/ x8 }; a* c; ~) o" ~
45
0 l4 U, P3 X. p  G/ g46# d2 s  R9 S1 @& R
475 M1 ~; w$ i7 j2 }4 J. i4 F
48
& X0 y. u2 @' X0 a5 i8 C: K49
( Y5 d8 ~  z/ S; e/ B50
3 w2 \& _" K% J" L( v51
6 s" |+ M: H/ O' v" F7 z52/ Z8 C9 [% _6 O1 u8 [
538 Y; E+ `. O! [( {  c# _3 W
54, m) r. s9 p, ^% V- p6 d
55
; u6 z0 d& p0 v' _& m56+ V7 A% b. m! ]  `5 q6 K
57: d0 O- _" `1 W4 o* U
58
9 w) i4 m+ P. f; |5 h% X2 f* I3 ]) ~7 r59
& s) i- ~2 W8 _5 R. m% j& o$ B6 P60
% R8 Y3 ^9 {4 h# Q7 R61
' ?  Q8 v2 q, `# u( \62
: R3 T' @2 Q" Z, S1 P63
) ?: S  g& p  H3 U64+ E- K  f" Y8 O2 x
65
  X1 l! m: ~- d+ t/ y662 O6 ]" X3 g: Z' k3 u# `0 H
67
: p7 B: c6 Y, y. o68
, G8 B* i* m! t( n" q& A69. E- z6 C0 C: f$ \% V
70
: m* ~9 |# s, i1 H71
/ N. y7 }) b  L5 q$ j2 d* {8 b72: ^! M) u+ z# U+ r0 o2 `( r) q
739 G. E+ R; }4 y( f$ b2 J
74
5 d% k9 L! m3 M& U0 C6 O; I7 b750 j1 M7 C# y- q  j
76
, O6 o$ T& |) `% y* T, x777 _' W3 r$ t5 g+ b( X5 n! s0 {& n
786 w5 l2 h. ^2 @( k
795 I0 ^& N7 B# D  z
80
' F1 F- c% M' y1 X0 M/ J6 P# n# A81
1 x& U0 Y& @- v9 C# s; h) X82/ j6 Q6 ?) i; S8 X
83
" A  d0 y! S+ {& u84
3 h$ s4 X( T+ U# c6 o: q1 V85
& e  d3 y: W! A" n2 J86
6 I, g6 N& ~' ^* l; H" D6 C87
' M- x# ^# R9 ~880 @; D& O; f* a: Q
89" O( i9 e' o) D( N
90
$ j. ?+ Z6 N" z- W  J91; c  U' C9 Z1 A4 a9 z# F. t6 }8 ~
92
/ W' Z1 b2 A+ s4 \4 h; O  F* Z93
+ ^$ M+ c* d8 c' _% G: E$ D# v94
# N5 j, |2 e4 {$ q' c: {( j- k95
9 I/ K+ k6 c6 r9 ^6 X! x7 k4 m964 i$ Z  u: Y0 ?8 T5 E( ^: l
97
) }: g6 U' _- v8 r/ X" g4 a98
0 W* W  x( y+ [) X' @99
+ f9 V1 `% K/ S! B5 b! q100) T" f0 |- f& m" s4 m- d  s1 H9 s
1012 I8 S4 r. N! L. g( z/ K
102, ?* `$ H$ _' ], g+ w" Z. \2 ?
103
" ^: g. ]' U# d% P: J7 F104% {2 m! L, n$ ~# U, B
105! y9 `, F+ M3 Z  j
106
; P* w; p  x) }) R1076 N! S+ d% k- m9 E6 }
108) y* i- \2 H6 b& i$ Z
109% w+ ^  l4 C/ H! K
110
$ B7 }0 n" x" i3 [) {, z" A111
; X$ @2 p5 E  J; a& a112
4 A5 U0 c3 g+ t: q4 M1 K& u, q& {+ j5 G113+ W9 v. z! J" ~/ u
1147 D& P, _( }% Y; c
115. p4 z+ @+ L6 E$ s- }, q6 Z
116/ s! b" }1 v  \1 v* j( F/ @% }4 g
117) e$ B3 o9 T& |0 p) j/ X
118
4 B7 C8 @/ G1 H. Q9 c: z% }1194 e( J7 b0 y2 d+ |
120
, V* ~, c9 X  d- l% @! S- U- m. @121
2 k: Q# x! `/ Z/ k" \8 ]' |122! G. ?# M4 v0 I: |2 p# u
123% Q! t/ Q. n  y* D/ M( I' r( u
124
7 T0 n6 n8 L  `" e/ S125
( i3 ~* x8 {! x3 P- s* D1267 ^/ j1 @+ k0 |
127
- N% g9 W" M7 r, ?128! v+ H& y/ B+ o, w
129
& ]) u" H+ @. e2 c! |9 _130/ T! S( `, p) E" p) i5 z8 P' z
131
7 R  z: ?) R  A9 b1326 b" @( o% ^) S2 L
133
! o( N* [$ x4 A9 T/ i/ s1 f& E+ G& i134
8 ?  D8 Z; l. M" {) H1356 S- n2 a! y3 Y% \/ l8 O: Z
136
. v+ T6 q8 |" |2 W! y* e8 Y& t137' b# G4 b" W  y' o* h" @4 G
138
4 k% I' S$ t1 s139. Y, l4 G* m+ n- @6 ^
140) @# U0 Q5 _: F' G/ S
141
( C/ r& n) _0 j8 Q- W. `142
" {. W2 o% X& E4 d143( q# b4 x, w  B5 ]9 }% C5 h# b* D1 o
1445 {- h# _# |% l: d, C) {
145
' K- q! U3 w& ~5 v6 H146" e7 x- j( d% n# K: L# |
147' h6 M1 J5 E. @3 Y% E( y+ F+ \/ r; x
1481 i- \4 p: d- A: t% U5 O% s
149. c% m0 m& z( W: F* W3 }# }
150
7 i: ?& Q; X6 q) z( O  x151$ z- |5 V& G/ ~, U
1524 V( [9 D" u, E1 w8 b
1531 i/ V, m3 j  {! ?
1546 \. D; X4 h8 ]6 Y- q
155+ t* j8 H' v/ W/ m( o* ^! e
156
: e9 s) Z# j$ ?4 |7 S157
& k! K! I; \, U+ U3 l9 o2 V/ C158
/ o+ n7 y; \0 N. v159( x6 N, \% X! X3 m* ?) [8 P, g
160  K2 D. i- I3 s+ G
161
& }4 U5 I! j* ~# n" {5 ~162- K. ?1 ]+ E, t, C
163
1 U) D" }) t& p9 h( ]5 ~; _( J164
4 f9 i( z, N2 g4 U1 N6 m6 X165& M9 y# @/ u8 J! P  k; J
166
$ o+ B. o' F- c* J& ?7 r) f' o167. ]  m' {" d( `& R, u
168
. x) f' w' _3 S( P! L1691 Q4 c8 V' l+ R( b
1707 [. H/ e1 \8 J: s+ u$ @
171
! b0 G( |* ~6 N0 J; l) `172
. \& i$ ^2 o, g# Z' _% N173' D2 J% @& q# N6 W) t  w- i
174  q8 H& K* c# l4 m- p
175
4 A# G- Z# ~' R6 P- M. v' f176
( [( c8 M1 w' w177
- s$ P. u: q  ^8 C1 ~+ Z1780 ]. ~( i; b2 W/ B
179* [# [) R" B, W+ g. E; ?$ ]
180$ k; S8 W% x; t+ X. p
181
5 K2 u6 Y3 Z! Y7 ^1 I4 H# y) e7 N182) a. I% R8 d# q. w' s& s
183& f# G. _7 }/ R  o( s' Y2 i
184' O6 l( B9 R% O) o+ j
185
+ n7 y2 u+ q( i; I/ ~7 Z' D186. Q, N$ q5 e; }! Z' n% F
187
) r) f- r' ^  ]188
2 J" E& n1 e" M6 F. U189
4 t* z7 _, M7 Q' @" e  L190! c& s% ]$ }: v3 h8 i) R; c
191- S& W2 ]  ^+ z/ U: p
192
/ O1 q* c# j0 U1939 g1 r, ?# W# O7 a' G: e- {
194
; Z+ A' j& p. P% Y8 k$ L% b' L8 y195
0 o) u% I' C2 [196
7 {4 z* V, _5 `; u" o* N; X4 y197
; v6 @! x$ |8 [! }: q% e. |9 f# U4 T198* M% T: \9 T) n
1992 t2 e+ w) M/ `7 M7 F) b6 N7 ]9 T
200
" e, o) p+ [4 }$ L7 _4 x  I201( F7 c8 ?# Z# g
202* g: M  V7 Q; M: p' m, |1 z/ J
203* l) j4 \1 T& l! w7 a. N$ ^
204
! f$ c) ~: |/ P, d' f205( [1 [7 H0 q) ]/ j
206& z& ?) W2 M. W1 N+ C
207+ U: @$ r; G6 U7 F. B, t/ @5 B
2082 ?4 Z2 j: F0 B% m5 a
209
; S6 a/ z' d' U) f" ~2103 Y, {1 ^" |& i& G& v! x: L. t
2114 y5 P1 O* x9 }4 u% }3 k! T; r
212
( q5 x& y, u9 _7 V$ g9 |213
5 C! t9 _$ P* C5 I! V* s) u7 c1 b214
1 X4 @4 r3 \: M  F6 c3 g215  b# y7 B, [! O
216
, w# ]4 ]+ p* @, B, b$ {% m) a217
8 T, h- n3 u( U) h, ]( [218
1 ~. E) }4 ^0 D" {& j4 I+ q6 R+ c219- x4 K8 @# J3 k
220
  K+ }% T, f* G- i2212 g1 e( [, L: }6 f
222& {* R8 X1 a: J1 x& V
223+ K8 c# o! k+ I: l- n
224* e- ]  k- u( K
225
2 p: g- @' N) Q' _+ P" \/ @9 L7 I8 r, \226" c- e" u7 q* a2 _
227
9 N, u! X  J; I  q  |8 e4 [228% v* m% r% u6 p8 ]" \' J% ?
229& O" ^7 J; {' q! K
230  k6 N# `6 Z9 M! N2 t
231, P/ a- }( l- i' p: ?  Z+ H
232% R% I' f3 J; S) S
233
- E4 I$ b. T6 p' h* h234/ |" O$ d/ b/ r
235
7 M8 K7 c8 O/ X$ K  t$ y236
6 a1 X/ K$ G# \) {' t& N1 x237
) ~; C& |% K# C. ~. U238+ T/ @. h0 Q, U! E1 _
239
; Z6 R4 O2 e5 M$ L5 z, C/ j240
7 N- T5 p+ T3 q  a: R1 d241
# S9 R: E; t: i2 e242
& _% `0 k2 E" l* s243
! |4 x. p! p' }& ]' ^244
7 d( t, ^2 W9 l8 e. y245
! T: {' O& g; h) |: j7 |8 Y5 T( P246
# v9 P9 V6 G* h. _2 @! V0 g) }7 L247( n) k8 a& m7 I2 M! i0 k( Q
248
$ R& o/ Q1 f$ `$ m6 O4 R249% M+ C* `) c, e. i% l$ B# h; F( Q
250; W0 i/ W4 O/ c" _$ b: B2 o$ a
251& ?3 R. O7 z( U# i
252
. J, T% \5 [- i8 p8 R- q2531 o1 E& j6 K& n* i5 D( v
254$ \  O  [1 m% N( D+ z
255
! x/ b2 y+ ~7 _" w: F) r256
1 R8 m$ c. ~" X' n5 W257
+ m! y; @. G+ f' l( P- G7 @258
0 D& \6 P0 t0 V! ?" m# a9 X- M259
4 Q5 E! q0 }! b4 M7 v4 k2602 X  B# @# i! x0 `- c
261
0 R: g6 j. g, ?9 W262
) v: f% ^: Q1 l! Z. ?- h263
- U& b" Y- F' J- X, u264' |, @$ N) @% Z
265
0 r$ x) ~/ i9 A3 V, P266
$ z( E3 H0 p6 m/ K5 X' z" {* C- v) @267
* \! O4 z, f" {6 E! z) [268  q5 H% F) n2 i& s# b% y: _/ W: l8 W
269
  }5 @+ ?* x) ]1 [" \2705 M1 D# v, t% |2 e
271
- J* x6 e; w% |/ k  u/ {; O! |272: }7 O$ ]' N! q2 N6 y
273
+ j! m: i( s/ g2 _- S; s+ W2 Q274+ h" Z7 T  Q1 F' \. W% i
275
% @. g# n5 }. I7 i276, L& i$ J) K( ]0 ~
2772 J* B6 {; E0 |  f4 t
278. g- l, t  X2 r7 c/ I+ S
2796 o" @" X6 D6 y" l$ Z' ^
280
  H- ^, ]6 Q% U9 v2810 d  a' G7 b% k2 Z2 {# p. s% c6 T, _
282) |5 p8 X2 j: M  z. {. N+ k3 P
283
2 {1 ^  ^' @3 m9 |3 L284
+ A  Y# M. R0 j# \" B285
7 _4 B" s2 }! c3 h/ r; Z% o286/ S# Y% U: c! R- P) M# D
287
7 ?- C( E3 W2 _! u9 H4 _  |0 r2889 f( w* C# d- m/ f: L4 z7 @- c
289
0 r; t- ?9 t  h" y4 q2 D  A290& z/ {3 w  X( F* ^5 l1 R
291
5 _0 r" u# X' n  b292
1 Y( L* u1 k4 `) v- I, a' B293
0 w* M2 y+ f) K294
% L; d8 Q$ t* ]1 H295
7 T4 p6 W8 Y8 v7 h296  T- @+ M, v0 _/ o0 }! r; g
297% R2 r* F) l4 a. ^0 b. _* C: A. ~
2985 g6 E& D0 S. P6 u* M
299" R' p2 C( s4 ?% y* P4 {7 g4 R
300
" G- k1 i5 `, A; O$ U8 P+ j301
. \  V* M/ [. H2 l7 [) z' ^302
; K# \2 U% e8 ~303. w8 Z5 m' H* ^$ D: M# z3 e; z( b
304
0 I, @3 b  U) E3059 o  L, h; a3 R& u
3060 T0 H- a: T5 T; M) I9 h7 b
307' T! V) O7 ~' B7 @+ i" {& Z
308
# |% v, f5 R* W. }" B  X3094 r) g# n# Z+ g2 E) G
310
* l* e& P* j: B  j" l1 v/ y3116 X* b2 m: o, n7 o* z
312% x2 B5 X9 ^0 r/ |' C
313
3 B# j0 K8 w* M" V314
+ O: S1 y% d- F( P315
* l- h" {6 v' w* c/ M/ m& j/ q3160 s9 u9 e, {! @4 a+ H" H4 ^% o. X
317# M$ q( x  N& D& n+ r
318* W, K7 p) N7 j: \
319- Z( Q, a, i+ {' C, g3 f. t) S
3205 E1 Q7 D) O- R3 B) R9 \7 m
321
. H  n* f8 p8 C8 u4 ^- `# Z322! D8 ~) e) Y" b) p  w; `
323
$ r  n" i0 c6 |! _( `& Y/ P2 F# k, G324) p2 d7 E# y  _
325
; [; H, G; I1 ~# N326( e1 u# J% E. p! f) T
327
# L8 [% @% w  v( k+ r3285 I) [! x, _9 P6 p* Z3 X) N+ T
329% `5 o- ^8 ^! I; h' }$ j" v; @4 s
3301 @* l* p% Y& Q: w2 t! K/ K' ]
331
6 h& ?0 g9 w# _332* f, G+ S7 L: X
333
2 _+ @7 m3 z) _# T334
0 U5 q: X' i5 W! |- g! z335: T7 J1 r# u5 n8 J, B/ I
336
% V8 ^9 c/ r+ O337- J; O. R, w/ t: f3 ?; _! a* x
338
/ _& G# N: H( H0 n. T+ d* i/ r339
- I* |& p/ z+ s% p# P) j$ s340  y8 ]1 U3 X1 s! U6 ~. Y& D% \
3417 \. ]  k! \& n" `4 E9 Y9 C
342
2 e5 W% Z% e  W% A# Q3433 S8 Q/ [+ p; j
344
0 U) l/ U' X; L5 D# S+ w% x& ~. O7 _345
: U3 P4 c& d3 b1 f/ \/ v0 N
[root@localhost SPECS]# cat nginx.spec5 _, B0 Z) K; A6 J
#
9 d# A- X, l: p/ v; A* G%define nginx_home %{_localstatedir}/cache/nginx
$ |6 R! ?% P4 R%define nginx_user nginx
, p9 ^* K9 J: E5 y$ w6 E%define nginx_group nginx" [3 H' [  e: Q; `/ c2 j
%define nginx_loggroup adm
+ O# y& g! n5 Z; M( k# [
* c% z8 f6 w7 E# distribution specific definitions
/ n7 W% y7 v) b, j' c  l%define use_systemd (0%{?rhel} >= 7 || 0%{?fedora} >= 19 || 0%{?suse_version} >= 1315 || 0%{?amzn} >= 2)7 r4 c9 j9 Q, x: x6 l# o; B
$ h8 l6 C8 ]7 Y
%if %{use_systemd}& ]1 e5 T) m6 j4 S
BuildRequires: systemd
! p8 M, |3 z/ }3 ~Requires(post): systemd
6 o! J1 |! S" [4 J4 O0 z$ nRequires(preun): systemd: Q: j: m! a7 R- }$ r$ O, W. [0 ^
Requires(postun): systemd, i* z5 n, |5 K( @% B: a8 N$ |4 I$ y
%endif1 M8 K" b% ?) L/ G. J0 V' ~, q

8 w2 T. w/ X5 [  K- {) \" V%if 0%{?rhel}
6 z( g- E% I! h+ @: c& Q%define _group System Environment/Daemons/ d4 H, a4 ?2 r0 u7 y: U
%endif8 A0 k# I! R6 `$ e+ }$ t$ j
' k' ^& P6 l: |' g1 X5 D; b( `. x
%if 0%{?rhel} == 67 }( }2 R. }# A# I
Requires(pre): shadow-utils
3 u, W3 j/ |! W; }' X7 ?Requires: initscripts >= 8.362 a  U) u; K6 @# l
Requires(post): chkconfig
3 W) w9 s, f  c* ARequires: openssl >= 1.0.1% y3 ^% r; h$ i9 ]
BuildRequires: openssl-devel >= 1.0.1
) j" H6 Z0 D4 Z1 V- M$ W%endif
& z6 Q4 a/ R- l6 y& _% L. q( y; Z0 e
9 C* l8 d% `* u3 M4 C' j%if 0%{?rhel} == 7% T  A' e( t2 U; E' s" ]
%define epoch 11 l, L% `! i3 X) g, y1 a
Epoch: %{epoch}
/ S* d1 O+ t9 E4 n! ?1 p  vRequires(pre): shadow-utils gperftools GeoIP-devel
* W/ k. `, m* C6 M7 R: u  O0 uRequires: openssl >= 1.0.2
6 ^( z/ T% W: C/ [5 ?% |BuildRequires: openssl-devel >= 1.0.2! t8 x2 W0 ?% r+ D7 P
BuildRequires: GeoIP-devel gperftools
& _: H; ~) T1 `: n6 w/ `%define dist .el74 e; [3 X8 w1 h
%endif
2 o7 G# i$ Z/ b$ e, c; _) X
8 v8 O9 V4 W% a' ~) W%if 0%{?rhel} == 8% Q3 p7 w1 ]8 ?- L' d+ s! {* I- I
%define epoch 1
, |; ^& N0 R. P( V, U& N8 HEpoch: %{epoch}
8 X7 L, i4 T8 S: |& tRequires(pre): shadow-utils
' C, G; a  p# d6 x' Y1 t" v5 T$ hBuildRequires: openssl-devel >= 1.1.1: E6 o8 @; p5 p( o
%define _debugsource_template %{nil}) J9 A% }2 k( m
%endif7 w1 ~6 O' l- \6 _: G

6 j% }+ V5 J8 j4 ]%if 0%{?suse_version} >= 1315. K' b1 c& h  w% ~* H1 t5 \
%define _group Productivity/Networking/Web/Servers
/ c; V0 q. i* o* L% Z4 G; c%define nginx_loggroup trusted
7 |; X6 A. \, A7 T5 I* h+ z2 A: URequires(pre): shadow( S4 J3 j4 m8 |7 U2 e
BuildRequires: libopenssl-devel
+ h9 I% q+ S" w" F& H+ z%define _debugsource_template %{nil}
3 S; o* N( t' M7 h7 n%endif
" Z$ a+ h5 E& U& G$ n% x, H, K  N3 \* R/ _3 c3 h
# end of distribution specific definitions' K) n3 `: i" e. Z

# m  j0 Q( L- h1 M  e' k" }5 o! [%define main_version 1.16.1
( E8 |; _4 a6 f# q3 v7 E$ _( Q%define main_release 1%{?dist}.ngx9 l9 o, {, o( J0 f) s
- d+ l9 ]$ i- t% O5 Z- i
%define bdir %{_builddir}/%{name}-%{main_version}7 C; e; D) {/ e* ~5 f& J' d7 }+ V

) I, f' |1 r4 c  U8 b%define WITH_CC_OPT $(echo %{optflags} $(pcre-config --cflags)) -fPIC
& {! P" J/ s' H; e4 F3 M! j- ~%define WITH_LD_OPT -Wl,-z,relro -Wl,-z,now -pie
( o  W" U# v. a! d; ~, f) a; {' V: z# P9 G3 \# }% c; b: C  a2 O, [
%define BASE_CONFIGURE_ARGS $(echo "--prefix=%{_sysconfdir}/nginx --sbin-path=%{_sbindir}/nginx --modules-path=%{_libdir}/nginx/modules --conf-path=%{_sysconfdir}/nginx/nginx.conf --error-log-path=%{_localstatedir}/log/nginx/error.log --http-log-path=%{_localstatedir}/log/nginx/access.log --pid-path=%{_localstatedir}/run/nginx.pid --lock-path=%{_localstatedir}/run/nginx.lock --http-client-body-temp-path=%{_localstatedir}/cache/nginx/client_temp --http-proxy-temp-path=%{_localstatedir}/cache/nginx/proxy_temp --http-fastcgi-temp-path=%{_localstatedir}/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=%{_localstatedir}/cache/nginx/uwsgi_temp --http-scgi-temp-path=%{_localstatedir}/cache/nginx/scgi_temp --user=%{nginx_user} --group=%{nginx_group} --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module")7 Z3 W4 O5 ]0 z+ G% v& @

8 |& d9 q( h# U0 n8 A  GSummary: High performance web server
4 C" i4 p3 H2 b! DName: nginx
1 a  [& k4 o$ Z" _' tVersion: %{main_version}$ U3 z* C( B3 [5 t
Release: %{main_release}: G1 k( T/ N0 T3 R6 a; f! a
Vendor: Nginx, Inc.
7 j, X8 [/ i$ C- T4 X' bURL: http://nginx.org/( I3 e2 }& A/ K1 \5 F
Group: %{_group}
: Q) j- I1 U# ^" Y
1 ^# X: K$ t% J, l2 `5 cSource0: http://nginx.org/download/%{name}-%{version}.tar.gz) ~0 j2 \% O  V9 a5 p) v6 ^
Source1: logrotate% Z; U9 p3 |+ {9 p! ^- m" N
Source2: nginx.init.in- L6 |1 q- @( I8 a6 J4 r7 F& _
Source3: nginx.sysconf0 t" z( z  g$ O7 r, q( S( {
Source4: nginx.conf
1 D0 T! e% l& H# F* \, e8 uSource5: nginx.vh.default.conf
) ^1 c( T: o  m2 ^2 rSource7: nginx-debug.sysconf) ~) u9 G# S( d; V* o  r8 e. l, u
Source8: nginx.service$ M8 g/ j) ^2 X- A( t4 ?
Source9: nginx.upgrade.sh
; `% w* u/ A6 iSource10: nginx.suse.logrotate
0 {2 B1 S( H  l5 pSource11: nginx-debug.service
3 T9 e$ c: D, P- j& D" m9 k5 HSource12: COPYRIGHT
0 b' N% d! k9 U* ~# ISource13: nginx.check-reload.sh+ \2 p- I5 M5 X0 U; }" w0 J* H4 r
Source14: nginx-http-concat.tar.gz
8 R; w& U' i% @0 W% cSource15: ngx_cache_purge.tar.gz
6 k3 l) ^+ g2 O: I& D, {. f1 o9 X8 E- M* f
License: 2-clause BSD-like license  @" F( R0 l/ T$ T5 P

6 g, W2 {) u% C" }" aBuildRoot: %{_tmppath}/%{name}-%{main_version}-%{main_release}-root
* z5 S* H* J7 D, s  ?2 LBuildRequires: zlib-devel/ R) ~. @6 U+ L6 f' a
BuildRequires: pcre-devel
/ i7 Z+ h) `& {4 e! t3 I( h3 A' q% o( B# x( g
Provides: webserver
- B" r8 [: y, r% R
+ u8 w+ a; K: z%description
* Z. G* g  W) C' Q* Inginx [engine x] is an HTTP and reverse proxy server, as well as7 b5 r  K- Q# z7 z' u
a mail proxy server." r" F9 C& j. m& H1 Y

# M+ _0 p. v- i/ T%if 0%{?suse_version} >= 1315
( y. N  O$ U+ Y%debug_package' D; r$ o+ s- d, ?% ~/ c+ _
%endif5 @6 L! u% J; J& M
1 m  y' I8 U- A
%prep! Y; B* M/ @; Q" r- h( d
%setup
# A$ Y' j  p* m- F%setup -T -D -a 14, |; R1 [7 W3 D, l+ e
%setup -T -D -a 15* s1 P2 C8 d0 d( i7 W
cp %{SOURCE2} .9 p1 v# S$ P7 M* L1 L: ?$ w
sed -e 's|%%DEFAULTSTART%%|2 3 4 5|g' -e 's|%%DEFAULTSTOP%%|0 1 6|g' \# c/ G! f2 v! y* b& j
    -e 's|%%PROVIDES%%|nginx|g' < %{SOURCE2} > nginx.init- {$ j' u. S3 C% O! p
sed -e 's|%%DEFAULTSTART%%||g' -e 's|%%DEFAULTSTOP%%|0 1 2 3 4 5 6|g' \1 u" Y: M3 e: t, t
    -e 's|%%PROVIDES%%|nginx-debug|g' < %{SOURCE2} > nginx-debug.init: L  U1 S+ h7 @/ P

& ?" }0 Z& s2 k' M5 B4 l, j%build& v( D: S. q. P: e  n# C4 q) r+ V4 [
./configure %{BASE_CONFIGURE_ARGS} \
- h! A, g/ O5 U1 d, [    --with-cc-opt="%{WITH_CC_OPT}" \5 d4 }# A+ G: _- |8 Z; u
    --with-ld-opt="%{WITH_LD_OPT}" \- M1 |7 o) V' \, |7 s2 a% V4 u
    --with-debug \7 f; C! m" {8 h% `
        --with-google_perftools_module \
- ^  ~! P0 h' m        --add-module=ngx_cache_purge \) i4 X/ |* q. W& e
        --add-module=nginx-http-concat \
% I0 ?5 ^( ]6 J        --with-http_geoip_module! p! f: \/ L; H( u

& h0 _9 F. B( ]! i* q. c9 Zmake %{?_smp_mflags}
; V% I. e$ m0 J' [# v' k+ q! i( ?%{__mv} %{bdir}/objs/nginx \+ k  K+ s; y& d0 Y* B. a' D
    %{bdir}/objs/nginx-debug
6 {1 V- V+ j: c8 `! F. D8 N./configure %{BASE_CONFIGURE_ARGS} \
7 Q* m0 x& }2 Q  x% @' I" B    --with-cc-opt="%{WITH_CC_OPT}" \. t/ }9 E/ r7 |' K% j, Q
    --with-ld-opt="%{WITH_LD_OPT}"
! V& l; @6 O1 w/ g5 z+ x( E  \make %{?_smp_mflags}
, N7 Y4 p8 u# F  i& E6 Q( n" ?' i6 V+ E
%install7 I: _- N( D4 O0 P5 z
%{__rm} -rf $RPM_BUILD_ROOT1 q* C9 ]# x" n: F' J- X. X2 }
%{__make} DESTDIR=$RPM_BUILD_ROOT INSTALLDIRS=vendor install; S; Q6 a2 g3 r  y" O( o0 f

3 [  `% M% }  b4 N%{__mkdir} -p $RPM_BUILD_ROOT%{_datadir}/nginx
+ n9 Z& ^+ a' Y' B/ `" }, l% D# r+ L%{__mv} $RPM_BUILD_ROOT%{_sysconfdir}/nginx/html $RPM_BUILD_ROOT%{_datadir}/nginx/, s, c- t8 D, H2 O+ e5 d* P& q# _
9 y1 k# i5 b1 y  T4 a! B9 T: l
%{__rm} -f $RPM_BUILD_ROOT%{_sysconfdir}/nginx/*.default3 i4 ?: g1 B- s( |  e9 |/ K  J$ `
%{__rm} -f $RPM_BUILD_ROOT%{_sysconfdir}/nginx/fastcgi.conf8 e- c- m) y1 ]1 C5 Y
1 a: _4 H/ d9 z* q* j8 W$ `4 p; Y
%{__mkdir} -p $RPM_BUILD_ROOT%{_localstatedir}/log/nginx) n( G( N. ]5 g- B; ?. Y& L
%{__mkdir} -p $RPM_BUILD_ROOT%{_localstatedir}/run/nginx
+ x, o1 I( N% H3 f, q%{__mkdir} -p $RPM_BUILD_ROOT%{_localstatedir}/cache/nginx% J- p) N3 x4 K
& f/ E: T& m) }: k+ i6 Q6 _7 d
%{__mkdir} -p $RPM_BUILD_ROOT%{_libdir}/nginx/modules
4 L) _9 H8 K' g7 j: s6 xcd $RPM_BUILD_ROOT%{_sysconfdir}/nginx && \
& m* t* M- S. {# X    %{__ln_s} ../..%{_libdir}/nginx/modules modules && cd -
* m3 X" @* f- O, ^" m
% y, ]9 }3 T7 ~# ^% u0 `%{__mkdir} -p $RPM_BUILD_ROOT%{_datadir}/doc/%{name}-%{main_version}
; o; t- D" M2 u+ O- j& s0 ]" D, N+ I%{__install} -m 644 -p %{SOURCE12} \( ^* `0 D! i( Y7 Z. D
    $RPM_BUILD_ROOT%{_datadir}/doc/%{name}-%{main_version}/& m# t9 Y6 q2 U7 \9 x- }. \' L- q; X

' }8 V7 W, k% U%{__mkdir} -p $RPM_BUILD_ROOT%{_sysconfdir}/nginx/conf.d5 R" K  w. T" F: q' k5 B
%{__rm} $RPM_BUILD_ROOT%{_sysconfdir}/nginx/nginx.conf
- k( i. E- u* b/ T) O( ]%{__install} -m 644 -p %{SOURCE4} \
2 z' Q8 C1 L9 c" i& v0 f2 p    $RPM_BUILD_ROOT%{_sysconfdir}/nginx/nginx.conf
+ {. n/ E. e# }. z. u%{__install} -m 644 -p %{SOURCE5} \  [  Y- o, N7 Q/ b
    $RPM_BUILD_ROOT%{_sysconfdir}/nginx/conf.d/default.conf1 M9 r, O& R* s  H6 N+ S$ D

, p/ M( B$ }: h- w: ~%{__mkdir} -p $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig: H" w6 Z5 c) D6 d. @$ m
%{__install} -m 644 -p %{SOURCE3} \
6 f& I: w) a' r( l, m5 y/ P    $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/nginx
: q  a% O2 H$ g$ n- t1 c%{__install} -m 644 -p %{SOURCE7} \0 i" n( n. V: [8 @* P+ @2 x
    $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/nginx-debug
) a7 l2 H. I) Y8 i, K
" {: U7 @8 ]. [5 B%{__install} -p -D -m 0644 %{bdir}/objs/nginx.8 \
! c3 O( N0 S& b3 r3 i# S    $RPM_BUILD_ROOT%{_mandir}/man8/nginx.8
0 h4 z: B; W% o' w+ @
  Z9 l3 y* r9 o8 K* g%if %{use_systemd}: r4 u' K+ z: v0 x: H9 p
# install systemd-specific files
; H$ L/ ^' M$ d4 @%{__mkdir} -p $RPM_BUILD_ROOT%{_unitdir}
7 S: ?" c! h4 A1 A%{__install} -m644 %SOURCE8 \
9 h5 A% b6 v/ E! J2 o& }    $RPM_BUILD_ROOT%{_unitdir}/nginx.service
& W! w: W- L' B4 }  A: {, V%{__install} -m644 %SOURCE11 \
9 w1 k/ ]- b( u6 L9 I* T    $RPM_BUILD_ROOT%{_unitdir}/nginx-debug.service; L- ^4 |1 N" D" q% {
%{__mkdir} -p $RPM_BUILD_ROOT%{_libexecdir}/initscripts/legacy-actions/nginx+ a- \# I0 O6 N) ~. E& N
%{__install} -m755 %SOURCE9 \
1 V+ ]8 a* q' \5 d4 O    $RPM_BUILD_ROOT%{_libexecdir}/initscripts/legacy-actions/nginx/upgrade& w% e& W# e3 n! Z5 ~- }, t
%{__install} -m755 %SOURCE13 \
' I4 v" z2 v* |# p6 q1 H1 E    $RPM_BUILD_ROOT%{_libexecdir}/initscripts/legacy-actions/nginx/check-reload, Q& f5 o8 `) l+ c
%else6 [* f  X8 h  \% }& B# A! F
# install SYSV init stuff' g* @5 D) e) x- t8 [9 B9 q" }
%{__mkdir} -p $RPM_BUILD_ROOT%{_initrddir}
, w& I* J3 I4 P/ P%{__install} -m755 nginx.init $RPM_BUILD_ROOT%{_initrddir}/nginx
* e5 |6 c3 B. f& G%{__install} -m755 nginx-debug.init $RPM_BUILD_ROOT%{_initrddir}/nginx-debug5 ~) O2 U+ i, [' {5 q# g& O$ k8 o
%endif" w7 C* `0 z! K

  p4 N+ t4 K$ @+ x0 J& ]# install log rotation stuff
0 l. p: E! f! Z% F%{__mkdir} -p $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d
; Z' N* J% ?3 @% [% r%if 0%{?suse_version}/ i/ R& r* O* o/ |  P$ [
%{__install} -m 644 -p %{SOURCE10} \; H1 W1 n2 r- c: s
    $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/nginx- i0 N/ \7 v5 R  i* J) z/ O0 O
%else
2 z2 y' U* f' `; P' W7 B7 e%{__install} -m 644 -p %{SOURCE1} \2 H# ]" I+ t/ t5 }( q
    $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/nginx
. o. w9 n6 d; o  k: M+ s1 p  ?# K%endif9 _4 r# O" e% e3 a, p2 v

, {0 u: G9 W8 `4 e4 R$ ?- Y, ^/ d# ]%{__install} -m755 %{bdir}/objs/nginx-debug \
0 E3 O- u8 K, j. r; G    $RPM_BUILD_ROOT%{_sbindir}/nginx-debug
+ b; n2 G% f) q6 m! Z8 c/ M) J) O
3 J& c9 N( m6 \%check
) M; c/ v3 j0 d. h* z: c%{__rm} -rf $RPM_BUILD_ROOT/usr/src
3 x$ {4 }) o5 k4 i' s9 A% g8 Dcd %{bdir}! m$ I, a  k6 A2 K# K+ o
grep -v 'usr/src' debugfiles.list > debugfiles.list.new && mv debugfiles.list.new debugfiles.list
, w. ~' W8 A3 }* w: K6 kcat /dev/null > debugsources.list1 I, c! A0 `% v
%if 0%{?suse_version} >= 1500
/ c- d' Q; y, E: A0 s4 }9 Tcat /dev/null > debugsourcefiles.list
* T" a( Y: D" D: b%endif
3 E& H& c8 Q1 I  A8 S  c8 s! }$ l& h3 n! g/ k- s# _9 a
%clean3 \  V( }0 f- R
%{__rm} -rf $RPM_BUILD_ROOT
/ A" a) n* E' u0 t- n" r- T: t. \3 Q2 n: [7 C( Q! k: u) I- C
%files  U5 h, D, [! w! `! w1 w9 J' \
%defattr(-,root,root)
4 d5 o7 F5 X1 l3 ~1 |
9 L0 i% y% n8 T0 K6 ?9 r$ E) I8 _1 t%{_sbindir}/nginx" j) x  g7 d% E: a  d
%{_sbindir}/nginx-debug; r, f) {; o! M7 }4 K
5 k8 {$ ]9 f: @6 B; d/ R$ d
%dir %{_sysconfdir}/nginx
, V! b7 l. s/ q, j3 \%dir %{_sysconfdir}/nginx/conf.d
% I. n3 }0 {2 T5 H: l0 m%{_sysconfdir}/nginx/modules- ]6 a" R& s  U6 q1 A# k

3 ?! ^) j  ^7 a# x, Y3 w%config(noreplace) %{_sysconfdir}/nginx/nginx.conf
3 f( K& P. J  ^# R  Z+ }8 ~%config(noreplace) %{_sysconfdir}/nginx/conf.d/default.conf
% E" p- V9 W9 z  Z1 N5 I%config(noreplace) %{_sysconfdir}/nginx/mime.types8 j. J8 V5 k/ }. \3 S8 d5 {4 D
%config(noreplace) %{_sysconfdir}/nginx/fastcgi_params# {5 z' W  a0 w
%config(noreplace) %{_sysconfdir}/nginx/scgi_params
  M% Z0 l) u' [9 @6 z& X( N%config(noreplace) %{_sysconfdir}/nginx/uwsgi_params
' {0 A& z6 c$ z3 M8 N) V%config(noreplace) %{_sysconfdir}/nginx/koi-utf$ \# r8 {$ f# C( i/ w2 O% s4 i
%config(noreplace) %{_sysconfdir}/nginx/koi-win* F6 s; |- M! G3 \
%config(noreplace) %{_sysconfdir}/nginx/win-utf
* W6 W6 V9 z0 Z$ G$ L9 r% X2 L- u- P' c6 k6 n1 @
%config(noreplace) %{_sysconfdir}/logrotate.d/nginx0 [8 |; S& v& G9 p; H2 \
%config(noreplace) %{_sysconfdir}/sysconfig/nginx8 q* j% p5 f' i0 R
%config(noreplace) %{_sysconfdir}/sysconfig/nginx-debug% \7 w8 |& M, z( K
%if %{use_systemd}# X( i* @! v) L# L! v
%{_unitdir}/nginx.service" x$ l) X6 h, C
%{_unitdir}/nginx-debug.service
+ K8 z/ R- H3 h7 P%dir %{_libexecdir}/initscripts/legacy-actions/nginx3 }1 o+ O2 c( D+ m' K
%{_libexecdir}/initscripts/legacy-actions/nginx/*
4 o  d+ m) I" o0 j4 K. {% b%else  K5 R7 M0 p/ T( U; G4 J
%{_initrddir}/nginx
( |2 \5 P% U3 g3 p* r%{_initrddir}/nginx-debug
* @2 T9 F6 B/ f& `%endif1 c3 D% {+ t9 [0 }! o% \
  S/ N+ ]% H8 y/ N! o& B
%attr(0755,root,root) %dir %{_libdir}/nginx2 C* N, v/ s5 l+ ]
%attr(0755,root,root) %dir %{_libdir}/nginx/modules. h0 h5 _9 \# [' F
%dir %{_datadir}/nginx$ C; s# m+ _& {* F
%dir %{_datadir}/nginx/html
& I2 O# I, J7 |  g%{_datadir}/nginx/html/*
) ]' p4 e0 e: o7 q% S; L& b% w* M) V/ g& ]. q3 Q, N
%attr(0755,root,root) %dir %{_localstatedir}/cache/nginx
- N2 k6 x4 F" J& t5 U6 }+ N. n%attr(0755,root,root) %dir %{_localstatedir}/log/nginx: m: e$ n+ W& j$ Z) t/ h3 p
: L" n4 I  f% b# A
%dir %{_datadir}/doc/%{name}-%{main_version}4 X7 a, |3 l9 H, D" v: I) s4 h5 S- V
%doc %{_datadir}/doc/%{name}-%{main_version}/COPYRIGHT
7 J0 G8 Q. M. X6 _$ i- \2 s: w- s%{_mandir}/man8/nginx.8*/ r! B" D, ^7 ]1 B2 I; k! [

+ M; F0 Z* p. ^8 u. k3 q%pre
# ]; h# Z4 v/ R: z# Add the "nginx" user
" l3 |6 H. j8 `( }+ p# L+ jgetent group %{nginx_group} >/dev/null || groupadd -r %{nginx_group}
: A8 ?3 p$ D' U1 N. ~% ?getent passwd %{nginx_user} >/dev/null || \
, g) @$ ]6 P  r2 r" s    useradd -r -g %{nginx_group} -s /sbin/nologin \
5 d  i' T+ F! d- v& U+ N    -d %{nginx_home} -c "nginx user"  %{nginx_user}
: _; t! a. l1 d" F, E' h# A  u8 Jexit 0
  |: X, M% u9 N. ~2 S8 S
) I) _. O/ }' I6 N$ h%post
* ~6 `5 \3 n) @; s/ {: _# Register the nginx service
* ?- q  X5 |" p4 Vif [ $1 -eq 1 ]; then7 b% E) z$ L5 G- Z
%if %{use_systemd}. f. j! Q2 S  L
    /usr/bin/systemctl preset nginx.service >/dev/null 2>&1 ||:1 r3 G$ G) R9 Q  Z$ v( A
    /usr/bin/systemctl preset nginx-debug.service >/dev/null 2>&1 ||:
- B7 z5 C7 f) K/ R3 M, E%else, `  z% ?/ a1 ?3 Y
    /sbin/chkconfig --add nginx0 V7 I- }% ?! C& j  b
    /sbin/chkconfig --add nginx-debug
+ Y9 M9 w9 q: E1 [8 R%endif0 \* z! d# k2 z. f3 |% m2 a# v, N
    # print site info
+ F) y/ i' x* ]- t; {    cat <<BANNER
, b7 Q1 C5 z1 T0 {( E----------------------------------------------------------------------
# o3 O3 S9 W( \" ^& U- y8 G  @5 x1 |. R: y$ N  l9 [3 N
Thanks for using nginx!
* a. r1 s8 |/ N# ?) s. p9 m' }( Y  E/ v! F8 i2 t' _; i
Please find the official documentation for nginx here:
' ]. a& }1 v7 {. \- u* http://nginx.org/en/docs// d7 K3 }/ J4 U. p1 I
) O$ c9 N8 s9 m2 j' h
Please subscribe to nginx-announce mailing list to get) h  _8 N. B, e0 `4 m1 V2 G* S5 s
the most important news about nginx:
% Y- K) |" M9 \7 s9 e* http://nginx.org/en/support.html4 w$ U5 q3 N: Y9 \( c' {  j6 j

0 N( ~' Q* Y  f. C! ECommercial subscriptions for nginx are available on:( _+ P6 U! ^; ?. j* l9 E( c
* http://nginx.com/products/
& ]  r% S, Y8 O* |' W7 r- H
6 G  P! e+ J/ x# t4 Z----------------------------------------------------------------------
1 h3 N5 ?9 b8 j. JBANNER$ P9 t" W6 T/ R4 Q
- l7 K( b  [# @( g$ }1 V! y
    # Touch and set permisions on default log files on installation
. _. m9 F/ t! D6 J" M$ [, J9 X% h+ d
    if [ -d %{_localstatedir}/log/nginx ]; then
+ `' R/ P' w3 R  ?/ U1 s# U5 e! ?        if [ ! -e %{_localstatedir}/log/nginx/access.log ]; then5 n2 l8 \7 i5 P+ u' V  m
            touch %{_localstatedir}/log/nginx/access.log" v+ D, x% |' |* w8 c
            %{__chmod} 640 %{_localstatedir}/log/nginx/access.log
( _/ E; c  b- u2 G4 _/ e4 }  R! F7 _            %{__chown} nginx:%{nginx_loggroup} %{_localstatedir}/log/nginx/access.log
/ J9 g9 ]8 K3 `% V' m        fi
2 i3 i% ?" ^& n* G0 {3 |6 C/ J$ X+ |" {) r8 Y
        if [ ! -e %{_localstatedir}/log/nginx/error.log ]; then) s# j1 W! L" \8 V2 `
            touch %{_localstatedir}/log/nginx/error.log( u0 n1 a4 `" H2 H  w
            %{__chmod} 640 %{_localstatedir}/log/nginx/error.log
" S& t7 Y% U# j# t) e' t) M8 I" d            %{__chown} nginx:%{nginx_loggroup} %{_localstatedir}/log/nginx/error.log
- |1 `7 L2 N* x! [6 M+ \; i. g# {        fi
! Y9 |" r4 ^1 }: B    fi; V# _) N) a9 s
fi
& s! h& {% i( W* o; W
3 \" U; Q* k% T, _5 M' U0 ?%preun
3 J  \  X+ q0 k8 h7 Tif [ $1 -eq 0 ]; then- b( ^+ a2 D8 }3 y
%if %use_systemd- r$ X! H/ e- A1 N' {
    /usr/bin/systemctl --no-reload disable nginx.service >/dev/null 2>&1 ||:
! O" H' g! Q$ O$ ^3 R    /usr/bin/systemctl stop nginx.service >/dev/null 2>&1 ||:' Y! X( Y( d# q6 U* F; J3 \
%else
5 X# S" P" o8 `) j9 ?5 o    /sbin/service nginx stop > /dev/null 2>&15 q$ X, y- h* H% `7 V# \. Z
    /sbin/chkconfig --del nginx# X) u# o( F2 v0 c
    /sbin/chkconfig --del nginx-debug2 _( p/ F8 ?% }
%endif
( A1 k0 {- m* I4 l0 F7 a) N' ofi% r, P, m2 e9 N0 u7 [3 K  y& l! d6 Q
' z* ?2 E! r0 @1 g! ]- E7 e2 T
%postun9 B: R+ j* u7 e1 W7 r
%if %use_systemd4 c/ ]4 D) N$ ?' L6 ]9 ~# x) L
/usr/bin/systemctl daemon-reload >/dev/null 2>&1 ||:
- c2 M( Q5 _5 m  O! m/ ^%endif& l8 \) r" ^2 q4 Z# o8 Y! J  ~& G
if [ $1 -ge 1 ]; then
' ^2 [7 R/ b6 b6 `  v1 @7 y. g    /sbin/service nginx status  >/dev/null 2>&1 || exit 0
( M0 a) g' q" U. D% Z2 D    /sbin/service nginx upgrade >/dev/null 2>&1 || echo \
: q9 ]5 c% f6 _* {+ S        "Binary upgrade failed, please check nginx's error.log"
, n% }$ n% l, q+ }" `fi
; L- \# O& O. ^- l( m, s  x" A( r
%changelog3 B* |' K$ s; j& |
* Tue Sep 30 2019 fangdm <8@8994.cn>
2 E, x, H) j3 q5 }$ n5 u! O- Add modules nginx-http-concat and ngx_cache_purge3 x( @( e4 |& ^" O9 k. M
+ N+ O0 n+ M( d; e! L% Z: v
* Tue Aug 13 2019 Andrei Belov <defan@nginx.com>
2 d4 Q. ~. M; L" J, |* E- 1.16.1
. [, ^1 o. G; O
5 e, l! b3 n; x

, g/ }4 m  H( m. i7 ?$ A8 W) \
编译完成之后,查看changelog,是成功了。
复制
1# c: x6 |4 `: {. `
2  j, p; D' w( j9 N8 X$ r/ b" M
3
: g! O) l/ C* S! ?  |# ?4) A7 {$ `6 e9 H: K7 H+ l# g
5
6 k* `) X$ j" b5 y) P) g6 f1 f60 A9 B! e7 S; r4 V! w
[root@localhost SPECS]# rpm --changelog -qp /root/rpmbuild/RPMS/x86_64/nginx-1.16.1-1.el7.ngx.x86_64.rpm
1 g" k0 o; }: R8 G* Mon Sep 30 2019 fangdm <8@8994.cn>4 o# I% z0 ~: }) ?# s
- Add modules nginx-http-concat and ngx_cache_purge% o/ E( V5 S6 n: y5 N( N

  i) o+ t. }6 ?; H! u5 c8 y& e* Tue Aug 13 2019 Andrei Belov <defan@nginx.com>
; J, L4 p1 i$ A- 1.16.1
+ e4 B/ M/ ?5 p+ K, A
& @* A8 E8 Y1 S9 J' z! U

5 O/ i! W) l3 U. g4 u: D: X0 x, E$ efpm打包方法
使用fpm这个方式也是可以将tar打包为rpm包,其打包流程大致是这样的:
  • 编译安装被打包软件,指定安装的临时目录,如指定--prefix=/fpmbulid
  • 创建安装脚本、卸载脚本
  • 安装FPM工具
  • 使用fpm打包
    ( l. T. M( ?1 ^5 _, w* O" j8 O+ j: ~
# E% Q. C; z. H2 p2 S5 y" H
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

北京云银创陇科技有限公司以云计算运维,代码开发

QQ|返回首页|Archiver|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )点击这里给我发消息

GMT+8, 2026-4-8 21:40 , Processed in 0.104537 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

快速回复 返回顶部 返回列表