找回密码
 注册
查看: 453|回复: 1

make编译安装,将tar转rpm包

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2022-10-20 15:00:05 | 显示全部楼层 |阅读模式
gcc相关知识, U& j7 ?( _6 ]/ Q
先编写一个C文件,其第一行表示包含文件在/usr/include/stdio.h下,如果没有申明,则需要使用参数-I /usr/include指定。. C6 p# s* A3 t2 i( U
( I% K4 V  Z+ M. _& n
[root@home ~]#cat sin.c
% E4 g2 v+ X: q# [3 m8 K' A5 `#include <stdio.h>
8 D: W5 z/ |/ l, _1 s3 ?8 Xint main(void)
! O6 n& `. v& m7 Q& {/ r/ m{+ Z) ]0 m% r- _8 K' A% S$ k' F
        float value;$ x9 r' [1 ?6 Q# n$ ~* G
        value=sin(3.14/2);4 Q' l$ M* O$ S  E
        printf("%.2f\n",value);
+ \1 O; d" e* L- G}' c: R: l& T, l& \4 K% j

" G/ r/ k7 f' a4 l2 J* s0 i[root@localhost src]# gcc -c sin.c
0 {  P% ~7 R6 l0 e8 P$ c' h7 ksina.c: In function ‘main’:
9 f9 A* N) m5 D. k% j% d& `sina.c:5:8: warning: incompatible implicit declaration of built-in function ‘sin’ [enabled by default]4 E/ ]+ C/ ~. W
  value=sin(3.14/2);9 \; D( C6 t+ ?% ^2 c
        ^
/ j% p2 M& v4 V# G[root@7ftbv7mdz7cdpc ~]# gcc -c sin.c -lm -L /lib/64 -L /usr/lib646 x3 w. P) f! c6 h2 c4 M
sin.c: In function ‘main’:
: [" A" t- n1 _+ }3 G; gsin.c:5: warning: incompatible implicit declaration of built-in function ‘sin’# I4 y  s) u2 t& \( A. A9 P
[root@localhost src]# gcc -o sin sina.o
" S' g0 X) W# P& _. J[root@localhost src]# ./sin# e5 j5 ]* o5 m) l" ~$ w" k: X! [0 P
1.00
/ z9 K  q) k# E3 R1 Pgcc sin.c全产生a.out运行文件,加上参数-c则生成二进制文件sin.o,再加上-o则生成运行档sin。& G4 x: Q/ D- ?
, M, Z3 E' ]: o- T
但是如果出现以下错误,这是因为 C 语言里面的 sin 函示是写在 libm.so 这个函式库中,而我们并没有在原始码里面将这个函式库功能加进去,可以使用以下命令gcc -c sin.c -lm -L /lib/64 -L /usr/lib64  c2 z% n  o7 s/ r

2 v4 f" G7 _6 ~  J7 u) a9 Mgcc -O 为产生最佳化的参数* g7 l9 @  n- O0 g3 M

* t1 q" v( d! I7 @6 Sgcc -Wall 为产生更详细的编译过程资讯
& E% s+ R3 B! z% Z7 U+ e
9 e6 i- [. P8 X" q-l :是『加入某个函式库(library)』的意思,
9 X1 ~1 z: X; h) ?: M
4 [, A6 G' f5 y- L$ d  E0 qm :则是 libm.so 这个函式库,其中, lib 与扩展名(.a 或 .so)不需要写% o3 U. p1 v& t
-I /path 后面接的路径( Path )就是配置要去搜寻相关的 include 文件的目录啦
& u- [+ q* S" ^; C/ c-L 后面接的路径表示函式库 libm.so 请到 /lib 或 /usr/lib 里面搜寻
' s) w; O; {0 \# J总结:  @; ~+ y' A! @

; T. m; u& R( A0 v; @7 h" X* j# 仅将原始码编译成为目标档,并不制作连结等功能:
3 T6 T/ L; f- J/ t' b[root@www ~]# gcc -c hello.c8 E( d3 }9 T4 o+ T
# 会自动的产生 hello.o 这个文件,但是并不会产生 binary 运行档。+ q: i6 H9 T2 ^& u0 V" ]+ r. F) j

/ _; p, Z8 m) U! I; p# g; O8 M( K# 在编译的时候,依据作业环境给予最佳化运行速度+ r. C5 {# v5 {5 G7 c! C0 X. |
[root@www ~]# gcc -O hello.c -c
6 l5 z: o' _* O/ t# ]4 c# 会自动的产生 hello.o 这个文件,并且进行最佳化喔!& p2 ^( }- R; s5 `1 \6 R, M: m
$ f8 e, C1 S8 O7 e' _4 e4 [4 t- L$ o
# 在进行 binary file 制作时,将连结的函式库与相关的路径填入
/ z: l: B/ X6 \[root@www ~]# gcc sin.c -lm -L/usr/lib -I /usr/include) l2 J$ U; M/ j7 j2 c9 G
# 这个命令较常下达在最终连结成 binary file 的时候,
: F) m$ F6 W  r) z& d* B/ f7 o, R- O# -lm 指的是 libm.so 或 libm.a 这个函式库文件;3 O5 k7 @4 m- j' j  ~+ S" @/ }
# -L 后面接的路径是刚刚上面那个函式库的搜寻目录;) G7 D& l  ~; U  \, U5 }3 u
# -I 后面接的是原始码内的 include 文件之所在目录。$ j- v1 h, ?! y& X8 M

. @: U  E# G. J+ F0 @! K# 将编译的结果输出成某个特定档名0 M' \& j/ y' C$ C4 t3 i2 K
[root@www ~]# gcc -o hello hello.c! N8 y  o9 B1 }; m6 B9 ^2 B) C
# -o 后面接的是要输出的 binary file 档名; k, V0 Y$ n9 w( s- x

+ ^5 {, `; I. z# x4 n# V# 在编译的时候,输出较多的信息说明
9 a1 L! H, \$ b' w* y. T' n[root@www ~]# gcc -o hello hello.c -Wall$ \6 ]$ E- T. ^* q0 P
# 加入 -Wall 之后,程序的编译会变的较为严谨一点,
6 y& N- I0 k( I2 E' V9 ]# 所以警告信息也会显示出来!
! z8 J1 \$ W9 Z0 o另外,我们通常称 -Wall 或者 -O 这些非必要的参数为旗标 (FLAGS),因为我们使用的是 C 程序语言,所以有时候也会简称这些旗标为 CFLAGS。2 d& d' c( s$ s! i# Y6 K" g. P

$ E; s! t  b8 Xmakefile介绍
  K8 B  G, c  e实例$ t- c" b7 F. x6 w: O( @$ f
首先,下载wget http://linux.vbird.org/linux_basic/0520source/main.tgz然后开始编译:
4 Q, `5 ?8 \4 f0 ^; x4 |; u/ Q" [( a4 @, S* P* L+ ]# P5 b
[root@localhost main]# cat makefile
4 k5 J6 t. Q: Wmain: main.o haha.o sin_value.o cos_value.o
& O3 }* x; r7 e* w; u        gcc -o main main.o haha.o sin_value.o cos_value.o -lm5 z" |/ P! V8 y6 R1 r4 L
clean:
; ~. G+ N5 l9 Z        rm -f main main.o haha.o sin_value.o cos_value.o4 ]1 W. M$ Z3 H7 N! g
        : s* x5 c0 b. R+ A0 }' {
[root@localhost main]# make6 I1 h( P2 Y6 [$ R& C* o% ^6 b$ S; i
cc    -c -o main.o main.c3 `! m7 v5 c; V- A6 X1 `- m1 T
cc    -c -o haha.o haha.c4 D5 y5 h$ D( g7 p. _4 u" Y
cc    -c -o sin_value.o sin_value.c
" w: [( W4 `, ?% |/ e8 g1 Zcc    -c -o cos_value.o cos_value.c! t" m3 w1 y! t* @; f
gcc -o main main.o haha.o sin_value.o cos_value.o -lm! [) ^* ?. C* g1 w: K6 L. T

0 ]4 {7 M- t& C6 ~8 ^) I% |3 [[root@localhost main]# ./main6 X/ U! S" U9 J
Please input your name: fdm' r7 c6 l( g5 @, Q
Please enter the degree angle (ex> 90): 33. g6 W& J9 S) R/ j# S4 r$ w
Hi, Dear fdm, nice to meet you.' H9 Z' l/ G  D& d7 p6 j
The Sin is:  0.545 d8 F) G9 I1 L/ a6 J& F9 l; g
The Cos is:  0.84' N; y$ f8 I6 g4 P0 t
2 G3 i. {- D# [" f5 [9 D- N& o  R3 c
[root@localhost main]# make clean
5 a" q& w. O+ K, n  Z* Vrm -f main main.o haha.o sin_value.o cos_value.o
7 r. g: h1 Y) s( N2 B* Q- ]makefile 的基本语法与变量
# C, ]- @8 q- ^+ Smake 会主动的去判断每个目标档相关的原始码文件,并直接予以编译,最后再直接进行连结的动作。  C  r) Z; D: {9 D( ?0 f3 x% n7 w
" F, E! ~5 ~. S
在 makefile 当中的 # 代表注解;" P* R. b5 f0 G0 b2 {0 [- }' Y
需要在命令行 (例如 gcc 这个编译器命令) 的第一个字节;
8 C$ U# M8 p+ W1 g2 u2 q- e标的 (target) 与相依文件(就是目标档)之间需以『:』隔开。就是可执行程序的文件名。
. y/ T) D7 _* `2 x9 i标的(target): 目标档1 目标档26 m% Z! G3 `3 R
        gcc -o 欲创建的运行档 目标档1 目标档2
' R3 O* ~+ b1 @3 H! F如下,makefile 里面就具有至少两个标的,分别是 main 与 clean ,如果我们想要创建 main 的话,输入『make main』,如果想要清除有的没的,输入『make clean』即可!而如果想要先清除目标档再编译 main 这个程序的话,就可以这样输入:『make clean main』
- }( {+ y1 F6 V2 y- E
; m! ^7 `, U* }( L  F5 v5 P还可以进行简化,使用变量来减少程序的修改量。$@:代表目前的标的(target);gcc 在进行编译的行为时,会主动的去读取 CFLAGS 这个环境变量,可以写到makefile7 q) t: ?* I; r, }
2 Y* a) n1 U3 ^7 K4 ~0 E
[root@www ~]# cat makefile  Q) P% U6 h" S% w& M
LIBS = -lm
) s7 j2 u2 X8 [) d& T  LOBJS = main.o haha.o sin_value.o cos_value.o
4 E/ E7 U- S+ k7 u/ ^CFLAGS = -Wall7 v. T& A+ j, b  R( o# }2 X% T
main: ${OBJS}& B; a) |* b; Y  F2 g
        gcc -o $@ ${OBJS} ${LIBS}
5 e: u( c: m# Q( V" Dclean:& u) g8 p3 t+ W2 `  v* w- T) N
        rm -f $@ ${OBJS}5 |' v( a. Z+ {9 ^- D
由於 gcc 在进行编译的行为时,会主动的去读取 CFLAGS 这个环境变量,所以,你可以直接在 shell 定义出这个环境变量,也可以在 makefile 文件里面去定义:/ V6 }& @( X, n3 L

# {; q- F2 D4 P8 ?& U7 @; R[root@www ~]# CFLAGS="-Wall" make clean main
, Y$ W5 K; X" `% q0 e) s# 这个动作在上 make 进行编译时,会去取用 CFLAGS 的变量内容!
9 r% X2 s  b: w( R9 rmake与Dockerfile相接合) ^& x1 s, m" ~5 |  [6 o
此小节内容来源于 high-iowait-process 。
$ {. @* o' f. F+ K3 r
4 o/ o& A  f6 B) F, `; v  O如有下列Makefile文件内容:
6 W0 d% q% K4 y  @  _% n  T' J; K' W# h3 ?5 @' E; x
.PHONY: build) I( D8 M' W- }, B1 v4 I) r+ |
build:& E1 j" n8 X( r5 q( w+ H
        gcc -o app app.c9 z9 |: z' h4 g3 {  m
        docker build -t feisky/app:iowait -f Dockerfile ./ c1 ]- F6 A/ \5 g  Z
        gcc -o app app-fix1.c6 w  t( z# \+ o2 g
        docker build -t feisky/app:iowait-fix1 -f Dockerfile .
0 c0 l6 _3 \9 c( G, ~        gcc -o app app-fix2.c
% d- X( ?. Y( z4 z# [$ W% W        docker build -t feisky/app:iowait-fix2 -f Dockerfile .
. e$ o! t0 u4 K, |  a# f% n+ ~  D7 ]8 s1 ]" G0 K8 Q0 Y5 y
.PHONY: push
$ U1 h: y8 T1 `' h: C  }push:- e- m1 m2 V5 j* g
        docker push feisky/app:iowait$ f' O, S/ E) X' A
        docker push feisky/app:iowait-fix15 [+ D9 c% R, o; L. d
        docker push feisky/app:iowait-fix2: M  ?$ {2 v; O/ i5 T  A

( p9 C7 p: p1 |7 w' ^.PHONY: run( P5 I: h* u3 R% \. @0 F7 t5 q+ a
run:
. v; V/ d* N) _7 s3 }" h        docker run --privileged --name=app -itd feisky/app:iowait# o# j' i9 R' @4 c- i4 w. h/ o
: E- x* D8 @. g% Q6 Y2 u
.PHONY: run-fix1" D0 b3 Q) I: z- t4 W
run-fix1:; x1 y) y9 c3 d7 s
        docker run --privileged --name=app -itd feisky/app:iowait-fix1& u8 l; i$ Z! l8 [: C1 e

/ g2 P7 ]" \0 O+ @: O.PHONY: run-fix2
7 J* C* [( X$ o7 g& Crun-fix2:
' K. B- H  ]. d! J        docker run --privileged --name=app -itd feisky/app:iowait-fix2
1 v: O% U4 |  S$ j
- Y/ l( W7 o0 ~0 q* t.PHONY: clean, f8 i6 O# ?9 F/ |
clean:, b; H" z9 e$ d6 ?, |
        rm -f app$ x2 L/ j* X$ R: A
        docker rm -f app || echo "Container app already deleted."
9 _  e7 D! T/ I4 n5 n* t3 X9 {4 j! n这样写好之后,就可以使用 make bulid 来生成镜像,使用 make run 来运行镜像,使用 make clean 来删除镜像。所以这看上去就有点像脚本的函数一样了。! ]6 n' ?9 t$ C

# v, s( j/ L  s变量的基本语法
1 W3 p, O  w0 ~6 ~% \* }) V变量与变量内容以『=』隔开,同时两边可以具有空格;( l/ I9 O/ T1 I  \+ T9 {
变量左边不可以有 ,例如上面范例的第一行 LIBS 左边不可以是 ;
7 k; I5 `  H8 h% I* c; s1 y变量与变量内容在『=』两边不能具有『:』;; D( A/ G; j3 Y- t4 d) M, F) N
在习惯上,变量最好是以『大写字母』为主;
' \% ^0 d/ u8 P运用变量时,以 ${变量} 或 $(变量) 使用;2 W2 z8 y% B  j  a: W% g' F: L
在该 shell 的环境变量是可以被套用的,例如提到的 CFLAGS 这个变量!; F( ^1 J0 w' \
在命令列模式也可以给予变量。/ Z! T3 }% M( d
yum安装相关环境
9 Z# s0 A  }1 \, N" k6 u  Z1 u如果是要安装 gcc 等软件发展工具,请使用『 yum groupinstall “Development Tools” 』
% y3 F( w( m! E! b4 A8 y1 g若待安装的软件需要图形介面支持,一般还需要『 yum groupinstall “X Software Development” 』
, \5 p, Z1 I+ i! H9 g3 v若安装的软件较旧,可能需要『 yum groupinstall “Legacy Software Development” 』- p8 K) |$ P  L4 |/ Z" u7 f8 F
编译软件步骤0 j, _: r& H" A. ^
./configure 创建Makefile文件
4 v* E+ T! W* S9 Dmake clean 会读取 Makefile 中关於 clean 的工作,可有可无
* N/ K% H; i% C( s5 i1 mmake make 会依据 Makefile 当中的默认工作进行编译的行为
: A" o0 C; v" @; Q# ~4 B* h) cmake install
  H2 l3 s( L2 G/ ~% K8 q9 x) f% t如果未指定安装路径,则编译安装的目录是放在/usr/local/etc、/usr/local/bin、/usr/local/lib、/usr/local/man下。
* v" d7 i, ^9 J0 t) R* U* m! x( z# b3 W
rpm知识
0 e# M3 t5 H  d- {- w  \' W此内容与编译无关。可以跳过,同时此内容也来自于鸟哥私房菜,是一本好本啊~. q0 A# n2 U! w) I

! @8 U, ]5 r1 o8 e  R& tRPM 安装 (install)& O' i0 i+ Z* k- p( i+ \
[root@www ~]# rpm -ivh package_name
& r1 n, ]$ m# {* b* V选项与参数:) X/ g6 _( C! e$ f
-i :install 的意思
) \0 V/ G; j& W0 I& i- J5 l-v :察看更细部的安装资讯画面
$ w8 T  S4 V4 h4 j0 x-h :以安装资讯列显示安装进度
+ n0 A$ C% {( D# [! ~1 F. h- B/ w, R
-Uvh        后面接的软件即使没有安装过,则系统将予以直接安装; 若后面接的软件有安装过旧版,则系统自动升级至新版;
$ [2 G) M( v6 _  ]-Fvh        如果后面接的软件并未安装到你的 Linux 系统上,则该软件不会被安装;亦即只有已安装至你 Linux 系统内的软件会被『升级』5 ~, ?5 h5 x. W( [3 t  ]
: t" V' L& C. b( O% b7 D9 U4 R) r
[root@www ~]# rpm --rebuilddb   <==重建数据库8 ?* a  G' j' s* x' u) C
rpm 安装时常用的选项与参数说明
2 M7 \: O& `! {! s: Q& \8 q- B- h  a( V: X6 D8 W
—nodeps:当发生软件属性相依问题而无法安装,但你执意安装时: x6 H$ B3 |) P% B0 E
—replacefiles:如果在安装的过程当中出现了『某个文件已经被安装在你的系统上面』的资讯,又或许出现版本不合的信息 (confilcting files) 时,可以使用这个参数来直接覆盖文件。
4 }8 i% X8 v6 ?) @& R, v—replacepkgs:重新安装某个已经安装过的软件!如果你要安装一堆 RPM 软件文件时,可以使用 rpm -ivh *.rpm ,但若某些软件已经安装过了, 此时系统会出现『某软件已安装』的资讯,导致无法继续安装。此时可使用这个选项来重复安装喔!
3 q( H; d( Y6 l2 \% K3 Z1 ]—force:这个参数其实就是 —replacefiles 与 —replacepkgs 的综合体!
; ^( U3 _! l- c, S—test: 想要测试一下该软件是否可以被安装到使用者的 Linux 环境当中,可找出是否有属性相依的问题。# R' J6 Q! ?5 H* J+ G- H, L
—justdb 使用时机: 由於 RPM 数据库破损或者是某些缘故产生错误时,可使用这个选项来升级软件在数据库内的相关资讯。% E3 X- U. Z+ u# G6 C" |
—nosignature 使用时机: 想要略过数码签章的检查时,可以使用这个选项。4 w9 u- [! m# ]( i7 j, }
—prefix 新路径 使用时机: 要将软件安装到其他非正规目录时。举例来说,你想要将某软件安装到 /usr/local 而非正规的 /bin, /etc 等目录, 就可以使用『 —prefix /usr/local 』来处理了。3 C. ?; K" c2 m3 P& z4 l# O
—noscripts 使用时机:不想让该软件在安装过程中自行运行某些系统命令。) [% o# u6 n- W! u
RPM 查询 (query)0 z8 O; q1 l4 d
RPM 在查询的时候,其实查询的地方是在 /var/lib/rpm/ 这个目录下的数据库文件。
: k6 f/ l4 J5 q8 T' @2 A
" v1 \8 k/ x* [5 m4 P/ b[root@www ~]# rpm -qa                           <==已安装软件
3 Z8 F" k! G, [$ i. t+ P; f[root@www ~]# rpm -q[licdR] 已安装的软件名称       <==已安装软件
/ o, [+ u' R5 h3 O8 w: k1 q) \[root@www ~]# rpm -qf 存在於系统上面的某个档名      <==已安装软件
, I( K7 A% ~% _5 K* N2 U[root@www ~]# rpm -qp[licdR] 未安装的某个文件名称  <==查阅RPM文件- [1 c' s+ t) l, u0 C  h$ \
-q :仅查询,后面接的软件名称是否有安装;
/ R. ?; d/ J/ u  L-qa :列出所有的,已经安装在本机 Linux 系统上面的所有软件名称;- g- t& D9 [+ {8 Q' f! j
-qi :列出该软件的详细资讯 (information),包含开发商、版本与说明等;
6 u; ]; \6 h2 w; {-ql :列出该软件所有的文件与目录所在完整档名 (list);" m  r4 o0 t% ]5 L& |( J4 B
-qc :列出该软件的所有配置档 (找出在 /etc/ 底下的档名而已)3 N6 d4 W8 |$ E4 u2 l9 I
-qd :列出该软件的所有说明档 (找出与 man 有关的文件而已)5 ~; N  z* k" v& Q. m. n
-qR :列出与该软件有关的相依软件所含的文件 (Required 的意思)9 f4 A$ {$ d3 [& m
-qf :由后面接的文件名称,找出该文件属於哪一个已安装的软件
) L4 D9 W0 P; u% N1 N4 `-qp[icdlR]:注意 -qp 后面接的所有参数以上面的说明一致。但用途仅在於找出某个 RPM 文件内的资讯,即未安装的名称5 H) N# U/ J9 i9 o  t% f
RPM 验证与数码签章
- w6 X# V7 S) ?8 T验证
0 N+ `+ `' i: _( y4 ^( @; j验证 (Verify) 的功能主要在於提供系统管理员一个有用的管理机制!作用的方式是『使用 /var/lib/rpm 底下的数据库内容来比对目前 Linux 系统的环境下的所有软件文件 』也就是说,当你有数据不小心遗失, 或者是因为你误杀了某个软件的文件,或者是不小心不知道修改到某一个软件的文件内容
1 V! d# |" Z8 k( ?+ x: B! U
/ N) V6 s3 ]2 v- @7 s2 c[root@www ~]# rpm -Va
! N% @  Y. `& h/ h9 v# \[root@www ~]# rpm -V  已安装的软件名称, T+ A" ^. H9 d! e
[root@www ~]# rpm -Vp 某个 RPM 文件的档名' l5 |! g) `$ ?. D/ w6 V1 B+ [
[root@www ~]# rpm -Vf 在系统上面的某个文件: G% U5 E$ y) U* t$ k& V

! y5 u1 E. S! a  n* v选项与参数:1 c) ^% f+ }" c( g8 g/ n
-V  :后面加的是软件名称,若该软件所含的文件被更动过,才会列出来;* a& h  ~) @6 r/ ^' {& E2 d
-Va :列出目前系统上面所有可能被更动过的文件;+ |. h# L; _  N3 C5 f* |4 n7 O
-Vp :后面加的是文件名称,列出该软件内可能被更动过的文件;+ v2 @- }. j  r
-Vf :列出某个文件是否被更动过~
) z: a8 }( i7 P: N: O  d8 |6 T2 Y, n' M) ?
[root@www ~]# rpm -V logrotate$ ?# m5 [7 K+ ~; b& ]" a. ~: a( }
..5....T  c /etc/logrotate.conf5 v- W0 O6 {1 j, K2 j0 Q, M
第一列的含义有以下几种:6 f- [2 D3 r, g

- X4 E/ H" E$ F  lS :(file Size differs) 文件的容量大小是否被改变" }. z- m6 F' o# J1 _) Y
M :(Mode differs) 文件的类型或文件的属性 (rwx) 是否被改变?如是否可运行等参数已被改变/ T! f. P# a$ F+ c: K3 e" i
5 :(MD5 sum differs) MD5 这一种指纹码的内容已经不同  @0 U0 L% N7 C
D :(Device major/minor number mis-match) 装置的主/次代码已经改变9 S+ d* ~% G4 i& Y! O
L :(readLink(2) path mis-match) Link 路径已被改变
, `1 q. J, x, e, D! |6 k' pU :(User ownership differs) 文件的所属人已被改变; _( i/ m+ @. k; F
G :(Group ownership differs) 文件的所属群组已被改变
0 A0 u. t9 \. D* Y4 ]/ O5 y7 cT :(mTime differs) 文件的创建时间已被改变, x5 f4 d- ~% I
第二列的含义有以下几种:
* ~6 q; z) G, e% I* b1 i0 W: z# v( ~, h1 l$ w" p; f
c :配置档 (config file)! Z" N& z6 ?( t4 j
d :文件数据档 (documentation)
- j! O$ X$ I- eg :鬼文件~通常是该文件不被某个软件所包含,较少发生!(ghost file)
& H; @6 u' t( e* o3 wl :授权文件 (license file): R; \: V: Q8 @6 x1 e) Z
r :读我文件 (read me)
" M% ]" o3 d' f% v. J' p数码签章
. f9 Z  }% N6 I7 R软件开发厂商可以数码签章系统产生一个专属於该软件的签章,并将该签章的公钥 (public key) 释出。 当你要安装一个 RPM 文件时:& j$ m0 L8 E1 Q7 |% @2 E

5 e+ j5 U) b" v2 t首先你必须要先安装原厂释出的公钥文件;实际安装原厂的 RPM 软件时, rpm 命令会去读取 RPM 文件的签章资讯,与本机系统内的签章资讯比对,若签章相同则予以安装,若找不到相关的签章资讯时,则给予警告并且停止安装喔。" O5 v" y- k* a. h/ n

% V4 s, \6 Y$ L( l% v. T[root@localhost ~]# ll /etc/pki/rpm-gpg/RPM-GPG-KEY-*8 F8 P  B$ T! U# C: m1 d4 T
-rw-r--r--. 1 root root 1690 Nov 23 08:16 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7; y  \% Z$ ^7 p, U$ A9 V
-rw-r--r--. 1 root root 1004 Nov 23 08:16 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Debug-7- `2 w1 p& R3 W" W# W5 u: d+ R
-rw-r--r--. 1 root root 1690 Nov 23 08:16 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Testing-73 K" X8 C1 ^) k% Y0 ^
-rw-r--r--. 1 root root 1662 Oct  2  2017 /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7/ ~; ^8 H0 q8 U3 @. f+ v+ ]# V* z
-rw-r--r--. 1 root root 1340 Mar 23  2017 /etc/pki/rpm-gpg/RPM-GPG-KEY-remi
+ d) z5 D6 W* S- l+ [-rw-r--r--. 1 root root 3100 Mar 23  2017 /etc/pki/rpm-gpg/RPM-GPG-KEY-remi2017# R& W& N! p8 p5 y; ]% X5 e) d5 d7 u
-rw-r--r--. 1 root root 3143 Jan 16  2018 /etc/pki/rpm-gpg/RPM-GPG-KEY-remi2018* K+ w  N# j$ {8 x4 P6 m
SRPM相关知识
$ X6 E2 t: F- ~$ R# H+ ~rpm的全称是Redhat Package Manager,SRPM是指 Source RPM 的意思,这个 RPM 文件里面含有原始码,特别注意的是,这个 SRPM 所提供的软件内容『并没有经过编译』。通常 SRPM 的扩展名是以 *.src.rpm 这种格式来命名的。srpm跟tarball的区别就是srpm提供了这个软件所需要的相依性软件说明、以及所有 RPM 文件所提供的数据。$ c+ i  {# t! b! I8 R( }6 U" m4 ~
) ]# a) v5 ]  F
rebuild直接安装
  o8 ]# `$ f  l3 {下载src.rpm包之后,可以在不修改配置的情况下,直接使用以下参数直接操作:6 t: Y$ _% y! e

9 p  V" F) q: {; \# ~; i—rebuild:这个选项会将后面的SRPM进行『编译』与『打包』的动作,最后会产生RPM的档案,但是产生的RPM档案并没有安装到系统上。当你使用—rebuild的时候,最后通常会发现一行字体:Wrote: /root/rpmbuild/RPMS/x86_64/pkgname.x86_64.rpm这个就是编译完成的RPM档案啰!这个档案就可以用来安装啦!安装的时候请加绝对路径来安装即可$ Y$ t! X, F& C$ y: z
—recompile:这个动作会直接的『编译』『打包』并且『安装』啰!请注意, rebuild 仅『编译并打包』而已,而recompile 不但进行编译跟打包,还同时进行『安装』了
9 {6 g# Q6 B' N, ^" i/ r, W示例:
6 {. R  o, e  _7 d% [7 z* a! v5 r( R, \9 _
先下载软体:
  X+ ^  g1 U/ o: J! vwget http://vault.centos.org/7.1.1503 ... l7.centos.1.src.rpm
  e0 [5 U7 Q8 Q: W! P再尝试直接编译看看:
; Q+ J2 m8 _! L  A8 a2 c" `: b( @! {rpmbuild --rebuild ntp-4.2.6p5-19.el7.centos.1.src.rpm' w# E' ~9 \# `( R% D4 J% S
上面的动作会告诉我还有一堆相依软体没有安装~所以我得要安装起来才行:8 m' Y5 f) O/ W; f: U
yum install libcap-devel openssl-devel libedit-devel pps-tools-devel autogen autogen-libopts-devel
$ z9 n- {4 y6 d: ~3 o# ?+ s) k再次尝试编译的行为:
, N; [. b3 ~" ]8 O: S. H5 wrpmbuild --rebuild ntp-4.2.6p5-19.el7.centos.1.src.rpm
" _4 A" m- l  ^' e最终的软体就会被放置到:
- n" o8 a: V: [( f" g) z/root/rpmbuild/RPMS/x86_64/ntp-4.2.6p5-19.el7.centos.1.x86_64.rpm
) R" r' l, K, ?1 MSPEC编译安装
, @' i& \* \6 a" |: g目录说明& S5 N- j" l0 o0 d
如果你的rpm的版本<=4.4.x,那么rpmbuid工具其默认的工作路径是/usr/src/redhat,这就使得普通用户不能制作rpm包,因为权限的问题,在制作rpm软件包时必须切换到root身份才可以。所以,rpm从4.5.x版本开始,将rpmbuid的默认工作路径移动到用户家目录下的rpmbuild目录里,即$HOME/rpmbuild。
+ ]0 ^, ]0 [% L- S2 G$ `2 \. p! l( M+ _& u3 ^4 p
首先yum -y install rpm-build rpmdevtools,然后rpmdev-setuptree来创建工作目录,也可以不安装rpmdevtools,直接使用mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}来创建。具体的各目录的含义如下:
* x) a3 I; g( U- q+ S7 W4 u
' M) Y/ p7 a4 ^+ Y! j0 S默认位置        宏代码        名称        用途* B" C' N4 ^, c9 v% P% C
~/rpmbuild/SPECS        %_specdir        Spec 文件目录        保存 RPM 包配置(.spec)文件, m, @! g3 z- Y: x
~/rpmbuild/SOURCES        %_sourcedir        源代码目录        保存源码包(如 .tar 包)和所有 patch 补丁% [- f* s! J: c) S
~/rpmbuild/BUILD        %_builddir        构建目录        源码包被解压至此,并在该目录的子目录完成编译
- M1 O) }0 W/ f+ m5 ]* l) X) c+ R~/rpmbuild/BUILDROOT        %_buildrootdir        最终安装目录        保存 %install 阶段安装的文件  Q2 s& @5 l7 y" t3 K8 U/ E% m
~/rpmbuild/RPMS        %_rpmdir        标准 RPM 包目录        生成/保存二进制 RPM 包
6 x( ~9 Y0 b( ^* R1 R1 h+ \~/rpmbuild/SRPMS        %_srcrpmdir        源代码 RPM 包目录        生成/保存源码 RPM 包(SRPM)
  C* k6 D1 y; D4 [" h8 n) \使用rpm -ivh来安装srpm包时,会生成很多文件在/root/rpmbuild下:
% I* e! R7 i7 d6 P/ n9 @$ b& A# A# f. ^+ x* g# U, |2 E, O3 y9 r
[root@localhost ~]# rpm -ivh ntp-4.2.6p5-19.el7.centos.1.src.rpm& h) p! v! p7 z# S
Updating / installing...
- R+ K+ e( Z" K) i# _   1:ntp-4.2.6p5-19.el7.centos.1      ################################# [100%]" w0 W4 o5 E3 c6 e7 J0 F  _+ E, G
[root@localhost ~]# tree /root/rpmbuild/( ^) r/ d: t( [4 k
/root/rpmbuild/  U+ [0 E5 }: w4 q5 Z
├── BUILD8 s# ^, f; [' ]. w2 H/ k- V
├── BUILDROOT
; s& k/ [# y8 A& e: A/ l4 P├── RPMS, m8 g; ~0 s, B3 C, S, f
├── SOURCES
+ d! I  |; E# w│   ├── ntp-4.2.4p7-getprecision.patch9 P5 V% u1 V  J& J8 _5 `" J+ W
│   ├── ntp-4.2.6p1-cmsgalign.patch
% ^' k8 |+ X( W。。。
& ~. z! o: C9 E, K) w│   └── sntp.sysconfig7 J% S* @& R: c
├── SPECS
2 c' ~. M% c/ n│   └── ntp.spec) i; B; Q. y+ c6 K3 y
└── SRPMS) u6 q( {( x8 }7 F
解压完成之后,srpm本身就提供了spec文件,可以直接通过以下方式直接安装:
7 H+ R3 q9 w8 a  F7 Y- P# Z+ j; ~/ \- S! g( X% `1 E& W7 z/ M
[root@study ~]# rpmbuild -ba ntp.spec   <==编译并同时产生RPM与SRPM档案 / k7 L; L* i+ U+ [! f% f7 S3 ^6 g; p
[root@study ~]# rpmbuild -bb ntp.spec   <==仅编译成RPM档案  E* `: i6 c) R' [0 w/ b% R& z
spec打包流程
5 ?9 A2 A# S! e2 QSPECS下是RPM包的配置文件,是RPM打包的“图纸”,这个文件会告诉rpmbuild命令如何去打包。“宏代码”这一列就可以在SPEC文件中用来代指所对应的目录,类似于编程语言中的宏或全局变量。当然~/rpmbuild这个文件夹也是有宏代码的,叫做%_topdir。; ]& }  u) ~8 T# G' t, f

: n# r3 f% v' q4 `, N! Q/ @0 c打包的过程有点像是流水线,分好几个工序:
6 z# G0 n4 W3 W- h. h! j  D( ?1 G2 V# S1 V6 m9 `5 l
首先,需要把源代码放到%_sourcedir中;
8 K' i8 ^: F8 v然后,进行编译,编译的过程是在%_builddir(~/rpmbuild/BUILD)中完成的,所以需要先把源代码复制到这个目录下边,一般情况下,源代码是压缩包格式,那么就解压过来即可;: V1 |. [, k2 `) M7 _) ?# E* L$ _: H
第三步,进行“安装”,这里有点类似于预先组装软件包,把软件包应该包含的内容(比如二进制文件、配置文件、man文档等)复制到%_buildrootdir(~/rpmbuild/BUILDROOT)中,并按照实际安装后的目录结构组装,比如二进制命令可能会放在/usr/bin下,那么就在%_buildrootdir下也按照同样的目录结构放置;
7 N# `8 j, x0 S5 Z+ a  {  Y然后,需要配置一些必要的工作,比如在实际安装前的准备啦,安装后的清理啦,以及在卸载前后要做的工作啦等等,这样也都是通过配置在SPEC文件中来告诉rpmbuild命令;
! B3 f# V( n; Q还有一步可选操作,那就是检查软件是否正常运行;& a. i$ ?/ w7 E5 Z  Z+ @2 z
最后,生成的RPM包放置到%_rpmdir,源码包放置到%_srpmdir下。
# t- P/ l1 e% p+ J" g- K* U2 sspec文件内容* V* o& _9 C* V7 B$ K. B% Z
使用vim a.spec之后,会自动生成spec的结构体,内容如下:
4 d; i6 Q3 s! I/ x; m6 E& R+ V7 O
. \+ x- @1 S6 V# s' T* FName:                                                                ==>软件包的名字,后续可以用%{name}来引用
% ^$ M) D2 P) W% F# r- ]2 V8 J3 ?Version:                                                        ==>软件版本* {3 M& A3 H' B, I
Release:        1%{?dist}                                ==>发布的序号* I% `; i/ M# W
Summary:                                                        ==>软件包的摘要信息
  }0 m' g$ l, G& p1 a+ Y! Q! [8 ?% |9 p9 L# {
Group:                                                                ==>软件包的安装分类,参见/usr/share/doc/rpm-4.x.x/GROUPS这个文件
$ Q& m( F% ~" x' E5 B7 RLicense:                                                        ==>GPLv2,授权方式
$ P3 L3 c4 k& |$ a. ?# q0 W# PURL:                                                                ==>这里本来写源码包的下载路径或者自己的博客地址或者公司网址之类,无实际用处
3 t8 V* [7 S" E' z8 d5 r1 ]* M( ^# w6 |Source0:                                                        ==>%{name}-%{version}.tar.gz源代码包的名称,这里的name和version就是前两行定义的值。如果有其他配置或脚本则依次用Source1、Source2等等往后增加即可。
4 i8 f( y5 ~/ g& u/ s; o
, _; ~- q: p9 fBuildRequires:                                                ==>在本机编译rpm包时需要的辅助工具,以逗号分隔。假如,要求gcc的版本至少为4.4.2,则可以写成gcc >=4.2.2。
) e! ^) V9 b9 O* `8 `/ yRequires:                                                        ==>编译好的rpm软件在其他机器上安装时,需要依赖的其他软件包,也以逗号分隔,有版本需求的可以
; ?2 [# z  Z( {5 f3 a0 l6 E) c2 w  |- d, r0 R
%description                                                ==>软件包的详细说明信息,但最多只能有80个英文字符。
( y# S, ?4 I0 _1 Z6 D/ b/ b- j" X3 {) y5 j( o) ~1 R4 e# m6 g
%prep                                                                ==>读取位于 %_sourcedir 目录的源代码和 patch 。之后,解压源代码至 %_builddir 的子目录并应用所有 patch。
* z- f+ k- w. `) T%setup -q                                                        ==>使用这个语句实现%prep功能,仅能解压Source 或 patch 定义好的文件
0 h  K: {/ {( @8 _$ l3 r2 T, ~! W2 y( m" E5 Y
%build                                                                ==>编译位于 %_builddir 构建目录下的文件。通过执行类似 ./configure && make 的命令实现。
6 t! [3 l. Y4 V/ T+ h& T9 s%configure
0 ~; `& x7 N' w, G3 N% G! q( G3 U) rmake %{?_smp_mflags}/ |9 `/ x) @( S/ H+ R
4 y- d: F* I" M
%install                                                        ==>读取位于 %_builddir 构建目录下的文件并将其安装至 %_buildrootdir 目录。这些文件就是用户安装 RPM 后,最终得到的文件。注意一个奇怪的地方: 最终安装目录 不是 构建目录。通过执行类似 make install 的命令实现。) ~# a) N4 j3 L% i+ W+ V9 F9 ?: q! m- {
make install DESTDIR=%{buildroot}
* O; [, [9 d6 Z. ~( w; _) k$ |0 s  _$ H: k. F
%files                                                                ==>软件文件和目录# W6 S* E9 h+ P4 U, G- J0 @
%doc                                                                ==>软件说明文件) a  [$ U! u# d1 P
* K- Q' [2 c, B
%changelog                                                        ==>更新说明,星号(*) 后面应该要以时间,修改者, email 与软体版本来作为说明, 减号(-) 后面则是你要作的详细说明啰, G& J9 A0 J0 v( x# E5 b6 L: L
除了以上这些,还是以下阶段:- `2 \, k( u  I% `, c6 ?

( D$ v' a9 r, D# Q. t7 D; D' H%pre 在目标系统上安装软件包之前执行的Scriptlet。注意跟%prep的区别。! W" u* o7 Q/ D. S- D: q" j9 Z6 y
%post 在目标系统上安装软件包完成之后执行的Scriptlet。! M, l! s$ s0 `* A7 E
%preun 在从目标系统卸载软件包之前执行的Scriptlet。
' f: M8 k2 \9 ^. d%postun 从目标系统卸载软件包完成之后执行的Scriptlet。+ d/ [7 r" o/ r( Q
以下介绍一下比较重要的阶段。# m, e, R' J; H% s

& z2 \5 F' w5 e1 p' N& S%prep阶段
4 r! L; _% |; U4 {- `这个阶段里主要完成对源代码包的解压和打补丁(如果有的话),而解压时最常见到的就是一句指令:%setup -q。这句指令可以成功执行的前提是你位于SOURCES目录下的源码包必须是name-version.tar.gz的格式才行,它还会完成后续阶段目录的切换和设置。如果在这个阶段你不用这条指令,那么后面每个阶段都要自己手动去改变相应的目录。/ [" Z2 v7 k  I) N# y
8 Q6 V; h1 J8 x& ^' h$ F
如果在%prep阶段,只使用了%setup这个宏变量,代表了会运行以下操作(假设Source为cdplayer-1.0.tgz):
; U8 {$ q0 V$ N& j+ J
4 `8 Y' W, G+ a( e( M4 ^cd /usr/src/redhat/BUILD+ z7 F! b  m8 E4 z0 R) f
rm -rf cdplayer-1.0
9 L0 \* \* ?, Ngzip -dc /usr/src/redhat/SOURCES/cdplayer-1.0.tgz | tar -xvvf -+ P2 I; L) D) z$ D
if [ $? -ne 0 ]; then; M; E, g3 i+ Q
  exit $?" ~  |1 Y3 w( v+ b
fi' P/ S/ O$ d+ O' \8 z
cd cdplayer-1.08 V; @+ f" J# n% y! |
cd /usr/src/redhat/BUILD/cdplayer-1.0
* `. ]$ @  m& Y& ~chown -R root.root .% |  x) S4 G8 o1 b4 [/ M
chmod -R a+rX,g-w,o-w ." ]- q" D' J! c
可以看到,默认操作为先进入BUILD目录,然后再删除%{name}-%{version},再解压,最后再修改权限、属主等。参数-q是指不输出运行的过程,还有其他参数如下:/ F- F6 T3 E) r" b
+ O% P. \0 t  G9 r
%setup -n newdir 先删除/usr/src/redhat/BUILD/newdir目录,然后将软件包解压在newdir目录;再进行这个目录进行权限设置
' l9 ?: C. j' N. N# ^8 ^& b%setup -c 先创建目录,进入这个目录后再解压。与不加参数的%setup比较,仅仅是多了mkdir 以及 cd 这2个命令
% r; l( o1 z* x; b( {; U%setup -D 解压缩时,不会去删除目录。与不加参数的%setup比较,少了rm -rf操作* m( X. \0 y% R2 b  [
%setup -T 不进行解压的操作。与不加参数的%setup比较,少了gzip以及if判断语句
% D; f: }4 s2 L; r3 u/ g
# P& E" H$ K/ A1 B5 y: o7 E- s%setup -b num 将第num个source文件解压缩。如果是 %setup -b 0,就会解压2次,可以使用 %setup -T -b 0,这样就只会解压一次了。但只效果跟 %setup 不加参数的效果是一样的。
" v8 g2 K: I( }' s8 n3 q%setup -T -a num 先进入目录再解压第num个source文件
- \: e  p, j5 N* {
$ S" K& a+ f( P' U* s4 I
. s) ~& x1 b4 O; ~2 m9 X7 h%patch 最简单的补丁方式,自动指定patch level。' v( v! B. _& i0 o6 w
%patch 0 使用第0个补丁文件,相当于%patch ?p 0。
/ P1 b2 f% x1 w$ {& F" O# w%patch -s 不显示打补丁时的信息。! ~6 R: F( \3 V4 w' K) q# t( j
%patch -T 将所有打补丁时产生的输出文件删除。
; ~1 Z* X3 q$ I: j4 N*************************************/; ~. f) v* J: d
%setup -q -n %{name}-%{version} . U* z( I4 C7 k( @, w

) B$ k. O) q+ X, p% A( @% \/* 如果原来只有一个“Patch:”,您增加“Patch1:”,则在SPEC文件%setup行后面的7 F( U. v, M1 P  c! y* A
   %patch -p1后面新增一行: %patch1 -p1 依此类推.
8 z7 D. i% z9 m& }- O' w */
. @9 X+ Q; {/ I- R5 E  W8 j. H%patch0 -p1" e: x; L) O! X1 i
实例,如果%prep的内容如下:# e* ~5 ?( B& q* v1 F. E
$ T# ~3 e" F7 k- ^$ H
%prep9 j4 q" R2 l9 x, h$ _& b
%setup
7 c* G- S) G, N7 W! x3 Q" q%setup -T -D -a 14' J9 ~% N4 ]  V
%setup -T -D -a 15
4 g3 [. {: B& s: z- M5 x% Z" v其运行的过程如下:
, I* `( k2 |4 ?4 e8 }% t& V# @6 c3 H0 _+ m
[root@localhost SPECS]# rpmbuild -bb nginx.spec
7 o( \) X& f; v# F( dExecuting(%prep): /bin/sh -e /var/tmp/rpm-tmp.N1Tdpo- s& }0 ?1 t; q: n/ l
+ umask 022
8 W9 S: n" W& V/ k# ]" [+ cd /root/rpmbuild/BUILD
; e  V4 |* p4 e1 _% R+ cd /root/rpmbuild/BUILD
( N$ X' L8 ]( Q- W5 l4 o8 C+ rm -rf nginx-1.16.1- K" ?! v* l* X4 l1 R
+ /usr/bin/tar -xvvf -
0 m1 a1 Y' }* E; D2 ~+ /usr/bin/gzip -dc /root/rpmbuild/SOURCES/nginx-1.16.1.tar.gz
( U( g. N0 y. X: {+ Y* B$ N...8 ?/ b9 f$ p6 v5 g
+ STATUS=0
9 V  U( U7 @4 U8 u+ '[' 0 -ne 0 ']'
) ?* Y  M: ~( q; `8 ~# Q: K! `+ j+ cd nginx-1.16.13 `6 m9 \+ L$ l$ O
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .' }" j+ ^3 `/ k5 N4 ^  |( O" E, }
+ cd /root/rpmbuild/BUILD$ h* @# H! x/ G' f% Q
+ cd nginx-1.16.14 k* ~6 o% A$ R) M. r8 W- ^
+ /usr/bin/tar -xvvf -
2 P2 A; m6 C/ z, O1 B+ /usr/bin/gzip -dc /root/rpmbuild/SOURCES/nginx-http-concat.tar.gz
2 H  H  V( Z) ]* M4 J" s2 C...
( i, f' Z% n6 L8 K8 ^+ STATUS=0( x! e6 B) \$ W- A6 h9 E
+ '[' 0 -ne 0 ']'  F7 L) }8 N8 A7 R$ `5 J" T
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .+ I1 h* Q; J: Y/ Y& t- ^3 ~$ r2 {
+ cd /root/rpmbuild/BUILD
# g3 D% n9 X! C. I+ cd nginx-1.16.1
8 f8 @% P; c! \+ /usr/bin/tar -xvvf -
. B  L, D) M( c7 y6 P$ Q+ /usr/bin/gzip -dc /root/rpmbuild/SOURCES/ngx_cache_purge.tar.gz, [! Q9 i2 s4 Q. m
...
  F6 n5 o* l$ b  O: {* ~7 X, Q需要注意的是,%setup -q 是指解压不输出任何提示消息,只会解压source0的文件,即第0个source文件。%setup -T -a num 先进入目录再解压第num个source文件,进入目录的意思是进入%{name}-%{version}这个目录,即spec前面定义好的Name以及Version。
: }; P2 a( y; T- w3 H" @# \8 S& H5 i* L# M% T, B. l3 i
https://book.huihoo.com/maximum-rpm/s1-rpm-inside-macros.html
* |0 }9 s. c* C5 p( A& {2 o. G: X- P" Q
%build阶段/ g; r( H; i- G7 z8 P2 a
这个阶段就是执行常见的configure和make操作,如果有些软件需要最先执行bootstrap之类的,可以放在configure之前来做。这个阶段我们最常见只有两条指令:
; l' i0 z4 ^: H
" l* e% _2 |! W( X" I. r% V%configure
* u; G6 L0 f7 p- ]make %{?_smp_mflags}! [" v; J7 F* _+ M, r* `
这里的%configure是个宏常量,会自动将prefix设置成/usr。另外,这个宏还可以接受额外的参数,如果某些软件有某些高级特性需要开启,可以通过给%configure宏传参数来开启。如果不用 %configure这个宏的话,就需要完全手动指定configure时的配置参数了。同样地,我们也可以给make传递额外的参数,例如: make %{?_smp_mflags} CFLAGS="" …
+ ?/ b: {6 d! o8 ~8 x) x6 ^6 m# R7 c' \1 d+ X' o/ N/ r
%install阶段1 P" a' I- f3 N
这个阶段就是执行make install操作。这个阶段会在%_buildrootdir目录里建好目录结构,然后将需要打包到rpm软件包里的文件从%_builddir里拷贝到%_buildrootdir里对应的目录里。这个阶段最常见的两条指令是:
2 \. A  y8 l3 s5 |$ h2 J$ D/ M$ {+ l# {
rm -rf $RPM_BUILD_ROOT! G# Z) h0 {; g/ e: o
make install DESTDIR=$RPM_BUILD_ROOT
) Z5 {7 n# a8 D4 R其中$RPM_BUILD_ROOT也可以换成我们前面定义的BuildRoot变量,不过要写成%{buildroot}才可以,必须全部用小写,不然要报错。7 b) X: p; Q# K
8 G: I7 T' L( K+ C: O: m
如果软件有配置文件或者额外的启动脚本之类,就要手动用copy命令或者install命令你给将它也拷贝到%{buildroot}相应的目录里。用copy命令时如果目录不存在要手动建立,不然也会报错,所以推荐用install命令。+ m9 y" C0 o- Y7 G: l- G0 T

% Q2 `" C: G3 K$ j) t制作rpm软件包的阶段2 Q9 O3 J- Q" F9 ]/ v
这个阶段必须引出下面一个叫做%files的阶段。它主要用来说明会将%{buildroot}目录下的哪些文件和目录最终打包到rpm包里。
3 I/ k3 `9 v. c# F0 R: I
2 t3 [  X" _+ Y%files
2 P& m5 a$ {2 C7 E8 T%defattr(-,root,root,-)
" z: ^* V; }0 Q% A%doc+ V0 {$ I+ R# a% D
%defattr 表示的意思是: %defattr(文件权限,用户名,组名,目录权限) ,如果不牵扯到文件、目录权限的改变则一般用%defattr(-,root,root,-)这条指令来为其设置缺省权限。; V1 T4 i1 K9 V3 s
* @: F% w0 [: g. _
关于%files阶段有两个特性要牢记:1 ?/ c, i% q% ~7 J2 h
6 y- G' f2 |$ _; k$ d! {2 s1 _
%{buildroot}里的所有文件都要明确被指定是否要被打包到rpm里。什么意思呢?假如,%{buildroot}目录下有4个目录a、b、c和d,在%files里仅指定a和b要打包到rpm里,如果不把c和d用exclude声明是要报错的;
& I$ j" q  ~" @8 |如果声明了%{buildroot}里不存在的文件或者目录也会报错。; V" J8 Y+ T6 J; S. s( H! U, f
代表路径的宏列表
# U5 `0 _- d" ^: X  m' `7 C如果您看到一个不熟悉的宏,您可以使用rpm --showrc 或者 rpm --eval %{_bindir}以下方法对其进行查看:
4 y. H! f& ~8 B( L8 Y# u5 D% e2 a. }# [6 S/ G/ B$ Y
$ rpm --eval %{_bindir}: {! ~7 J3 ?: c6 O. K' f/ f
/usr/bin8 F" l7 t, C* G0 l
8 n9 ?' M; ?2 \# E
[root@localhost noarch]# rpm --showrc |grep buildrootdir
: U# U$ C( u, N  P9 @- @. r-14: _buildrootdir        %{_topdir}/BUILDROOT
5 H  ~% {# l0 Z) J7 l. y-14: buildroot        %{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch}) Y/ H$ n* W6 o
也可以直接查看/usr/lib/rpm/macros文件,以下是常见的宏:
- M/ _- u4 j( \) C, c, Y( F1 d% `8 j
%{_sysconfdir}        /etc
) S! g2 u- L7 d% Y6 G6 E%{_prefix}            /usr3 z  x+ u6 V( ]6 T3 b. t
%{_exec_prefix}       %{_prefix}
8 T2 h" i' K8 i* E2 P6 D%{_bindir}            %{_exec_prefix}/bin
) p6 \$ j* {: E9 _( }; ?8 |5 ?( L2 I/ n2 C%{_libdir}            %{_exec_prefix}/%{_lib}
! X0 x) W) T1 `6 P8 k%{_libexecdir}        %{_exec_prefix}/libexec6 ?: }  Y' ~6 A3 }: |) d) S
%{_sbindir}           %{_exec_prefix}/sbin
% A( x5 ?0 H3 \2 s6 G$ B%{_sharedstatedir}    /var/lib
5 c& M5 g$ N) u4 C1 ]8 e%{_datarootdir}       %{_prefix}/share
9 \$ \7 D* a$ {%{_datadir}           %{_datarootdir}
+ G9 q) R' ~" w4 v%{_includedir}        %{_prefix}/include
( P9 K6 u  t6 z5 h3 m6 @: J%{_infodir}           /usr/share/info
$ ^4 w5 c$ F9 ~( `1 T%{_mandir}            /usr/share/man
( n0 K% z& f* Q%{_localstatedir}     /var
0 E7 ?5 ^& s1 K- `%{_initddir}          %{_sysconfdir}/rc.d/init.d: U2 _: u& F  w1 n8 c1 M. h# A
%{_var}               /var
( d' e9 o. r8 ?%{_tmppath}           %{_var}/tmp' U" p: d* ~9 @& O/ I: j5 ~1 U, P
%{_usr}               /usr
9 D4 M5 C. P- m4 N2 j* `  `6 P%{_usrsrc}            %{_usr}/src9 d' Y" H( Q- m0 d  i- L" Z
%{_lib}               lib (lib64 on 64bit multilib systems)! o9 t0 T# D* Z9 Q, @1 }( m- x
%{_docdir}            %{_datadir}/doc; D& b2 v6 E; }- o- W$ g2 q
%{buildroot}          %{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch}" ~( C& u7 K% q$ o6 U. D! M
$RPM_BUILD_ROOT       %{buildroot}& ~; @! ?5 h# L) l% p, C6 @
要注意的是%{buildroot} 跟%{_buildrootdir}不同。%{_buildrootdir}对应的目录是~/rpmbuild/BUILDROOT;而%{buildroot}是%{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch},有关其他内容可以参考 https://fedoraproject.org/wiki/P ... PM_directory_macros
* _$ a" Z  N0 ?8 G1 F
5 w, ?' G- h6 _) K实例1:打包shell
1 O% u! [" M  L( R- {& f: \可以把一个平时写的一个脚本打包成一个rpm包,spec文件如下:
5 b% b2 t6 f7 V: z% t" T8 O3 j
% O  s8 b* U3 T) e: o[root@localhost SPECS]# cat disk.spec1 G3 \( q' d: T9 \& Y4 y
Name:                showdiskinfo
6 l1 G  X& e, K0 p7 d" {! jVersion:        1.0
; e0 p; D  b7 T6 a0 Q4 v3 |: ^Release:        1%{?dist}
/ j3 j- R6 O9 ]1 W. |) _6 tSummary:        Show Raid and Disk info
" l3 b) V* d+ ]# M8 H3 WLicense:        GPL9 ^2 Q7 y5 g! d" D* i- ~
URL:                http://www.wumingx.cn/ z9 n% z% J! c% h. v
Source0:        showdiskinfo.sh
" y) n; X/ N' T1 |) X5 x4 \" d! f6 t; K$ g2 f/ ?5 d" m+ d
#BuildRequires:
- F- s' C) }: J8 Y0 ~8 wRequires:       bash% L  E2 N2 X( l( T' A0 ]7 X5 P
8 |% P: k8 H1 ]* E6 i! j
%description
+ k% i( c7 d4 j' pshowdiskinfo shell script.9 g% m) h3 D. |, R9 A
8 c& `1 Y% `& A
%prep
2 E: |8 C2 @; V6 T" `  |7 l#%setup -q
! _3 n: Z$ s' l- X; \: o3 O, C$ ]
4 X3 ^; d% {7 {* ~$ Y%build+ t2 a4 P$ {7 x7 A  \9 g
cp %_sourcedir/showdiskinfo.sh %_builddir/showdiskinfo; H( S7 C2 Q0 N" |* Z7 F( F
$ L. r. e% ]) j
%install7 S9 O& F0 _5 Q5 ^
mkdir -p %{buildroot}/usr/local/bin
+ U  d* X# V, r/ q3 minstall -m 755 showdiskinfo %{buildroot}/usr/local/bin
( y* ]9 A* p. Y% z: i/ \
) ~. U: @9 O$ ]% a& r%files: q$ O; [/ z* _3 k% K
/usr/local/bin/showdiskinfo; B9 q' }- Q: `" T
%doc
9 L/ H& g1 C" C%changelog
) b# t6 w3 C4 _开始编译:
' s) y( W* I! y4 n' f
& {0 G" I  K4 ?[root@localhost SPECS]# rpmbuild -bb disk.spec3 Z" H8 W: ]+ A4 d, D0 K
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.agda2b9 d( v; ?) _; f) G. r& p& e
+ umask 022
6 C4 o. W; x8 ^+ cd /root/rpmbuild/BUILD0 E8 f7 l2 Y5 ^. J" l$ i2 Q  {# O
+ exit 09 ]- {" H2 z4 b3 G" R  W* b6 J3 @0 V
Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.spexQx5 v, _: @: y, e
+ umask 022  ]  L' f1 \* Q- L. R
+ cd /root/rpmbuild/BUILD! @: ]0 ^/ O4 z, ]/ t! _5 M
+ cp /root/rpmbuild/SOURCES/showdiskinfo.sh /root/rpmbuild/BUILD/showdiskinfo
. V/ A! l2 y& a7 J! k3 Y+ exit 0! g6 F/ ?6 ^% W9 S/ G+ ?9 E. ^
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.grcfHT
4 X* \6 r+ x6 F' M! \4 V( c9 ~+ n+ umask 022( k6 ~; z/ j2 {4 J8 W- }1 I/ c5 C
+ cd /root/rpmbuild/BUILD# o. K, G' z  a: N/ g2 w
+ '[' /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64 '!=' / ']'
1 [1 l3 m- h4 C& W5 W+ rm -rf /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64: R/ b- \2 ]3 g6 P4 g5 |" R4 C
++ dirname /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64+ {5 ?3 k  |) W$ g& P% P, Z
+ mkdir -p /root/rpmbuild/BUILDROOT
$ M8 z7 [5 x8 G1 i5 ?2 z8 o; C" r% ]+ mkdir /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64
6 H6 n+ g5 J/ W' F+ `4 M0 p+ mkdir -p /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64/usr/local/bin% T- J6 I% n4 V" S. c6 W
+ install -m 755 showdiskinfo /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64/usr/local/bin
4 ]2 |) i/ Z+ ^+ U  E7 ^1 F! \' \+ /usr/lib/rpm/check-buildroot1 o) t- Z6 }9 K7 s' W0 B& ^6 T
+ /usr/lib/rpm/redhat/brp-compress/ }9 v" i, N+ y7 g: u
+ /usr/lib/rpm/redhat/brp-strip /usr/bin/strip- e" c% O" q8 [* I# s1 G
+ /usr/lib/rpm/redhat/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump' Q9 _3 B3 N' e6 {: }
+ /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip
$ W) c3 m" R" i- t# b1 Y3 O; w6 J+ /usr/lib/rpm/brp-python-bytecompile /usr/bin/python 16 O% }  F! _( C1 `) p, m/ s- S
+ /usr/lib/rpm/redhat/brp-python-hardlink
/ W" n5 h5 \! o  u# s# t' i& z! |; V+ /usr/lib/rpm/redhat/brp-java-repack-jars
! Q% V6 r8 z6 A+ ]0 V+ cProcessing files: showdiskinfo-1.0-1.el7.x86_64" V. d5 s$ m  K$ X  W0 R
Provides: showdiskinfo = 1.0-1.el7 showdiskinfo(x86-64) = 1.0-1.el7
# Z& K: N/ k4 T1 P. R4 yRequires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1+ T9 b" \, u4 j
Requires: /bin/bash
% o4 i! E- M' K7 \6 z- s( \" VChecking for unpackaged file(s): /usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_646 R0 L0 ^! R- n: l3 Z7 k
Wrote: /root/rpmbuild/RPMS/x86_64/showdiskinfo-1.0-1.el7.x86_64.rpm
3 q7 k4 \: w: [" DExecuting(%clean): /bin/sh -e /var/tmp/rpm-tmp.4uHq3D
5 V8 ^8 H: M1 X2 K6 l8 Z* ~+ umask 0223 S3 a+ V+ [8 o: y* ?8 h2 R
+ cd /root/rpmbuild/BUILD
% a' |( G! Z! B6 x2 A* I4 e" I+ /usr/bin/rm -rf /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64
! L2 C: S3 u$ J+ exit 0
+ l9 `9 _% D- u0 g可以看到编译成功了,文件保存在Wrote: /root/rpmbuild/RPMS/x86_64/showdiskinfo-1.0-1.el7.x86_64.rpm下,开始查看:3 n/ k- p, |  \- t2 v

7 f/ ~. V3 n1 u' y- ^2 v[root@localhost SPECS]# cd ../RPMS/x86_64/
; z" _/ I& H# V' p" }& b/ t[root@localhost x86_64]# rpm -qpi showdiskinfo-1.0-1.el7.x86_64.rpm
. \5 x. n: j0 lName        : showdiskinfo
2 z8 O$ h5 ]1 k  o3 jVersion     : 1.0  z0 q3 O3 W6 m
Release     : 1.el7
& `3 q' e- V/ v) gArchitecture: x86_64
% k% o; ?3 ]/ h. ]0 G; d4 NInstall Date: (not installed)
( n2 s$ q5 b6 [2 h( X+ kGroup       : Unspecified
* R) U& q3 a6 `) B, KSize        : 383900 Q- ^& f# F  g0 X, W, L1 b9 i
License     : GPL
1 t) U/ v: z' z$ k1 S" l8 H  ~Signature   : (none)0 Y2 T. r4 A! D7 Z
Source RPM  : showdiskinfo-1.0-1.el7.src.rpm& v. h, \4 c# h3 B! K) X
Build Date  : Fri 08 Mar 2019 06:41:42 PM EST  @" |6 @  U: s+ u
Build Host  : localhost
1 p9 I5 }  z+ Q9 D4 z# I7 MRelocations : (not relocatable)
# v. v( f& V/ E$ ^: R, D* H: w/ WURL         : http://www.wumingx.cn
+ V* s( [* \, W2 {# l) TSummary     : Show Raid and Disk info: ^+ S5 Z5 s; G/ q3 @
Description :% N! S' H# X! I! X5 B! v' B* c
showdiskinfo shell script.1 ^* H! b' m5 R* d$ _: G( i. B# I- Z
[root@localhost x86_64]# rpm -qpl showdiskinfo-1.0-1.el7.x86_64.rpm
7 H3 h0 o, G# Z7 ?) |/ P/usr/local/bin/showdiskinfo
: V, v0 G  J1 {, Y; i1 L6 |1 R# |#开始安装! }( T' V& _8 M) s$ b$ I9 w/ i
[root@localhost x86_64]# rpm -ivh showdiskinfo-1.0-1.el7.x86_64.rpm& l' E& J! r9 J% R# }
Preparing...                          ################################# [100%]
3 Q, P1 m; G3 wUpdating / installing.... k7 k/ [- q% |/ ?' R/ @/ S
   1:showdiskinfo-1.0-1.el7           ################################# [100%]
" a0 q! X% W9 O' e% Z: h9 \2 j1 ~3 d[root@localhost x86_64]# ll /usr/local/bin/
( b8 o& Z( v. Y. C( `# Btotal 40
2 D1 v. h/ T0 _-rwxr-xr-x. 1 root root 38390 Mar  8 18:41 showdiskinfo
9 o+ u  H7 }" H7 R8 Y  i[root@localhost x86_64]# showdiskinfo6 U& [9 P) ~- e0 A, _) K
no raid
: L. }0 Y+ K2 a此内容参考了 https://rpm-packaging-guide.github.io/#hello-world ,可以阅读原版。3 i9 y) @( g) E& ^* x& ?, ]. v& o

+ E# b. M: ^3 ]5 t2 f  V实例2:打包main; m+ D' `; C4 u& U& {8 j6 v
此代码来源鸟哥私房菜,先来处理原始码的部份:0 g# I% T& C+ U* ?! d" S6 W
) r  l" J4 M9 a1 o$ u. v* f
[root@study ~]# cd /root/rpmbuild/SOURCES - [. P: i& a5 o
[root@study SOURCES]# wget http://linux.vbird.org/linux_basic/0520source/main-0.1.tgz & \1 k9 C- K+ O: J$ h
[root@study SOURCES]# wget http ://linux.vbird.org/linux_basic/0520source/main_0.1_to_0.2.patch
% U0 S: J" J& [+ @' X[root@study SOURCES]# ll main*. `% D- d& O* h/ r* v+ Z
-rw-r--r--. 1 root root 703 Sep 4 14:47 main-0.1.tgz+ j( s% L/ [8 t
-rw-r--r--. 1 root root 1538 Sep 4 14:51 main_0.1_to_0.2.patch
, |8 l; x8 I6 O% y% d到SPECS目录下创建main.spec文件,建议使用vim创建,会自动生成格式。也可以用rpmdev-newspec -o Name-version.spec命令来生成SPEC文件的模板
2 \! ?0 i& M5 ]- M% v
* ^+ p; p4 R2 K% Y8 ^& P9 h" c[root@localhost SPECS]# cat main.spec
! c2 S" E4 ?6 J- \. [; ^, MName:                main
5 n9 v, y, s1 W/ Z* Y& x0 \Version:        0.1" [" ^8 e; C" g& ~0 [! d
Release:        1%{?dist}5 t  L1 Q; j9 \& I2 U
Summary:        Shows sin and cos value
- G( v4 D" h  T" E* f" ^, U: h, J  Q  B: q$ J" Z$ L1 j( R2 ~  r1 X: K
Group:                Scientific Support
: H$ m! j1 g; b* [" {: cLicense:        GPLv2
0 n5 Q) p% p. \* f; ^* i. NURL:                http://www.fangdm.com/# u; c& r! Z& d8 l7 j# I
Source0:        main-0.1.tgz
, r3 I& |( U8 [8 L9 Q) \# CPatch0:                main_0.1_to_0.2.patch( w6 D; \& M8 X+ P: h4 j; g6 ]) _
$ a* L4 U! {2 i/ d4 A
#BuildRequires:; v3 i# k: k, G5 |
#Requires:
0 a/ L& a0 W6 a) M' @# J, m- d/ L: l, Z. |3 i3 N1 T9 b9 q
%description
; m+ u" E0 [+ t7 i- R7 HThis package will let you input your name and calculate sin cos value.% n! n. K- i2 ~% g- i

3 w5 |9 Z4 }5 S( a  w1 M- J4 C%prep5 _8 u! h, I) b' Z& |: B
%setup -q
5 f: \3 {$ f3 V: Y4 r/ \7 L5 W%patch0 -p1) \+ V+ V. y. j8 [# @# L

* B0 @! Q/ W8 f3 @3 _%build# I3 U4 H+ ~' z
make clean main
8 S# d5 x8 H& m- g' h& C+ I
% Z9 s3 n+ r3 X+ g4 x%install4 I2 X/ ^1 c7 K3 K4 O1 g
mkdir -p %{buildroot}/usr/local/bin; K6 ^1 e, s3 X( ]5 w$ U
install -m 755 main %{buildroot}/usr/local/bin
  h* z& q* H2 c; w/ ^5 U, Q3 k2 {1 H; v$ [8 S& \( m' s
%files
1 l+ [/ {  ]& F, l7 C/usr/local/bin/main0 q* V! ?3 M) _  J6 O0 e2 \
%doc! F. Q5 c4 F( h# h# t& n; c

' ~# p! o8 z; T! t$ P* j2 m- H: Q! W%changelog
$ H( d  g, W7 c* x& O* q$ L* Wed Sep 09 2015 VBird Tsai <vbird@mail.vbird.idv.tw> 0.20 h* e* z7 A6 G  @/ z
- build the program  D7 k( B( L' K+ F  w0 d& K, Z% G1 k
然后就直接编译rpmbuild -ba main.spec,再安装rpm -ivh main-0.1-1.el7.x86_64.rpm  r  W2 ^6 B; F, _) G; u0 E4 Q% f
. W4 J$ G2 {) a' }* a8 j2 l: D
[root@localhost x86_64]# rpm -qi main# @* f) E0 a0 r8 \9 {
Name        : main+ z' o1 c, l7 j7 p1 z# F
Version     : 0.1. A6 J* \/ ]! m
Release     : 1.el7
, d; U* u" ~( E/ K7 gArchitecture: x86_64
+ {: Z6 }+ N( p' P3 `Install Date: Thu 07 Mar 2019 05:42:50 PM EST
% b( P( c2 w+ tGroup       : Scientific Support
3 Z3 S' e" M6 D0 e4 N5 p/ iSize        : 72723 B% [( t* F8 y$ q1 y; d" o7 T3 ]
License     : GPLv2  j, _- h7 ?8 b( b( @. O
Signature   : (none)% K% t+ j) j/ C. f: q- k' U  d7 Q" m
Source RPM  : main-0.1-1.el7.src.rpm
* p2 S+ d# W2 W' a7 jBuild Date  : Thu 07 Mar 2019 05:42:07 PM EST& p' p! Y: w* |% ^5 N3 V
Build Host  : localhost- v) x) p0 v5 }" @0 b) s4 `
Relocations : (not relocatable)
" D7 N# M. U* V7 y" ^URL         : http://www.fangdm.com/
6 `4 M4 R4 I' O1 nSummary     : Shows sin and cos value5 V1 b8 G+ c; q5 \% S% }! M1 E" S
Description :
/ F' b: A5 u- q" q! |6 K3 dThis package will let you input your name and calculate sin cos value.
2 L6 \/ l1 W- F: G7 n3 |实例3:打包hello
% D& a6 y5 z  k/ e. _- |) U1 V" O使用区域语言(Locale)文件的程序应遵循 处理 i18n 文件的建议方法:% H$ D' |6 _) ?4 F& k; y5 w8 B

+ _9 k  P& z, f% _/ R在 %install 步骤中找出文件名: %find_lang ${name}
) |1 F# g" k& q+ \, W添加必要的编译依赖: BuildRequires: gettext) t( T3 ?- h2 N( h$ y4 c
使用找到的文件名: %files -f ${name}.lang6 ?% j1 c1 T+ ^# S: e7 U. u/ o/ w
%find_lang此宏将找到属于您的包的所有语言环境文件(按名称),并将此列表放在一个文件中。然后,您可以使用该文件包含所有语言环境。! H( W& E% F. g

$ s1 P- @/ J) ~9 y! Y; D2 o[root@localhost SPECS]# rpm --eval %find_lang
( Q2 Q# h4 U1 z7 h7 V: k/usr/lib/rpm/find-lang.sh /root/rpmbuild/BUILDROOT/%{name}-%{version}-%{release}.x86_64
# o3 L  e/ x1 m8 i, ]' ?[root@localhost SPECS]# rpm --eval %make_install
: J2 ?. S% d  D) L( Q0 H/usr/bin/make install DESTDIR=/root/rpmbuild/BUILDROOT/%{name}-%{version}-%{release}.x86_64
! C7 Y/ }  N* L% z3 r/ C%find_lang %{name}在这个spec里面等价于/usr/lib/rpm/find-lang.sh /root/rpmbuild/BUILDROOT/hello-2.10-1.el7.x86_64 hello% I) l2 H4 u9 r2 o( q

% D; R* R( m" a而引用的方法是:%files -f %{name}.lang即可。3 {( V- [( D' u( e

$ ~4 t. r$ \+ w* ^+ q0 L%make_install是等价于make install DESTDIR=%{buildroot}。
6 X" t' Q) C1 D
! |$ K' M1 u: U4 M[root@localhost SPECS]# cat hello.spec
& o0 d, p% Z- _* q2 NName:           hello( F* H- Z8 w# }$ N3 A, h
Version:        2.10$ g- Z/ V/ W3 a6 I  ?
Release:        1%{?dist}- H/ U* O, t, C$ d
Summary:        The "Hello World" program from GNU
, c0 R  [9 M) ~7 c" @/ s7 v) w& c# `4 [9 U/ R/ Z
License:        GPLv36 k6 T6 n9 A; b1 ]  a) q; ]
URL:            http://ftp.gnu.org/gnu/hello/
1 D$ d4 [' i& v1 h% P4 x+ fSource0:        hello-2.10.tar.gz
3 E6 K  l- l' a* v, J: R& V: y4 W7 M1 M/ O6 F' }, w
BuildRequires: gettext0 l0 _( [$ F, n$ |
#Requires:* j; i. E1 B/ g. F# A
. h+ o% N6 D0 F# P
%description) q% ?- @$ m; @, H) ?2 a: r0 {, u
The "Hello World" program, done with all bells and whistles of a proper FOSS
+ J, b& [1 s7 W# `; _project, including configuration, build, internationalization, help files, etc.+ G6 F  G! d$ \" h- r2 G" f/ `
& D, z6 {5 f: H9 P
%prep  S$ G& Z. _9 n8 B: `9 |
%setup -q+ ~' \) J' B: |2 n: b
( ]6 _1 f! c3 }1 V. [# c

1 j2 e9 T0 W. h2 I  q& s%build
3 P! i" g7 [. {4 [! v%configure
4 `& n" \4 U, p, @- d* ?$ B. Z( Mmake %{?_smp_mflags}) s! I8 T3 }0 c) S

* C+ U' `( m1 V$ A' Y6 u; Y%install5 Z. c) Y8 _' C8 x* l. ?
%make_install; }+ R' b2 i4 F2 n7 a
%find_lang %{name}9 y4 W; Z5 S9 [6 \% q
rm -f %{buildroot}/%{_infodir}/dir: D! W. P3 q# ?5 }1 j
1 ~6 y+ ^1 x9 U2 Q# ~* N
%post
7 b8 U7 Y0 G$ Q4 M/sbin/install-info %{_infodir}/%{name}.info %{_infodir}/dir || :
9 A6 _2 R& X+ @/ U' {5 R8 q4 @: C, s5 n# r3 k
%preun# ~2 P2 v5 w8 ^: N
if [ $1 = 0 ] ; then
9 F0 x/ e6 b# A# \2 k: X/sbin/install-info --delete %{_infodir}/%{name}.info %{_infodir}/dir || :
6 ~+ ]+ M' b' E; @- p! D2 Wfi+ F: [/ H& b+ K
7 T. X4 M& [" J+ D
%files -f %{name}.lang0 W+ R  E; [3 o
%{_bindir}/%{name}
3 }3 p) L" O, C# M( e9 C. J
" c+ Z! M( {, v; t%doc# m0 \2 `  a$ Q' q) d
%{_infodir}/%{name}.info.*. H3 K* g0 e6 v0 F) h* W6 B' i
%{_mandir}/man1/%{name}.1.*
8 z7 [' f* @* d+ W& a5 U: Q8 X) R& }8 z2 |$ |0 R" Q% A( V  M# \
%changelog! c2 @. `$ v! o4 Q7 J3 `/ L
然后直接rpmbuild -bb hello.spec进行编译,此实例来源于:https://fedoraproject.org/wiki/H ... o_RPM_package/zh-cn- D5 t0 ~1 V+ E6 K" g7 i# B2 H7 m
: f2 S: d7 |* M3 Q/ o
实例4:打包smartmontools
' `0 J: Y% A& R9 Gsmartmontools 7.0已经支持json格式的输出,对于采集的话,有很大的优势。目前在centos官方上面可以找到centos7的包,如https://cbs.centos.org/koji/buildinfo?buildID=25069,但是还没有centos6的,所以需要自己写一个spec。
+ d# x6 k0 g; F# |( v
! Z. `" J& J" D+ Z+ I$ N( ^访问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 d9 _, ~( r5 @$ _! h9 Y- w

$ @* X& W) I; L% j  I  d[root@7ftbv7mdz7cdpc ~]# cat smartmontools.spec  N1 ?# h1 S8 ^8 R
Summary:        Tools for monitoring SMART capable hard disks& u( M. g% S9 e+ m8 w4 z
Name:                smartmontools# {) |+ g1 ~% }
Version:        7.0
$ _% ^0 P9 h/ r. K1 MRelease:        3%{?dist}' w! t3 D" _" I& R( u2 G
Epoch:                19 P3 \; `3 Q* [4 [
License:        GPLv2+5 ?& P  W$ y+ v- W9 A. x" b
URL:                http://smartmontools.sourceforge.net/
, Y0 W5 D8 R/ G. Y( x#Source0:   http://downloads.sourceforge.net/%{name}/%{name}-%{version}.tar.gz
" ?+ @  |5 t. i% V0 W! ZSource0:        %{name}-%{version}.tar.gz7 m$ ?+ ^6 r( Y0 b
Source1:        smartd.initd
: e; V6 N5 Y* rSource2:        smartmontools.sysconf/ }( Z4 b& n3 p9 ^$ b; ~. ~3 L: z
Source4:        smartdnotify4 _$ s. _: l$ _; R/ |, L; q
#semi-automatic update of drivedb.h# I1 h/ u; t5 h' u1 ]
%global                UrlSource5        https://sourceforge.net/p/smartm ... rivedb.h?format=raw
6 g/ b4 a# ]. KSource5:        drivedb.h$ X8 e1 A! q2 w+ _, b. z

$ l1 k$ c# o0 n! h#fedora/rhel specific
1 w" Y+ z& l- R% G+ q, pPatch1:                smartmontools-5.38-defaultconf.patch
# P0 [( Q" a6 m: r8 y3 J# b7 x; Z$ \5 E
#BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)( w2 s5 \: A, ~/ H9 ~9 ?6 W! Q) e4 q
Requires:        fileutils chkconfig initscripts6 Q% d+ U" t7 X" g
BuildRequires:        readline-devel ncurses-devel automake util-linux groff gettext
8 b+ s1 k1 `2 L- N. W: C; i* Z# hBuildRequires:        libselinux-devel libcap-ng-devel, V9 ^* m6 e! p7 b; V
' Y: o6 a) D8 ?- g: ]
%description
: `- M$ r5 [# q$ g6 B' ?) YThe smartmontools package contains two utility programs (smartctl
9 z' `" v8 O. _9 Cand smartd) to control and monitor storage systems using the Self-+ M' I% U0 s5 t9 i
Monitoring, Analysis and Reporting Technology System (SMART) built7 @3 x+ r. d- @& y. W
into most modern ATA and SCSI hard disks. In many cases, these
8 K3 }. |: v: v/ outilities will provide advanced warning of disk degradation and0 v/ h, G! l- d/ n
failure." n) l' V1 e/ D& U$ ^7 y6 |
4 s" V! ]0 K8 i- V0 u# C
%prep
: v$ N$ B$ d7 W. N1 W6 K& a%setup -q; n; h. q' I. L- \
%patch1 -p1 -b .defaultconf
$ I  ^+ \: m+ o, r) F2 r
' I7 |  U: i1 p* `% a# update SOURCE5 on maintainer's machine prior commiting, there's no internet connection on builders  u# l/ ]/ k3 e( J& N
#curl %{UrlSource5} -o %{SOURCE5} ||:
8 a5 U! z) C8 L# l( Z7 Bcp %{SOURCE5} .
/ l- m' `& N" v! m) o$ E  P7 o' t
%build* z, r; y/ s8 D# Q3 E% f5 i
autoreconf -i
; {4 B5 ?  J' y% f2 @3 S) C' M%configure --with-selinux --with-libcap-ng=yes --with-systemdsystemunitdir=no --with-cxx11-option=no
5 Q4 h6 h- H4 h%ifarch sparc64
  z3 A- J8 |: M. Z& }2 Jmake CXXFLAGS="$RPM_OPT_FLAGS -fPIE -fno-strict-aliasing" LDFLAGS="-pie -Wl,-z,relro,-z,now"' w1 y: T- ]( v* H) X! f- J
%else
  Y0 G' R$ {, f* ?$ [make CXXFLAGS="$RPM_OPT_FLAGS -fpie -fno-strict-aliasing" LDFLAGS="-pie -Wl,-z,relro,-z,now"$ h7 B6 t# N  D& T6 d
%endif
( l; V2 u- C! U) T4 t8 ^# M# `6 b  v
%install2 j  _0 h7 {3 M' L" R+ ~3 y
rm -rf $RPM_BUILD_ROOT- w( x7 _* R$ g% j  Z  P
make DESTDIR=$RPM_BUILD_ROOT install5 _% D4 ?6 P0 d- [& A" ^: y# D
1 `. e5 ~3 }- g4 y! R/ n5 o
rm -f examplescripts/Makefile*2 N/ S" E* m& i; j' u* E5 s
chmod a-x -R examplescripts/*
3 e" K: R& l1 `$ w! Fmkdir -p $RPM_BUILD_ROOT/%{_sysconfdir}/%{name}/smartd_warning.d
! k4 m  b( N6 s* n' ]' \install -D -p -m 755 %{SOURCE1} $RPM_BUILD_ROOT%{_sysconfdir}/rc.d/init.d/smartd+ F2 o* M  M8 ^* j/ `: s& |4 K
install -D -p -m 644 %{SOURCE2} $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/smartmontools
: S. @) {" ?; }install -D -p -m 755 %{SOURCE4} $RPM_BUILD_ROOT%{_sysconfdir}/%{name}/smartd_warning.d/smartdnotify
5 [3 l; F1 C! S' _/ c  ]  Xrm -rf $RPM_BUILD_ROOT%{_docdir}/%{name}6 ?/ {% j$ O7 `- }. U/ \
mkdir -p $RPM_BUILD_ROOT%{_sharedstatedir}/%{name}
! k& \( ^; A! p2 E" g# j
3 [5 _. R8 W/ x. V2 Z%clean4 ?& F" a1 F  ]  q- h1 ^" d, q" l% G
rm -rf $RPM_BUILD_ROOT9 |3 |6 h) G# u* j
2 c/ q) t" W3 U7 t. u/ M
%preun/ a4 I$ W+ I8 w1 [& i
if [ "$1" = "0" ] ; then2 c9 f! k. h- A6 D
/sbin/service smartd stop >/dev/null 2>&13 U9 {% I8 ~+ k, ^: }9 v) t
/sbin/chkconfig --del smartd
1 ?3 r. D% p: P# zfi0 i5 ~$ F7 P8 L

3 u, b$ G5 N, r) D% h2 ^  C8 O) H%post7 h. i# r: T( C+ U
/sbin/chkconfig --add smartd
5 ?% o  K1 b- b& J8 a( f
3 y8 l. ]# h& }) M$ b. A* c) x( z& ]7 _# y( l' A
%files
0 i! x" v/ i( H' r7 ^%defattr(-,root,root,-)
+ \: f% B- f. V9 ?5 r8 r%doc AUTHORS ChangeLog COPYING INSTALL NEWS README
/ a# X9 Z7 @+ ?4 b  j0 w2 w%doc TODO examplescripts smartd.conf
" \/ b6 \; C/ k- p# V; l0 z+ ?%{_sbindir}/smartd! I" \' Y5 x+ ?
%{_sbindir}/update-smart-drivedb. d) }  K' l' _8 q
%{_sbindir}/smartctl; H1 w' g' q% I6 C. {' w0 u# G
%{_initddir}/smartd! Y3 |& g* H7 j) H  ^5 p6 d
%{_mandir}/man?/smart*.*& V3 {4 U+ [, S% l
%{_mandir}/man?/update-smart*.*0 f$ G" a  U+ `6 i4 ]
%{_datadir}/%{name}& [, W4 b, w% J! z4 t1 f+ {& q
%{_sharedstatedir}/%{name}8 H5 u( c5 n: S& x0 `' n" V! v" \- w
%dir %{_sysconfdir}/%name) n- t8 d7 s+ ?& F1 ~' d6 t' V
%dir %{_sysconfdir}/%name/smartd_warning.d1 V! r9 K- Z9 K8 z  \' ~
%config(noreplace) %{_sysconfdir}/smartd.conf' O0 S1 Y3 F2 @# m
%config(noreplace) %{_sysconfdir}/smartd_warning.sh) n! g& R+ y9 ?; f: N
%config(noreplace) %{_sysconfdir}/%{name}/smartd_warning.d/smartdnotify4 Q8 r. X2 A& m  |6 G. v; W% u
%config(noreplace) %{_sysconfdir}/sysconfig/smartmontools
3 w; ?# W0 K) s$ k" F
' k$ s  \* _' s%changelog
' V9 n9 @. H0 P' \* Thu Sep 26 2019 fangdm <8@8994.cn> - 1:7.0-3* h/ Y7 p% [0 P, F7 `* t1 C0 m
- create smartmontools 7.0 base on centos 6
  d; N* u! O0 \( T4 ~# l5 x注意,Source这几个文件一定要存在,从上可以得知,加入了启动脚本、配置文件等,准备好了之后就可以使用rpmbuild -bb smartmontools.spec来编译,经过多次失败后,根据报错信息进行调整之后,终于编译成功了。( J# p$ l6 F$ v+ s. ?2 K
8 J0 P% M) t; ]7 b$ U; j
[root@7ftbv7mdz7cdpc SPECS]# rpm -qp --changelog /root/rpmbuild/RPMS/x86_64/smartmontools-7.0-3.el6.x86_64.rpm
. g) _# j$ ]! J: j# S1 B& M* Thu Sep 26 2019 fangdm <8@8994.cn> - 1:7.0-3
9 I3 p$ _2 b2 F- create smartmontools 7.0 base on centos 6" f! D+ a% Z/ p" r% I0 u' X; U" j- e6 R

& f* U& K: W9 {1 T. y5 v. i[root@7ftbv7mdz7cdpc SPECS]# rpm -qpi /root/rpmbuild/RPMS/x86_64/smartmontools-7.0-3.el6.x86_64.rpm
# ~% B6 n/ I% j& _0 f/ L  t& v# BName        : smartmontools                Relocations: (not relocatable); n4 ?: N% y& G( h  c1 h
Version     : 7.0                               Vendor: (none)
- o  E& n  @# ~. M3 v: j, T7 xRelease     : 3.el6                         Build Date: Thu 26 Sep 2019 10:53:19 PM CST8 v1 J: p. q- d4 A2 X* S% f) r- ^
Install Date: (not installed)               Build Host: 7ftbv7mdz7cdpc
4 f' p" }5 j7 RGroup       : System Environment/Base       Source RPM: smartmontools-7.0-3.el6.src.rpm3 p( O1 ~' m% B3 g) @
Size        : 2081911                          License: GPLv2+' I9 o7 x/ h7 N1 F# P
Signature   : (none)6 @; P) a4 \+ S  R" b. E' b8 V$ c1 ?
URL         : http://smartmontools.sourceforge.net/  l9 T6 g+ K3 ?* h% Q6 L0 J( I3 a; d
Summary     : Tools for monitoring SMART capable hard disks
) h% o0 P. ~  VDescription :
1 P" g, |( P2 w8 q( QThe smartmontools package contains two utility programs (smartctl. i  A2 p) U1 f( r- ~0 `
and smartd) to control and monitor storage systems using the Self-
3 B* |- h* i) e' {9 O# OMonitoring, Analysis and Reporting Technology System (SMART) built
' b, O2 F7 Y9 q) Ainto most modern ATA and SCSI hard disks. In many cases, these9 r1 M/ V8 Y1 l; B! d+ D, [" `
utilities will provide advanced warning of disk degradation and
, ?( x+ |5 y0 ifailure./ G; s  p+ p% I) a0 v- U
另外,在%preun阶段有使用了if [ "$1" = "0" ],表示的意思是uninstall,如下图:
8 D# b1 m+ y3 B% v; K- t+ \* u5 T- h9 D9 q- u+ G
  H. [7 v2 `- S) G5 H. V4 `
; W7 }' h% y& L! @2 Z* E1 _8 B4 n
实例5:打包nginx
! u4 w$ q6 \' g) g& n用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 w, Y2 D' _* Z, j' \9 @4 |; M$ e
[root@localhost rpmbuild]# tree  G, V1 S3 u  \' W2 L
.& t! j8 D& p! y' E
|-- BUILD* J# i6 Y% v: ^7 i9 \
|-- BUILDROOT
5 `' n8 s/ y0 H9 D' J  b. r9 G. f' b: T|-- RPMS* n7 X1 c2 [' r) A/ ]3 G4 N
|-- SOURCES# {9 V5 t2 ?" B
|   |-- COPYRIGHT  J6 c. U, _7 V1 L0 }
|   |-- logrotate6 ]% Z' o. e# g# o7 {
|   |-- nginx-1.16.1.tar.gz, c  _& S# t. V2 Z" n5 n+ A
|   |-- nginx-debug.service
# F) Z! E. m3 B6 g9 u  _|   |-- nginx-debug.sysconf6 f0 a1 F. w7 [% X" @5 I! P
|   |-- nginx.check-reload.sh8 }0 Q, m* h# l! Y+ ~
|   |-- nginx.conf
2 h% ]7 X+ `+ N/ C6 L0 _: ?|   |-- nginx.init.in7 A3 R; U$ [$ \7 S/ }7 y
|   |-- nginx.service
7 ?, `. \6 a6 y6 I. ^4 j2 {|   |-- nginx.suse.logrotate: ~0 ?/ r% F, Z# |
|   |-- nginx.sysconf
" d# O& q2 \% ?( P$ B|   |-- nginx.upgrade.sh1 |! q- A) O, {1 k. K
|   `-- nginx.vh.default.conf
  |" P& l6 `6 i" B1 E1 J|-- SPECS# e) y! P7 B/ P9 u% ]1 C
|   `-- nginx.spec/ X5 O4 d: H- b) T0 }- W
`-- SRPMS
$ N2 l* b6 e8 M/ t9 n$ I+ X主要是SPECS以及SOURCES这些文件。查看nginx.spec之后,大部分都有写好了,并且都兼容了centos 6/7。添加了gperftools GeoIP-devel ngx_cache_purge nginx-http-concat这四个模块,修改如下:: H+ M8 A/ @: M. @4 ]- G

$ B: v8 \  A4 V6 F* l" R4 O; M[root@localhost SPECS]# cat nginx.spec7 N* |9 c) D3 b4 c! e5 Q5 o# ^; Z* \
#4 D0 g+ Y( d# b% Y
%define nginx_home %{_localstatedir}/cache/nginx
0 E; a8 V% M. F1 L( j8 Y0 P%define nginx_user nginx
3 a  z2 o  k0 Z% R# d9 j3 b& Z6 ~%define nginx_group nginx
" m+ ]- K& J6 q%define nginx_loggroup adm
0 x* T' n/ P* X7 t8 b) S% I& f" [: v
# distribution specific definitions
7 j9 P0 L8 m3 x, ?1 e" Q8 O* O%define use_systemd (0%{?rhel} >= 7 || 0%{?fedora} >= 19 || 0%{?suse_version} >= 1315 || 0%{?amzn} >= 2)
( t' J: X; ~& j
: [2 G- t6 p- ^; N4 @. g+ @%if %{use_systemd}7 d* N9 ^4 {7 }3 Q/ n* o
BuildRequires: systemd
% O0 e: x9 p- [: I# y: T; `2 YRequires(post): systemd
. r  R5 O' d7 S* ^: g3 }# H: {  WRequires(preun): systemd1 W' c. i5 L( O% t  y3 y
Requires(postun): systemd4 O% N/ S9 S! X4 H
%endif- @: G# \: A6 q4 [

# Q  }1 A: P' C%if 0%{?rhel}3 k9 M6 v8 @  o9 K8 u
%define _group System Environment/Daemons& _' f. n6 v1 \, n, T9 p7 Q8 p% z* x
%endif
: I0 M: Z" ?& x4 a
: g& ~2 l7 S6 _5 T, c%if 0%{?rhel} == 6- H' C7 d! f  j/ E5 ]
Requires(pre): shadow-utils
5 P$ ?; Y& b' {2 U2 tRequires: initscripts >= 8.369 O: }. j: ^) W) y( M6 I% Y+ u* @
Requires(post): chkconfig* N3 r. A  x& H/ v+ r6 V
Requires: openssl >= 1.0.1
* U9 w+ g0 h6 A8 iBuildRequires: openssl-devel >= 1.0.14 ?) C4 ~+ Q+ Z- X
%endif
5 P4 @, I' D+ }' y  `
  i6 O; a+ [7 n, D; _) w- B%if 0%{?rhel} == 7) c* p- }% u9 n, l
%define epoch 1
; H+ ?5 ?0 ^& ]  `) eEpoch: %{epoch}
  a7 o( E0 m, r' l1 wRequires(pre): shadow-utils gperftools GeoIP-devel
4 J' I1 v. |1 j# Q% i5 A: r8 R1 dRequires: openssl >= 1.0.2
* Y, n* N* Q& R1 x3 q# ]BuildRequires: openssl-devel >= 1.0.2
5 [4 x+ I; P* I( d$ u! P1 {% uBuildRequires: GeoIP-devel gperftools
5 v) r8 h9 s7 j6 X% b8 j6 g* @1 A8 c8 J%define dist .el7! M4 f" d) G; a9 f. M- H& }1 ^3 Y4 n5 `
%endif2 i) A, |9 W2 a# ^# n# b" [

0 N1 \$ r' z8 o1 r' [/ x% ]%if 0%{?rhel} == 8+ _. F# \9 v$ z
%define epoch 1
/ m+ W. u& }/ SEpoch: %{epoch}
2 C$ l! l) A1 o# T( w( ]' wRequires(pre): shadow-utils
" @( H6 T% }. p2 o  {% kBuildRequires: openssl-devel >= 1.1.1
7 `$ ~, z2 C& S%define _debugsource_template %{nil}
+ V% f! v) _( I) q' f%endif; @, D" T  g' _; d) W1 m7 y( }

7 ?4 u' Z: ~& S  [4 i( v7 k" P4 u%if 0%{?suse_version} >= 1315
/ U/ Q6 P$ g6 ^& u# k1 U%define _group Productivity/Networking/Web/Servers9 F& f2 ^% N( U  a7 P
%define nginx_loggroup trusted0 U3 ^& o; v* X+ u
Requires(pre): shadow
- r' h/ c% h* |6 i1 m) a' Y0 ~1 HBuildRequires: libopenssl-devel
7 r+ G1 R! }2 ~( d%define _debugsource_template %{nil}) ^7 S# n" b6 K: p. y9 I, f
%endif
- N" A4 I" C" Q# K" c" C/ A4 {( t4 M- ^( [
# end of distribution specific definitions
- K7 G+ W/ s: _  d5 W8 x: x) A
$ T% b' ~; E# y, u; y%define main_version 1.16.1
! w8 m3 G. W4 ]%define main_release 1%{?dist}.ngx
1 k; O/ E/ E! Y* a: L' h. m. d
1 j- g- [8 @; j7 n( P' B1 a- J' d%define bdir %{_builddir}/%{name}-%{main_version}# L. R# e7 Q1 f* Y, S

) d5 O, t+ g! d%define WITH_CC_OPT $(echo %{optflags} $(pcre-config --cflags)) -fPIC8 V9 \4 e8 h; `: _
%define WITH_LD_OPT -Wl,-z,relro -Wl,-z,now -pie, j$ P3 c  ?9 H, U+ ?4 Q1 ^5 x

5 e$ v1 F- V+ K; ], t0 H%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")
, [2 W8 S& Q, T  ^/ G9 u
+ i# h. C0 k7 `Summary: High performance web server( t6 _1 o. k$ E
Name: nginx
7 y# J7 O0 x; K( RVersion: %{main_version}
* V- R; |# c, P7 t6 H" J; yRelease: %{main_release}
8 B4 A8 {1 V7 u8 X5 N, XVendor: Nginx, Inc.6 l; r7 g3 E1 d: [7 ^
URL: http://nginx.org/
* c) j: j* b2 F4 bGroup: %{_group}
* y' {2 H( d* f: ~% S. I
2 Z1 w  E+ l0 m8 q) a1 nSource0: http://nginx.org/download/%{name}-%{version}.tar.gz; j# \% [7 `3 f' ~  ?: W" X
Source1: logrotate
% i( w$ a+ {3 X3 MSource2: nginx.init.in- i( U  d, W% i3 x7 f9 M
Source3: nginx.sysconf
* g* q, {7 u7 v- H) ySource4: nginx.conf
0 ~  C7 M5 |4 YSource5: nginx.vh.default.conf3 u+ y0 c1 s7 \0 C) U
Source7: nginx-debug.sysconf8 G; \/ O9 s9 ?# r1 A$ A: {
Source8: nginx.service
! {+ ^. z& e4 b6 sSource9: nginx.upgrade.sh& `5 W  A  s, e* v$ R
Source10: nginx.suse.logrotate
4 [. M2 S; ]* w/ C6 ~; z, ISource11: nginx-debug.service6 p; e0 ?$ v8 Q* g
Source12: COPYRIGHT
. [- q8 z6 K$ e6 X3 ~) ISource13: nginx.check-reload.sh
  k, {8 H: x6 o0 z" |' @Source14: nginx-http-concat.tar.gz
7 G% N  h3 ^8 G5 @7 ?Source15: ngx_cache_purge.tar.gz
& p/ m/ R0 u) S; M/ f
6 D3 P, V. V  E" h3 Y! l2 BLicense: 2-clause BSD-like license
0 H% N$ l- r3 D2 i* ^5 q6 N$ \
# p8 B1 T7 n/ i1 R9 G+ PBuildRoot: %{_tmppath}/%{name}-%{main_version}-%{main_release}-root
  `2 }7 W3 }' i( R" h( |BuildRequires: zlib-devel
' `8 n2 C1 m+ |BuildRequires: pcre-devel
$ n, c8 t" o: J: d0 N2 x4 ]
% A3 i( Y: |1 O$ {9 @' mProvides: webserver
( a, \8 G* w1 I% m; j  R, ]8 M/ D3 }0 p1 O5 @
%description% c. a( u! K- ?' c6 ?" _: f$ q
nginx [engine x] is an HTTP and reverse proxy server, as well as
' L- O6 F" S! b" ?4 h" w6 `a mail proxy server.; A. J- N1 S0 c6 w; z) |. v$ l& P; j
+ V( d$ a+ Y1 K# ?0 @
%if 0%{?suse_version} >= 1315
7 b( `$ X! i5 v: d: V%debug_package
! O6 ~1 y, B3 s%endif
& g) _1 T+ k% l+ j/ u6 U  u) Q. {9 ^
%prep- g- j$ j$ r* i0 @; `7 _
%setup
7 \% V8 [. f4 N& @%setup -T -D -a 14
$ B% j$ V/ C" M4 r%setup -T -D -a 15+ o& G$ Q  h4 i+ `
cp %{SOURCE2} .- L5 B# S4 P5 D6 F
sed -e 's|%%DEFAULTSTART%%|2 3 4 5|g' -e 's|%%DEFAULTSTOP%%|0 1 6|g' \8 R, G0 N! f* {
    -e 's|%%PROVIDES%%|nginx|g' < %{SOURCE2} > nginx.init
  p* e; Y5 |$ U+ M( o! u9 [9 F  ised -e 's|%%DEFAULTSTART%%||g' -e 's|%%DEFAULTSTOP%%|0 1 2 3 4 5 6|g' \
/ a& u7 U7 H% |& R* {+ [) w5 H    -e 's|%%PROVIDES%%|nginx-debug|g' < %{SOURCE2} > nginx-debug.init
5 y# L! g, u& P, h5 s9 n: s: R1 d3 c! q9 e7 o3 }
%build" M' W1 ]$ m. P! D4 s( s: B
./configure %{BASE_CONFIGURE_ARGS} \3 X& @! @  ~' Z8 G
    --with-cc-opt="%{WITH_CC_OPT}" \
3 r" p, ^' e- V- Y2 L  @    --with-ld-opt="%{WITH_LD_OPT}" \
: ]' `8 X5 F- ^! l) \. C9 E    --with-debug \
. v$ |% W3 B, h; D: Q) u! D        --with-google_perftools_module \
9 Y# H; X1 U$ m+ s( D# D        --add-module=ngx_cache_purge \
" P+ j! ]' Y( b' e6 |9 p; A( a        --add-module=nginx-http-concat \
6 ?5 ^3 k) n, H        --with-http_geoip_module+ j8 T+ l: {3 V& ]. @( K
% c- u3 E% M. y" J- b( Z, f$ K- H
make %{?_smp_mflags}9 ~0 w. c- t' i+ U6 ^
%{__mv} %{bdir}/objs/nginx \1 A) ]7 ^# J3 E4 \' n* R7 M
    %{bdir}/objs/nginx-debug
1 L0 r' ^- \7 N( Q; e./configure %{BASE_CONFIGURE_ARGS} \' A4 f1 n; t* Q2 R6 n( @4 x
    --with-cc-opt="%{WITH_CC_OPT}" \
$ L( \& F8 b" |5 z2 ^    --with-ld-opt="%{WITH_LD_OPT}". J2 P4 \2 d- d8 e! t0 l8 D8 M! ^
make %{?_smp_mflags}& C& f, D0 Z( c! Z* t5 W! |

. B, K$ A2 M9 S; ^4 V) E9 r% J' J9 }%install/ L( [1 M/ b0 j* @
%{__rm} -rf $RPM_BUILD_ROOT. _0 _* p% _( H1 H8 l7 z4 b
%{__make} DESTDIR=$RPM_BUILD_ROOT INSTALLDIRS=vendor install
5 [$ p; z, b2 r5 N0 k& J, `, m2 h: I( |9 N# {
%{__mkdir} -p $RPM_BUILD_ROOT%{_datadir}/nginx  X; ?- s8 N* [5 _" H6 Q% d
%{__mv} $RPM_BUILD_ROOT%{_sysconfdir}/nginx/html $RPM_BUILD_ROOT%{_datadir}/nginx/
7 a! Z1 C. E9 F* w/ G1 N, O, T+ }: L
%{__rm} -f $RPM_BUILD_ROOT%{_sysconfdir}/nginx/*.default
2 O6 u( T) @& ~0 v% p! V* K%{__rm} -f $RPM_BUILD_ROOT%{_sysconfdir}/nginx/fastcgi.conf; \& B; Q  O7 b/ J, ^$ \
* R) b$ y! w6 ^. r0 {  \- E" i
%{__mkdir} -p $RPM_BUILD_ROOT%{_localstatedir}/log/nginx6 j) L4 J  M- g8 h  E5 K! x
%{__mkdir} -p $RPM_BUILD_ROOT%{_localstatedir}/run/nginx/ Q; `9 R6 ^) i' H7 X" y
%{__mkdir} -p $RPM_BUILD_ROOT%{_localstatedir}/cache/nginx
/ v  l* a, s9 N
0 m* _1 G. P/ Q8 t3 p! Y%{__mkdir} -p $RPM_BUILD_ROOT%{_libdir}/nginx/modules
! T' A/ V3 B0 o' @cd $RPM_BUILD_ROOT%{_sysconfdir}/nginx && \
# Q# K) H# n" m. L( ^    %{__ln_s} ../..%{_libdir}/nginx/modules modules && cd -, W! v; A% e$ R$ V) F/ _
  I2 f: y# h" T7 \
%{__mkdir} -p $RPM_BUILD_ROOT%{_datadir}/doc/%{name}-%{main_version}
5 t+ i/ @, h4 C: f4 I+ a%{__install} -m 644 -p %{SOURCE12} \
: Q+ V3 }9 T$ ]  x1 {! r    $RPM_BUILD_ROOT%{_datadir}/doc/%{name}-%{main_version}/
) Z( Q5 X1 l% @2 C( z7 k3 i8 W7 d
! J0 ~& L2 V- K5 ~/ S2 y%{__mkdir} -p $RPM_BUILD_ROOT%{_sysconfdir}/nginx/conf.d7 g% [' A! Q# E2 B, m% H
%{__rm} $RPM_BUILD_ROOT%{_sysconfdir}/nginx/nginx.conf
/ }7 ?. f7 e0 Q* M, ?; ]* I/ g, \%{__install} -m 644 -p %{SOURCE4} \
) \5 }, g* X' _3 g- I. h/ s% p6 _    $RPM_BUILD_ROOT%{_sysconfdir}/nginx/nginx.conf
# n) X. L  f. _9 [%{__install} -m 644 -p %{SOURCE5} \
9 P4 d+ s' r4 g4 i2 n    $RPM_BUILD_ROOT%{_sysconfdir}/nginx/conf.d/default.conf
- w8 i3 ~5 @  ]- p
0 x, [/ f; h# b3 d# _$ v; e) M%{__mkdir} -p $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig
1 S5 b' ^) j) B2 i# j. S5 U- M%{__install} -m 644 -p %{SOURCE3} \# @0 y* d0 a# m5 i) ~4 V- y& C
    $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/nginx! c% |' m! m& t( c$ X/ f
%{__install} -m 644 -p %{SOURCE7} \* V0 V0 e1 k" c. l1 C3 B! H0 Z- L
    $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/nginx-debug7 }, d0 S3 U# m5 x
$ U5 q5 }4 s) E* V4 O3 z
%{__install} -p -D -m 0644 %{bdir}/objs/nginx.8 \
- e9 P) O  Z$ ~    $RPM_BUILD_ROOT%{_mandir}/man8/nginx.8
! U+ E- {. a9 D" B- R
. [+ \* W4 P2 e' c: @% {%if %{use_systemd}% {7 R" K7 Y. I, e
# install systemd-specific files
( c% c0 l1 u( j$ l: j& V! q7 W6 n%{__mkdir} -p $RPM_BUILD_ROOT%{_unitdir}
/ ~9 l$ F, \" ~) K* @0 [%{__install} -m644 %SOURCE8 \& p2 z8 m/ e  @( f
    $RPM_BUILD_ROOT%{_unitdir}/nginx.service0 X9 L. p" k3 r
%{__install} -m644 %SOURCE11 \1 ?# v; T4 M/ [: i8 h
    $RPM_BUILD_ROOT%{_unitdir}/nginx-debug.service6 }& e' Z2 k, w. d
%{__mkdir} -p $RPM_BUILD_ROOT%{_libexecdir}/initscripts/legacy-actions/nginx
# Z" `. n) `5 T8 ^  a/ @%{__install} -m755 %SOURCE9 \
* a6 ?. N5 R$ I6 K6 S* u7 u    $RPM_BUILD_ROOT%{_libexecdir}/initscripts/legacy-actions/nginx/upgrade
8 C& J" ]/ F+ S+ @- h. w%{__install} -m755 %SOURCE13 \
: C9 n0 {3 a3 I# W+ B    $RPM_BUILD_ROOT%{_libexecdir}/initscripts/legacy-actions/nginx/check-reload
( V( j: |7 w% {/ C%else
# F% s8 L" C* e4 o# install SYSV init stuff
7 _7 X% e" z! |8 R7 L$ i%{__mkdir} -p $RPM_BUILD_ROOT%{_initrddir}* v1 V+ k: w3 Z4 Z% t
%{__install} -m755 nginx.init $RPM_BUILD_ROOT%{_initrddir}/nginx2 ^# J& M# y5 ^5 H9 U# ?
%{__install} -m755 nginx-debug.init $RPM_BUILD_ROOT%{_initrddir}/nginx-debug% H$ ?- \! s1 a' \
%endif
6 B! y  B# z* d, j* ~* y# @) L$ p3 G
) U7 ?7 h& w; m# install log rotation stuff5 N4 M6 {8 e! C* ^
%{__mkdir} -p $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d( D0 m5 ^9 {8 e3 p
%if 0%{?suse_version}
% i1 y: _, D$ N" b0 h%{__install} -m 644 -p %{SOURCE10} \/ s2 T4 G. U- Q4 y4 C/ W. B
    $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/nginx
+ q9 t8 U. e/ k% @0 L%else
5 k( n& J3 K% z7 E%{__install} -m 644 -p %{SOURCE1} \% r( P  Z6 X, O4 E- F; X
    $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/nginx
# I  p' p# H; B% G%endif/ q/ J: E" w. ]4 ]3 z" _7 `
) g1 x0 T* x7 B& f* c6 N
%{__install} -m755 %{bdir}/objs/nginx-debug \4 y: d$ M3 c% w8 [5 o
    $RPM_BUILD_ROOT%{_sbindir}/nginx-debug
9 w. a$ r: M$ z9 q  z! x9 G
- S) ^  {; X0 k9 g. }5 P%check
9 o3 e7 z& y% C5 l%{__rm} -rf $RPM_BUILD_ROOT/usr/src; n3 N4 K$ d5 K( _1 D
cd %{bdir}
' O" m) d2 |; g4 [/ Hgrep -v 'usr/src' debugfiles.list > debugfiles.list.new && mv debugfiles.list.new debugfiles.list
1 i7 `3 \1 H% e2 n( I' icat /dev/null > debugsources.list1 |$ g: F% q9 W( H, g
%if 0%{?suse_version} >= 1500& _6 n% K" J/ p) s7 M! _. Q! @# V) ~$ H
cat /dev/null > debugsourcefiles.list
5 ?5 T$ ]/ K8 I3 C! f# y) j%endif
2 t# ~6 t, q; y' a4 s3 U6 k! S8 H$ l, }7 A
%clean, u& x( z# ?3 c9 g2 R7 W
%{__rm} -rf $RPM_BUILD_ROOT
3 s1 e7 F( M, \6 a# g* P0 ?8 T; [
%files
4 ~- e7 q; @8 U1 a3 x: A0 d- W' w%defattr(-,root,root)9 f. l" R, N& \5 g5 b  \4 N( Y7 t

1 _; C' v: n* j, G%{_sbindir}/nginx3 M' ?- l: S/ C3 F$ \9 H
%{_sbindir}/nginx-debug1 z8 n; G* K) T/ ~( Z" ^9 s
/ R: x2 z) q( w- N% C: e
%dir %{_sysconfdir}/nginx
# ]' F. Q" `# E# C: x%dir %{_sysconfdir}/nginx/conf.d" W* G. _' O" {1 B$ A' D/ Q+ i
%{_sysconfdir}/nginx/modules
7 C( l. y0 X- o" L* ^8 L/ Q& k0 G1 w1 n0 c$ l8 i6 g6 C3 P
%config(noreplace) %{_sysconfdir}/nginx/nginx.conf
$ \- ~7 b1 `0 k  A0 ^( ^1 P/ q& s%config(noreplace) %{_sysconfdir}/nginx/conf.d/default.conf$ C) |0 H9 ]+ M* `0 t; S0 N
%config(noreplace) %{_sysconfdir}/nginx/mime.types+ [5 R% p8 w$ y1 s2 H1 {2 }
%config(noreplace) %{_sysconfdir}/nginx/fastcgi_params
1 v" A8 B5 z) M1 u% [%config(noreplace) %{_sysconfdir}/nginx/scgi_params, N$ O/ d/ j) j3 ~
%config(noreplace) %{_sysconfdir}/nginx/uwsgi_params! |; v7 a/ u" e  N0 {% K
%config(noreplace) %{_sysconfdir}/nginx/koi-utf5 v" e( I+ U% l& J8 V
%config(noreplace) %{_sysconfdir}/nginx/koi-win
0 ?" ?2 W& k( C) Y3 _+ x# P%config(noreplace) %{_sysconfdir}/nginx/win-utf' M8 M- k0 T+ `$ E: X
9 Z; r9 ]& T, R. b, }- j$ C
%config(noreplace) %{_sysconfdir}/logrotate.d/nginx4 u7 B' P' \+ @& U, v7 B) g
%config(noreplace) %{_sysconfdir}/sysconfig/nginx. x2 S  x9 F* e4 ]
%config(noreplace) %{_sysconfdir}/sysconfig/nginx-debug4 `1 q1 r8 I' D1 E) W. b
%if %{use_systemd}% W) M1 b. a" |; k5 _2 M
%{_unitdir}/nginx.service0 s6 n2 N# G/ n
%{_unitdir}/nginx-debug.service( a3 g5 Z* g  x' [
%dir %{_libexecdir}/initscripts/legacy-actions/nginx
+ c& p! R: r3 }# Z% F1 T%{_libexecdir}/initscripts/legacy-actions/nginx/*
  M5 ~5 a/ l; j/ i0 U/ t%else; J6 [% L/ v! L9 k& ]
%{_initrddir}/nginx
( Q+ Q# E  S% R/ h- U%{_initrddir}/nginx-debug
2 ^0 E* Q; x( z5 e%endif6 _. T; p4 W# z! ]7 ]  z0 R1 O! V

$ o$ ^6 m# D7 u+ Y/ Q4 k$ j9 _* H%attr(0755,root,root) %dir %{_libdir}/nginx
+ r* o5 q9 P. k; d& O9 K  W! b%attr(0755,root,root) %dir %{_libdir}/nginx/modules- ?: I# a6 O9 e6 P% O! d
%dir %{_datadir}/nginx9 f! z( I% n% U) h
%dir %{_datadir}/nginx/html8 H7 I3 z+ K$ t5 T$ s
%{_datadir}/nginx/html/*: w3 b( a5 c* @

3 v0 b: |" M4 t%attr(0755,root,root) %dir %{_localstatedir}/cache/nginx
9 v0 w' ~& t  b  k1 P6 D4 t%attr(0755,root,root) %dir %{_localstatedir}/log/nginx3 E2 M& A8 e% W6 Z
" d+ t% }: M4 P) e
%dir %{_datadir}/doc/%{name}-%{main_version}. ^2 E) t1 f( H( `7 \, I
%doc %{_datadir}/doc/%{name}-%{main_version}/COPYRIGHT
* r  u' ~/ E& b+ f3 U; U+ {%{_mandir}/man8/nginx.8*
5 m: Y. ]$ N# H, h$ k6 S: {6 m, R" @1 w* v8 B6 T
%pre! Q( k  n& ?2 Z* P4 f) e) [5 k
# Add the "nginx" user
. ?3 F, L/ n0 G2 Q2 ogetent group %{nginx_group} >/dev/null || groupadd -r %{nginx_group}: K: u% }( S! Q! u6 p* f
getent passwd %{nginx_user} >/dev/null || \) Q" b0 i2 a7 t( v3 C% G
    useradd -r -g %{nginx_group} -s /sbin/nologin \
4 G4 n1 I$ r, q% t8 x8 t; ?8 m    -d %{nginx_home} -c "nginx user"  %{nginx_user}
+ r& M  {7 K; Uexit 0
% l# M  |* h  T
* I; R, j, o- @0 G7 C%post
, k' n6 }6 [1 O' ]; x# Register the nginx service& G: a  p( }" x( N* v3 G9 X
if [ $1 -eq 1 ]; then. l( x* S  _# ]! L8 U* u  ~
%if %{use_systemd}2 Y: K; ?. a  y5 A( h
    /usr/bin/systemctl preset nginx.service >/dev/null 2>&1 ||:
% P+ k9 W" M' m2 L, z/ q4 R    /usr/bin/systemctl preset nginx-debug.service >/dev/null 2>&1 ||:
2 C$ F9 {. c5 ]%else
, o/ `& v- C3 |1 F- U8 ~    /sbin/chkconfig --add nginx' f5 H. z/ }, q2 ^2 {6 z; x
    /sbin/chkconfig --add nginx-debug# o7 s" T7 K4 M
%endif
7 O, Y! d' Q  l3 f! C" p+ t    # print site info$ a3 G& q# v8 p' s- Y
    cat <<BANNER
0 _$ N2 u' }+ w4 |2 h8 B----------------------------------------------------------------------
  A/ b) Q* l' t* d8 x% Z
8 L: T3 c4 a( R4 p4 ~Thanks for using nginx!
$ @# X) M4 B2 }
  ~" V2 `) m( w! h( d$ ~- APlease find the official documentation for nginx here:
  }! U3 _! D1 t# C- ~* http://nginx.org/en/docs/
1 m* @9 m4 e  r3 E
5 i0 ]6 P! s$ J# Z  mPlease subscribe to nginx-announce mailing list to get
0 W7 c% ~$ x, e, _+ wthe most important news about nginx:4 {& q% P& d4 I0 ^0 S5 N) L' @; {4 l
* http://nginx.org/en/support.html
2 i2 H: Y6 U3 n( R0 u6 s3 o/ H7 [, h
Commercial subscriptions for nginx are available on:
- I4 H  G% d0 B* g! @/ c3 T# ]1 w* http://nginx.com/products/! J0 K* n& ~# D

; I; b& ]6 r" e* Y2 A; ~----------------------------------------------------------------------
" G, h; ?3 z$ }1 hBANNER
8 d; C& B! F& y6 b3 m
! Y* K: C4 g, z6 t5 T4 U    # Touch and set permisions on default log files on installation
0 R) j9 H9 p3 K7 C) K: t0 X9 \7 h' l
    if [ -d %{_localstatedir}/log/nginx ]; then2 r$ B! i9 t# A4 R
        if [ ! -e %{_localstatedir}/log/nginx/access.log ]; then
$ j6 k4 u) B/ s. T1 y7 A            touch %{_localstatedir}/log/nginx/access.log8 O% G+ n5 A  ~8 x& s. }7 m8 g, v4 R
            %{__chmod} 640 %{_localstatedir}/log/nginx/access.log
: d. a5 S; U5 F# O            %{__chown} nginx:%{nginx_loggroup} %{_localstatedir}/log/nginx/access.log& f5 B; K" d, [: ^7 Z
        fi
, `* e2 f. e3 U# r, W9 ]$ N# ]5 l5 E3 B
        if [ ! -e %{_localstatedir}/log/nginx/error.log ]; then" w! ^! ^! n: Z- }: H1 |) ^5 C  E
            touch %{_localstatedir}/log/nginx/error.log
8 @: m; K' i" k; o; r% E6 G( m4 r            %{__chmod} 640 %{_localstatedir}/log/nginx/error.log
0 B  F3 P: r. x6 @9 j8 x            %{__chown} nginx:%{nginx_loggroup} %{_localstatedir}/log/nginx/error.log
3 s5 k1 n. a) k        fi
3 O: S7 O: ^! I6 ?7 N) e    fi. o+ b( N. m7 b9 U7 g. V/ V) \% M
fi( L: V+ o% j" e2 E# e/ O9 n$ _
% D! V3 X" J- A2 U" J
%preun2 P  L# F# c& [
if [ $1 -eq 0 ]; then1 b0 O3 ]) \5 {8 E8 G
%if %use_systemd
. \" r/ @& ]$ ?% z    /usr/bin/systemctl --no-reload disable nginx.service >/dev/null 2>&1 ||:
9 Q0 C$ A, s$ |" v    /usr/bin/systemctl stop nginx.service >/dev/null 2>&1 ||:
  ?: [2 N  n0 u- t& Q, o%else/ J. `1 v* I1 D
    /sbin/service nginx stop > /dev/null 2>&1
6 W. G' w0 {# r/ X& E    /sbin/chkconfig --del nginx# p: @: A% Z3 c( s, @5 i6 Q, Y
    /sbin/chkconfig --del nginx-debug
4 S/ y( w8 T7 h( j%endif! M, X& R. H- k- L
fi7 q: [0 R9 }+ `1 n4 y5 D
, [2 Z7 u) U8 x9 P* ?2 j
%postun; S4 c% S$ I1 s! |+ o' i! N4 C8 R* o
%if %use_systemd/ w" m7 m" C1 Z3 @; E. G4 S3 Y: W
/usr/bin/systemctl daemon-reload >/dev/null 2>&1 ||:7 b1 u) F5 A0 c6 a
%endif! o9 f8 \& ]+ e8 z9 H" k
if [ $1 -ge 1 ]; then
" M) r# c! Q  }1 W% C9 z    /sbin/service nginx status  >/dev/null 2>&1 || exit 0
& k( B9 ]1 Q1 d: l6 T7 Y    /sbin/service nginx upgrade >/dev/null 2>&1 || echo \2 B1 b% y4 I! v' w9 D* z# D
        "Binary upgrade failed, please check nginx's error.log"
1 e) R/ g. M: `fi
; o+ \3 D5 x# D+ b1 W' M, q8 }1 H4 N: V
%changelog
- \+ {7 Q2 [6 \: |8 [6 i" m* Tue Sep 30 2019 fangdm <8@8994.cn>
, Y* A# ^! U: c" d- Add modules nginx-http-concat and ngx_cache_purge
& i0 `  B, o0 ?) w7 k0 x. I
% @5 `3 y3 J4 Z# s4 t* Tue Aug 13 2019 Andrei Belov <defan@nginx.com>
, p, l& n1 n8 ]4 W- 1.16.1
( s) w1 K$ s# s3 w编译完成之后,查看changelog,是成功了。$ D. M2 w3 |/ v4 v- v- t$ l

/ p( z, N. r& u# t9 z+ f* Y9 A[root@localhost SPECS]# rpm --changelog -qp /root/rpmbuild/RPMS/x86_64/nginx-1.16.1-1.el7.ngx.x86_64.rpm" m$ i5 c1 s4 P' ~7 a
* Mon Sep 30 2019 fangdm <8@8994.cn>
0 H3 _: i3 P* z- Add modules nginx-http-concat and ngx_cache_purge  j& a3 L2 h" W0 N, |8 q' Z

( v- _  Z$ v) ]* Tue Aug 13 2019 Andrei Belov <defan@nginx.com>
# ~2 M9 }) T* i" q- o& n3 _5 p- 1.16.1/ y% }1 S2 d  Q) h# X& N, Z5 ]
fpm打包方法* d$ @0 Q) L# k7 C: S3 q9 l
使用fpm这个方式也是可以将tar打包为rpm包,其打包流程大致是这样的:+ E: t% @$ n' ~+ \4 q  h
& N2 ^) l$ E6 T! j
编译安装被打包软件,指定安装的临时目录,如指定--prefix=/fpmbulid% J: l' f4 W/ b6 W4 g0 R# W
创建安装脚本、卸载脚本: h7 l) _9 P% i
安装FPM工具
/ S( ~) k+ g7 k, F# I: U/ _使用fpm打包8 A2 D$ U+ ~- G4 u0 x5 X* Z

8 v+ N3 w! p4 `1 p$ p# C

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2022-10-20 15:00:06 | 显示全部楼层
gcc相关知识
先编写一个C文件,其第一行表示包含文件在/usr/include/stdio.h下,如果没有申明,则需要使用参数-I /usr/include指定。
复制
1+ c, w- Y4 M+ O' ~9 B% x: C: s
2
2 K% Y# W5 T5 m; f0 N# Y" b3
9 j% B7 C; ?- F2 q$ Z8 d' V4
$ Y  `8 t. d3 j( x53 t8 {3 @3 v0 W: V
6
% \( }- M/ H# H8 ], F! N7% \# g& h: l: U* T% C' A% s# |
8
- D; r1 Z# n1 |! C- a) w! Y9
' Y: f. Y* Q6 r8 k10
# v; b* ]: q1 J5 `( U11: u! c& \7 e! @; N( Q
12
' g( O) l) \5 T, r3 {+ n( N. y13* `: b$ q) m& J, Z' R, B
14
+ a$ [5 h# }. [0 O2 Q, M15
- `/ O4 c! r, [16
0 \# Z; a; p; R- i; `17+ F1 a+ v9 W# A- _, `% n
18
8 P# g. A6 p( l: P. r7 Z190 \# }4 G4 |/ L! m4 E; h
20) T/ }& n4 ~5 G3 I& m0 |
[root@home ~]#cat sin.c
3 K% c! m5 n7 V2 J  U% l7 G0 j#include <stdio.h>
$ Z, W. }" E) k( e- j7 Lint main(void): _4 R8 U4 [1 `
{
' I) u: ]9 ?0 N( s        float value;& j/ C& N3 [# Y8 m6 ?
        value=sin(3.14/2);
* x2 H. M3 t2 o" }! x. e, N        printf("%.2f\n",value);
7 |% C8 h& _/ l) U. a% e}8 e8 e$ d6 q, ^7 i! H8 X0 b) `
& N* s+ }% t; \  j
[root@localhost src]# gcc -c sin.c+ o6 l1 h1 ~+ t6 |7 x5 p
sina.c: In function ‘main’:
4 I9 `3 u  |- h9 ]7 N5 J# |sina.c:5:8: warning: incompatible implicit declaration of built-in function ‘sin’ [enabled by default]% e3 o5 R: `, _4 _4 F3 S9 \( I
  value=sin(3.14/2);
3 d3 P( f  I: p" v        ^( ?! E5 o. [$ ]8 z( v
[root@7ftbv7mdz7cdpc ~]# gcc -c sin.c -lm -L /lib/64 -L /usr/lib645 H3 M3 K2 _" N
sin.c: In function ‘main’:/ }8 n) u# z* k) ?3 T' c( r1 b
sin.c:5: warning: incompatible implicit declaration of built-in function ‘sin’
6 u7 w+ `; X; u+ I) S[root@localhost src]# gcc -o sin sina.o; G& \0 L; h* k1 {7 W& E
[root@localhost src]# ./sin  _. q" b$ e# ?3 ]5 o$ u
1.00
+ {0 j& B& V5 z( T, |  w+ l9 R
( X% g0 Q+ o& Y9 o& X$ p0 R! {1 p
: p0 D) {: j' _1 w4 P" C/ {0 T
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 里面搜寻8 j1 \7 \4 K! T- c/ ?/ N
总结:5 A# x& \) q: L0 b  o: ^
复制
19 w$ m+ l: |! p: \1 M& L' }
2" h1 G% E! K) Z3 `6 O+ A6 k
3
  o6 X8 K2 ]" h! e% Q6 n4' Q3 D- [" E6 W. E. ~9 R# ^# a% J9 k
5
( x# X/ m; B, Q# E( K+ F6
7 o% y- s8 n+ ?* n; o: J! T5 A8 m73 P8 H$ d" S2 t; F5 _# o
8* o' i/ g- D# n
9) j* w# i2 d3 r% k, ^% x5 t9 s
101 K9 [' D/ f) d: u8 C; E
11
9 f0 i" h; m( e& D, A128 }6 v: |* \7 ~5 `8 [
13% u) j/ o; }; d; @; e. S
14' z& u$ |! `; R+ r! [+ W
15
" d" n6 |$ _; ~# s16  d' o6 i! y4 D2 t; s
17
( o. `! a( I3 x' k/ @9 v18' z# {0 S6 v+ u. {7 M
19/ l% [4 q, g1 g$ E% a
20
$ O0 E+ Y  f* q- |( X: U* P21
& x7 v9 q# A& p22
( i( k5 ]  J1 S3 `, x. e23) J: ~0 {, \9 V/ K/ `
# 仅将原始码编译成为目标档,并不制作连结等功能:
! K3 F+ P9 v; L, X. d[root@www ~]# gcc -c hello.c  |0 ^8 Y4 q0 t- ^' |
# 会自动的产生 hello.o 这个文件,但是并不会产生 binary 运行档。* @1 y3 t6 B1 V

% D9 ^$ g! T( h+ ~, h4 U* S# 在编译的时候,依据作业环境给予最佳化运行速度! y! ^6 f# _, H1 e: k
[root@www ~]# gcc -O hello.c -c5 f0 V1 `+ P+ z1 u: j
# 会自动的产生 hello.o 这个文件,并且进行最佳化喔!, O+ e' L% T3 _) @: C# @$ l, c
2 C# Y: a* f' X* {% [0 ^
# 在进行 binary file 制作时,将连结的函式库与相关的路径填入
8 Z+ v% [" P1 O4 }[root@www ~]# gcc sin.c -lm -L/usr/lib -I /usr/include5 d) b$ Z0 |' V# F) E; O- B6 C1 |
# 这个命令较常下达在最终连结成 binary file 的时候,3 ~6 S$ ?  n1 N
# -lm 指的是 libm.so 或 libm.a 这个函式库文件;3 R) h& c, U$ i) f% z; D* N# h7 Q- o
# -L 后面接的路径是刚刚上面那个函式库的搜寻目录;* d$ \, E1 p8 n; J
# -I 后面接的是原始码内的 include 文件之所在目录。2 E# J* [& q. y/ U& n
) r! D* n+ U9 N0 N+ {4 [/ P
# 将编译的结果输出成某个特定档名" m1 |5 f0 i! X$ _
[root@www ~]# gcc -o hello hello.c: n0 J& S- g" s& H5 p, {
# -o 后面接的是要输出的 binary file 档名$ d+ L! T  ~, i* C4 H1 l3 Z0 t
( h) m6 j9 o% V( p3 ?. Y' J9 x
# 在编译的时候,输出较多的信息说明6 T' ~- @. F/ a: ?
[root@www ~]# gcc -o hello hello.c -Wall/ h& y3 ~; c5 ~- H0 N. g- I+ ~3 J# T
# 加入 -Wall 之后,程序的编译会变的较为严谨一点,
( Q0 E; R& E4 x- x0 G: Y9 w# F# 所以警告信息也会显示出来!, c% o. I& J0 h9 t6 _0 Q

$ C  Z, U8 J% e) i* _" t9 N' Z% X& `9 v

) w, W; F3 h' V- D" h& \& X6 ]7 h% I4 \$ V0 L7 w! x6 k
另外,我们通常称 -Wall 或者 -O 这些非必要的参数为旗标 (FLAGS),因为我们使用的是 C 程序语言,所以有时候也会简称这些旗标为 CFLAGS。
9 B- A9 {# r: w! i
! X7 M1 P. G$ ]# ?/ N
makefile介绍实例
首先,下载wget http://linux.vbird.org/linux_basic/0520source/main.tgz然后开始编译:
复制
1
: N6 K* f3 U- T0 m! j( x2
: L* }! ~, Y7 l  c' [4 w; Y3
8 J9 s6 i0 {8 o' q41 V/ P, H" O. t% ^5 _% o* r7 k+ c
5
( ^3 t( m4 o$ e/ k$ u1 U; p% y6
' Q; ~8 E# e; [+ }7
+ ], d2 ~* f* j' S$ W3 v# j8
8 t3 \  ?9 Z0 y$ ~9 E0 y7 N9* t, H- O/ p" k$ m3 U
10
! i* \7 y. L- H7 @119 I2 H0 y& X. j% R4 N1 l
12) v0 y* M9 M# g) m, C
13
$ z! y; Q0 k1 @0 |1 J% [8 o14
% c( ?* p( |6 L3 ^1 B, z% S( n- [9 A156 b4 T. e5 i, h8 x* r8 T! |6 I- L
16
9 q0 L; u  T9 f- N9 q3 O" I/ b' i7 i170 Q: \. T) _' v* C7 z
18
! q7 v9 `) l, F' ~6 U* N19
$ }2 h; s" Q) }20& Z0 F/ v- N8 W) z
21
. s* l, v, ^. G' }9 v* W/ X22
$ C$ Z+ a' h) s, \' N+ f
[root@localhost main]# cat makefile; y8 }0 P! I) g# P
main: main.o haha.o sin_value.o cos_value.o
. Z# B6 C( u" e3 F        gcc -o main main.o haha.o sin_value.o cos_value.o -lm- Y9 ^3 j) L2 ~! H5 e1 h
clean:- ~6 L0 L! z6 d" m9 w
        rm -f main main.o haha.o sin_value.o cos_value.o9 {# e% p2 g$ |6 r: d+ Y9 k
       
' i5 i1 f. v# R+ B3 d[root@localhost main]# make1 ?' g8 b2 A+ |6 k7 @
cc    -c -o main.o main.c2 w, K' Z. \2 v. y1 J
cc    -c -o haha.o haha.c
1 W9 J; t5 V/ s0 I/ C) [! occ    -c -o sin_value.o sin_value.c
" J0 I2 O5 m# l' D: f0 occ    -c -o cos_value.o cos_value.c' g! C. l( y5 s5 Y6 l
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
7 c- r0 b- N; `3 T' C; f2 F: b' G  @; E. u
[root@localhost main]# ./main
% @- `: z2 e  U4 N: P# T4 VPlease input your name: fdm; F- b5 s' i0 [, t' a
Please enter the degree angle (ex> 90): 33+ V$ e. c* U3 T( A; j
Hi, Dear fdm, nice to meet you.
8 K4 ~2 s$ s# fThe Sin is:  0.54: {4 E9 u& p4 _
The Cos is:  0.84
' W& d! p% u: L- {3 L+ N$ D$ K9 O+ Q' l* B& x
[root@localhost main]# make clean. r2 G1 J* m- Q( m1 @
rm -f main main.o haha.o sin_value.o cos_value.o
) V! o3 ?% Q- w2 c

2 H; u: Y) Y$ N2 y7 _1 h
1 s  W4 _( ^- q$ I6 F/ F
makefile 的基本语法与变量
make 会主动的去判断每个目标档相关的原始码文件,并直接予以编译,最后再直接进行连结的动作。
  • 在 makefile 当中的 # 代表注解;+ B1 E( R" u. S) n
    • 需要在命令行 (例如 gcc 这个编译器命令) 的第一个字节;
    • 标的 (target) 与相依文件(就是目标档)之间需以『:』隔开。就是可执行程序的文件名。复制
      1
      6 b% m$ n* h6 i- A27 X* r4 I8 Y9 T2 \5 }% Q2 n7 X
      标的(target): 目标档1 目标档2) g3 c; h: @7 f7 a2 C
              gcc -o 欲创建的运行档 目标档1 目标档22 u$ F) g$ `, D0 W% _

      4 O( S) ^0 k+ W
      : y4 u1 H9 S0 s$ @- E
      4 `' c, F: a5 s; ~, j/ F/ o8 k9 t! y
如下,makefile 里面就具有至少两个标的,分别是 main 与 clean ,如果我们想要创建 main 的话,输入『make main』,如果想要清除有的没的,输入『make clean』即可!而如果想要先清除目标档再编译 main 这个程序的话,就可以这样输入:『make clean main』
还可以进行简化,使用变量来减少程序的修改量。$@:代表目前的标的(target);gcc 在进行编译的行为时,会主动的去读取 CFLAGS 这个环境变量,可以写到makefile  j' f6 w; j' x& O$ b- g
复制
1
; r6 |+ }+ D4 ^8 g2$ Y) `* L6 f+ f; \: d! Q  L3 w
3
  ?* t  \% B1 m7 `4
2 |3 ]7 z# g' M; p5# l3 A1 r7 l& G% X) j" X
6" Z# F1 D  z6 w. F% _# @/ h
7& K. _* j! M7 E  z$ d) {) W6 t
8
% b; o# I2 U& j6 J
[root@www ~]# cat makefile% }  O- B: M( w, P: {! P+ B
LIBS = -lm
$ Y* O; ~" {$ `" ~  NOBJS = main.o haha.o sin_value.o cos_value.o
0 Z6 o3 u- F9 ^4 \# `& R4 MCFLAGS = -Wall
3 y/ B6 O9 M$ vmain: ${OBJS}
: |# z2 Z* B) K3 p. Z$ ^        gcc -o $@ ${OBJS} ${LIBS}& v. B# _( P1 i* q7 G. A
clean:$ x" c0 |/ C, t; n- b1 Q" h! K
        rm -f $@ ${OBJS}
( x7 a1 n5 s! }

& D$ ^) g0 u- E! q1 r- q

. m4 g; Q; a" A% U) Z1 `3 t; [/ ]& D8 J9 L/ r5 }) z# p' n  j
由於 gcc 在进行编译的行为时,会主动的去读取 CFLAGS 这个环境变量,所以,你可以直接在 shell 定义出这个环境变量,也可以在 makefile 文件里面去定义:9 u+ k% G4 d8 s, @* ~- t
复制
1/ l/ B  {" X1 m) l+ T/ r# m. o
2$ c) {, @( L6 E5 N. w
[root@www ~]# CFLAGS="-Wall" make clean main+ E5 y( w5 r6 T- f
# 这个动作在上 make 进行编译时,会去取用 CFLAGS 的变量内容!
0 w( U/ V& |# R
5 }& c$ k, R/ T; C( ~

% c4 M$ a& F+ @0 D+ j: l. ^: b9 w4 Q6 j# M' n$ ]! e0 R
make与Dockerfile相接合
此小节内容来源于 high-iowait-process
如有下列Makefile文件内容:
复制
17 U! y" q' \' H$ `0 y
29 [6 p; _6 e6 L9 @3 y- r0 [
3
/ z9 s% ]  Q6 Z+ i4
9 X' N+ b& p( e" F8 H1 ?5 e9 B3 r8 g54 ~% G" ?* c: c( {- L$ {
6- K+ s- N5 u* ]: M
7( f) _% s6 M3 S( i8 L+ t% C
86 b, V( H( L5 G
93 q  I; h1 N& p3 J# G6 o
103 v$ N' Q2 v5 H2 D0 [1 `/ ~" B" D
11
& S* h+ [5 h% x% D12
* L' x7 s$ ~/ v0 i0 W8 J13: n- B" X* K# V* I
14
! ?1 x. s, _3 @; k: [' y. {0 T: l15
4 T6 G# \% g2 b& k& a5 @$ f16
. J9 E% L9 k4 [17
0 K# ^2 Q* q1 ]4 e18
' u, D5 W' y5 i19
1 \) _3 H/ b1 E9 k  X20, b5 ]( k6 |; P9 j0 ^
21/ P% N1 G, m( F" O: i% f' |0 K( Z5 q7 g
22% R' ^8 Z0 i& Z4 \1 c7 u
23
# X) \6 Y* d. Y/ O2 [24# ~, J) K! x+ U' g3 A9 q+ `
25
4 {; T+ K$ ~* J; j) i26
4 y2 e; I& P- Q" y; v27* f/ D. W! |3 V  D0 B' T, t
287 ]/ {' l' v7 C
29
- y5 F( J7 J0 F* N# z( F% A' P30
0 b% n$ z$ _! M& \# u31* x* e5 s! H* \2 @- l
.PHONY: build7 `3 o, ~# u7 l+ o6 G: R
build:
6 \* f# V3 P8 t6 V4 K+ j" U        gcc -o app app.c
2 r) m% q; _% N% A        docker build -t feisky/app:iowait -f Dockerfile .
* U$ I* k0 Z/ O8 ?- ~1 T5 v7 A. z        gcc -o app app-fix1.c: g0 Q3 B7 B/ B+ c: v
        docker build -t feisky/app:iowait-fix1 -f Dockerfile .4 f" \1 O9 t& u- T) t
        gcc -o app app-fix2.c
2 C- U8 u* V! V. s( u' Z        docker build -t feisky/app:iowait-fix2 -f Dockerfile .0 Q6 Z& E# C  F$ S- J

* T) m5 c2 u* D4 K/ L4 ~! _$ @.PHONY: push
" [+ u1 @& r2 I  ]' Spush:
0 W* H4 V% _2 u5 k1 r% B        docker push feisky/app:iowait5 I; i  |; p9 e( t& d. Y
        docker push feisky/app:iowait-fix1( r# s7 H. B* c9 D
        docker push feisky/app:iowait-fix2
! `9 ]7 S, \) t( B- B5 M8 `& r- {' Y! |2 s+ C' k5 Y
.PHONY: run
1 |+ P0 H: L# e, e; @run:# t1 }, y2 q0 V3 Y: N2 e
        docker run --privileged --name=app -itd feisky/app:iowait4 X7 ^, x6 [& P8 I, S

) O1 h9 v( j2 y0 w4 y.PHONY: run-fix1' A+ y' _5 V7 J2 I1 M8 c1 i4 o
run-fix1:0 [  M* z) C! L4 |! d/ |
        docker run --privileged --name=app -itd feisky/app:iowait-fix1
; b$ R$ F) T8 p* U
" ]& W- P4 v5 |' u5 ].PHONY: run-fix27 k1 l4 Z% D+ l8 D
run-fix2:
0 l3 {5 ?9 L- l        docker run --privileged --name=app -itd feisky/app:iowait-fix2$ T" T5 ]7 j+ u
! v8 b$ b# L+ S8 H- x9 C. E# ?
.PHONY: clean& m& ?' b  {, O- y6 X2 d
clean:* J/ `4 ^3 ?: }( D
        rm -f app
7 w/ ^- H" r" i* Q9 l        docker rm -f app || echo "Container app already deleted."& Z! K$ o* ^+ [( L3 H8 [7 K, \8 _
# K  ~  a9 W& A' f' h4 t0 n% G7 A
! w, G4 w7 i' U3 M8 Q' ^
这样写好之后,就可以使用 make bulid 来生成镜像,使用 make run 来运行镜像,使用 make clean 来删除镜像。所以这看上去就有点像脚本的函数一样了。
变量的基本语法
  • 变量与变量内容以『=』隔开,同时两边可以具有空格;
  • 变量左边不可以有 ,例如上面范例的第一行 LIBS 左边不可以是 ;
  • 变量与变量内容在『=』两边不能具有『:』;
  • 在习惯上,变量最好是以『大写字母』为主;
  • 运用变量时,以 ${变量} 或 $(变量) 使用;
  • 在该 shell 的环境变量是可以被套用的,例如提到的 CFLAGS 这个变量!
  • 在命令列模式也可以给予变量。
    5 ]) g$ u8 y+ c% y* n
yum安装相关环境
  • 如果是要安装 gcc 等软件发展工具,请使用『 yum groupinstall “Development Tools” 』
  • 若待安装的软件需要图形介面支持,一般还需要『 yum groupinstall “X Software Development” 』
  • 若安装的软件较旧,可能需要『 yum groupinstall “Legacy Software Development” 』9 U8 i+ O" V+ h: f+ T5 L& f# k& `
编译软件步骤
  • ./configure 创建Makefile文件
  • make clean 会读取 Makefile 中关於 clean 的工作,可有可无
  • make make 会依据 Makefile 当中的默认工作进行编译的行为
  • make install
    & T5 }. K1 t5 f4 s9 L
如果未指定安装路径,则编译安装的目录是放在/usr/local/etc、/usr/local/bin、/usr/local/lib、/usr/local/man下。
rpm知识
此内容与编译无关。可以跳过,同时此内容也来自于鸟哥私房菜,是一本好本啊~
RPM 安装 (install)复制
1
  Z5 L' Y# ^2 L/ r- H' u2
! k8 w7 o2 ?  L% A3
) R/ a. ~. _* v4
1 k' D7 Y$ W, j; I! q; o* O6 d5
$ X" x6 Z( K* R6 q+ K4 D4 I6! Z6 [* b& k9 o6 G" N, {
7+ J+ G* u1 B$ [2 _5 {. }
8
8 W6 e: g6 F7 D" l  H- B9
8 X$ ?# j$ A+ A+ ~5 W4 S10
- p* \4 x( D2 E6 o% _
[root@www ~]# rpm -ivh package_name
( o' [6 `  \) ?) B3 }5 q! s8 A3 l) X6 T选项与参数:. h' a% c3 |3 \' V
-i :install 的意思
& x2 O; `$ ~6 N* f( t" V1 K-v :察看更细部的安装资讯画面& T# `6 ]0 t) T2 G; U& p9 k; Q
-h :以安装资讯列显示安装进度
7 a/ P1 p  q  L( q& q; z7 P: \
0 u( A8 K7 ?, C( n-Uvh        后面接的软件即使没有安装过,则系统将予以直接安装; 若后面接的软件有安装过旧版,则系统自动升级至新版;# B* u1 _! a/ C3 ^3 ^9 n
-Fvh        如果后面接的软件并未安装到你的 Linux 系统上,则该软件不会被安装;亦即只有已安装至你 Linux 系统内的软件会被『升级』; Y; D$ \5 ]! C8 k) F" c
9 z6 |; K9 H& A
[root@www ~]# rpm --rebuilddb   <==重建数据库
, T: w3 i5 h1 i& o4 G9 M
+ H- v! x% E. o1 g$ M; Z: E% A4 u0 O
( B8 N# W( J  b" g
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 使用时机:不想让该软件在安装过程中自行运行某些系统命令。
    2 r# D% c# }% E; N3 \+ x; X
RPM 查询 (query)
RPM 在查询的时候,其实查询的地方是在 /var/lib/rpm/ 这个目录下的数据库文件。
* i9 H; Z0 \! {8 R% s
复制
1
# D4 W5 V' z, j0 @8 _' |3 T& z2
4 ~% F7 G& o8 V+ n; ]% P3( x, x) c1 H9 P+ h+ C: T  l8 U* T
4
3 T1 S) `$ M( j# b6 R: k' w
[root@www ~]# rpm -qa                           <==已安装软件
1 i# B) _, ^# h0 z[root@www ~]# rpm -q[licdR] 已安装的软件名称       <==已安装软件
; ?" l6 F9 |" L0 v" `* M; i7 ][root@www ~]# rpm -qf 存在於系统上面的某个档名      <==已安装软件- m) ?) T+ A& g8 E* s1 Y
[root@www ~]# rpm -qp[licdR] 未安装的某个文件名称  <==查阅RPM文件" x1 ^1 B  O5 M8 m) O. H: Y1 N

; z2 n# F( p. ?9 l9 }( O( u$ ?

: L1 U( N( K% z7 L4 x/ R
) ?; E& p2 ~2 f5 Y+ Q/ N8 y
  • -q :仅查询,后面接的软件名称是否有安装
  • -qa :列出所有的,已经安装在本机 Linux 系统上面的所有软件名称;
  • -qi :列出该软件的详细资讯 (information),包含开发商、版本与说明等;
  • -ql :列出该软件所有的文件与目录所在完整档名 (list);
  • -qc :列出该软件的所有配置档 (找出在 /etc/ 底下的档名而已)
  • -qd :列出该软件的所有说明档 (找出与 man 有关的文件而已)
  • -qR :列出与该软件有关的相依软件所含的文件 (Required 的意思)
  • -qf :由后面接的文件名称,找出该文件属於哪一个已安装的软件
  • -qp[icdlR]:注意 -qp 后面接的所有参数以上面的说明一致。但用途仅在於找出某个 RPM 文件内的资讯,即未安装的名称9 W: b0 @, u# W- H
RPM 验证与数码签章验证
验证 (Verify) 的功能主要在於提供系统管理员一个有用的管理机制!作用的方式是『使用 /var/lib/rpm 底下的数据库内容来比对目前 Linux 系统的环境下的所有软件文件 』也就是说,当你有数据不小心遗失, 或者是因为你误杀了某个软件的文件,或者是不小心不知道修改到某一个软件的文件内容
复制
1
# Z+ w  _# `2 p4 G' L" B$ S$ \0 m( Y2  E8 n% D2 C  L, }$ ^4 |( b, m
3
/ P% Y7 R4 D; r$ d4 _48 @. a, P; n$ o) Q
5
: l1 u, B. u( @6 f6
* B5 c9 u& R. Q" I6 b+ x" R! @' l74 g# f8 M1 \0 r2 ~" z
8
" p* O0 ^% C) x% ~$ b  |/ M9 h9, O4 @# M4 A/ `9 v9 {6 ?0 y$ T* G: K
108 T! J6 s1 Y& n5 A8 K
11
) H7 V8 O; {; `$ x/ O; A125 E3 I; q7 V9 B2 i! \
13
4 F/ I% p" X. D, W: f
[root@www ~]# rpm -Va+ h) d8 M' S! u7 H. c1 x
[root@www ~]# rpm -V  已安装的软件名称) I; y6 u3 E8 ^- Q4 m0 _) K
[root@www ~]# rpm -Vp 某个 RPM 文件的档名
2 z( i5 z1 W! e( p+ T5 r: L2 K$ K3 y[root@www ~]# rpm -Vf 在系统上面的某个文件
, `0 C% r/ F# b/ w. @& m0 C# Z3 @; `) G  C$ t. e* x
选项与参数:
& L$ T) r/ _" ]  _-V  :后面加的是软件名称,若该软件所含的文件被更动过,才会列出来;$ y2 r2 J# ]. W& S
-Va :列出目前系统上面所有可能被更动过的文件;, u0 N( ]5 m* R& {# W9 S
-Vp :后面加的是文件名称,列出该软件内可能被更动过的文件;
- O# T; w9 l, C# R2 d( G! x-Vf :列出某个文件是否被更动过~4 W; y* x  U0 l  B' _

5 W; z! j' T, f- {[root@www ~]# rpm -V logrotate
0 l$ z" |1 P4 |- l( `- E..5....T  c /etc/logrotate.conf. E( \2 ^# P7 n: _, W3 ~

9 g! f3 j5 L; I; O

! K  N( t# w+ l  L$ i
第一列的含义有以下几种:6 [' p2 W/ l6 |8 |7 D, j- j% U
复制
18 Q; N% W  m2 l" r, y
2' o. @7 |9 \3 z2 c" [" I0 y, S2 m
3
! ^- E/ g  v' _4 N47 [7 w- j: h# \* j- n
5
, v* E; z" l1 K2 S8 h% Z4 }6
7 C  T, l! l5 c1 i6 o- s7. ?6 `1 n" F: e
8- y# h$ l  Z% k1 c. t& B7 c
S :(file Size differs) 文件的容量大小是否被改变
* O. m# P  \1 NM :(Mode differs) 文件的类型或文件的属性 (rwx) 是否被改变?如是否可运行等参数已被改变
% m6 f  V( Q" s+ i. E! T; Z7 w5 :(MD5 sum differs) MD5 这一种指纹码的内容已经不同
8 I8 n3 z  d) d; L( ]; MD :(Device major/minor number mis-match) 装置的主/次代码已经改变
" G* R- O' y/ _5 J/ Y6 V. d4 o5 M) HL :(readLink(2) path mis-match) Link 路径已被改变
7 K- Q8 @% [5 HU :(User ownership differs) 文件的所属人已被改变: m9 H! w3 t1 H( a0 q! d
G :(Group ownership differs) 文件的所属群组已被改变
# s: C, {& `0 e  UT :(mTime differs) 文件的创建时间已被改变, [2 O: M# G! l+ r. i

6 }; i6 S# H' D! ^( G# R

2 g! R! m0 c' ]4 M6 _$ @2 n0 v  X
第二列的含义有以下几种:
复制
13 k( Z5 A. g) b7 q& ~! [9 V) r
2
+ J0 M- z$ o! P0 U3
$ k1 o8 e/ `( q, s+ n! K4
/ ]9 x/ _0 h8 C/ W! [5
" Q& R( v* A# N' H$ j6 _/ F
c :配置档 (config file). Z6 V5 K! F5 E  J  g3 k# }7 t& j
d :文件数据档 (documentation)
4 {/ B1 d  A5 @0 h7 S% }g :鬼文件~通常是该文件不被某个软件所包含,较少发生!(ghost file)
8 F5 u: a+ d# U/ Q6 ?, E+ Q+ W) Wl :授权文件 (license file)2 g7 G0 W6 B+ i: I) B' N
r :读我文件 (read me)
/ k; j8 h# R6 ]$ Y7 n. d6 z

; a4 y9 c6 T& N. L* s$ h  {. Q2 }

+ l! S6 I  }. x( {" P数码签章
软件开发厂商可以数码签章系统产生一个专属於该软件的签章,并将该签章的公钥 (public key) 释出。 当你要安装一个 RPM 文件时:
首先你必须要先安装原厂释出的公钥文件;实际安装原厂的 RPM 软件时, rpm 命令会去读取 RPM 文件的签章资讯,与本机系统内的签章资讯比对,若签章相同则予以安装,若找不到相关的签章资讯时,则给予警告并且停止安装喔。
复制
1" z4 U3 |2 W' I, A$ t5 i
22 o) L; D2 p* o$ f( _/ v
3. s9 P/ ?- x" p6 J2 I6 W8 X) @% k
49 ?8 W/ C" Y/ S- Z. c
5! b( i$ ^$ x& d" b1 v( g
6
- o( n, F' M4 g, q" `  N7* H+ G+ B" g( w; V' }5 ~
8, G6 }, I# c" _
[root@localhost ~]# ll /etc/pki/rpm-gpg/RPM-GPG-KEY-*% @: J, c2 U/ m  V! {9 p/ b
-rw-r--r--. 1 root root 1690 Nov 23 08:16 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
% ^% O5 U) ^, P9 l0 k-rw-r--r--. 1 root root 1004 Nov 23 08:16 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Debug-7& h0 m% }) B$ I$ J
-rw-r--r--. 1 root root 1690 Nov 23 08:16 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Testing-7
: a- t' ]8 m* Z" [8 D# z& a-rw-r--r--. 1 root root 1662 Oct  2  2017 /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
. F& }9 k9 q$ `7 b+ ~+ K% ?6 s3 C: C-rw-r--r--. 1 root root 1340 Mar 23  2017 /etc/pki/rpm-gpg/RPM-GPG-KEY-remi6 K9 P& x4 Y" a) ^
-rw-r--r--. 1 root root 3100 Mar 23  2017 /etc/pki/rpm-gpg/RPM-GPG-KEY-remi2017
8 o4 U; @" ?$ m. A3 B-rw-r--r--. 1 root root 3143 Jan 16  2018 /etc/pki/rpm-gpg/RPM-GPG-KEY-remi2018( o9 ?  H6 t: K

  e) F2 W! I4 H6 H9 |8 _) a0 E

' s) B) F* \  S4 ], Z$ dSRPM相关知识
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 不但进行编译跟打包,还同时进行『安装』了9 r' V! v) v, c. X
示例:
复制
1
; i; i: Y* c; L% K4 s2' W) \! s; X1 q" m! I
31 Q  d2 Y& h2 N: y7 `
4
, Z" o3 y8 E3 i  Y5 j* B) B5# O+ J: n+ a8 Y
6
1 s3 w- B8 l( [7
% X/ d3 n& b& Z9 R8 S4 S8
6 @) z3 j" d) W: e$ q' M8 E9: ]4 ]# v5 u" [4 ]9 R! h" O4 G5 p
10
! y& F& h7 ]0 l2 T+ Q$ s
先下载软体:
% d: a' h4 k+ g  J) I& Q3 }$ jwget http://vault.centos.org/7.1.1503 ... l7.centos.1.src.rpm* S& F4 t8 Y0 V5 R0 @
再尝试直接编译看看:- o7 [4 B- B$ y( H4 [
rpmbuild --rebuild ntp-4.2.6p5-19.el7.centos.1.src.rpm! G3 D8 N9 X# Z! w2 S3 {
上面的动作会告诉我还有一堆相依软体没有安装~所以我得要安装起来才行:" e: m& L9 ^+ P; C' X( s8 z1 s
yum install libcap-devel openssl-devel libedit-devel pps-tools-devel autogen autogen-libopts-devel1 R2 r+ E% h! r9 g7 u
再次尝试编译的行为:
$ n3 B& _& I, i9 |rpmbuild --rebuild ntp-4.2.6p5-19.el7.centos.1.src.rpm
+ `/ z; F$ l, g0 D5 A1 A) k( X最终的软体就会被放置到:/ k' A: b: t" ?& ^
/root/rpmbuild/RPMS/x86_64/ntp-4.2.6p5-19.el7.centos.1.x86_64.rpm
  F6 p8 ?3 F. x. v; T% N

- N' c8 V4 P( L8 d0 Y& f

1 K+ D# L/ Z- ]0 I! d( qSPEC编译安装目录说明
如果你的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}来创建。具体的各目录的含义如下:
默认位置
宏代码
名称
用途

) q0 U1 D0 @( s- y. C+ P5 r& }5 c1 z7 F% S
~/rpmbuild/SPECS
%_specdir
Spec 文件目录
保存 RPM 包配置(.spec)文件
! [, \: O- V$ d( P
~/rpmbuild/SOURCES
%_sourcedir
源代码目录
保存源码包(如 .tar 包)和所有 patch 补丁
: ?$ n9 |0 f! o$ h' @* l) T
~/rpmbuild/BUILD
%_builddir
构建目录
源码包被解压至此,并在该目录的子目录完成编译
% G" b) Y: `+ Q
~/rpmbuild/BUILDROOT
%_buildrootdir
最终安装目录
保存 %install 阶段安装的文件

$ X+ D) a7 y  l7 b6 M
~/rpmbuild/RPMS
%_rpmdir
标准 RPM 包目录
生成/保存二进制 RPM 包

! h( ]+ q# k: g* m6 V& Y
~/rpmbuild/SRPMS
%_srcrpmdir
源代码 RPM 包目录
生成/保存源码 RPM 包(SRPM)
# Q8 T2 n/ @3 ?$ w# p3 a
' T1 Q8 t: w7 F- c+ K
使用rpm -ivh来安装srpm包时,会生成很多文件在/root/rpmbuild下:
) l5 K: y- |4 M. h% X  s7 s
复制
1
0 e# ^8 A0 S4 F/ t2  W" Q. Y" `/ B
3
% S& |4 N# ~. b4# \1 {' P" a; b: l% i! d# _
5+ A. E6 S4 e+ y5 E$ @
6
+ w6 T& ^+ r8 f8 f' ?: g7& A8 R/ b2 h% v! p/ Z
8
" {* S! o8 y# v( P* ~9! `0 t3 b8 L( X9 b  X' Z, Z
10# v* P8 E) |( V" u
11* ], I. b# ]+ M& P
12
- L. ^0 Y' w" f( }13. q# B+ A  _$ r( w) A* X
14
6 G4 ]1 \: t* _$ K15
0 ?7 ^. N+ z( P$ ]- R$ G) G3 Z16
8 c% u4 z' z$ p3 ~
[root@localhost ~]# rpm -ivh ntp-4.2.6p5-19.el7.centos.1.src.rpm
! h8 ^, y/ ^/ m. KUpdating / installing...; t- h5 d: r' C; w
   1:ntp-4.2.6p5-19.el7.centos.1      ################################# [100%]5 C) v" m, O' T( ^1 F
[root@localhost ~]# tree /root/rpmbuild/* g) T+ ~2 P) E4 H# W! H
/root/rpmbuild/9 R" C  \& m/ z4 a& a4 ]9 a
├── BUILD: W; @& l$ _: t' n, ~6 O3 ]4 l
├── BUILDROOT
$ @, L# y+ Q- y├── RPMS$ M9 ^- @$ x7 n( h1 g/ h
├── SOURCES7 ?) A9 ^% G; N+ y: z, p
│   ├── ntp-4.2.4p7-getprecision.patch
" F0 S8 x, m) J6 D% |. B+ i│   ├── ntp-4.2.6p1-cmsgalign.patch" ?& r0 Y& o& j, m" ?& r
。。。
" o" y* \# D6 B│   └── sntp.sysconfig
6 |, N8 u- E! P3 ]├── SPECS1 m) {. a; o" o( B9 r' P
│   └── ntp.spec% M% S4 B* B0 U  p/ S
└── SRPMS
' x+ R( X% t4 P7 u! V; H& x
% m. q' x1 R2 R, y6 X$ q! M

; T4 [3 j8 {* p/ c+ D$ \* i! P9 b# n1 U) V/ [9 N: w
解压完成之后,srpm本身就提供了spec文件,可以直接通过以下方式直接安装:
复制
1
* h6 m' x& Y4 m2 A" ^& a2
: m, Y" ]9 F: a% `2 o; i
[root@study ~]# rpmbuild -ba ntp.spec   <==编译并同时产生RPM与SRPM档案   M* B1 O! C- r2 I0 y6 |
[root@study ~]# rpmbuild -bb ntp.spec   <==仅编译成RPM档案
9 R4 l  b% i" E
& J2 s/ B9 U# j) G! l" o$ E" a
' c0 X% o6 Q  O7 t+ a# |3 v# R
spec打包流程
SPECS下是RPM包的配置文件,是RPM打包的“图纸”,这个文件会告诉rpmbuild命令如何去打包。“宏代码”这一列就可以在SPEC文件中用来代指所对应的目录,类似于编程语言中的宏或全局变量。当然~/rpmbuild这个文件夹也是有宏代码的,叫做%_topdir。
打包的过程有点像是流水线,分好几个工序:
  • 首先,需要把源代码放到%_sourcedir中;
  • 然后,进行编译,编译的过程是在%_builddir(~/rpmbuild/BUILD)中完成的,所以需要先把源代码复制到这个目录下边,一般情况下,源代码是压缩包格式,那么就解压过来即可;
  • 第三步,进行“安装”,这里有点类似于预先组装软件包,把软件包应该包含的内容(比如二进制文件、配置文件、man文档等)复制到%_buildrootdir(~/rpmbuild/BUILDROOT)中,并按照实际安装后的目录结构组装,比如二进制命令可能会放在/usr/bin下,那么就在%_buildrootdir下也按照同样的目录结构放置;
  • 然后,需要配置一些必要的工作,比如在实际安装前的准备啦,安装后的清理啦,以及在卸载前后要做的工作啦等等,这样也都是通过配置在SPEC文件中来告诉rpmbuild命令;
  • 还有一步可选操作,那就是检查软件是否正常运行;
  • 最后,生成的RPM包放置到%_rpmdir,源码包放置到%_srpmdir下。8 V+ ~3 ~& \7 ]) t
spec文件内容
使用vim a.spec之后,会自动生成spec的结构体,内容如下:
复制
1
* t( D( ?& _+ {, d) X% f, d2
2 k6 H$ `0 r) j7 R0 ~+ Z+ ~3+ ^$ i9 V% `1 r. s8 w
45 C: z9 z7 ^- f' \
59 B+ w, @' H+ k) z! H" m& Y& u
61 z, h, e, o# Q. |3 M
7
) x* A0 U  b; c8
. z7 i! p$ z. f) s98 d$ L) s4 J' E: j5 B  o
10
" K% h. H& d& b2 i, a11% i) S8 B% Z4 ^9 ^/ ~
12
/ O7 h5 R( |" a2 m7 ]) }6 |13
, ^. b) x" d. o; h0 |. X. w14
7 t# O8 L, a3 _. F) F5 p; [# L4 {15/ ]# z, P; S0 i' N0 h9 w
16
- r0 I/ Q3 f; @3 {! m17
( G, P3 Q$ Z) F+ J6 s- D18
* d' D" \1 `3 `* a19
8 y' }3 h: }3 q" r, L) I6 m: {20
1 J* Q  ?! d- X0 h. J# A/ H: I  [. G, J# w21
' Y8 X, \) E2 c3 V* j% V5 u0 m, @22
2 f5 y  i" V% P6 Q2 O# H23: K! Z% w5 Q" O/ ?, C! G
24
# e% a3 D4 T: s8 y) N8 S25" ^  G/ [6 w# v
26" P' q$ I2 G& p( z! H( F/ H8 [. P
27
; L. D7 n* U: L28# Q) ]! m9 d7 ^' \, N2 e# _* u. J
29
. H2 h4 a  q# q4 u0 L: D
Name:                                                                ==>软件包的名字,后续可以用%{name}来引用
5 r. X/ v3 [. s  @4 f7 uVersion:                                                        ==>软件版本
  c& ?# l5 ^; d# yRelease:        1%{?dist}                                ==>发布的序号6 Q# i% _2 x; n! h
Summary:                                                        ==>软件包的摘要信息" [4 E9 A5 D# w: h; R/ ?; G
' [, {& F5 }8 f2 z: a
Group:                                                                ==>软件包的安装分类,参见/usr/share/doc/rpm-4.x.x/GROUPS这个文件; A+ P8 D- x  Q8 j  N3 B6 U
License:                                                        ==>GPLv2,授权方式
  B! v9 P+ @0 c* FURL:                                                                ==>这里本来写源码包的下载路径或者自己的博客地址或者公司网址之类,无实际用处
5 E0 a& x! |- q* Q! U+ w* N4 GSource0:                                                        ==>%{name}-%{version}.tar.gz源代码包的名称,这里的name和version就是前两行定义的值。如果有其他配置或脚本则依次用Source1、Source2等等往后增加即可。/ Y( ?) g5 l" m2 Y9 B

6 S) N. [! b' m5 q8 z' VBuildRequires:                                                ==>在本机编译rpm包时需要的辅助工具,以逗号分隔。假如,要求gcc的版本至少为4.4.2,则可以写成gcc >=4.2.2。) y9 p4 w# a! x( W
Requires:                                                        ==>编译好的rpm软件在其他机器上安装时,需要依赖的其他软件包,也以逗号分隔,有版本需求的可以
% }* J$ y5 q8 Y5 _* ~' {. A1 [, ]$ k% s) l
%description                                                ==>软件包的详细说明信息,但最多只能有80个英文字符。8 U" G* s& s2 w5 w+ J
. U3 g6 @- ]* ?4 X0 [# J
%prep                                                                ==>读取位于 %_sourcedir 目录的源代码和 patch 。之后,解压源代码至 %_builddir 的子目录并应用所有 patch。5 z9 E, |# Z1 A
%setup -q                                                        ==>使用这个语句实现%prep功能,仅能解压Source 或 patch 定义好的文件, {& t" p4 O0 Y2 ?8 j
' g* f% X0 q1 z3 s6 i
%build                                                                ==>编译位于 %_builddir 构建目录下的文件。通过执行类似 ./configure && make 的命令实现。  Q  c2 T7 C: ~) Q- u0 l' W
%configure+ ?) l/ }6 ~; I4 g/ G% Y
make %{?_smp_mflags}
8 u; v" g; k; f/ Q, Z1 R4 `! h: C  }. D3 ^: n
%install                                                        ==>读取位于 %_builddir 构建目录下的文件并将其安装至 %_buildrootdir 目录。这些文件就是用户安装 RPM 后,最终得到的文件。注意一个奇怪的地方: 最终安装目录 不是 构建目录。通过执行类似 make install 的命令实现。4 ^' @0 ?1 D! o
make install DESTDIR=%{buildroot}1 c8 m$ t- _1 d. V1 H& x
8 T: W$ l# D5 h) \& N: H
%files                                                                ==>软件文件和目录
: d' X: \: _: a4 e%doc                                                                ==>软件说明文件+ G0 ^) E% @7 j; t2 Y/ i( u

) g8 l' U$ }7 R% w/ @9 p: J2 y%changelog                                                        ==>更新说明,星号(*) 后面应该要以时间,修改者, email 与软体版本来作为说明, 减号(-) 后面则是你要作的详细说明啰
# W1 a" b4 s' N' M

: P3 ~* c9 }5 Y7 q" a
5 n1 [- {" ]: d# L
除了以上这些,还是以下阶段:
  • %pre 在目标系统上安装软件包之前执行的Scriptlet。注意跟%prep的区别。
  • %post 在目标系统上安装软件包完成之后执行的Scriptlet。
  • %preun 在从目标系统卸载软件包之前执行的Scriptlet。
  • %postun 从目标系统卸载软件包完成之后执行的Scriptlet。* X- n8 V3 H* h5 C1 D3 B
以下介绍一下比较重要的阶段。
%prep阶段
这个阶段里主要完成对源代码包的解压和打补丁(如果有的话),而解压时最常见到的就是一句指令:%setup -q。这句指令可以成功执行的前提是你位于SOURCES目录下的源码包必须是name-version.tar.gz的格式才行,它还会完成后续阶段目录的切换和设置。如果在这个阶段你不用这条指令,那么后面每个阶段都要自己手动去改变相应的目录。
如果在%prep阶段,只使用了%setup这个宏变量,代表了会运行以下操作(假设Source为cdplayer-1.0.tgz):
复制
1
. `- G6 V; p. [; _, e2
8 `2 ?! v# b# v3
4 y& h8 ]- O# b6 D4
  B: d/ |* V2 Y( Q+ Q# M9 @5 Z56 k  \; a2 t7 Z3 v; ~
65 u) J, g  V* @% b# M, @: Z
7
5 r$ ~7 [- }) p' |1 ?& ]% M8
  m3 f: G, O+ }( I/ u# v9
$ T. T, P2 T' w. h6 _105 u5 M; Y7 @- y+ U- G
cd /usr/src/redhat/BUILD7 U9 Z& c8 C7 d* F3 p9 k# R
rm -rf cdplayer-1.0* H8 O$ a, i- u! C5 h/ U( g  I
gzip -dc /usr/src/redhat/SOURCES/cdplayer-1.0.tgz | tar -xvvf -
' k7 G) m- ]( t8 [' hif [ $? -ne 0 ]; then
; b9 [6 s) H# @, g* x- t  exit $?
* T* ^! \9 ~8 w' p$ w- ?fi$ k2 m5 x) H- N& ?0 ?
cd cdplayer-1.0
6 }* [3 N' n1 q5 Vcd /usr/src/redhat/BUILD/cdplayer-1.0+ a" m. M; c* ?  G
chown -R root.root .5 }2 \0 w) x) A7 R# h
chmod -R a+rX,g-w,o-w .
' @7 |/ t0 E, i  o

; F2 P9 A0 X% z3 T/ a

; \: J7 S* c3 ~8 o
可以看到,默认操作为先进入BUILD目录,然后再删除%{name}-%{version},再解压,最后再修改权限、属主等。参数-q是指不输出运行的过程,还有其他参数如下:
复制
16 L  a+ P* {2 Y4 G% \/ d
2
7 H+ o# j8 U1 `" l/ m# q/ y3' N! k1 c/ X% X
4
1 P6 j* S* ~3 f, F1 P! Y, _5: L# O8 I% C( H  q
6
2 X( H9 g& S/ q7
7 v8 Y, W' G3 c4 q9 U' I) M8
' I7 `" V5 U) j4 ^3 H& u/ J; ?9, ~! D( u: U# F- v* v5 R' L8 [
103 i$ G, f' b* a! G
11
, Q4 x9 ~" G6 P' V0 Z2 w* Q/ X12: d+ F* B& t" O1 D
13
# w- h; L6 L9 s14* v7 E6 p. I) C* N! h: C5 a4 {$ v
158 u5 d) f; m( C$ [. Q; q
16
5 w6 @) ~& y5 [+ K2 W179 `, Q* \6 W  h9 {/ _- F2 A. s
18
" J& [0 k. D2 n+ q# Q19& a: `% W1 _, G5 B& R8 i: M8 P5 y
20  O0 w$ I2 x) b' B5 c
%setup -n newdir 先删除/usr/src/redhat/BUILD/newdir目录,然后将软件包解压在newdir目录;再进行这个目录进行权限设置  v, n. d8 ~2 o+ a
%setup -c 先创建目录,进入这个目录后再解压。与不加参数的%setup比较,仅仅是多了mkdir 以及 cd 这2个命令- c) M# g/ H  u/ T  G+ _
%setup -D 解压缩时,不会去删除目录。与不加参数的%setup比较,少了rm -rf操作  o2 @0 S# B0 W8 _' W& j% [
%setup -T 不进行解压的操作。与不加参数的%setup比较,少了gzip以及if判断语句
' a" Q% a( ]4 k& H/ H5 m
, V2 |' U- I' R  B%setup -b num 将第num个source文件解压缩。如果是 %setup -b 0,就会解压2次,可以使用 %setup -T -b 0,这样就只会解压一次了。但只效果跟 %setup 不加参数的效果是一样的。/ n! t0 u/ i! ^5 K; ^' V
%setup -T -a num 先进入目录再解压第num个source文件
& p4 A. C7 G9 G$ j/ ^
6 i1 R' }9 W1 c+ K
9 K. @7 S+ B/ W& ~7 v% S%patch 最简单的补丁方式,自动指定patch level。
8 c; c6 T. }! A! J) ~. R' T%patch 0 使用第0个补丁文件,相当于%patch ?p 0。
! b8 [# k% Z, o4 I  y( b5 U. b%patch -s 不显示打补丁时的信息。
7 v6 c. i) \  p%patch -T 将所有打补丁时产生的输出文件删除。
" o7 ~% `' @/ A2 {*************************************/
' L* }+ h- f' p% p# r%setup -q -n %{name}-%{version}
( a5 l5 X4 h# B2 C4 l0 @' C6 u9 t. u# V$ B6 d
/* 如果原来只有一个“Patch:”,您增加“Patch1:”,则在SPEC文件%setup行后面的% X  u7 l5 H. d
   %patch -p1后面新增一行: %patch1 -p1 依此类推.
) U- i% ~2 ?2 \ */- j! B- l* G, C8 T; i: i
%patch0 -p1
  p9 h. `" Q" A6 i  S7 c0 s! [

! D. C$ Y* O% V; N1 D
3 x4 ~2 F9 p+ V! f
实例,如果%prep的内容如下:
复制
1) w- c, j+ x+ s) Q7 D" ?/ D
2
% D$ k, E' ?1 ^, U3, @8 n2 \8 q4 {( O: Q$ W6 G
4' Q' m) u: l9 ?' ~5 F0 x# @% [
%prep
3 F8 J0 [( I- L7 V) {8 G2 H7 ~%setup, q2 J0 x9 ~$ t# T* {: \
%setup -T -D -a 14
: R; b0 ~% J& F# x! t+ V* k% T" U%setup -T -D -a 159 p" Q2 j. x4 p1 n; D- k6 n" V# ?( b

8 i% a& `: J. u) Y
3 J3 f+ u8 C0 T* F! S  w) {$ G
其运行的过程如下:
复制
1
. V* Y! C) E; _  f) W2
/ l+ H( `2 g+ n2 s/ o6 B3+ A7 U6 g; Z# Y2 T' ^, B1 _
4
) Y7 U7 {5 e6 Y, q5. I1 ?5 a/ o$ Z. o
6
) v3 r' ?# T2 x3 q+ m5 J7' }, z/ i- O- e: T- B
8
3 D( y; @" I3 p' d3 C( |9
+ p  v: A, a$ Z" R$ }% j6 k10
+ A2 ?) {& D# i. p& y/ C# g5 a11' H4 J- G- O5 D" j/ [
12$ _) F5 W  |5 `) H5 O- k! V
13) E* l0 ]7 \, z- \
145 u" N# Q# Q$ c; S; e* V# b
15
( `+ j! P( q# e: [, b16
5 e+ M- A% V3 v8 B* M17
) Y2 d: ]  y$ y) ]; R, X18; _+ D( i. ?- x1 w
19
5 `( D& E& |$ C) i20
+ ]- x+ m) q9 @0 @211 F- M, U* z# r) d6 q/ K6 D0 U
22
  B4 h6 i- \8 O237 H5 j1 _& {4 G' K, g0 y$ @
24
8 I- x  y3 G( v' g3 W25/ \: P2 X9 ?( J$ N& |/ d, V# p
26  W& I7 D: s1 b- z7 f! X. A
[root@localhost SPECS]# rpmbuild -bb nginx.spec3 r7 [0 c: g2 H' a' W0 ]4 ?
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.N1Tdpo! X9 p- L+ e) C/ v
+ umask 022
! D+ {6 r7 T4 U! G+ cd /root/rpmbuild/BUILD
% }- L1 K* k: t+ cd /root/rpmbuild/BUILD. r4 z/ M- Z0 |* w
+ rm -rf nginx-1.16.1. F3 t. v7 n/ J* _" ?
+ /usr/bin/tar -xvvf -! H3 o6 [8 W9 x. |/ w- ?0 L
+ /usr/bin/gzip -dc /root/rpmbuild/SOURCES/nginx-1.16.1.tar.gz
& d! h6 a! [: K( I( F: {( z5 _  V...- e. _! D2 T& s. T6 K
+ STATUS=0
  P5 C) W1 l' b+ '[' 0 -ne 0 ']'" _. e( d+ _6 h% [9 S
+ cd nginx-1.16.1/ M1 ]( [- X  @/ U
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .5 a6 @( U0 o9 S5 H4 v$ V
+ cd /root/rpmbuild/BUILD) n- P; f3 R; K# X6 P: G1 Z8 J
+ cd nginx-1.16.1* T* @% |3 }8 X! i) h% F- ]: A) ^
+ /usr/bin/tar -xvvf -
# e3 ]7 r: }, P* |  U+ /usr/bin/gzip -dc /root/rpmbuild/SOURCES/nginx-http-concat.tar.gz0 n6 |) i! g; d$ u2 Z/ ]4 m# H
...
5 X( b  I5 P% G- N$ j5 k+ STATUS=0% X/ g; I$ n, j
+ '[' 0 -ne 0 ']'( |. r$ p5 D' o0 S' O. J) m. L
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
5 |  O4 A. H/ w4 m- S+ cd /root/rpmbuild/BUILD
  g" `# k* a8 [; C6 u% q; R+ cd nginx-1.16.1
( c; i8 Y5 v1 p+ /usr/bin/tar -xvvf -
( J9 O- m7 p4 p. U! y8 o+ /usr/bin/gzip -dc /root/rpmbuild/SOURCES/ngx_cache_purge.tar.gz
% Y( p* e1 b) o( }' {$ D...
% X0 `( h7 U1 @  ]" m
: a* Y, ^# @; N1 p( `

$ U  V' I, C4 H' u需要注意的是,%setup -q 是指解压不输出任何提示消息,只会解压source0的文件,即第0个source文件。%setup -T -a num 先进入目录再解压第num个source文件,进入目录的意思是进入%{name}-%{version}这个目录,即spec前面定义好的Name以及Version。
, I$ V" J: r1 ~- I. C3 w1 [: E

3 i( R# O% _0 b& I
%build阶段
这个阶段就是执行常见的configure和make操作,如果有些软件需要最先执行bootstrap之类的,可以放在configure之前来做。这个阶段我们最常见只有两条指令:
复制
1% H" c, Z- ?+ P# E
2
, q$ \; q3 r3 f% @7 V
%configure& \# B$ f4 `, p9 Y# }3 ~4 y6 D
make %{?_smp_mflags}# s1 G8 n( n& h- ~( Z
' t! t! i$ R% m% U4 I
' q4 x6 D9 e# A" G( @8 A% @2 h
这里的%configure是个宏常量,会自动将prefix设置成/usr。另外,这个宏还可以接受额外的参数,如果某些软件有某些高级特性需要开启,可以通过给%configure宏传参数来开启。如果不用 %configure这个宏的话,就需要完全手动指定configure时的配置参数了。同样地,我们也可以给make传递额外的参数,例如: make %{?_smp_mflags} CFLAGS="" …
%install阶段
这个阶段就是执行make install操作。这个阶段会在%_buildrootdir目录里建好目录结构,然后将需要打包到rpm软件包里的文件从%_builddir里拷贝到%_buildrootdir里对应的目录里。这个阶段最常见的两条指令是:
复制
1
4 |( T: Z+ Z7 k  v! q2
% a# X# m* U! n
rm -rf $RPM_BUILD_ROOT& r/ Z( O; Y) y/ l' b3 _
make install DESTDIR=$RPM_BUILD_ROOT
' B: \; f6 J/ m% u& g: S
. a. n0 P0 L- I" `+ U4 f3 d1 T# E

; p: h" F& a" s
其中$RPM_BUILD_ROOT也可以换成我们前面定义的BuildRoot变量,不过要写成%{buildroot}才可以,必须全部用小写,不然要报错。
如果软件有配置文件或者额外的启动脚本之类,就要手动用copy命令或者install命令你给将它也拷贝到%{buildroot}相应的目录里。用copy命令时如果目录不存在要手动建立,不然也会报错,所以推荐用install命令。
制作rpm软件包的阶段
这个阶段必须引出下面一个叫做%files的阶段。它主要用来说明会将%{buildroot}目录下的哪些文件和目录最终打包到rpm包里。
复制
1( |% x3 Z& Y3 u5 P% H; u
23 G, w1 V) U" ]5 ~- e9 v
39 f' [3 T5 I% |; v! r
%files6 L2 @. n" t: \# E! `' I
%defattr(-,root,root,-)
6 R2 i0 z2 u0 q$ p, }%doc5 D- M; y. \* ]# a! R# P( Y

9 R# s; G7 |0 N7 T
: \1 m+ z" M+ u
%defattr 表示的意思是: %defattr(文件权限,用户名,组名,目录权限) ,如果不牵扯到文件、目录权限的改变则一般用%defattr(-,root,root,-)这条指令来为其设置缺省权限。
关于%files阶段有两个特性要牢记:
  • %{buildroot}里的所有文件都要明确被指定是否要被打包到rpm里。什么意思呢?假如,%{buildroot}目录下有4个目录a、b、c和d,在%files里仅指定a和b要打包到rpm里,如果不把c和d用exclude声明是要报错的;
  • 如果声明了%{buildroot}里不存在的文件或者目录也会报错。
    ; D9 [4 O; z8 \7 C
代表路径的宏列表
如果您看到一个不熟悉的宏,您可以使用rpm --showrc 或者 rpm --eval %{_bindir}以下方法对其进行查看:6 P: ?9 f1 }, E; D4 c6 e# o8 T' c
复制
1
: l3 Z" i; `4 `: g8 `2  N+ u0 ^+ s: g; P* q
3
8 n3 e# y7 W/ R. G0 C4
+ B' z# ^$ X0 }' r, `+ q% \5! x1 U* E9 n+ ~, ?% u9 `. A& ]
67 l9 K) P$ e. c+ B5 p
$ rpm --eval %{_bindir}1 a$ U, u, j3 B& Q% W' K5 r
/usr/bin
3 x( V( |  b- D, h( o# Q2 r8 o0 ~' D- G) d% q6 I1 E$ P
[root@localhost noarch]# rpm --showrc |grep buildrootdir$ H& _8 R  c, T1 z
-14: _buildrootdir        %{_topdir}/BUILDROOT
% X5 y9 y& T( a  `-14: buildroot        %{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch}; d( s3 h2 D4 e. p6 Q* Y

/ ]1 Q: M' n* |4 Z

. @" J" K3 h5 K' _: {8 I: {8 S, `  Z
也可以直接查看/usr/lib/rpm/macros文件,以下是常见的宏:
复制
12 e6 g- }& _. j# C' s
2
5 {8 O9 d  z4 u: n5 D" [9 W+ M35 ^0 {3 [* J5 F) ?
48 k9 w8 A. w5 K
5
* [5 V& v+ S* I4 q; E& B* O64 Y* \& }+ l* |0 ^- E  R3 n
7) A2 G) w: }; m4 S' I9 ]) D' y; m6 a
8
+ H& g4 w" p, Q, ^9
  _" B7 G+ r6 g& B0 L2 t9 q: y10) E( r+ L# Q1 h
11
1 M# K5 a! x8 _+ x5 r, T/ S12
& X* B. \( p' i' c! w& q13* U3 i$ Y0 V; X! Z5 Q3 S
14
6 N1 ]9 d, ]/ G9 {" Q& L% j( m15* R, U% `( |" A
16
+ {( {  E( W; }: B4 T1 W17
0 L9 U, P( C6 l7 W18# ]9 b, P) K+ t  }& ]) [4 M
19( d* @6 T5 N6 Y) z
20) ~) H4 Z* h& C8 x
21
' J2 E+ h7 p/ F6 H22
1 ]2 L- o9 d/ d: X% U  H23# v0 n  f) r9 P0 L& K
%{_sysconfdir}        /etc
# F4 i5 v8 c* G1 w9 V2 F%{_prefix}            /usr
" `6 S" `6 q9 t0 j  e%{_exec_prefix}       %{_prefix}: X5 F# I. Z- S; s5 U3 n- D
%{_bindir}            %{_exec_prefix}/bin
- t' ^( ~. G) ]" ]+ L0 i%{_libdir}            %{_exec_prefix}/%{_lib}
: ^3 W. Z$ R7 j; ?& F%{_libexecdir}        %{_exec_prefix}/libexec
2 z6 {7 N9 k. }2 \" ?8 k) b%{_sbindir}           %{_exec_prefix}/sbin
* H$ Z0 }# y' }0 k$ w  W1 M; |%{_sharedstatedir}    /var/lib9 `2 x; M5 M5 e/ t* O* E
%{_datarootdir}       %{_prefix}/share2 C* X+ R' s( s* O/ c* [5 N
%{_datadir}           %{_datarootdir}: c* T! R4 `, K+ L
%{_includedir}        %{_prefix}/include# B4 e2 E1 p& E. b
%{_infodir}           /usr/share/info. q7 q( y" |0 f1 M
%{_mandir}            /usr/share/man+ R( E' [& n2 k4 K* g6 G5 \
%{_localstatedir}     /var6 Z$ a, L' l: n0 X# _- G- x8 H
%{_initddir}          %{_sysconfdir}/rc.d/init.d
9 a+ A/ o6 R6 L( h%{_var}               /var" S" B6 e: s7 w: t: c
%{_tmppath}           %{_var}/tmp
, O; X( v) S2 `* Q# j  s%{_usr}               /usr4 V2 n; q, Q5 H; l$ B7 }- M: g
%{_usrsrc}            %{_usr}/src1 g& n+ A! y7 d  X  o8 [
%{_lib}               lib (lib64 on 64bit multilib systems)
: `$ W; h; B! z2 R%{_docdir}            %{_datadir}/doc* E0 D- `8 b) V+ y  J
%{buildroot}          %{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch}6 _6 V* ]5 U9 i' ~9 i
$RPM_BUILD_ROOT       %{buildroot}3 `" s7 h9 f1 ?" m

& c# e) x7 U  L- x

; A( p6 A4 j/ V- N要注意的是%{buildroot} 跟%{_buildrootdir}不同。%{_buildrootdir}对应的目录是~/rpmbuild/BUILDROOT;而%{buildroot}是%{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch},有关其他内容可以参考 https://fedoraproject.org/wiki/Packaging:RPMMacros?rd=Packaging/RPMMacros#RPM_directory_macros
( m1 u/ G7 l  j) w. A

2 {3 ^" f* G8 ]0 M实例1:打包shell
可以把一个平时写的一个脚本打包成一个rpm包,spec文件如下:
复制
12 {: {) j+ ]: Q, t% [: E4 W1 H
2
6 }/ G+ L! P/ }# U30 `; u7 ^7 E) P9 R3 ]) n
4! W4 E1 N, o- k& r. `- g- {
5! l/ N2 C( t- i" t
6% k3 k5 u: D; [% ~+ C8 ~
7
8 N2 L  l/ l3 g$ J4 E' m" @8
6 o/ R' j9 t! e1 }7 L: N( g: t2 @92 w! v; Y+ q1 {& Q
10! v( B3 s& R7 s; G/ o/ k
111 I+ G5 l3 {& V7 b! [+ D# s
12
% u+ [2 O  P, Z4 ?13
9 P% E  T" I  P7 `7 T143 @+ p$ ~& Q) y2 }9 ?& \
157 ~" Z0 q$ ?5 [2 l7 T$ o  ~
16
0 V+ Y0 T% ]. M1 k/ t9 {! o5 N0 ?0 m# L17
9 A; V. L2 Y+ _& `$ |% c! Z5 l9 U18; o# O' I+ A" N0 K  Q% `
19( z9 v: h  _  `" {# B  _
20* U$ _' S- w  u+ V( a
21$ y0 m0 B- q* ?5 {0 a
227 t+ V9 m- s/ t& u) M7 P, D* X
23
! D8 d! E/ T* E. K, N( I) C24
: K* e* t$ A, W# M; }/ m6 Y+ ], g25& f% O) G7 K3 n' f& ?% U  G
26
: k5 [" v- ]% m; d6 U6 S27' \( l: Y( s3 J7 X/ F8 r0 c  ]2 p
28& {8 W7 j( R: p/ W& D
29
; t  U. |2 E0 x$ r7 E& f% ~
[root@localhost SPECS]# cat disk.spec2 ?, B7 ]% \' W, o
Name:                showdiskinfo! E  A- G. t8 H7 N. o' P: p
Version:        1.0* u! H# F+ N+ K& T! h
Release:        1%{?dist}
# r" A8 b8 k2 r4 ~Summary:        Show Raid and Disk info
/ J% S" i& I1 Q0 CLicense:        GPL
' @$ ]& t) R# q% ^9 Y+ iURL:                http://www.wumingx.cn5 O/ V1 C) j' Z* }8 |8 T' y8 l
Source0:        showdiskinfo.sh
- F: u) ]0 n: }6 e1 I! q# m+ L  p$ T" M0 r- Q' q# I# a
#BuildRequires:  Y2 Y. P+ h+ n( J7 g: r
Requires:       bash
% E/ I" ]  D8 ~# n0 I5 _" P  A  d) I9 `7 {0 Q  j' D2 {! c
%description
# l- i+ \: ]6 ushowdiskinfo shell script.
, H' V8 z5 b! f1 k0 s* A' \. i- {/ a2 o9 h* }) f( B
%prep
( W  q/ g! W' P  @#%setup -q: S5 T. |9 H& U7 U4 f
5 `/ X5 E, A) T( Z, c
%build
4 C5 n+ r0 q8 K. d# l8 H. tcp %_sourcedir/showdiskinfo.sh %_builddir/showdiskinfo
/ _  `# c, s( {) _1 ?" H* i
9 F0 q& V  H3 X%install2 g* E: @* z5 l) L
mkdir -p %{buildroot}/usr/local/bin
" L- Y& ^% H$ N+ \3 Binstall -m 755 showdiskinfo %{buildroot}/usr/local/bin
; ]0 J6 j6 u' T5 a
  g1 c8 o* K9 t- Y- a%files
; a. V/ G- j) x+ w5 ^9 y/usr/local/bin/showdiskinfo
6 s* ]3 d/ x% K2 O% d2 T%doc$ M. \3 b3 d- J$ H$ A
%changelog* ?' t* w! g& E  y8 K/ Q
3 D8 A' M+ G+ d, ?8 u
# A  T4 c, ]7 |" Q: d
开始编译:
复制
1
) T$ {$ V( m- ^23 a, D" K  Y  R1 `  ^
3
( M$ z; q) v: f; T, ?4( c# q  c8 V2 A; U: j
5/ L- T$ t1 F. B5 [& |5 B( y+ F& h
6
- X; r" G1 |# {7/ E' u* j3 O$ m6 B+ l9 j
8
! [2 A7 c3 D3 a+ x9
" `4 {: |) W6 B9 u5 G10
) K! z5 \) o/ E. Y6 D11
) @! W3 e8 E: V8 `& p( o12
6 @& _; q2 x4 ~$ i, q$ ^, _13
: e" H7 x# w9 o; T14: {8 P6 G; x+ h' B
15
- j5 F1 d8 R1 W5 [3 U* R* i16
9 }+ a5 S, r! S) A17% ?1 U: ]# u6 N& P& M: E0 k9 G
18; r4 ~) G0 r  u3 l  ~4 z! O* K
191 H0 s' |' _& d/ P& Z
20/ h( P% a1 W: e
21
4 a1 p1 ?8 h3 {! E5 N22, M& @7 C& E& O' q$ L5 H) F" m' w9 G
232 z0 A& {; N4 u- p) n* `$ e
24" k! _2 F7 d/ D' v7 l/ z
25
) ]* V# P: x* u. d# F26
7 i# w1 y4 j: I' X27
9 O) r0 u7 k/ M8 m28. J4 Y& ], V( [* U; i0 {
29
  s# T, |1 v6 q+ V30) `$ y6 b2 L4 s
31- \4 _; o% F6 l+ Y
32! Y/ j: Q' L, H( }
33
2 ?5 B1 t' v5 ]34
9 o. ]. Q/ p& _35# s, P& ~* D, K$ K7 o
36. `2 ?8 B9 P7 H: t0 o! Z
373 c! ]3 b7 e. ^3 M6 _7 p2 F
38
- S9 h# ^+ h* o5 u: ]39
% J2 s) _! h7 J" O8 p( X
[root@localhost SPECS]# rpmbuild -bb disk.spec* b  E$ K) _% J4 W% C9 G; a' T8 r
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.agda2b4 f" g" M2 C7 s/ Q
+ umask 022
- A  k; [( H: s$ J& N+ cd /root/rpmbuild/BUILD; [7 d. N* `: {6 ^5 h
+ exit 0
% m. x+ C; o( B: Y# AExecuting(%build): /bin/sh -e /var/tmp/rpm-tmp.spexQx9 H* x8 [. W4 g
+ umask 022
2 b8 ~2 Z2 Z2 v0 `8 D& R% [' Z+ cd /root/rpmbuild/BUILD
8 S5 `+ F* z2 m8 F+ G/ n  [$ U: r6 q2 [+ cp /root/rpmbuild/SOURCES/showdiskinfo.sh /root/rpmbuild/BUILD/showdiskinfo1 F) m3 q4 D( E. L
+ exit 0
+ Z; S) M" i+ yExecuting(%install): /bin/sh -e /var/tmp/rpm-tmp.grcfHT# e. |" G: |. t( J+ a8 _
+ umask 022$ C7 z7 B* S# R
+ cd /root/rpmbuild/BUILD
& |" V3 N1 u) O! X& j+ '[' /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64 '!=' / ']'7 K5 a  V: M) K% D7 \4 n( v
+ rm -rf /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64
3 n. E! Z, W5 C# C; q& |++ dirname /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64
' V9 l# h4 |( N7 R  x0 i+ mkdir -p /root/rpmbuild/BUILDROOT% i4 h/ a% v* G" h
+ mkdir /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64' N1 j! m/ [# i( o% Q1 T
+ mkdir -p /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64/usr/local/bin
# |" W8 @8 B( R8 Z+ install -m 755 showdiskinfo /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64/usr/local/bin
0 I- M+ L/ A9 t9 I. c6 `- ?1 U+ /usr/lib/rpm/check-buildroot4 _2 {, @4 V0 B. {
+ /usr/lib/rpm/redhat/brp-compress
! k' |5 Z: v- p; S6 ^3 a/ U0 Z6 b+ /usr/lib/rpm/redhat/brp-strip /usr/bin/strip
' P- @! B6 w" @1 @+ /usr/lib/rpm/redhat/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump
/ ?' X4 S6 l$ W/ _( M  K9 x+ /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip
& @) k! {4 ?+ D" o; @( V+ /usr/lib/rpm/brp-python-bytecompile /usr/bin/python 1
5 J/ [# y2 O/ ^2 g5 `+ /usr/lib/rpm/redhat/brp-python-hardlink% \( f; J  I( n/ i3 t
+ /usr/lib/rpm/redhat/brp-java-repack-jars
2 k6 N7 Y7 d/ s2 m% V3 Y% nProcessing files: showdiskinfo-1.0-1.el7.x86_64
0 j9 Q4 U) Q" o% F( o( cProvides: showdiskinfo = 1.0-1.el7 showdiskinfo(x86-64) = 1.0-1.el7( q& q$ l3 Z% y) F5 G1 K
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
# c: W9 x2 I3 K( G# J, tRequires: /bin/bash
5 [! b9 Q/ v( K5 ^  b/ r0 UChecking for unpackaged file(s): /usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_648 {: k# B  ?# s" j  M2 Z+ g& A1 o
Wrote: /root/rpmbuild/RPMS/x86_64/showdiskinfo-1.0-1.el7.x86_64.rpm
$ t3 H- m' B  R0 P  `  G$ rExecuting(%clean): /bin/sh -e /var/tmp/rpm-tmp.4uHq3D
! b% N- q+ I( S. H* h1 i+ umask 0229 `( J. R. b/ |+ P7 Y
+ cd /root/rpmbuild/BUILD5 M3 t. y+ V3 O  b' G3 o
+ /usr/bin/rm -rf /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64' S% Q" J0 A2 l; f5 E& J
+ exit 0$ z+ ~" ^, o- b: J

9 D# W; J* g4 X& t# m- d9 U4 X* P; p) Q" B
+ T8 c) y; u. E6 K. b
可以看到编译成功了,文件保存在Wrote: /root/rpmbuild/RPMS/x86_64/showdiskinfo-1.0-1.el7.x86_64.rpm下,开始查看:
复制
16 ^* \9 l: e' g
29 i3 W8 n3 _; m& M3 m# u4 i" }- @
3# ?+ q1 T" B% O/ A; B5 Q9 Z" O
4
0 e; B. h& A2 n0 t5; R$ r+ U. M. N
6  _1 C/ F$ b4 X) L
77 O9 s. ?8 K: ?' P! ?
81 U) i/ E, n! N+ t  w( ~6 L
9( }; e/ d: z3 U  A
10* }- n5 |" Z4 C( q& {; h" M
11  v$ t/ S8 \2 L
12
& k) h( G6 M8 `0 X1 k2 Y6 K13- v; @8 _. j: y) k* H7 A9 p
145 Q9 f- E0 t  f5 J+ ~
15
* R( _' I4 ]0 v) F; i1 B9 K16
1 C# d( R& P9 P- N# d17
2 \, W' I. R5 O18
/ A6 Y7 m" h; y+ L: z+ T19; N: f/ G" e; J- r) x
206 c7 q, n6 A& T! q# j
210 q1 {% v9 m+ k& F
22
+ p+ \$ e  {" ^8 \6 D3 d23( W: B' q1 [  b/ ]5 l
24
0 {6 ]. W& ]% g5 I+ N; l" _% x25
( z3 I, A8 |" g7 a0 b$ I9 C26/ u7 L4 f( O5 [# _& K, M
27
! `, p9 u/ v6 G( `28
3 z2 a1 N0 g3 d( K! i3 M29! p6 Q" b$ a1 I8 I+ F0 ]: U1 V- W
30+ e3 N' z. n' X! K: {/ n, l
31
4 f( m! _" K( o  I- W
[root@localhost SPECS]# cd ../RPMS/x86_64// m+ Q% `& Q$ l6 i  N
[root@localhost x86_64]# rpm -qpi showdiskinfo-1.0-1.el7.x86_64.rpm
# u" _% [- R0 g0 t8 NName        : showdiskinfo% x/ c: N2 y3 g. f! X. D
Version     : 1.0. V+ V0 K- o) h; S: p+ r
Release     : 1.el76 l+ N: G8 s0 L+ ^" E( s
Architecture: x86_64
( ?8 A  b$ V5 c$ UInstall Date: (not installed)
$ ~( M6 X0 ]! JGroup       : Unspecified- D& B( D! [$ p2 `0 b$ p
Size        : 383908 V, |# N) g7 A9 O1 [+ u$ W% f
License     : GPL
. u2 q$ _& b$ Q5 S4 aSignature   : (none)5 L# W9 I2 u( N" S# \
Source RPM  : showdiskinfo-1.0-1.el7.src.rpm
% b' m- ?" y2 v6 v! {4 Z9 v  BBuild Date  : Fri 08 Mar 2019 06:41:42 PM EST
5 o9 l( E$ O& V9 |Build Host  : localhost
1 e6 o) z: H1 n4 YRelocations : (not relocatable)  X* k& f& f% S- Q% D& r
URL         : http://www.wumingx.cn
0 _9 Y8 L, C( N/ D3 TSummary     : Show Raid and Disk info
( C, L1 U' I* a/ C  hDescription :
9 C2 M5 g5 M  ]4 e3 x6 \showdiskinfo shell script.
5 z+ M* Z3 {& [' V# J& m9 y) f% [[root@localhost x86_64]# rpm -qpl showdiskinfo-1.0-1.el7.x86_64.rpm% j; |  @) K7 }' x8 H; |" N
/usr/local/bin/showdiskinfo2 h5 R/ Z# m/ {! u4 H$ o
#开始安装
1 m& |% F/ h6 X% ~$ ^" x[root@localhost x86_64]# rpm -ivh showdiskinfo-1.0-1.el7.x86_64.rpm9 Z2 h4 N1 t+ ~
Preparing...                          ################################# [100%]
% r0 ]% H  C1 v1 @# E. XUpdating / installing...& a  y/ D* [# [7 n$ y3 d! v# a3 J5 u6 y
   1:showdiskinfo-1.0-1.el7           ################################# [100%]
. Q# o9 _6 H$ @, j9 m[root@localhost x86_64]# ll /usr/local/bin/. f. C+ d9 M/ F
total 40
9 V9 m" x  ?4 l" H-rwxr-xr-x. 1 root root 38390 Mar  8 18:41 showdiskinfo
' e" N6 m" |, V2 l! z' y7 ]8 P[root@localhost x86_64]# showdiskinfo1 \+ Y3 P' ^" h: d5 G0 _  K
no raid
6 [/ @3 i/ b  o5 R/ I# p+ W9 _

4 G! D# Y/ i' r5 b" L' x# V5 o

. Z: z& r& c$ E
此内容参考了 https://rpm-packaging-guide.github.io/#hello-world ,可以阅读原版。
实例2:打包main
此代码来源鸟哥私房菜,先来处理原始码的部份:
复制
11 |* J' Y: `; Z7 p; A% N
27 v$ |0 [) Q" N1 \5 u! Y7 E; V( i
3
" Q7 W: g8 g! z) A4 i5 J  d6 A4
) I! p9 |; n/ G3 G) o5 A5
8 S# b$ W. e- @66 F0 F) ?" z2 {- O& i0 ]. h6 x
[root@study ~]# cd /root/rpmbuild/SOURCES
9 N5 r. \1 @0 g; |5 n[root@study SOURCES]# wget http://linux.vbird.org/linux_basic/0520source/main-0.1.tgz ) U" Y" G) e- y& q" j
[root@study SOURCES]# wget http ://linux.vbird.org/linux_basic/0520source/main_0.1_to_0.2.patch
" `: w7 b, R# H& [8 M; B$ p[root@study SOURCES]# ll main*; Q5 s+ Z# p" Y
-rw-r--r--. 1 root root 703 Sep 4 14:47 main-0.1.tgz
& w( O7 X- v) m-rw-r--r--. 1 root root 1538 Sep 4 14:51 main_0.1_to_0.2.patch
$ W/ e2 n/ ~9 ?' L

8 j  _$ |2 ^% ^1 t5 c5 f. p

' n( S# N6 m5 m, m) V) [8 F
到SPECS目录下创建main.spec文件,建议使用vim创建,会自动生成格式。也可以用rpmdev-newspec -o Name-version.spec命令来生成SPEC文件的模板
复制
1/ E) Y8 f+ h* A6 b5 s7 Y/ c$ c
2
" m! p6 [% ?0 e5 G9 Y  D( h35 W! x, E/ V4 b3 w5 ~
4
( v* e/ Z( u( Z5
) \  r8 t& t8 G! R# S6
# E4 {2 F2 n2 v. ^( u: R9 H7( [* C: A% t: t  a4 M) H, N3 Z
8
' J  {# n$ ]. O; z7 q" a99 E+ |/ j; @$ h2 n+ f. T! p" G
106 k0 A  T8 x" }8 m- S
11
4 o% s* {6 Y" \) H7 T1 v4 R. X' N5 q12
2 B: Y" u6 c  Z# O- J( U13+ i4 C  `- F* N. S% r
14
, u3 h) d5 C1 C8 D# c% |! i158 Y& \& f" m2 z, p0 h8 b
16% p5 u! P0 V% J# y& D# a
17
3 `7 i* z" L; O' f2 b18
, Z- H: }8 o' A5 x' p7 V  [19
/ ]3 ?, c: _6 S: _, R2 S0 ]4 v/ b" d20
* D. K5 u( Z# W' \21% q% [3 L- M& L' @# K- A
22
; w5 S! O. b& N/ W( c4 n23- r4 k! }- z1 t* c0 `+ @! Y9 ?7 G
24
& {9 J) @& ]0 s* T" }4 X25! _6 @+ N8 V, G7 N5 H
26! @% o7 [; N" N9 D
27
# N9 q; X, P+ K: t! \) Y28
) l- u( r2 i1 c5 ]2 q29
  z6 ~9 z" j. }# Y8 }# @" }# ^. n0 J30
. [2 e1 P& c) v! n# @3 G( d& l31
+ e5 R" _) `1 K6 s/ H32
' V8 ^6 V8 t% K, o33! C4 e& |) p5 E. X; C0 O* o. Y! t
340 X6 _* G) Q0 x% \( c/ D
35: N  g+ E0 i" c' f1 m7 J
368 o4 E- i" i% v& g0 g
[root@localhost SPECS]# cat main.spec$ b7 X: W: C( a0 Q% @
Name:                main; ?1 @: o$ a! ?- u* q0 }
Version:        0.1  c2 {3 a1 H. A- ^' A0 y& q
Release:        1%{?dist}
$ Q8 m) L) g" g( N  L$ W( m# _2 x! @' y& xSummary:        Shows sin and cos value
" U( X, y- A$ c$ |1 k5 s" {6 `( y: ?4 R  C
Group:                Scientific Support+ j! O7 Q* s4 Q# S
License:        GPLv2  \5 ]; ?  q0 E, Y
URL:                http://www.fangdm.com/
% |0 @& W4 ~* u' v- qSource0:        main-0.1.tgz
( [  F6 z. v% e) lPatch0:                main_0.1_to_0.2.patch
( g% A1 Y6 F6 Z1 M
- N; }, Y+ @  e, u/ F# [6 A* s#BuildRequires:% v( H* J5 ~% ?% j
#Requires:
+ ~2 h$ _9 [; b3 s3 _3 w
' y% h% j8 ?1 V7 O%description3 F4 p: O- C' h3 Y" c1 ]! L" ]- M
This package will let you input your name and calculate sin cos value.; y5 Q+ \* P% x# s& P
% C$ v, }. T: w  T
%prep" ^/ j4 `* R% k0 W) @% Z" v; b5 Y
%setup -q( Y  M; F9 y. U0 b: C$ w# ^1 B+ \
%patch0 -p1
7 u8 {' N" R9 l0 T# J: C5 I' I7 b6 L; k
%build
  V* E! d( ]# g/ t) Zmake clean main
0 g6 }0 V: i/ R  `5 r
. k/ g( t7 T9 Z) g% m8 U4 i" ~: h%install
; g$ f$ H: B, I, x" t* d! Smkdir -p %{buildroot}/usr/local/bin1 K6 Q% i! i) w  N
install -m 755 main %{buildroot}/usr/local/bin. n9 j6 w+ I  e* i3 n
4 A" _7 D& J+ I4 x
%files
0 a' n$ L# B* |  q3 @; m/usr/local/bin/main
4 X4 e: j( ^1 `%doc: m" o6 V2 W& o8 B4 v+ f# p
/ b3 l# X2 d! f) n4 r  e
%changelog
* r' l2 o) A" D5 l* Wed Sep 09 2015 VBird Tsai <vbird@mail.vbird.idv.tw> 0.2
" E+ W/ H0 [9 C- build the program" q# Q9 [3 s  o, ]- q$ h

% @' Q0 s' \7 s6 j3 l3 C; j

  y# s% R: r/ V3 @- T4 P
然后就直接编译rpmbuild -ba main.spec,再安装rpm -ivh main-0.1-1.el7.x86_64.rpm
复制
1
3 |$ I, X- k; t/ w/ i4 \2: [# f# z# E# @( P/ ]! B! L- A8 I9 v
37 P  F! g* x' ]( |1 Z9 K
4
: C# V% O( s; g" e- k7 w4 T5
6 i5 b7 h5 j+ {2 ~; @1 p% D6- t, _6 d. b8 E) H) A- {
7
: X( C3 }$ f2 Q8/ w6 l0 x4 I1 l" {3 s' d0 [; W
9  p$ Q1 v5 c7 k/ H/ D
106 J/ c3 R4 Z+ C9 q6 f; z& l6 h
11
. O8 C1 J2 Y; G  o: s12
, l% A) \: F3 {. ^13
3 O" Y3 B1 `+ q# F3 h14" ~* H; j$ m- r9 c! \3 ?
153 Z6 |. K/ V# Y4 C
16
& }$ D1 i* T# q. O. q  W17
3 v" {: t5 t& u3 m4 ~18
0 E% K. W, K0 h' x. R! Y( K, F! z* A
[root@localhost x86_64]# rpm -qi main" \$ C6 Z3 ]* q, d
Name        : main* h* ?( E4 T+ Z: A3 J" A: Q
Version     : 0.1. g& i, S% U5 ?: s6 K) N
Release     : 1.el7  K4 V5 _; W/ X, J
Architecture: x86_64
) e2 t" P8 j) kInstall Date: Thu 07 Mar 2019 05:42:50 PM EST
8 D5 a. l6 w$ k& l9 _- tGroup       : Scientific Support2 m  q( O, p/ x. c* h6 w
Size        : 7272
6 L* l" w; ^% B' K/ C, wLicense     : GPLv2
, e) q  E# a3 `0 g4 `, P& `Signature   : (none)
* Y/ a  U5 {- n" [5 {Source RPM  : main-0.1-1.el7.src.rpm* `- Q, @  Q1 Q9 |
Build Date  : Thu 07 Mar 2019 05:42:07 PM EST
" f$ Z/ k+ H* ?3 u# q1 T) U; NBuild Host  : localhost  @$ W* x' e& u) M4 V. t
Relocations : (not relocatable)
0 P7 ]" \8 ^6 |8 WURL         : http://www.fangdm.com/
) i( R" _+ @) Q0 cSummary     : Shows sin and cos value
5 g1 ]8 [) z- L5 Q3 q. L& \Description :
: @  m1 `7 |9 k* Q% O. EThis package will let you input your name and calculate sin cos value.8 J4 m4 u- O  d; d

) x( w: y+ Z$ U* l

1 W1 t$ ]( c- B: }9 m0 K+ E& ^/ y+ @实例3:打包hello
使用区域语言(Locale)文件的程序应遵循 处理 i18n 文件的建议方法:
  • 在 %install 步骤中找出文件名: %find_lang ${name}
  • 添加必要的编译依赖: BuildRequires: gettext
  • 使用找到的文件名: %files -f ${name}.lang
    7 s# v1 o% v. W) g) u3 A% g- ]
%find_lang此宏将找到属于您的包的所有语言环境文件(按名称),并将此列表放在一个文件中。然后,您可以使用该文件包含所有语言环境。; }  O7 c+ G, S& Q$ `% b
复制
1
7 B1 p8 w; I( [2
0 r8 `; i6 B6 ?0 `* C* x6 y6 _, Y( t1 ]3
- N) Z. T5 }. j* |6 j  `4! z, N- n" V. |/ b5 [; X
[root@localhost SPECS]# rpm --eval %find_lang9 F5 V( `- P7 t# p  F- I* j! B
/usr/lib/rpm/find-lang.sh /root/rpmbuild/BUILDROOT/%{name}-%{version}-%{release}.x86_64
% w) R. b0 z3 M  B1 ~0 o; {$ R[root@localhost SPECS]# rpm --eval %make_install0 q2 P  a6 \" m3 z; U9 [, G
/usr/bin/make install DESTDIR=/root/rpmbuild/BUILDROOT/%{name}-%{version}-%{release}.x86_64
, [8 ~. l" H; q( E; a

$ D+ X( P; E# L2 t1 U
* [! p4 p% W% j; H7 c+ D# b' }, Q
! ^$ A6 G& s% m7 j1 \5 m5 |
%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
3 Y' @9 Y0 J+ t) t, g2; D& P# h1 L- y, o
3! m' e, K9 s) G) z, {$ t
4
8 ^) N+ X6 G: V+ Z5
9 r0 n; @3 y( l( T2 x6
( ?0 d, i5 H0 W( Y) S, N7, Q0 p& r5 U- _* |6 e
8
- ^; q1 N  ]* T  ]1 r5 K9
) s: f* M1 i7 r, ?8 [& s10
; v  t3 C; @" N, i' B: q$ K11' m/ W& ]$ l" W9 M
12
7 ~. N5 p. M9 _! ]0 a6 M4 t133 h$ H/ Z% j. p9 s) Z9 K
14
9 {, X2 S! O3 [) X15) v' y$ o# {4 i; Z' u
16! U% Y' Y6 [& z+ A" P
171 E+ c( T- m4 }" v* p  z7 ^
18
8 H5 ~" s' n8 p: c2 I1 J197 \- u5 d+ {% g! T" C. G
20
& J/ N8 W# v5 E3 A0 \  P) v21
8 A. o( s3 x5 M5 ~5 B# N1 ?# |0 \5 }+ b22
' [' ~) c+ Q4 C9 Y5 `& Q' j) g0 f1 k23
; X7 C2 j1 b3 ?: k24. x9 @4 @* d) }2 H
25
0 t8 Q9 S1 [' a$ }1 f26
& \: C; H5 e+ u7 N6 Y  w27$ m) V: }( d' K
288 f: P' _6 H0 \( U# V# k
29
% R/ h; X8 \  T, k7 X- h" z30
! h; |( D) T0 j: I) i' s2 N/ S314 C8 T& ]0 a& H, K6 x( H$ {
322 E0 v' ]) `  Y3 o- Q1 r
33- Y# T2 h) c; W. S& L. S; N0 s! E; M
34
/ \0 l2 U$ }8 f( v35& M* h1 l6 V, y; z9 U
36
3 _- \0 T! Y% R4 K" Q# A$ d0 z37
( A, K! p* ~. X( y: ]7 O38
: e( ~4 z0 e! W2 H39
( G' _5 V- X* Y$ H3 Y' Y. U40# I- z) {+ c3 l$ t9 |+ d# r& N
41- h2 t' e( ^+ ?+ e' I% q9 [( \
42, l, x- G6 ^4 N' w9 h- K, C
43
7 r% Y) ]8 p/ Q! k. T44
9 X* E- [. Q4 ]  W6 F8 y# F45
4 @5 B5 ]/ L1 y7 p1 V46, K7 X9 h  K7 c5 s% M+ O; m
[root@localhost SPECS]# cat hello.spec- N! J2 D6 A7 W4 k- H3 H) k9 D
Name:           hello
  s: N( f/ H* A! f3 OVersion:        2.10
6 h' ?4 Q" _8 F. g) VRelease:        1%{?dist}
+ ]1 d; _: U# J  qSummary:        The "Hello World" program from GNU
+ |" [. C  I4 ^" T1 K+ ]
% B7 z; `0 R$ k; J! vLicense:        GPLv3
, W6 `7 U% |# G' g8 [URL:            http://ftp.gnu.org/gnu/hello/
/ C$ y4 ~0 v/ `) [3 hSource0:        hello-2.10.tar.gz
6 g6 G+ t. ^2 ~- N& g6 {
; ?9 f$ L& d& |. Z6 n. I+ rBuildRequires: gettext* b+ h7 m9 S% h/ M6 N
#Requires:
) k, r3 L$ ?- d  z# `. D
  Z5 W9 P) r3 g' `) |%description
2 N2 R9 j5 j% k( N- t% c# F3 OThe "Hello World" program, done with all bells and whistles of a proper FOSS
- f* c7 M4 L( t. W% _/ Pproject, including configuration, build, internationalization, help files, etc.! n6 o5 H$ K& n
  h6 f, d5 y6 b& ]3 \2 r( E. P
%prep( A" O2 Z4 d1 y
%setup -q
9 C: d  s) i8 C
; X' Q9 k; G: }( G% e
7 i. O: @$ z( ]! J7 z; ^%build
4 v& W) K* U% V3 t1 C6 [4 d%configure
3 e5 t5 Q# R7 [make %{?_smp_mflags}
6 M, @3 m( D: a, ~
, z* ]" s* x- P0 ~- k# V4 r%install
* V5 n, m: |8 b4 w! ?%make_install
, j8 C9 F9 T- z2 x%find_lang %{name}4 L4 @) y# u* ^0 O% }
rm -f %{buildroot}/%{_infodir}/dir, @# \' f0 O! I) k6 Y2 F& A
1 J5 O1 E  `+ U5 e$ @* Y; `6 P
%post
/ b  R# v9 Z' [0 W2 x2 q/sbin/install-info %{_infodir}/%{name}.info %{_infodir}/dir || :- X  c/ [* G3 ]
0 [4 \: _4 ~4 g' L8 E. s/ x9 v
%preun6 V7 t) S* n9 ~3 K& C  n6 N, Q
if [ $1 = 0 ] ; then- K6 o; o- H) }# S+ U/ e+ l0 R2 }  D
/sbin/install-info --delete %{_infodir}/%{name}.info %{_infodir}/dir || :6 b( S2 E5 ^  l0 W  q7 \
fi
* C4 {5 h7 w1 E1 Z2 c9 l! v8 o1 c8 R, k& j# D
%files -f %{name}.lang! c3 i5 [1 ^  \+ z1 k
%{_bindir}/%{name}
  w, Q8 w6 p3 L, B4 c  Z3 R' ^+ k3 u8 N* R( D- f9 ?
%doc
" X" K$ {& n# u4 w' _4 b%{_infodir}/%{name}.info.*3 U, u+ ^: T% S
%{_mandir}/man1/%{name}.1.*0 {  Q& m. j9 y. Z

( ~0 c4 ]1 Z& {$ t%changelog  c$ R7 a- h. t- \- n

& B  @1 c6 {. {6 {' g5 M. h
% y# o( H0 t) l) t
然后直接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' D% X* o( e$ O. I6 |8 J
22 P/ C: i6 p& W. {- P# j5 b5 x
31 C# L* [5 O2 ]% H1 N2 d
4
1 }& ], l4 V5 l" R+ y3 @5/ a/ Y5 ]# ?; a; W! ?, A0 V
6
1 f6 l# F% {' S0 ^0 b3 J7 t7
2 U3 U- c. O3 y8* b% |1 Z) g( U2 j
9
# i/ Q9 u4 v: z; Z. P+ a1 y" G10
  F* ]9 n% a& X; Y- b" Q4 ^116 y2 g! m: {+ L9 |7 Q
128 ^- H1 J' ~& l, T: q5 C; k
13
$ J* h- d# A; E5 o- W. [6 [14+ P+ w/ ^6 D! K$ `6 Q
15
: R9 \# d4 z4 w  w1 ~; B4 [16* {) |/ ^) }7 u) a; X" S
17' T& X3 K+ B; y2 s9 v( F' y
18
" Q) f' r- j# }19
: ]" J- L6 v5 X3 A( w( k  x202 s9 l( D% _* Q( v. H  Q
21
1 e/ i( Z0 a4 [; ~- q( O22
+ s7 O$ s& u9 k7 c$ Q* _23
/ i  I$ [2 ~4 S: \4 v* r4 j8 W24
2 s4 n, ~( Q0 X8 S25
+ |  Z- Q( i, @& c6 Z8 \# V26  {$ y. e) Z/ g! B& K1 G
273 j- R7 A9 Q2 O8 _! M
28
1 r# s0 Y" I! Z29  i" K9 t9 `5 z
308 [# J6 h; Z3 q+ K0 b$ _
31
6 d' a9 q, Y- L3 C: I' n3 n322 `  e* p) d9 u9 f% R
33
/ [/ ?% O. R6 T1 m349 Q# _- B. ~' B' }9 d5 `5 \7 c6 H- {* b
35
( {4 t' H! p9 w$ D3 w; O# o36
" y: q% l7 P5 V37
' ^2 t, Y' m7 b+ Y' G8 q4 w38+ Q- g7 S0 Y/ r7 L; A
39
. |. W0 q/ {) v* f  \% u5 g40' G% D* S6 x0 z# `
41
/ _; @1 W8 X1 W; o( y42
+ L* @& H+ \9 h, q4 C7 d0 Q5 l43
# b, }; m3 H6 Z" Z+ Y! m44
! H: K# M5 j/ z7 u45' I2 n$ S( t) F
46! z+ g0 Z: p( v8 l' U, t  M# A2 [9 G) _
47
8 @# H3 e' _  r6 ^. G7 }, `48
0 w# y$ x1 \) {. r6 v" x5 N49
  k1 @6 h; I$ L% I) y50
" t: ?/ ]2 t& ]8 y# g0 E. \" W- V8 |51
5 A, u' [% P1 g% }52
6 q# e0 ~! Y+ @4 p53
5 Y% R) u# G) @- E54; }5 {/ V% r7 C5 I* V
55
2 W# _, e: o1 G$ {& v" M8 ^56
' o+ S9 f& l# k- A! H& J576 `8 s, L) K& M3 T; ?1 F! D% m
58
* I! H3 N* h) H( u/ W59* `2 `2 b5 b  q# A* p* U. C) D4 c
600 H+ ?& ^1 C9 X  ]: U3 g8 }
61
2 W9 p/ I% ^/ @- S8 ?8 q& U62
0 z, s' z* h/ `, {; S8 g" r& P2 c630 M6 F$ D0 g- b# f$ U+ m7 I
64
) e* @0 o% I. d% w5 d& x* {65
3 C, |+ U$ C" h3 X5 y5 h66  t3 b$ p6 @/ t" H1 e3 u
67
3 b' m  X4 V' M# r4 W6 P) t- _689 h& H  \: e) z* Y
69
$ K; Q8 O6 h" ?# T. U& D; _1 _2 o70$ u. l; J. G; }) N3 U7 H8 o1 k
71; M2 _7 v/ v9 y; E9 b3 Y. t, ~" X$ r
72
/ H  t& w; i" P) C73
3 l# I: X  h; E" S: [# H& Y% ~; r5 S74
$ c# j, o7 S% y0 H  p) E75
; D8 z6 }( Y6 s) B) G7 s76
0 Z& S* N0 _' O- U& G771 ~: j0 Z8 l- E) U
787 R' w2 Y6 G$ X8 x, N' H
79
$ j" c% s( V3 q  Y806 |& a: [- v, |  L5 `1 ~' |6 y
81
2 ~# [) l( g7 o0 M8 J82
7 ^+ T9 z& G2 l8 ^* {83. Z$ ]1 k# b* z& W! ~6 n
849 x4 |2 _. v( P+ b! @3 F7 Y
85) K' I6 k! n7 T+ M+ d
86) b$ m% u% ^! L; z3 J* p, C
87
% I: n/ w; o  D& O; S  |88# B8 Z  {4 h* x6 c7 g
89
  ~" D1 y( g5 W- r/ k906 t$ R' @+ o$ d) Q6 E* F4 R: R
91
; F1 f/ |0 \* {- ^" w92
" [& G1 y. w. C  c# u$ v93
* D' P8 S2 ]' [. R9 `+ ?' [1 t94" n3 d& ?8 N4 R: F. C; W
95
: o) |, x4 i, V) C( l9 z; [. n96
1 Q+ _+ `3 Q; x971 d1 q3 D9 ^' e  @
98" X) r/ p! M6 D9 E  t9 C7 Q: w
[root@7ftbv7mdz7cdpc ~]# cat smartmontools.spec
: l6 }" W) B* J$ ESummary:        Tools for monitoring SMART capable hard disks" d, l7 e) z0 C7 F- J. a2 E
Name:                smartmontools  r, V* X2 K" B9 F2 Y5 s6 b, q
Version:        7.0
! b1 K+ E. z) r  ?. k+ r  B  a! @8 b, [Release:        3%{?dist}7 C' }1 G9 T# D+ y) V( L6 @
Epoch:                1
& ~, A- {! `2 S5 hLicense:        GPLv2+  C; C' x% u% r( g% }0 V
URL:                http://smartmontools.sourceforge.net/
8 E0 n, h8 r! T4 N, h/ G#Source0:   http://downloads.sourceforge.net/%{name}/%{name}-%{version}.tar.gz
. b% f7 L$ S) G% i9 J& MSource0:        %{name}-%{version}.tar.gz
; j$ T3 U4 \9 h/ n2 O. t7 s& P: ySource1:        smartd.initd
. ~! Z, R1 z" g8 R% `0 ^, O7 YSource2:        smartmontools.sysconf& o& C4 i/ L# {7 o2 q# y% m
Source4:        smartdnotify) n6 }' h5 |6 N
#semi-automatic update of drivedb.h
  r4 w; p: r4 ]; r0 ?& c%global                UrlSource5        https://sourceforge.net/p/smartm ... rivedb.h?format=raw8 d' g% Q$ L9 K
Source5:        drivedb.h" ~) e2 U: U9 R% C) ^

: E% G4 V' g6 k/ r  M  a#fedora/rhel specific6 M4 d7 _: T7 k) E- W( c
Patch1:                smartmontools-5.38-defaultconf.patch6 M  {/ ]3 C3 U/ x
: U  f" Q  Z) w5 K  v# F4 [
#BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)) d  A5 b/ H- T) Y. |
Requires:        fileutils chkconfig initscripts
0 o6 |' L. d1 K/ l0 F& ^# n8 cBuildRequires:        readline-devel ncurses-devel automake util-linux groff gettext4 H7 O3 ^1 n5 [( Y
BuildRequires:        libselinux-devel libcap-ng-devel
) @. k, E4 {# ^0 b
, A, p7 O2 z" `. ^. ^, Z# ]%description0 q  T( \7 v. f8 L: n
The smartmontools package contains two utility programs (smartctl
9 i& k4 X# m" @and smartd) to control and monitor storage systems using the Self-, ?3 \  g2 K) p
Monitoring, Analysis and Reporting Technology System (SMART) built
, B  N+ |, }1 C) A; N& zinto most modern ATA and SCSI hard disks. In many cases, these) A* ^4 G) o9 c7 x
utilities will provide advanced warning of disk degradation and3 l- J6 I9 Y4 u9 F; u0 ~
failure.
5 Z( g) o2 Q. ?$ d$ D& h, X% F4 p+ O) X6 [  V
%prep4 p4 Y; q4 }( e6 T
%setup -q/ n3 L9 o: {6 m/ M( {9 J" d
%patch1 -p1 -b .defaultconf' ~, I. r7 z4 s1 c5 M- F
* K0 ~' v9 b- I) q4 C% V3 i
# update SOURCE5 on maintainer's machine prior commiting, there's no internet connection on builders
" u7 Q1 h' p. K9 E7 B) {#curl %{UrlSource5} -o %{SOURCE5} ||:& G7 J  h8 e% K+ s0 K, i) S) W
cp %{SOURCE5} .' T7 m& b' i/ |' j0 S
# V& n- O. p4 L; y8 P
%build9 \! @& l" z; O
autoreconf -i. \. U. c! Y/ n- P3 _
%configure --with-selinux --with-libcap-ng=yes --with-systemdsystemunitdir=no --with-cxx11-option=no
, D) y2 X+ k# J3 |, s: j%ifarch sparc64: P# ~  N3 ^# g5 t
make CXXFLAGS="$RPM_OPT_FLAGS -fPIE -fno-strict-aliasing" LDFLAGS="-pie -Wl,-z,relro,-z,now"/ ]" ?7 d3 F7 s2 g: l" B. W
%else
  c/ F9 ^( h+ r7 z3 Ymake CXXFLAGS="$RPM_OPT_FLAGS -fpie -fno-strict-aliasing" LDFLAGS="-pie -Wl,-z,relro,-z,now"! I1 j. R1 V( R' |" }* V+ g* `
%endif
% }# D% B! C+ c% t& C
( ~( `% a3 D8 N- Y- k* |%install
1 h' o1 k5 x5 F9 T& W0 J- Xrm -rf $RPM_BUILD_ROOT
: _7 n! v% k2 ]+ S/ wmake DESTDIR=$RPM_BUILD_ROOT install+ e+ C: z3 c7 P  S

* E. J" j6 X7 `rm -f examplescripts/Makefile*
! k% I. a" l7 D9 h0 ychmod a-x -R examplescripts/*
$ B4 M+ Y7 u" \' c) }! v* [1 E2 }mkdir -p $RPM_BUILD_ROOT/%{_sysconfdir}/%{name}/smartd_warning.d! h6 N2 [- e7 P) R0 Z: Z- x7 M
install -D -p -m 755 %{SOURCE1} $RPM_BUILD_ROOT%{_sysconfdir}/rc.d/init.d/smartd
& a( G9 }% I5 Ninstall -D -p -m 644 %{SOURCE2} $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/smartmontools
. b$ K2 [+ t- s7 l# b7 [3 H& rinstall -D -p -m 755 %{SOURCE4} $RPM_BUILD_ROOT%{_sysconfdir}/%{name}/smartd_warning.d/smartdnotify
# ~' j: W* n, ]. m+ t7 n+ crm -rf $RPM_BUILD_ROOT%{_docdir}/%{name}
/ h& E7 @0 \. w& F$ p# Cmkdir -p $RPM_BUILD_ROOT%{_sharedstatedir}/%{name}
; E4 ?  u6 ?& H! k+ {6 I& t' @7 F8 _/ o6 }* x, y
%clean
2 L& g. T& X+ [7 erm -rf $RPM_BUILD_ROOT
! h$ |1 P! k, M* o4 E6 m& B& ]& `5 ^6 Z5 }$ |" Z' e- |
%preun! G$ y  j2 W7 D0 ~  _6 s, ^- r
if [ "$1" = "0" ] ; then& J4 q4 m# o3 Z; E. o. }
/sbin/service smartd stop >/dev/null 2>&1
+ G3 S+ j9 l0 Z' j! A# A5 L: v /sbin/chkconfig --del smartd
* Q2 f' u8 P0 T; nfi. U7 m1 W5 g! W: j
, S' x3 \4 A( I$ L1 \: R
%post0 F' l% I  y# ?6 x8 c3 _# V, G
/sbin/chkconfig --add smartd
/ d8 v* @. `( j" g0 B! \  A9 z
/ i. {$ P+ O7 n" l" e- [( t4 R+ |/ a7 N7 g* O. t' u! y' I5 v8 Q" L. N
%files
/ N' U1 Z( s" u& \8 N%defattr(-,root,root,-)
! l% v" f. C- ?1 w4 x0 i%doc AUTHORS ChangeLog COPYING INSTALL NEWS README; \) `# I6 \7 e: o& G, M* j3 A
%doc TODO examplescripts smartd.conf, b9 a* C0 E. K3 X% g3 H1 J. y
%{_sbindir}/smartd
- J" }! G% {# V; X! R( R%{_sbindir}/update-smart-drivedb* }5 d, L, J3 j
%{_sbindir}/smartctl- ^0 r6 x! X) X& R, r
%{_initddir}/smartd4 t' B0 k3 r3 ^& ~# B% Y. v& C# [
%{_mandir}/man?/smart*.*
. k  R4 ]3 z* S/ j4 @%{_mandir}/man?/update-smart*.*
. V) a5 ~9 a  z" F  `5 D% c%{_datadir}/%{name}3 V0 {, B/ W2 Q1 h+ r* ]
%{_sharedstatedir}/%{name}! q$ ^9 ]! s! Y+ L9 z
%dir %{_sysconfdir}/%name
) W  }) i+ K8 @%dir %{_sysconfdir}/%name/smartd_warning.d$ p6 L. u0 o. D0 ]3 b
%config(noreplace) %{_sysconfdir}/smartd.conf
1 P8 `6 P3 I" t9 O6 V' k%config(noreplace) %{_sysconfdir}/smartd_warning.sh
) s2 X/ W/ i6 L# g* y8 H% I0 F%config(noreplace) %{_sysconfdir}/%{name}/smartd_warning.d/smartdnotify
& X( @  x1 w* [) e4 s8 ^%config(noreplace) %{_sysconfdir}/sysconfig/smartmontools
8 E6 h2 A3 ?1 _. T/ f
1 h+ Y- i$ u0 z, x9 D%changelog
* a3 ~% H  j& Q; c: `* Thu Sep 26 2019 fangdm <8@8994.cn> - 1:7.0-3
4 v% b" l, L8 [+ s- create smartmontools 7.0 base on centos 6
, r$ Q+ o5 z& }8 {( c8 S

2 \8 K( ]/ E" v3 f, B

" r7 L. j* n. g" t
注意,Source这几个文件一定要存在,从上可以得知,加入了启动脚本、配置文件等,准备好了之后就可以使用rpmbuild -bb smartmontools.spec来编译,经过多次失败后,根据报错信息进行调整之后,终于编译成功了。
复制
12 A+ e: e/ S# _$ C1 M
2/ n4 s1 Y7 M, j% ?$ F
3, J* j4 _9 W' U- `
4; K$ P! o8 {* i' A* w0 E4 E
5& M) ?  V1 R" k
6( p# S5 m# s4 K+ \# n4 h
7
( U4 s8 D6 `7 u8( M) e4 _# f2 y( r: l: s
9
8 C2 a2 k# C# G/ n5 z: U* y10
7 n7 s* L# b1 Q) N) ~) B11
( ^) T# q& S( C% Q, ~7 {9 z12# k7 B* o7 y$ x" V. m
13. N+ ^1 r+ `. Z  J
140 E3 W; ]- y/ F) I
158 g+ ~% H6 F- q6 Y5 u$ \! `8 }
16( d. G: T* h+ e, C+ U# \
17
7 g! G- O; \+ C" z0 j8 O% N/ b18
% E. a, b% |$ E19
1 z: }/ I# m3 o$ N: G9 m20
% @$ Z. I, \' h( Q" w21/ l2 s$ M; s! |- G  r7 q* y
[root@7ftbv7mdz7cdpc SPECS]# rpm -qp --changelog /root/rpmbuild/RPMS/x86_64/smartmontools-7.0-3.el6.x86_64.rpm
! R  H+ c5 j6 |* Thu Sep 26 2019 fangdm <8@8994.cn> - 1:7.0-37 e8 P, t: D2 L; e4 \& p1 B! y
- create smartmontools 7.0 base on centos 6
. M: u5 y/ A4 R, a2 G
/ ?) C/ \2 ~9 K5 s[root@7ftbv7mdz7cdpc SPECS]# rpm -qpi /root/rpmbuild/RPMS/x86_64/smartmontools-7.0-3.el6.x86_64.rpm
, b. P4 z- i- h) Y" {# ?) aName        : smartmontools                Relocations: (not relocatable). B. p& ?4 e- q: o! D) m# n/ ?
Version     : 7.0                               Vendor: (none)
( t% W4 E  D; `* FRelease     : 3.el6                         Build Date: Thu 26 Sep 2019 10:53:19 PM CST' W4 W# _4 ]% U5 O( U
Install Date: (not installed)               Build Host: 7ftbv7mdz7cdpc  H, X6 }7 N; n  z/ P
Group       : System Environment/Base       Source RPM: smartmontools-7.0-3.el6.src.rpm
/ Y' B$ N3 b3 _7 p9 o( C0 wSize        : 2081911                          License: GPLv2+. u2 z& {2 J7 P2 ]
Signature   : (none)
+ x% \! }1 J" H1 l7 oURL         : http://smartmontools.sourceforge.net/
& Q7 r. Q* U; T3 F# c4 \3 U( G/ QSummary     : Tools for monitoring SMART capable hard disks' r7 T0 i! _, J( }2 k& p
Description :
: }6 a& }6 f9 g9 f5 v: t* iThe smartmontools package contains two utility programs (smartctl
- K& @) p  G( s( mand smartd) to control and monitor storage systems using the Self-
$ |8 l4 n  F+ p1 G. V7 K: xMonitoring, Analysis and Reporting Technology System (SMART) built
+ A( |8 e- A1 G7 `3 `into most modern ATA and SCSI hard disks. In many cases, these- n0 f) E$ r$ c: H+ {1 o. d6 \
utilities will provide advanced warning of disk degradation and. A  Z* W$ {! x( p8 N& [
failure.
; l) l+ g- d! B8 L/ G
6 c! D! a* O) ^0 ?1 O/ m5 _& n. i& C

8 f0 N1 U' \. e
另外,在%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
& c! S0 d( F2 y, L" `2
& P( r+ C0 z4 O5 b) Z; Z38 ^! w2 L" G$ i6 _# ~/ [# ~2 E
4
2 ]4 W( a% u$ L* L+ i" V# ?5$ @9 U, p  e! ~+ G3 ?3 a3 Y
6: v/ m& Z5 ?) O
7; b, d# G* I/ B- k; ^. {8 P
8& p  `4 Z9 c" Q# p% `
9! n/ E& C. ?1 Y5 K% _
10* k$ u5 Q- c: }. ~3 F1 x- g! c* U
11
; V9 [  C/ T6 ]/ c0 i3 K' u0 [8 e$ i123 M. E: `: m& d4 _& J. R. W1 a
13' ], g5 n1 }" t. q+ k8 U# ~
14
2 U. ]! M) b( h5 l- n& G15# g* s: k+ j* [* V3 t
16
1 g/ n4 }# J4 z3 \9 k8 g; Y17
2 c7 Z/ W" O; G+ k( Q18/ Y% U1 f% I8 @4 ~0 A( W
198 p2 \% K2 o2 ^, A: G8 K  T
20
0 y7 O, p) D! D4 D; j# n0 |21
% e& n3 v2 f) E$ t! W22
* G& H' T* w, h$ {4 v" i+ Y
[root@localhost rpmbuild]# tree
* C: g* e0 Y4 N. F5 I/ |3 F.
* @1 x1 i- A$ c; `) @" ]: M|-- BUILD
: @  _  h6 D& @4 f0 d' W|-- BUILDROOT
6 ]& I& b) @! L0 r" ~- q; H|-- RPMS' k% e9 }# j  D$ _! G# X4 K! U2 [* I& C
|-- SOURCES
9 C8 b" g( q1 {5 {0 J' _|   |-- COPYRIGHT8 I6 @2 ?9 I  M( s* P
|   |-- logrotate
2 I* ^4 ~0 b9 h& U/ p6 K|   |-- nginx-1.16.1.tar.gz# Q2 S- ~! ^; _( _3 q
|   |-- nginx-debug.service
: g5 m4 T6 r$ G- d) i- l|   |-- nginx-debug.sysconf
( p7 ]9 ]1 l8 g5 D|   |-- nginx.check-reload.sh6 j+ i4 |/ K( G2 O. H, e+ w6 L
|   |-- nginx.conf
& F- ]) Z2 `/ v. {& u) c8 O9 z2 c|   |-- nginx.init.in1 B6 N& n9 t; P. h" ]: l( e( y
|   |-- nginx.service) i3 O0 A! v: x' Z8 n% Z
|   |-- nginx.suse.logrotate
) w+ n' L! ^, M3 [6 ^|   |-- nginx.sysconf
. G# Y' X$ H! H3 y1 T! K6 \. x( j|   |-- nginx.upgrade.sh
7 W# h; g7 s' n: E|   `-- nginx.vh.default.conf5 A3 X: ^0 u% n9 n# _6 ]# Q9 v' Q
|-- SPECS
. x8 m1 n* c' ]1 h" Y' h0 W|   `-- nginx.spec
/ h9 Y& L& l3 C7 N, J( e2 `) |" L`-- SRPMS
( M) J4 k' B8 y8 ?& R

2 _7 U5 {" x# H5 p7 |+ ]

, @: I: b" M6 [% t$ s% t! T
主要是SPECS以及SOURCES这些文件。查看nginx.spec之后,大部分都有写好了,并且都兼容了centos 6/7。添加了gperftools GeoIP-devel ngx_cache_purge nginx-http-concat这四个模块,修改如下:
复制
1- b$ \" p( M2 d
2
$ i* A# e/ ~* ]3 y" e0 k' s/ `( r31 |. X: F  O. n9 n* v
4
9 |" P1 D: m) ?3 U5
, ?8 u. E6 w0 I' S4 p% V60 U0 |7 K) N0 @$ X5 u& t
7
. G7 W9 U: }6 W# n+ I8- ^) l9 @4 F- s: Q
9: }: @8 J% U, ?; |6 J' F/ _
10. y5 l5 B; g, U5 t, L* i
11
* \0 x- Y" }6 [$ B; }) }  h$ u4 f/ X12
( @7 M7 l0 }+ v# G0 y13& t% ]6 f# F7 s6 a
14% `3 m( Q6 |7 k4 a  V5 h
15
0 X+ N/ {3 P; {, S7 S7 S/ }16
4 A* w0 w* i  s4 j- R17
9 Y9 t1 Z9 p! o0 f18  w2 Q9 p! l; [& e" ~* I
19
3 D. ^+ _* }, a) s; |20
* [+ Q* ?/ t5 t& y: c- p& v3 b0 a21) W6 c, K+ t# R6 l
22
! f7 M9 E9 l) Y* z0 S) o: S23
' O& e3 {# f4 k8 i+ r2 |24, y1 U  o; r9 E  F9 L
25& G6 O* P  v( x8 [( E1 k
266 g: O) }3 N$ F4 |" s/ e0 z
27
" |% H  b9 o' R" G, m4 |/ F) m' c% I/ u28
& G. v4 l7 L( E7 @; s29
) }! J8 K0 k. ^& a5 P- Z% n+ ]30! [' L! o0 s8 m# f5 s
31: E8 T& z( ?5 C) Z) r8 |4 {  }* F
32" `7 ?7 V' ~4 ~3 x
331 y- n1 E! R3 T+ _/ M( m' `# J; E' Z
34  u! {, S, Q0 t$ A7 a
35
+ t. Q0 \/ T% i: D) f" W369 ?' K, c9 [9 Z# j' `
37
/ g! e8 d; f2 {/ F9 ]* K% l383 w' k; h3 {- q) ~
39( c, S' H9 K1 [" v8 k- x4 q* Y
40
( g' {7 N& K9 J: u4 _$ z; @41
: v# N' w4 ~% n42- M6 a/ m; ]! Y0 n
43/ _" s+ Y  c) _# b
44' z& v/ l) w" H8 [- P
45
. b# Q$ C( T- C46
$ V( G. |8 [" E8 @# S3 P477 B& @$ X8 G; u$ c6 k/ z/ n8 D
48
" Z5 b  S% F; S4 Q) F$ _49
7 ]4 D8 Q* Y6 o5 o9 d7 N' ~50+ ], t4 m7 M  j9 D7 Z% V/ E8 O, w
51# [# s+ k! R1 n& @2 I- [2 R2 l
52
% U, \1 X& D, y53" J$ C. B0 }! I5 \" Y
548 B/ o$ g4 Q* f" ^! p
556 \0 h8 A0 O3 I  b
56
: ?1 f; E' s5 z$ p0 M57' f3 S/ y( ]2 R" g+ l
58
8 f+ k+ f* E* w59
! n0 s4 f8 a$ w. N1 S6 s60
  [& h4 [6 `; ~& u, C3 s  z. f5 I615 K& v% P0 [4 Y" q4 h# T
62
3 o2 j7 {3 B2 P' H; D% F  ]63
- a" ?' C# Y2 S64- R- C2 E3 N8 s
65
& q" @6 |9 s/ Q1 f9 L66* A9 ^* O" h* h+ R
67+ G& M8 O" y9 q- o) f
683 }6 K& V' V# z: ~( h( B# {
69  Q# B' n' F$ y7 s3 J& b# Q* d0 M, Z0 J
70
9 t8 p$ g6 n/ ^( L- B) M4 S7 l1 D71. H7 q! e9 M; G
72
3 }( h8 T" v# Q' G$ y' f! u7 G& _73
2 x, I, l  L0 N9 V2 d% |74/ \1 W4 \& c2 y5 S4 P6 P" y" ~% n
75
# f6 S0 P1 D- A/ A% l76
- e9 L5 `/ {9 C2 X! }" j# w* i77
; y) ^; k! R# L/ T780 N% S) C7 J) v* d5 C& ^
79
2 p! o1 p+ k2 b$ r- t80$ w, e4 J; K  t6 d/ X3 C
81
7 I, _$ }) i9 ?/ ]2 I& n6 a82
; i) Z* F" |/ F# ]83
; c3 V; [/ x/ P3 j' z* K84# y% }6 n3 ^* p! x
857 }# n/ x, i: i5 p7 T0 i5 [; \) D2 y
86
: G9 ]" l+ j- z. i6 u/ ?1 P% w7 V87+ E+ v! m! m2 |' f2 x  h2 s  I
88
8 A! @3 {, m% q5 h89
8 {- \4 O1 P: t; H90- s- p# B* k2 c7 H  ?
91
8 n$ M2 D- j; a6 M0 U: e. r92" \! V" z" V2 b& d+ y- U; [2 Q
93
, e3 K5 g8 Z; n: @7 L* Y94& I7 r' Y. I! O- F; A
95
/ R6 f% ], k+ z/ W# l2 H96
) ^) a( [0 S! u- q1 q  g* d' E97, n9 l* F( X; l# e3 P
98
" f  c3 P2 h0 d! g6 ~9 E  z1 G99
4 h: {" ~# c0 r  l, X1 g100
: m: f! W0 l! E; x101
3 m9 Z, U6 K, g, I8 K. x3 C* ~102
5 ]% G/ y8 u7 J+ j, r6 H" G6 t103
. R! k; i# a. t5 T+ ^104
6 u" ?" {: C3 N; Z0 d7 h105
( I# i8 z4 I: v! e1064 [! C: Q+ B: b1 W
107! K0 y. F2 `6 G) b+ s  B" ^
108* ~$ l4 _3 \5 v9 a2 E
109
2 J1 a* i, k8 g/ S! `110
3 Y, e/ f+ u: ]( ]111" O2 P, E$ {$ j" U$ L2 K
112+ Z; P5 x- J1 R# P
113
  G0 X: |1 a: u2 y, j1 u' ]5 G114
+ b% U" M5 k' m1 ?, c115
: S9 V# A+ @2 D) k; X; n116) M. E% a9 P( t4 R2 L6 F
1176 r! X( R8 u: t8 c' J0 D# Q$ R+ y
118
3 Z0 R: m5 q; E7 C119
) `1 n; b* x4 s3 Y0 r120
4 ^$ h1 h. ^+ [( U$ W& C4 c121: `0 V! \* Z* t7 o( A. B
122
' `3 R& _, w2 m1 A# K) q123# U# j5 T$ |( f: t9 Y- n, A+ w
1246 P3 o. D; H$ g, N% k
125
4 \+ ^' r. @0 @" \% K, f1 E126- @  m0 e- {  |2 w6 n, f
127
/ {  o% m6 i2 m- z+ w2 A7 f: j128
, \7 \1 k1 L9 C1 d; A& N129. B( f# Q: W" \/ u4 z" f
130
$ l" t0 t9 q, M+ T! l131
# h$ n  d6 W! L- l132& ~6 x& A. r, s" }, B7 h
133$ e; R" y! |+ f  g1 S
134# l! j, r7 Z5 ]5 W" Y+ I- a7 n
135
% T& U( z3 B; B1 ]+ t6 R1367 t$ d  `, w5 v
137
8 |8 W7 I  K( J3 U+ c3 z3 _1383 o8 i! {1 A) _% V# D7 f
139) g; p1 P) j+ m1 g% M) k9 ]
140* Z4 }: k+ r# h1 X
141
) a3 @/ y$ H+ W142
+ u5 X( v3 K6 j1 P& q: |1 a143( r1 h: ^/ P$ l- r
1440 z& m; y. n: |3 T  B) f
145
6 e. [: h$ L0 p2 ~: T1462 Y8 A8 H2 E, \( c4 g8 q
147+ B: u1 h+ T5 y( a7 h
148
& |1 F0 u; v/ G3 h! n( E1 r1499 r  C  A& A5 E+ w# M$ z9 y
150
& m( o$ T& z- @6 @, \6 h& i5 I151
  h1 M( G/ f& Q3 Y152
0 B0 N1 B# l5 m8 v: Q! x# y0 _" J. t153+ d1 G3 `9 Z; r4 p. h/ N
154
$ ]6 I& ]$ \+ W5 E! i0 x+ Z5 V1 F1552 w0 Q9 u, X* i( x' Y6 e
156: G9 o; ^3 T5 F8 k
1573 R& ~7 I6 l+ ?
158: B* j1 \+ F- C7 ]* h% ~' M
159: F0 G1 B4 @9 b; _- I: }
160
: a# |& s/ i  Z1 e  e; [1611 N/ C* t8 c# J& J$ n
162
3 H6 t# X: E8 ]8 K163
5 N* v. |& u2 ~7 p& P% c% X) X164. X+ j, ~" u6 C, R- L# \9 C
165
- \+ D  K: L8 B! j( Q. g4 m166* Z8 U6 a% r+ c( t* a
167
1 m( [: \6 a, ?9 ~/ E0 g168
$ M, |6 Y* J# K! S& ]8 k4 a/ l169
+ H, l6 x: f1 _170- `3 }4 |! p) b) j. X
1710 Z' y& S4 H: X  o5 T  q: r
172) p5 j* {' N+ e& m# [7 l  S
173$ e0 o  h6 D! H  N- |' N
174
* ^4 J8 B0 d6 {175. M9 g& S8 s8 J  R* C2 q, X
176: o* \1 p% X3 P" T4 W
177
1 l; s' A. M7 l9 W) M( p2 Y178+ q+ W, l+ X4 R1 [
179
- [+ a9 s/ t: w8 g+ m4 `180$ S) Y) ^0 W- L1 |+ ~
181+ J8 h; t, \: w5 e9 }0 x, b
182: C6 G$ I3 S& H( K# e. h
1839 Y' V+ g3 B* S1 c3 }( E  \# }# {
184; e& h, N) ~" s7 e
185- i8 Y$ W1 ]; O6 U7 w4 J
186
8 F. }, t7 g( ^187
: v$ v" B# I- v  O5 J% ^# E188
$ l& k/ H/ C" V  I, q' l9 x- f1 f189
* }# r: i* r  n190
: x  S' f* b+ D& ^+ u' s& _% ?) Z6 I191( L! B3 P  l9 ~' e& c8 Y: U" U: y
192
" M2 V/ R# \5 W! T1934 H; Q2 l' d/ e! ~9 I9 S7 C
194
2 q& `) V( Y# u6 h! L8 N$ _) Z195- e$ Z; H8 ^5 v1 t9 \' W5 [
196# y+ j2 R; i- j$ ^+ p( x: W) j
197" A) Q9 l2 r+ K2 T
198; S; l) e$ U; k4 o5 t" ~3 [
199
, j2 f8 p" L/ o- d$ k! x200
5 n  Z8 [# W, M1 V( x4 u* M201& p* {* k5 D3 E4 E( y5 h6 H
202
0 n+ ]) A/ l; V3 q2 e- `203
; c3 c0 Q) y6 f+ n204
# d# A6 I4 d+ R2057 |1 E3 m! Y) j! ^/ |' o
206( s( _- c6 H# E) U) h, z! |3 s# f
2079 F. X( R$ b* M$ O8 I( X/ D
208
9 L5 B' H6 D! }5 q3 ^+ V* U) t2099 l8 D) W; ^7 V( q* g3 }* P
2109 {0 v- Z) M1 Z5 I6 k; @: j
211
/ U$ O3 r+ Y- @" d5 n212
; y) u5 m. E! V/ Y' y5 e! t! n213
6 x: C6 X& h( Q/ @: Y% L0 Q1 J214
, T! f2 ?' [9 ^  ]/ q215- ^3 p. L; _2 |: X6 Y1 @9 c
216
' Z% h: \7 l! t  d; ?217
1 B9 q) h5 p  P  s9 n; ]9 n& D218
5 T4 Z- y7 B3 w& Q' L219
9 p; `5 l( t: d9 u8 G8 U+ j2204 m- X& Z5 U8 W7 G: ?- ^2 B8 {
221
: W7 S3 I! |# X# _222
' x8 W) k0 K, v6 w: m/ g% ~7 |223
$ w) ^/ \% Z% t  Z2248 n, p% J' I: z( ?% T
225
" G" j/ c3 E8 n; A. T8 L1 Z0 ^6 M) I226
# r& H6 U- Z) D6 D5 g; E! I227. ?0 Y; e9 \1 f0 r1 R
228
& v( c& ^- j9 C1 i3 b( K' L1 S229! f. B. Z' t. ~, |$ C
2309 v4 G# B7 ]9 |# V
231
8 j! F6 r. U# l& f3 Z/ `: r2327 B' M' i; H5 x7 h5 F- V7 D
2331 B3 f( a5 Z2 i, T
234
  i: p8 n* T4 P) o) S, ^235  Z# w' |4 t/ n/ B8 m8 M3 E* D
236
4 Y# E& R+ b4 x( H237) g$ p" [, z) f& Q
238
% j0 R8 M: a: N, b239( \  v# X0 }9 P6 J1 O7 x6 W
240
1 X7 n( \  Z# ~" u* O  |241# Y! U& {7 z* z& A6 O0 D
2427 t3 }2 S+ ~5 D% B- v) ?
243% z3 v4 q5 R" U- n" R
244
! d& O4 H- [1 C* x; f0 M2 ]245% X1 _: f  I  U
246
7 `! u; }% G& p. H: ]' G. e; b247* `+ `6 I/ ^  S+ M6 ~0 e7 R3 U6 j
248
, x- \: c3 x) E% C9 n, a1 q8 C2497 m7 Z  Y* D7 o5 g+ D/ h
2503 p- p8 f1 {# P% A# f1 j
251
) Z+ j% ~% D! q252
7 a' V' A# |: O  l) R253
' |) g4 V8 I! o+ k0 j254: R5 J+ R! q/ T! D3 C; I- H
255! L% N" c1 p$ d5 ]# K
256
8 y# e6 d; V5 W0 ^) I2 N257
' ^, L* y+ M# y) E0 W' E258  s6 H. a/ q$ a
259
) w1 C$ @/ R- Z$ D* f( _2 ?# u2600 j. d+ x" G& |( T  C" ]
261
. X! s. ]. ?) l7 L/ T262
0 T7 a) \! p& l5 j9 i. a! p7 n2639 C9 z9 I% w/ U
264
- D7 S% k6 f. M8 i& S" F' R0 S- Y" U265/ s1 [# r4 _- B0 y* x: T0 {
266' ?3 @1 Z' D6 S: k- U& e4 q" E
267( K  x  R) }9 E, h( Q( W
268/ O9 S7 ]% N6 z' s( A8 e3 e4 B9 r
2691 K$ i8 g1 m! R7 z: Q1 N; L
2701 F) u# r' v; K$ ^6 Z
271
' P$ M  ?% t4 V$ S# v+ H+ V6 B272
2 |8 x% ^3 Y: a273
! a9 W1 O9 A2 n- L6 _* c* e274
/ `1 [. `, A5 f2 p275, @3 b5 p! X0 q9 ]
276
' c% o4 l! {) A5 K% i277
  v8 e0 W4 S4 w278$ H: L' b. n9 X* h( U# G4 z0 f
279
" i2 X6 v* q# t280
, F4 f" `6 {; b7 Y2 [# Y# ^281
' n8 U0 K; Z8 x7 \282
  F7 M! c  x8 b- @. v$ J  ^* t- h6 ?283; a' ^7 {; _+ S* f2 B, Z
2842 i1 X6 u/ u+ |% f  b( J7 m3 C9 o
285
6 K; g  I# j+ D- E" w286
  v* t* O( w; N7 J1 ~3 e) T) i287
- x* R0 h9 M6 r- l- i288( x: _5 |# {; F0 V1 k
289
4 e3 x, O1 U8 s( D( [5 B& [* J8 d+ T290# x1 |2 |8 M7 K+ I0 U1 \* Y. f, g
291
+ z! P) u9 G$ @1 S2922 Y7 m6 R+ h+ i. p
293* b) g$ W7 d2 D) g: h
294
1 R. N" A7 g2 h9 g! J295
8 Y, ?& v, a' s296
1 f# C; a$ C' z6 W5 ~297
  A0 Q, F0 }* j5 h4 J9 K" _298& y2 B' d: k9 Z
299: h9 ~: G- S" Y0 P, l
3008 ~" U' O* t, f: G& b) L, U
301' E/ k" [$ H4 O& [0 z- }/ K
302
4 _0 f" r: {9 \0 E9 K+ _3034 ~! O. t# ~) X+ {4 h! i& u. n: X
304
& G& ~0 W5 Z1 @6 O305
5 v2 Q# J1 t. m3 Y4 E3063 _6 g3 t  B% `
307
/ m- z5 a; r6 b, A5 H) r5 @308: [/ e3 z- g& I& @/ N: M) ~3 V+ i
309$ a" H& i( K5 s
310" K9 U& T0 [  n' e
3118 w: ]% N& g" [( C
3121 E% [& b; l* X" p( [
313
/ Z4 c+ o% T4 O1 a0 C9 F314
$ E# j) O) l0 _( |$ Y315
7 \1 l0 [  f) }) s0 g: F9 @7 f0 o3 t316
0 g% d; x9 d$ I, @: m5 e317. ^8 V0 O' S, X* b
318% j2 C2 \; u& k
319" P' A6 u, C) E: r
3207 j( z" Z, f. X: x7 r4 T5 z0 b% a+ `4 U
321
$ _/ T; u: f8 n" N1 p322
8 m* i* V# F4 x0 k0 n323
( x2 ?0 Y0 L9 x% ?* S324/ B, M( n$ [3 y3 J  Z- D, v3 q
325
" Q# p$ R6 K! Q4 ]326
1 {* ~! Q: h) Q9 ]327+ {0 B7 G) l: z
328
8 e- u8 ^1 {$ I5 E$ X. y3294 l0 \  I1 Y$ T7 R7 k- i
3303 I- v7 n% }3 ^7 g8 `  t
3312 i8 I- V! ~# v- D' W
332
; N. y; V. D# |- H3 y& ]333
6 W1 Z+ A  ^* i2 a3343 e$ [! x. m) C3 P3 N' v
335
5 ^; U) B2 O# Y0 u: B336
& c7 K  \2 T6 Y( @& z337
6 m: I3 g) p# i4 Z3386 j' {$ j% f) y
339
" x' V3 ?! _  X0 \3402 g4 N( J9 _* S; I6 I
341
* @' }7 A9 q/ {3 m342
9 Z/ c9 L* ^/ l& }0 x% f343
* S. X6 t$ w: R; ?  f9 L) N344
+ l$ N4 U. c4 @  v) Y3 M$ y345. _1 G& B* H; B* _! z
[root@localhost SPECS]# cat nginx.spec/ e7 }- Q! @/ X7 N- T9 q9 f
#
. g: z# M! x" B%define nginx_home %{_localstatedir}/cache/nginx
; _% f% }" t# {: C+ P$ V%define nginx_user nginx
6 l/ H& Z$ H& i: P2 z9 S%define nginx_group nginx
/ ]+ ]2 n5 }2 N9 }# n4 l%define nginx_loggroup adm
1 j5 c& Q( \/ ]0 u% g$ G7 x- {# ~5 f2 h9 X5 i: X
# distribution specific definitions6 v7 w" v# c4 X
%define use_systemd (0%{?rhel} >= 7 || 0%{?fedora} >= 19 || 0%{?suse_version} >= 1315 || 0%{?amzn} >= 2)
; {; N4 s! M! T& t% w. o
, n: A- q$ ~% z: A4 z8 [%if %{use_systemd}
7 _/ V. e8 Y) k% f% hBuildRequires: systemd
* _2 i6 q3 a5 u/ y1 ?Requires(post): systemd
" M0 F1 ~8 d) n' w3 s+ r# p" fRequires(preun): systemd
0 D& a$ ^1 k( T1 v- w0 FRequires(postun): systemd$ T6 `7 @, T1 v4 I- ]( k' Q9 Z
%endif
1 I& w: D/ y* c# c! p3 h
* v8 z1 _! E* ^7 u% V* d0 P' I%if 0%{?rhel}  P  ~5 t9 t# y1 B3 X5 E8 a
%define _group System Environment/Daemons5 [9 x. X7 s9 z; B$ t
%endif
- w  Q9 B6 k( T
; ?3 L) L/ {7 m9 ^& L%if 0%{?rhel} == 6% _0 M. d' d2 m6 b
Requires(pre): shadow-utils8 s* Y  A2 s8 r# H5 T
Requires: initscripts >= 8.363 i0 x; F( J) _" A- F
Requires(post): chkconfig5 f1 B+ w6 n  l) Z9 }* Z, V/ G
Requires: openssl >= 1.0.10 c( e* m9 \9 Y: m  c
BuildRequires: openssl-devel >= 1.0.1
$ N) N- E2 p- Z; H: h%endif8 T- m4 d7 R$ u' |. X  |* T1 m2 H' V3 [
) Y/ |- H( {/ y) O5 @0 l1 @$ c
%if 0%{?rhel} == 7, K* g* P8 g+ N7 j- ~2 y
%define epoch 1
: e: W3 }! J! @! s4 ~+ W5 ^/ {Epoch: %{epoch}. l$ P, v1 h3 F
Requires(pre): shadow-utils gperftools GeoIP-devel
7 q1 H) T$ v- m2 O: ~; QRequires: openssl >= 1.0.29 ]1 J8 E" ?# d& ^
BuildRequires: openssl-devel >= 1.0.2) `$ h  _' j( ^/ r6 T- H) d
BuildRequires: GeoIP-devel gperftools0 a" h0 }: X5 F3 H4 n. [
%define dist .el71 q+ R+ X# X2 R: D2 Y
%endif5 k+ `0 h5 p+ X3 h! {6 v% _' x

1 X9 D* H# e" T) J3 `$ z* H, o%if 0%{?rhel} == 8
. O# \$ \; I& G- E3 G  t5 p' R%define epoch 1
) I4 B/ ^) [* I" }! nEpoch: %{epoch}
) _; Q) ]# l8 z( BRequires(pre): shadow-utils
$ ^5 L( m$ W+ {9 PBuildRequires: openssl-devel >= 1.1.1/ z( T. O2 d: U7 G
%define _debugsource_template %{nil}( r3 T  J  R# ^4 {, ^: ~5 r# |2 Q  Y0 |
%endif
# j8 z5 D- o  @. O* M; k  ~( O6 B( x5 K" O; n/ }- f
%if 0%{?suse_version} >= 1315
9 b3 I7 l4 N' j) L, [%define _group Productivity/Networking/Web/Servers
* l" q# ^3 R8 p* |' @%define nginx_loggroup trusted, w4 \# i$ B) K. U# X8 w
Requires(pre): shadow5 w8 N2 y1 N& U( b
BuildRequires: libopenssl-devel
5 L4 s+ f! E  v%define _debugsource_template %{nil}$ _- O3 \$ ~  b% K, p
%endif
5 H' @, a/ `: Z* H% Q- s* o2 j8 B6 |. s) d) m
# end of distribution specific definitions
  ^" G- G0 w0 V% Y$ [  U" o8 I2 I8 H8 n4 i. [
%define main_version 1.16.1
. k& ^( x4 y' c; r%define main_release 1%{?dist}.ngx
" c+ M; C) n( t
& ]# T* y! [2 }2 e  }6 ]" {& g1 I%define bdir %{_builddir}/%{name}-%{main_version}2 Y4 c7 A2 ^1 l, Y8 `! q

* g8 R/ `2 _8 n' w7 w. a%define WITH_CC_OPT $(echo %{optflags} $(pcre-config --cflags)) -fPIC7 H/ t+ q% e/ s, J6 }$ j
%define WITH_LD_OPT -Wl,-z,relro -Wl,-z,now -pie
! b) k$ |/ M2 i; C' @4 Q# S5 v& J  o6 o4 R) 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")
5 T! [/ |1 i0 m/ U* x  Q* ~- D% X7 z+ h) w1 v" ]3 |
Summary: High performance web server2 [: Q0 {) ]9 X( a7 E& D
Name: nginx
6 l- J! Y: y0 |Version: %{main_version}
# J$ P9 }/ c# uRelease: %{main_release}
5 x5 s8 C6 Y% ?1 `7 Z" o& n! kVendor: Nginx, Inc.$ V! `! z0 ]. F% c9 Z, Z" ~  f2 D
URL: http://nginx.org/
* V5 w7 b$ V& u4 L3 RGroup: %{_group}; m& M2 A9 c: ~- e' @2 D+ R  K
8 Y  Q% V( r3 e) e. c! `/ E" ?/ i( d
Source0: http://nginx.org/download/%{name}-%{version}.tar.gz! H% A* W  G6 Y& e3 q4 ^+ d+ p5 q
Source1: logrotate( `( Y7 B, W! h1 `
Source2: nginx.init.in& Q  X/ ~( j5 l5 ]1 T1 |/ L
Source3: nginx.sysconf4 T% z+ l( e* R: J" a0 h6 }1 h
Source4: nginx.conf  H. a) k: G9 h$ H" o% R- @5 Q
Source5: nginx.vh.default.conf& ]" }0 R- I/ J- K: v( _' ]
Source7: nginx-debug.sysconf
# g: n" S6 b& f% f2 [( y; oSource8: nginx.service
* V2 u" [. h  jSource9: nginx.upgrade.sh
, K! ~" r& Y% I9 `" L" F! q/ TSource10: nginx.suse.logrotate
% u4 G) z4 H- m8 oSource11: nginx-debug.service5 Q5 a, z( s+ u( o, }/ O: R" s
Source12: COPYRIGHT
  Q  Y9 D8 t( i- z+ PSource13: nginx.check-reload.sh% d2 r: W8 o; P7 m
Source14: nginx-http-concat.tar.gz
, p1 u# [: c) g8 s7 R3 {Source15: ngx_cache_purge.tar.gz! o5 a+ a' m- Q

! |7 _& x0 I% D7 ^: J0 U2 |6 {License: 2-clause BSD-like license0 A: D& F5 z8 ^0 \( b
% E3 H3 B- j! S) X0 x
BuildRoot: %{_tmppath}/%{name}-%{main_version}-%{main_release}-root
$ y3 I& ?( E+ q# P) U! c* K( vBuildRequires: zlib-devel# O3 J7 r1 U5 ]$ E; P  F6 Q
BuildRequires: pcre-devel) r' {: N! u" J2 {" y2 d
# X; r0 y% ~9 \: I# l; N& D5 e
Provides: webserver6 G- E) q; }4 |( Q# a, L2 u

' I9 j0 B) |  b1 Q+ R%description
6 V- M- S5 f& y+ \nginx [engine x] is an HTTP and reverse proxy server, as well as
3 L# o, V: L% D1 `& d5 D/ j5 La mail proxy server.( I& _) D! b* @
. @9 j; K4 F* ^8 g7 Z( N
%if 0%{?suse_version} >= 13158 [: o# Z: O$ v( W
%debug_package
4 N2 H# u: E1 H) c0 v/ R8 Q1 c%endif* N2 D0 b5 B" e- r" J3 o: c

) l0 _) c) ?. O8 x& P/ E% J%prep
  @0 H( s: a: x  P%setup. p' N; H8 f4 e! g3 p
%setup -T -D -a 14
9 ~% T& W, x1 a5 u4 i& B%setup -T -D -a 157 l7 P- e7 S4 z/ |7 f
cp %{SOURCE2} .
- K7 \9 \: {: g% n- u  t+ h1 qsed -e 's|%%DEFAULTSTART%%|2 3 4 5|g' -e 's|%%DEFAULTSTOP%%|0 1 6|g' \
) z8 j1 S: w2 G% y; Y2 I    -e 's|%%PROVIDES%%|nginx|g' < %{SOURCE2} > nginx.init* _2 d) `7 ?% M* ?4 i
sed -e 's|%%DEFAULTSTART%%||g' -e 's|%%DEFAULTSTOP%%|0 1 2 3 4 5 6|g' \
8 Z" J' H2 n- s: m2 `' `" N( {    -e 's|%%PROVIDES%%|nginx-debug|g' < %{SOURCE2} > nginx-debug.init
; Q; I8 x2 ?3 k/ s  e" r0 b, {& y; `& ]0 B# G9 `
%build
- s! p% A1 \  E% [' p./configure %{BASE_CONFIGURE_ARGS} \" n2 v+ X5 ?  }1 |% Y
    --with-cc-opt="%{WITH_CC_OPT}" \
  C7 y* x5 e) o& R) L    --with-ld-opt="%{WITH_LD_OPT}" \
* [3 d9 O; h, `    --with-debug \" l* G7 e; l6 w5 q9 x
        --with-google_perftools_module \
+ f1 x% |' Y: Y5 e, I+ `1 y7 _* l        --add-module=ngx_cache_purge \
2 `& d/ `$ N0 _& @7 v7 X        --add-module=nginx-http-concat \
7 _% s/ {0 B; b/ G1 q        --with-http_geoip_module
) @8 a9 F8 w1 m' F# ~+ N, L/ @" \* K) n) A6 a6 u
make %{?_smp_mflags}0 R. L( c$ ^3 Y6 }4 Y/ _
%{__mv} %{bdir}/objs/nginx \" y1 u7 N# h- T& d5 k4 H( g
    %{bdir}/objs/nginx-debug& N. P4 l& h5 H2 Y
./configure %{BASE_CONFIGURE_ARGS} \
& o. U, j7 x& k# q6 y" q3 ?/ f    --with-cc-opt="%{WITH_CC_OPT}" \; h# p* T2 @+ l7 W+ M% X: t
    --with-ld-opt="%{WITH_LD_OPT}"  c9 H4 M8 y* K4 G- m& L
make %{?_smp_mflags}
% q1 D* }! u  x. ^# V. L7 ?& F$ W0 r2 g  l1 V, s
%install$ r1 F& L4 c1 n8 L5 ?5 ]1 N
%{__rm} -rf $RPM_BUILD_ROOT
* c& M! W2 z% p' w%{__make} DESTDIR=$RPM_BUILD_ROOT INSTALLDIRS=vendor install
# s2 m- a4 K- l8 \+ V0 L: a  S4 t/ b8 Q, J
%{__mkdir} -p $RPM_BUILD_ROOT%{_datadir}/nginx. M& K5 o5 ]' P; O% m: c
%{__mv} $RPM_BUILD_ROOT%{_sysconfdir}/nginx/html $RPM_BUILD_ROOT%{_datadir}/nginx/
+ d/ m" g% j" r. K; @( J8 O
( O( T* x4 W$ ^6 {2 t6 Z1 J%{__rm} -f $RPM_BUILD_ROOT%{_sysconfdir}/nginx/*.default1 t( k, n8 z. y+ ]. U
%{__rm} -f $RPM_BUILD_ROOT%{_sysconfdir}/nginx/fastcgi.conf
0 y9 s! ]+ ]( M3 ~  b9 {2 _& u& D/ k, p! e4 E. Z% i
%{__mkdir} -p $RPM_BUILD_ROOT%{_localstatedir}/log/nginx
4 U. p: C9 ]) x%{__mkdir} -p $RPM_BUILD_ROOT%{_localstatedir}/run/nginx
  x1 ]- b# ?! }3 J% l. \$ h  I%{__mkdir} -p $RPM_BUILD_ROOT%{_localstatedir}/cache/nginx0 e! q7 L! ~. A
$ G# _0 U6 E( ?. `
%{__mkdir} -p $RPM_BUILD_ROOT%{_libdir}/nginx/modules9 z1 g$ t. u: o5 a+ }
cd $RPM_BUILD_ROOT%{_sysconfdir}/nginx && \$ C9 ]9 \: f/ E9 N2 Z) Z
    %{__ln_s} ../..%{_libdir}/nginx/modules modules && cd -3 ~* J9 Z3 D/ d3 `$ G
  g* p; P6 s: v$ R1 u# B+ g
%{__mkdir} -p $RPM_BUILD_ROOT%{_datadir}/doc/%{name}-%{main_version}' y6 ^4 A9 E$ @6 R3 Z: x" @
%{__install} -m 644 -p %{SOURCE12} \/ U- z  \* y1 m# k# p0 e1 b
    $RPM_BUILD_ROOT%{_datadir}/doc/%{name}-%{main_version}/# [/ j5 ~& k. T1 D
8 }) b. r! F5 d: z
%{__mkdir} -p $RPM_BUILD_ROOT%{_sysconfdir}/nginx/conf.d7 [" o/ ~  Z7 x* U& I+ X# U" I
%{__rm} $RPM_BUILD_ROOT%{_sysconfdir}/nginx/nginx.conf) a  i8 j, a5 V* }
%{__install} -m 644 -p %{SOURCE4} \
4 X7 M4 d" L" f# _6 }    $RPM_BUILD_ROOT%{_sysconfdir}/nginx/nginx.conf5 C- Y+ P4 i4 U5 M6 u
%{__install} -m 644 -p %{SOURCE5} \
) K0 C" Q( Q1 N7 P    $RPM_BUILD_ROOT%{_sysconfdir}/nginx/conf.d/default.conf
" O3 i' o# Q0 |. ?5 E/ C. |7 f$ C# t- \8 N
%{__mkdir} -p $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig! _0 l; y! c/ O- G
%{__install} -m 644 -p %{SOURCE3} \
* q8 B; b- g, p" J& R: a4 B    $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/nginx) T) [2 A% v- l  K9 e) c
%{__install} -m 644 -p %{SOURCE7} \& W+ X7 o9 @! ~: m3 g& N8 F/ V  \
    $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/nginx-debug7 a6 j& c% H1 V' ?& R
* ?; G8 }6 |. o
%{__install} -p -D -m 0644 %{bdir}/objs/nginx.8 \% m# ^% ~; i9 c$ P9 `6 K
    $RPM_BUILD_ROOT%{_mandir}/man8/nginx.8( ~  }- x5 b5 m7 x

# V9 {2 |  |2 m9 c( K3 x. T%if %{use_systemd}3 _4 X1 k2 g( w' z3 h
# install systemd-specific files
4 R( |, }' J. ^0 L" O) Q3 e%{__mkdir} -p $RPM_BUILD_ROOT%{_unitdir}
8 m% P  C2 y0 Q  z" A0 t) y$ S- _%{__install} -m644 %SOURCE8 \
# u3 H& \6 I9 }8 O    $RPM_BUILD_ROOT%{_unitdir}/nginx.service# m% s5 ^. D4 d0 g& c1 j$ ~3 I
%{__install} -m644 %SOURCE11 \; Y9 r3 }  Z1 f) y8 ]
    $RPM_BUILD_ROOT%{_unitdir}/nginx-debug.service* D8 K& H, ?, _7 f2 J
%{__mkdir} -p $RPM_BUILD_ROOT%{_libexecdir}/initscripts/legacy-actions/nginx
; e* c8 i$ i! A" g%{__install} -m755 %SOURCE9 \7 O3 H5 [4 c+ ^
    $RPM_BUILD_ROOT%{_libexecdir}/initscripts/legacy-actions/nginx/upgrade* l+ U  L& {5 `- ~4 `
%{__install} -m755 %SOURCE13 \; A, T- J( `% V, B. D( R
    $RPM_BUILD_ROOT%{_libexecdir}/initscripts/legacy-actions/nginx/check-reload7 m8 H# f/ t9 t0 `% y
%else
4 i! H  B2 `" S* Y# install SYSV init stuff
, h, ]" v3 {+ [" t- l5 X%{__mkdir} -p $RPM_BUILD_ROOT%{_initrddir}! i: K5 h* |, `8 ^4 j$ _
%{__install} -m755 nginx.init $RPM_BUILD_ROOT%{_initrddir}/nginx
1 I0 {" a& D# _%{__install} -m755 nginx-debug.init $RPM_BUILD_ROOT%{_initrddir}/nginx-debug7 p+ ?3 K7 G( ~9 p0 l! R
%endif
$ z2 s2 p' _) p, e/ j1 Z
3 H% i9 n8 [2 ~- V# install log rotation stuff
5 d. z# f! _. V, ]) p%{__mkdir} -p $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d
: B) H7 q" J! P* \%if 0%{?suse_version}, S& J1 f1 q, h2 O5 N( f
%{__install} -m 644 -p %{SOURCE10} \6 ?" q2 K$ q9 [* t
    $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/nginx( ~  O' |, F- }, m1 y+ @2 P% j
%else( M& x, R# Z) _$ E
%{__install} -m 644 -p %{SOURCE1} \: B) w* a$ P$ i& ]
    $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/nginx0 R6 M: m6 p5 d+ P( _$ a1 Q
%endif
% U+ J0 @; h$ D1 q+ V. C# m) h) [4 @7 _' V- a
%{__install} -m755 %{bdir}/objs/nginx-debug \. l" D  Q4 s' n8 ~# |
    $RPM_BUILD_ROOT%{_sbindir}/nginx-debug
* X, Y4 H8 ^; I* S4 }: i) U* L+ l
/ k3 G; `: y5 V0 e# B%check, X& i5 a" [# X
%{__rm} -rf $RPM_BUILD_ROOT/usr/src7 H: W, P' l* O/ k1 {/ L
cd %{bdir}: K  S. l, v( z4 `1 V
grep -v 'usr/src' debugfiles.list > debugfiles.list.new && mv debugfiles.list.new debugfiles.list
2 |( O' v4 e5 rcat /dev/null > debugsources.list
+ l( X' ]; Y3 M%if 0%{?suse_version} >= 1500
- h7 u/ S) y4 A) \! J% y) H2 Hcat /dev/null > debugsourcefiles.list
6 O0 n9 z5 g, ~7 \: U; P5 w( g8 n%endif
# e$ i" `2 w* X. K4 [7 ]
# I7 r6 X) W5 d8 N" H/ u7 {%clean
( J0 M" M; u0 w8 D* B%{__rm} -rf $RPM_BUILD_ROOT9 E/ y4 v: R0 ]7 c. R4 m

5 P' l' w/ t; L1 P% K0 |%files* }- T% `6 G$ }2 p' s* _
%defattr(-,root,root)
) S0 D  r7 N* f
9 d  f, Q0 S1 |  J' D+ r! |  M" n%{_sbindir}/nginx" b4 @) x# E* B7 y/ r: z0 q# ]
%{_sbindir}/nginx-debug
* F: T  U1 w) v; }/ h
7 Y( g$ H* s7 d" X5 k) c3 T%dir %{_sysconfdir}/nginx2 f, X& _' f! K2 |3 c- j5 u, d
%dir %{_sysconfdir}/nginx/conf.d
7 a+ w& O8 A0 J) Z%{_sysconfdir}/nginx/modules
  [" L1 a8 F" Y: O- P& g4 h, h8 E( G# N2 U5 K- }% p
%config(noreplace) %{_sysconfdir}/nginx/nginx.conf
4 w% ^- O3 n( m4 ~* {% Z%config(noreplace) %{_sysconfdir}/nginx/conf.d/default.conf: F' x' W& _# [/ l
%config(noreplace) %{_sysconfdir}/nginx/mime.types
" u" L6 d3 O% i; }, ]) N5 k%config(noreplace) %{_sysconfdir}/nginx/fastcgi_params1 y9 j0 V' P0 X7 B( E
%config(noreplace) %{_sysconfdir}/nginx/scgi_params$ \8 A1 c; y, w4 L: D
%config(noreplace) %{_sysconfdir}/nginx/uwsgi_params8 C; O. E# G$ k  \
%config(noreplace) %{_sysconfdir}/nginx/koi-utf1 \) B$ }: H+ C8 b) y6 a/ Y
%config(noreplace) %{_sysconfdir}/nginx/koi-win1 [$ ]; W# K+ k' B5 m0 s* }3 p
%config(noreplace) %{_sysconfdir}/nginx/win-utf
* k7 D0 G) ?2 g. |# D0 L; w) k' ^( w  ^4 Q$ P8 f% F
%config(noreplace) %{_sysconfdir}/logrotate.d/nginx
. ]1 O. h6 }3 n9 }/ L: w: F/ g%config(noreplace) %{_sysconfdir}/sysconfig/nginx
: H; p! M- |- ~5 }" p1 u%config(noreplace) %{_sysconfdir}/sysconfig/nginx-debug
& d& M: T' L# f+ z  W%if %{use_systemd}3 t& n) ?7 Y2 b/ c9 A6 {
%{_unitdir}/nginx.service. H) O* z4 ^6 j+ W
%{_unitdir}/nginx-debug.service3 l9 f4 _; O7 o2 |" w
%dir %{_libexecdir}/initscripts/legacy-actions/nginx
. f% Y3 a. ]  e" B: x& K6 {%{_libexecdir}/initscripts/legacy-actions/nginx/*
7 N. }% k# f- F& T%else
6 d- n0 Y. F* r2 M9 [1 E%{_initrddir}/nginx
$ j% n8 r4 ]# N) I1 E%{_initrddir}/nginx-debug
; s. F: B' P1 R%endif# g5 R' ^/ S! B

  ]9 G8 O5 p9 O8 ]. X# e7 e" ?%attr(0755,root,root) %dir %{_libdir}/nginx* a$ Q5 O8 G9 v7 F8 u" Z8 k% A
%attr(0755,root,root) %dir %{_libdir}/nginx/modules
- L9 Y( T% i% ^0 C. ?8 n%dir %{_datadir}/nginx
; u! t4 N& l/ D7 w6 W0 J%dir %{_datadir}/nginx/html9 d; E% L' V! M, W) L; f( w, T
%{_datadir}/nginx/html/*7 G1 ]8 S  Y4 m0 W
' e  `; T2 A& \5 Q. P6 ]
%attr(0755,root,root) %dir %{_localstatedir}/cache/nginx
2 d& m0 j+ J8 B  n%attr(0755,root,root) %dir %{_localstatedir}/log/nginx4 T0 r3 I6 O( E0 ]0 U

0 B& r- ]7 m4 t7 A9 ^! o: n%dir %{_datadir}/doc/%{name}-%{main_version}( z5 n% m2 z3 _$ e  a
%doc %{_datadir}/doc/%{name}-%{main_version}/COPYRIGHT% ]/ n  c! R: G% E$ ]
%{_mandir}/man8/nginx.8*
5 }. C: n" q4 ~2 |
$ s* G5 n- q$ Q$ G& S* @%pre* _( ]2 p" F% S
# Add the "nginx" user
; U& F: X3 F) Ugetent group %{nginx_group} >/dev/null || groupadd -r %{nginx_group}
6 l: p3 p9 x6 w. \1 Dgetent passwd %{nginx_user} >/dev/null || \% ~3 ^6 c6 t* i' E  ?- {0 d
    useradd -r -g %{nginx_group} -s /sbin/nologin \* I2 I+ s1 `5 [+ r5 I
    -d %{nginx_home} -c "nginx user"  %{nginx_user}
0 d- X- ]1 E$ ^  z3 i5 Wexit 0: f. L" z8 V, l( |. I, I

& ?; E9 f5 B& `( v7 t" C  T+ Y! L3 k%post
% t, @1 R% P6 T# Register the nginx service
, C: L9 m5 [0 z$ F, V# Xif [ $1 -eq 1 ]; then- W" a2 u! S) O( E- j0 x% P
%if %{use_systemd}0 f4 r) |  H, }
    /usr/bin/systemctl preset nginx.service >/dev/null 2>&1 ||:
! T4 s/ s* S* B  c0 A4 v; W    /usr/bin/systemctl preset nginx-debug.service >/dev/null 2>&1 ||:. Y5 Z1 M6 v" _: y; g7 C6 s
%else3 k* s4 u  [0 @- ^; ^3 ]$ c
    /sbin/chkconfig --add nginx
4 a5 Z4 M' R8 n5 m7 c! _    /sbin/chkconfig --add nginx-debug' |9 ?/ J& B  T/ f; r4 U
%endif# \& {: ]0 L: V* X# U3 {8 L9 ?
    # print site info- H* k4 B- }+ |' h& x: q
    cat <<BANNER
2 c4 C- M% e  N* b----------------------------------------------------------------------2 e8 V0 n5 r' a
. V0 f4 c; A0 C
Thanks for using nginx!
: V- L& w" P6 ?0 L
: m) x9 L/ r+ h2 Y9 GPlease find the official documentation for nginx here:
* o# W7 Y. ~! T0 M' i+ F* http://nginx.org/en/docs/  o8 |0 i: K8 E; N& A- o

7 i8 S% e5 e; r" X( PPlease subscribe to nginx-announce mailing list to get5 u/ p/ t$ e/ e' D1 q
the most important news about nginx:* J. m$ l1 D! m, z5 ]) @* z
* http://nginx.org/en/support.html: s0 H8 q* l6 o( q. M

* G. d7 `' S5 ^5 a' ?4 b1 t9 ECommercial subscriptions for nginx are available on:
, ?1 p! J" C) O* {8 {: g* http://nginx.com/products/
' j# z( D  R+ j
# u* N7 Z! E9 k0 ^$ @----------------------------------------------------------------------
$ _. |4 ?& r: O& Y2 E4 @BANNER# m) _9 o$ W4 K/ {$ n8 ^
1 J+ Q3 P. ^# x. N& s2 g+ _. t
    # Touch and set permisions on default log files on installation: \% t2 A" Y- F4 g( r& d4 I
' @8 r% }) Z3 g% i7 X: t2 y
    if [ -d %{_localstatedir}/log/nginx ]; then
1 \: b; n% D4 D$ A4 G+ A        if [ ! -e %{_localstatedir}/log/nginx/access.log ]; then, U. M- B! q: f( j
            touch %{_localstatedir}/log/nginx/access.log! N: l8 V! N7 j1 p- H
            %{__chmod} 640 %{_localstatedir}/log/nginx/access.log
8 j+ x# p2 {6 k% b5 v9 r' ~            %{__chown} nginx:%{nginx_loggroup} %{_localstatedir}/log/nginx/access.log* d5 b1 y- P5 V$ X  h0 o+ r+ a# |8 ?
        fi" c' }, l% F. A

  z( n% w3 ~* ?3 F        if [ ! -e %{_localstatedir}/log/nginx/error.log ]; then$ z# u/ E8 a  ~2 U2 X( }
            touch %{_localstatedir}/log/nginx/error.log" [: U* d: [! }# g
            %{__chmod} 640 %{_localstatedir}/log/nginx/error.log
! P% z" i5 X4 H            %{__chown} nginx:%{nginx_loggroup} %{_localstatedir}/log/nginx/error.log& m, G' k( a1 l& C# g: ?
        fi( G' |3 d/ {& W8 f
    fi% N" j# x& _7 d3 d
fi
% _, E2 r. F0 H7 n
& d( Z) t% R5 S; C) K0 \+ c%preun
# c1 [: x7 a6 Mif [ $1 -eq 0 ]; then8 j8 ]' ^8 L7 f9 w% Q  t& n! @6 W
%if %use_systemd
/ f8 a( u+ ^6 O5 J* X5 l    /usr/bin/systemctl --no-reload disable nginx.service >/dev/null 2>&1 ||:! u9 S: O4 E! @8 [
    /usr/bin/systemctl stop nginx.service >/dev/null 2>&1 ||:! C. v$ p3 {1 H. [1 T2 Q6 v
%else' M* }: e2 P& [( \- U
    /sbin/service nginx stop > /dev/null 2>&1
, P* w% y1 {- Y0 C# ]    /sbin/chkconfig --del nginx; p% X) n( L$ Y# s
    /sbin/chkconfig --del nginx-debug! r( ]2 T1 j5 A
%endif* X* H/ `* N* s. i1 f* y  c. c3 E  _* h. z
fi
9 h: A2 x5 m) F  e1 w4 F# d4 s, l" {! }. W
%postun
+ e6 @% H- D1 U; R%if %use_systemd+ D* \! r" I! z6 U4 W
/usr/bin/systemctl daemon-reload >/dev/null 2>&1 ||:8 `1 \( U" V9 u/ L! @
%endif/ ?  e0 Y7 I; f6 J+ n5 X. ^
if [ $1 -ge 1 ]; then! a/ }; {1 Y* p! P7 U: C- |3 s+ X8 ]
    /sbin/service nginx status  >/dev/null 2>&1 || exit 0
7 o9 T2 J4 l) E1 @    /sbin/service nginx upgrade >/dev/null 2>&1 || echo \0 N% j( D* p, ~
        "Binary upgrade failed, please check nginx's error.log"
5 P' c: l# m! T. |6 n$ Tfi9 n7 W" ^' G; l# C" \6 u

4 ?. Q5 N- p* V9 o%changelog' F5 n8 n+ f3 _0 |( H& A  C
* Tue Sep 30 2019 fangdm <8@8994.cn>% D6 ]5 F$ S+ G: D- }- Z; }) {3 }
- Add modules nginx-http-concat and ngx_cache_purge
4 [( T, m. J2 o5 N2 s2 j
; |& i( ~0 A3 \5 \4 e2 z* h6 z* Tue Aug 13 2019 Andrei Belov <defan@nginx.com>
/ h6 q; L8 T5 F0 g9 x- 1.16.1' r: @/ [0 D9 D& t/ Y

* H7 C% n5 R7 I- P  y! P

' M  O8 f* D/ ~$ ?4 P/ i! K
编译完成之后,查看changelog,是成功了。
复制
1& M9 n+ a) ]+ t! U2 B- D
2
9 k' O1 `8 p( Q: m31 D/ I6 a" \  j/ F. O' `
4" z1 M6 P3 G+ J/ L; S% r0 U
5/ U2 o; N; l( n) {" a' H& ]" }& d
6. X. g+ w+ t& l, B0 i# |
[root@localhost SPECS]# rpm --changelog -qp /root/rpmbuild/RPMS/x86_64/nginx-1.16.1-1.el7.ngx.x86_64.rpm
( J  V4 ^) Q# J/ F5 M, M* Mon Sep 30 2019 fangdm <8@8994.cn>
- k0 x& U* _0 W. U2 V- Add modules nginx-http-concat and ngx_cache_purge' W% I. c/ V, c

+ p/ R( }; v, T6 Z+ }* Tue Aug 13 2019 Andrei Belov <defan@nginx.com>
  a8 z% J; U& D2 s  y7 m& N- 1.16.1( {  l- h$ @' \5 ^6 L1 @
$ X/ m# g6 u* R, o; Z$ T
  }3 N6 w4 u. |$ k
fpm打包方法
使用fpm这个方式也是可以将tar打包为rpm包,其打包流程大致是这样的:
  • 编译安装被打包软件,指定安装的临时目录,如指定--prefix=/fpmbulid
  • 创建安装脚本、卸载脚本
  • 安装FPM工具
  • 使用fpm打包2 ]8 m/ G0 x8 d4 {
" O6 C9 N7 n% @: q7 ~5 ~- @: g
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-12 04:26 , Processed in 0.028087 second(s), 22 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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