将设为首页浏览此站
开启辅助访问 天气与日历 收藏本站联系我们切换到窄版

易陆发现论坛

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

make编译安装,将tar转rpm包

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

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

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

x
gcc相关知识
/ _2 s" e6 o# j, w先编写一个C文件,其第一行表示包含文件在/usr/include/stdio.h下,如果没有申明,则需要使用参数-I /usr/include指定。. |1 {, M7 p, ]
1 h3 e/ ~, E, B/ W' n
[root@home ~]#cat sin.c
3 u8 J) Q+ {" F& M. U#include <stdio.h>7 \- V2 j; _1 o: ]9 _. L) Z/ z
int main(void)
6 P& g  @; `2 j- ^; x0 Z{
+ k8 _/ m4 y6 H  J  n        float value;
3 r( z" d2 c! a0 A        value=sin(3.14/2);9 E" H9 w3 M( E; J
        printf("%.2f\n",value);
' y+ i+ x) J9 B9 `}4 u  o/ ]* j) [# G4 i: `

" H" m& W6 A5 V" O* o) f! ?3 @[root@localhost src]# gcc -c sin.c0 [1 H! X% s, N0 f$ l' m
sina.c: In function ‘main’:
# U2 Z" j, x5 bsina.c:5:8: warning: incompatible implicit declaration of built-in function ‘sin’ [enabled by default]
3 ], L2 [' {  Q7 o' b  value=sin(3.14/2);
( Z+ F, U- f% z# g3 n& c        ^
& T/ g; X$ d' H9 W0 r& p( j& v[root@7ftbv7mdz7cdpc ~]# gcc -c sin.c -lm -L /lib/64 -L /usr/lib64
/ y/ D" Z3 V5 n1 t7 }- O3 w- V9 zsin.c: In function ‘main’:) b, X  ]  t3 Z3 X0 A: O0 @
sin.c:5: warning: incompatible implicit declaration of built-in function ‘sin’
& l( }6 S  Q+ ]) d  U$ q[root@localhost src]# gcc -o sin sina.o. _  S! \; i9 i- J8 U/ m6 F
[root@localhost src]# ./sin
( H# R+ A+ m8 J. Q% x$ f( v1.007 H9 l8 I; `$ x+ b
gcc sin.c全产生a.out运行文件,加上参数-c则生成二进制文件sin.o,再加上-o则生成运行档sin。1 c: M+ z* r  C7 Z
' }! ?* n) G) q- K9 I
但是如果出现以下错误,这是因为 C 语言里面的 sin 函示是写在 libm.so 这个函式库中,而我们并没有在原始码里面将这个函式库功能加进去,可以使用以下命令gcc -c sin.c -lm -L /lib/64 -L /usr/lib641 b, M, F) l6 C6 p' f- P4 }8 F
8 ]0 }& v( @9 A9 a
gcc -O 为产生最佳化的参数
1 V7 Z* \+ W$ |2 Y/ F: T& Z
5 c- V# o, F, K6 F! l3 Hgcc -Wall 为产生更详细的编译过程资讯
$ V5 K" `: {, C: _
0 }6 s& R* u; ]& A-l :是『加入某个函式库(library)』的意思,3 }  ]% Z2 z& s3 M5 r4 }8 r

% W2 f; F* @4 y: v  X; vm :则是 libm.so 这个函式库,其中, lib 与扩展名(.a 或 .so)不需要写
0 |* A) H8 ~: Y-I /path 后面接的路径( Path )就是配置要去搜寻相关的 include 文件的目录啦
# A" G2 n7 c, ^; u$ k-L 后面接的路径表示函式库 libm.so 请到 /lib 或 /usr/lib 里面搜寻
( G6 f, v- b" B9 J" M8 t+ Z& e* S/ W总结:
+ H% |) U; T; y5 `; A" t# s: q# k2 A5 K# j! v
# 仅将原始码编译成为目标档,并不制作连结等功能:7 f/ v$ m* o; v- a7 C0 f/ G8 ]
[root@www ~]# gcc -c hello.c- B0 Y  p) k# B, h
# 会自动的产生 hello.o 这个文件,但是并不会产生 binary 运行档。
7 n+ p3 l  E2 w% a6 v0 G* T4 o: R. D! m* s0 T8 r0 l' Y
# 在编译的时候,依据作业环境给予最佳化运行速度
, N8 y' d5 E7 Z[root@www ~]# gcc -O hello.c -c
, D! f! B5 ?  V6 k# 会自动的产生 hello.o 这个文件,并且进行最佳化喔!3 y- ?4 z% F+ W- J/ B6 ~! E: f! b
0 q& z; i! R- D" }4 w( t% \& S
# 在进行 binary file 制作时,将连结的函式库与相关的路径填入
$ d/ V: z% f1 _[root@www ~]# gcc sin.c -lm -L/usr/lib -I /usr/include6 |9 `( H) y* R' N  F0 Y3 x
# 这个命令较常下达在最终连结成 binary file 的时候,
2 C2 w; m; U6 g: Z- x# -lm 指的是 libm.so 或 libm.a 这个函式库文件;( l  y9 s) k- e7 {* v! c5 e. {
# -L 后面接的路径是刚刚上面那个函式库的搜寻目录;7 }  G$ G3 ^/ p9 @
# -I 后面接的是原始码内的 include 文件之所在目录。
5 V% o! O) i" Q1 m$ k( y' K) }6 ]! T# f5 z7 |
# 将编译的结果输出成某个特定档名
! f! d- |/ P8 f6 T* R[root@www ~]# gcc -o hello hello.c
9 D0 v8 V: [8 }2 e% l1 `# -o 后面接的是要输出的 binary file 档名6 \. ^2 e% s2 ~! B- D6 M; e

2 |& f7 z( S! z  Q/ _# 在编译的时候,输出较多的信息说明
) V: r2 `  E) o% f  A3 S4 D[root@www ~]# gcc -o hello hello.c -Wall
+ o3 C" K' P) M& X+ W. m+ H# 加入 -Wall 之后,程序的编译会变的较为严谨一点,
( E1 S7 N2 L0 [, H9 |# 所以警告信息也会显示出来!
2 X* J0 l% w+ K: R另外,我们通常称 -Wall 或者 -O 这些非必要的参数为旗标 (FLAGS),因为我们使用的是 C 程序语言,所以有时候也会简称这些旗标为 CFLAGS。& @: c$ r1 ]+ G0 `& ~& P# I+ P1 a
$ T' c' w1 s8 H  f; D) ?
makefile介绍! J; R4 W- F  ~9 l( V; c9 q
实例
# I% j+ L9 Y. R4 U, B1 Y6 \1 S; Q7 K7 N首先,下载wget http://linux.vbird.org/linux_basic/0520source/main.tgz然后开始编译:
& j' c5 s2 \2 E
; x2 G. x  P) \7 b5 H' C7 a: B[root@localhost main]# cat makefile6 D9 ~- Y  ^! v
main: main.o haha.o sin_value.o cos_value.o
  x+ \1 }7 C9 _2 g7 F        gcc -o main main.o haha.o sin_value.o cos_value.o -lm
$ p/ `2 W1 |5 F9 @4 N: g- xclean:
5 {9 l; v% a* e6 y6 l4 m5 a# B        rm -f main main.o haha.o sin_value.o cos_value.o: c8 f* ^* n* A4 f7 `  Y. J. u6 J
       
9 p0 |6 a! t1 s2 Q[root@localhost main]# make; C4 n1 M* U( C! R9 q5 O3 n4 G
cc    -c -o main.o main.c. e" e) j: D4 J8 P$ O& n& u
cc    -c -o haha.o haha.c  `0 c) P' X# b% w: j  |: W
cc    -c -o sin_value.o sin_value.c2 p* \' K  n2 w5 p6 _
cc    -c -o cos_value.o cos_value.c& R& H* H8 B+ @, m
gcc -o main main.o haha.o sin_value.o cos_value.o -lm$ C. C" V# d; r' y& p

/ _% @: W0 P% b[root@localhost main]# ./main% K2 l7 M2 U, h: \9 ]
Please input your name: fdm. Q9 [7 L% m* d* O7 ^
Please enter the degree angle (ex> 90): 33
0 E, M5 X  n: c# C! ?1 |  c# QHi, Dear fdm, nice to meet you.
" |5 T/ V  k) S! l9 j- G  d- BThe Sin is:  0.54
/ c2 c+ }4 h4 |& H( L; Q" sThe Cos is:  0.84
. {3 N6 [9 f% n% [7 q$ f- ], F. S8 o9 ^' `0 F
[root@localhost main]# make clean
, @* m0 \6 q0 Q. `rm -f main main.o haha.o sin_value.o cos_value.o
$ ~8 Y, H% @- `makefile 的基本语法与变量
6 R4 B5 D3 `7 i  y3 lmake 会主动的去判断每个目标档相关的原始码文件,并直接予以编译,最后再直接进行连结的动作。4 M! Z+ n8 i) g' Y

# d3 k9 {( Y3 t3 p, C6 j在 makefile 当中的 # 代表注解;8 s# q: j2 n$ z/ W* Z- c3 G& i" r
需要在命令行 (例如 gcc 这个编译器命令) 的第一个字节;+ d7 s, D9 m' ?1 y" i2 a% e1 H9 g
标的 (target) 与相依文件(就是目标档)之间需以『:』隔开。就是可执行程序的文件名。  x7 j/ u& r5 A% c0 w+ @8 Z! v3 T8 c
标的(target): 目标档1 目标档2! q" F! G# N4 y" [+ L
        gcc -o 欲创建的运行档 目标档1 目标档20 y1 O0 E1 O# m3 L1 t4 s7 ]
如下,makefile 里面就具有至少两个标的,分别是 main 与 clean ,如果我们想要创建 main 的话,输入『make main』,如果想要清除有的没的,输入『make clean』即可!而如果想要先清除目标档再编译 main 这个程序的话,就可以这样输入:『make clean main』5 o" A8 U2 Z" b; k( I# W
/ _8 h5 M, j0 b7 u1 h) Y: B
还可以进行简化,使用变量来减少程序的修改量。$@:代表目前的标的(target);gcc 在进行编译的行为时,会主动的去读取 CFLAGS 这个环境变量,可以写到makefile
/ F; b4 x' y) v% i: z5 R+ Q4 E
5 P6 ?4 d7 f5 y1 w8 j: [[root@www ~]# cat makefile: s0 ?6 U6 B# B
LIBS = -lm
: @* _' ~) {7 ]% P1 LOBJS = main.o haha.o sin_value.o cos_value.o  C0 M; j/ ]: u  x7 z
CFLAGS = -Wall, x* g& e5 n8 X' ~+ `: j3 O% A
main: ${OBJS}2 G6 y. Y! B+ F3 n
        gcc -o $@ ${OBJS} ${LIBS}7 P" y9 O9 |5 A  k4 D9 V$ }
clean:  k* d3 Q' b; o6 D
        rm -f $@ ${OBJS}) O* Q8 [. E6 r. B! J
由於 gcc 在进行编译的行为时,会主动的去读取 CFLAGS 这个环境变量,所以,你可以直接在 shell 定义出这个环境变量,也可以在 makefile 文件里面去定义:
" k& l8 P) ]4 t  [! S
& p8 v5 U2 P* O9 i& u( ^$ E. Y[root@www ~]# CFLAGS="-Wall" make clean main
+ o( t8 q$ R9 Y( ?# 这个动作在上 make 进行编译时,会去取用 CFLAGS 的变量内容!) y( g3 ?2 |* L! A0 m5 D) g5 ^
make与Dockerfile相接合
& G8 {1 ~& @' E% ^( @此小节内容来源于 high-iowait-process 。# p* d- y' n) ?7 V: i) k( ]

) A) W5 u( f( r5 C1 f& ~# H# ^如有下列Makefile文件内容:2 z# }/ K5 x6 f: n0 u
" w2 }7 w: P8 c% S
.PHONY: build
& X3 I2 X' S+ `build:" [* a, ]! e$ i/ E
        gcc -o app app.c3 J+ q6 M# W4 L
        docker build -t feisky/app:iowait -f Dockerfile .+ X! _/ H7 |; Z# T, `6 Z( p
        gcc -o app app-fix1.c# X' `: A* c6 [% |' q2 l- T5 F/ Q3 A
        docker build -t feisky/app:iowait-fix1 -f Dockerfile .4 g: ^6 f4 n+ V4 H8 ]
        gcc -o app app-fix2.c9 a, S; `+ I* c5 O" {- e$ w1 F
        docker build -t feisky/app:iowait-fix2 -f Dockerfile .
- p' I. t5 a9 X0 G6 r8 C/ e" w/ y* w$ L. L
.PHONY: push, p% F6 Y8 E" E5 [/ _" c# d2 S& X9 G
push:
" o) q- q7 H- f; b0 c2 M! \  Q7 D        docker push feisky/app:iowait8 B# ~% Z2 w: c# S" L
        docker push feisky/app:iowait-fix1
& [8 Q$ R1 @8 `* F/ g* b& ^4 b+ M$ Z        docker push feisky/app:iowait-fix2. b3 h  Z4 m5 `& I8 }+ j, K
" B: E9 S  T, T6 @: ~" j/ n
.PHONY: run
1 |+ w9 }; G9 Y6 V8 z3 {run:6 N  c; c1 N' a  ^- K' e1 @
        docker run --privileged --name=app -itd feisky/app:iowait6 Q4 V$ g  d* M- X- p% Q

! F$ l' x+ M9 y. o.PHONY: run-fix1
# X& }/ G5 G" r0 s$ E1 trun-fix1:2 R8 r) G5 ^. ~- n+ l
        docker run --privileged --name=app -itd feisky/app:iowait-fix14 E% E6 e  n/ F6 P
+ b) c& N8 q; i/ e  g+ ?' L/ a
.PHONY: run-fix2- U7 r" a. {* P. t. C
run-fix2:
$ I' k" C* t( k4 L+ R        docker run --privileged --name=app -itd feisky/app:iowait-fix2' q( k/ n3 C' X4 @/ K3 N. ]4 L9 \

- Q) C1 {% U2 q. N.PHONY: clean
% h) Y0 R; F5 m1 f/ l# n8 w5 P# D; uclean:0 t* |* R0 u7 R6 L* ?
        rm -f app
# B! K1 p3 G3 U2 U# y        docker rm -f app || echo "Container app already deleted."4 Y5 V' e9 N6 X7 B& v( r7 J9 ^
这样写好之后,就可以使用 make bulid 来生成镜像,使用 make run 来运行镜像,使用 make clean 来删除镜像。所以这看上去就有点像脚本的函数一样了。& q- U- s7 G# q4 g) W( \- @2 R+ X* y

3 j7 Y; l7 r8 F变量的基本语法: N  ~+ ?  H! S
变量与变量内容以『=』隔开,同时两边可以具有空格;2 A5 }3 \, [2 b
变量左边不可以有 ,例如上面范例的第一行 LIBS 左边不可以是 ;
6 r+ ]( _7 }/ p0 z7 m变量与变量内容在『=』两边不能具有『:』;, H5 ^' b1 F& Q1 ]
在习惯上,变量最好是以『大写字母』为主;; P, ^' m9 g9 n, _3 v8 A6 X  _
运用变量时,以 ${变量} 或 $(变量) 使用;& x3 m, a1 I. e) b
在该 shell 的环境变量是可以被套用的,例如提到的 CFLAGS 这个变量!: B; m7 ?+ c) f7 A/ }, p
在命令列模式也可以给予变量。+ S% g! [0 V* W: W6 i3 ?& v& O
yum安装相关环境
. h& S2 p; i' a) ^; L  r* W; t# z如果是要安装 gcc 等软件发展工具,请使用『 yum groupinstall “Development Tools” 』& l* j" D: M1 T! o4 b
若待安装的软件需要图形介面支持,一般还需要『 yum groupinstall “X Software Development” 』
* L1 R3 v4 `1 K: ]* m若安装的软件较旧,可能需要『 yum groupinstall “Legacy Software Development” 』
( ~" x9 P8 N+ `' i编译软件步骤5 B/ c- n7 G: U# u9 A% [* [0 l. y
./configure 创建Makefile文件
  p# g; f& N, r  ?6 F# bmake clean 会读取 Makefile 中关於 clean 的工作,可有可无8 ?# c8 V* j- w- o
make make 会依据 Makefile 当中的默认工作进行编译的行为
; |2 p  p2 {& S, [; Bmake install
0 T5 c/ u- i8 i' m- Y如果未指定安装路径,则编译安装的目录是放在/usr/local/etc、/usr/local/bin、/usr/local/lib、/usr/local/man下。
& \( z  N' S2 U/ V  C3 C1 B' C6 J! G3 m  F+ m3 i
rpm知识
. l, W, }3 K* i- x. w2 |$ G. y此内容与编译无关。可以跳过,同时此内容也来自于鸟哥私房菜,是一本好本啊~, P3 L! j- r- u. X5 Q$ s' ~# J7 n4 a
4 y& l1 Q/ |* k3 q% I* D
RPM 安装 (install)' @  G1 l. @% e6 C% F* ]1 J: P
[root@www ~]# rpm -ivh package_name; L% [4 ~. K4 }0 N
选项与参数:
; Q# J4 l- B/ N8 p" `4 D-i :install 的意思
: G( {( H3 g8 E0 P& o-v :察看更细部的安装资讯画面
5 j) x! s# t. S; N/ y3 J! J1 n& U-h :以安装资讯列显示安装进度9 c" l  Q* k0 P6 s% x3 x) }5 h

* [8 I/ b5 Z8 D+ a! N-Uvh        后面接的软件即使没有安装过,则系统将予以直接安装; 若后面接的软件有安装过旧版,则系统自动升级至新版;
0 `; z  o# m0 c% f+ w-Fvh        如果后面接的软件并未安装到你的 Linux 系统上,则该软件不会被安装;亦即只有已安装至你 Linux 系统内的软件会被『升级』: l9 G% S8 y# N
; e3 c) I/ r& C+ a0 V* |1 B+ ?
[root@www ~]# rpm --rebuilddb   <==重建数据库
) Q+ X; K$ \; t! d" {8 yrpm 安装时常用的选项与参数说明% [  m2 e* D/ L3 ]. P! j

) y) J# `1 N" o0 P9 a! Y. {* h/ ?8 `—nodeps:当发生软件属性相依问题而无法安装,但你执意安装时5 z7 ]: Q. g& y" m" G
—replacefiles:如果在安装的过程当中出现了『某个文件已经被安装在你的系统上面』的资讯,又或许出现版本不合的信息 (confilcting files) 时,可以使用这个参数来直接覆盖文件。
6 r8 S3 C7 X" I0 a! X—replacepkgs:重新安装某个已经安装过的软件!如果你要安装一堆 RPM 软件文件时,可以使用 rpm -ivh *.rpm ,但若某些软件已经安装过了, 此时系统会出现『某软件已安装』的资讯,导致无法继续安装。此时可使用这个选项来重复安装喔!& R- ?. X# L8 n7 J" r. d0 W$ v
—force:这个参数其实就是 —replacefiles 与 —replacepkgs 的综合体!% E/ h+ f( p) U
—test: 想要测试一下该软件是否可以被安装到使用者的 Linux 环境当中,可找出是否有属性相依的问题。  ?/ m0 w9 d" G
—justdb 使用时机: 由於 RPM 数据库破损或者是某些缘故产生错误时,可使用这个选项来升级软件在数据库内的相关资讯。
! a9 A5 u, f+ x: u7 [. f7 G—nosignature 使用时机: 想要略过数码签章的检查时,可以使用这个选项。; |' f9 e. h9 p. g) J6 b7 P
—prefix 新路径 使用时机: 要将软件安装到其他非正规目录时。举例来说,你想要将某软件安装到 /usr/local 而非正规的 /bin, /etc 等目录, 就可以使用『 —prefix /usr/local 』来处理了。
% g  z' \  F/ R% u0 d—noscripts 使用时机:不想让该软件在安装过程中自行运行某些系统命令。
  l! g# c& r( r+ p: W- D( N4 `, [RPM 查询 (query)  m: M/ J7 s' C7 i
RPM 在查询的时候,其实查询的地方是在 /var/lib/rpm/ 这个目录下的数据库文件。
- B0 f2 E' I" j* J" j  F& J  [" h: O$ g; v. G; F& N* Z  a4 S- \' b' J! \3 l
[root@www ~]# rpm -qa                           <==已安装软件* e( s/ X# a' ~8 U
[root@www ~]# rpm -q[licdR] 已安装的软件名称       <==已安装软件
6 }5 i1 O1 n, W* p1 {[root@www ~]# rpm -qf 存在於系统上面的某个档名      <==已安装软件' X5 B! x, L5 k- v
[root@www ~]# rpm -qp[licdR] 未安装的某个文件名称  <==查阅RPM文件
9 B. M4 B' }: f-q :仅查询,后面接的软件名称是否有安装;6 i* k- [; M' @) R6 H* }' O
-qa :列出所有的,已经安装在本机 Linux 系统上面的所有软件名称;
4 q, Z/ x, P- P1 v6 V& @-qi :列出该软件的详细资讯 (information),包含开发商、版本与说明等;
: n- x. n, a4 f0 v2 q' e-ql :列出该软件所有的文件与目录所在完整档名 (list);4 `8 B' E& ?  e
-qc :列出该软件的所有配置档 (找出在 /etc/ 底下的档名而已)
4 R1 K; W& b/ I" O4 R-qd :列出该软件的所有说明档 (找出与 man 有关的文件而已)6 v2 U6 ^6 ~. N. R5 _
-qR :列出与该软件有关的相依软件所含的文件 (Required 的意思)
$ K/ j! B' M/ O4 P$ C( F( g( o5 M-qf :由后面接的文件名称,找出该文件属於哪一个已安装的软件
' r& b+ l( Z& l* G5 L" o4 }-qp[icdlR]:注意 -qp 后面接的所有参数以上面的说明一致。但用途仅在於找出某个 RPM 文件内的资讯,即未安装的名称
1 m/ o" M% ?: YRPM 验证与数码签章( G: j1 b0 Q1 G, n; ~
验证
! x+ O& f9 m9 h+ G  g2 K; S验证 (Verify) 的功能主要在於提供系统管理员一个有用的管理机制!作用的方式是『使用 /var/lib/rpm 底下的数据库内容来比对目前 Linux 系统的环境下的所有软件文件 』也就是说,当你有数据不小心遗失, 或者是因为你误杀了某个软件的文件,或者是不小心不知道修改到某一个软件的文件内容$ A1 U6 B! r- H' d. Y

" D+ ?  F- {! R1 ]" h3 o[root@www ~]# rpm -Va
/ o, o+ \  Y2 P) S0 W3 k3 p/ h[root@www ~]# rpm -V  已安装的软件名称) u1 A4 B2 q- ]1 b' z* ]
[root@www ~]# rpm -Vp 某个 RPM 文件的档名
# y0 j4 C9 N3 a% B/ `[root@www ~]# rpm -Vf 在系统上面的某个文件( O3 B# C% L  o1 g
  c0 x6 D) I6 K7 K
选项与参数:
$ W' F$ C" C1 H2 @9 i-V  :后面加的是软件名称,若该软件所含的文件被更动过,才会列出来;
4 C% Y# m  @9 ^9 Q8 B! @+ L-Va :列出目前系统上面所有可能被更动过的文件;
  q8 J  q0 `" R# M0 m; O$ Q-Vp :后面加的是文件名称,列出该软件内可能被更动过的文件;
8 m# p$ O. P; F8 h1 m-Vf :列出某个文件是否被更动过~( }$ E1 ]- `' v$ d9 T3 ]& m& x
& L4 F7 E! R5 \/ z- S: {
[root@www ~]# rpm -V logrotate
2 U- E3 P( S: }8 ]2 p..5....T  c /etc/logrotate.conf
! X+ B* C( |9 K6 e第一列的含义有以下几种:
. ~1 e2 {$ `( i+ y( m
7 D1 n  }: M) O# CS :(file Size differs) 文件的容量大小是否被改变
# L: [3 [: S& @$ m) a/ {  NM :(Mode differs) 文件的类型或文件的属性 (rwx) 是否被改变?如是否可运行等参数已被改变, o' n+ [" f! s! s4 a
5 :(MD5 sum differs) MD5 这一种指纹码的内容已经不同9 M" P5 H  Y; Q: @
D :(Device major/minor number mis-match) 装置的主/次代码已经改变
# K9 O4 }. t. v! O0 X) S) q8 bL :(readLink(2) path mis-match) Link 路径已被改变
5 T. T2 {7 w6 E3 I2 B7 B3 X) [" RU :(User ownership differs) 文件的所属人已被改变" m7 ~+ S7 m0 M9 m" {
G :(Group ownership differs) 文件的所属群组已被改变
) M0 `  B3 K$ u! lT :(mTime differs) 文件的创建时间已被改变; R; P% R6 v# Y1 v# W# h
第二列的含义有以下几种:5 d; N6 ~, c- C5 E+ E# k! z
% |# _4 L! Y; H
c :配置档 (config file)1 l& q) G# H% l$ I% c8 \  u
d :文件数据档 (documentation)' p; j% K1 Q/ f6 E$ x6 X
g :鬼文件~通常是该文件不被某个软件所包含,较少发生!(ghost file)
) z3 [2 R0 C; Y4 dl :授权文件 (license file)4 X! w: a2 q( }6 u
r :读我文件 (read me)( _9 h& e  B/ f: S
数码签章) C3 G* j( s+ t- d% Q5 r1 Y
软件开发厂商可以数码签章系统产生一个专属於该软件的签章,并将该签章的公钥 (public key) 释出。 当你要安装一个 RPM 文件时:
. s! [& f" z& U
/ p8 I7 n9 c# L8 \: K! T8 ?首先你必须要先安装原厂释出的公钥文件;实际安装原厂的 RPM 软件时, rpm 命令会去读取 RPM 文件的签章资讯,与本机系统内的签章资讯比对,若签章相同则予以安装,若找不到相关的签章资讯时,则给予警告并且停止安装喔。
( i( D) {9 W* p, k. v3 Y* t' T" ?: A/ i
[root@localhost ~]# ll /etc/pki/rpm-gpg/RPM-GPG-KEY-*
8 S/ u& ^3 u$ T! S9 F# l- @-rw-r--r--. 1 root root 1690 Nov 23 08:16 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-71 I- U+ ]7 _( T( Q4 l8 B2 a
-rw-r--r--. 1 root root 1004 Nov 23 08:16 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Debug-72 ~" f1 `( r4 |
-rw-r--r--. 1 root root 1690 Nov 23 08:16 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Testing-7
! {5 \4 M/ N% I4 S" e; p% m-rw-r--r--. 1 root root 1662 Oct  2  2017 /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
5 N# |. C3 }& k8 g+ [9 h# F7 E-rw-r--r--. 1 root root 1340 Mar 23  2017 /etc/pki/rpm-gpg/RPM-GPG-KEY-remi* s& Q' f0 M# z( Q# R( [( m
-rw-r--r--. 1 root root 3100 Mar 23  2017 /etc/pki/rpm-gpg/RPM-GPG-KEY-remi2017
/ n+ h, H2 @6 C; g& f- D-rw-r--r--. 1 root root 3143 Jan 16  2018 /etc/pki/rpm-gpg/RPM-GPG-KEY-remi2018
6 R8 i9 Y- z7 p- w. rSRPM相关知识2 j3 ^6 V2 g1 ], p6 n
rpm的全称是Redhat Package Manager,SRPM是指 Source RPM 的意思,这个 RPM 文件里面含有原始码,特别注意的是,这个 SRPM 所提供的软件内容『并没有经过编译』。通常 SRPM 的扩展名是以 *.src.rpm 这种格式来命名的。srpm跟tarball的区别就是srpm提供了这个软件所需要的相依性软件说明、以及所有 RPM 文件所提供的数据。# t* U$ j+ ]3 l1 i! v/ }) \/ w
1 X9 ?' l1 {, T9 p8 V
rebuild直接安装2 ~8 ?. l5 b* w# j) k
下载src.rpm包之后,可以在不修改配置的情况下,直接使用以下参数直接操作:, k, Y7 q: m- b! P! I7 D
; u; ~2 a2 B7 \$ l% \
—rebuild:这个选项会将后面的SRPM进行『编译』与『打包』的动作,最后会产生RPM的档案,但是产生的RPM档案并没有安装到系统上。当你使用—rebuild的时候,最后通常会发现一行字体:Wrote: /root/rpmbuild/RPMS/x86_64/pkgname.x86_64.rpm这个就是编译完成的RPM档案啰!这个档案就可以用来安装啦!安装的时候请加绝对路径来安装即可: d3 T' E4 I( e  t6 l3 O  f- _
—recompile:这个动作会直接的『编译』『打包』并且『安装』啰!请注意, rebuild 仅『编译并打包』而已,而recompile 不但进行编译跟打包,还同时进行『安装』了* Z: |2 Y$ S% i5 W0 V- f
示例:
% Q) l: O; r$ x' M& m' M! d  B; S- j+ C+ I7 F3 r$ u8 S
先下载软体:) |1 x" ^0 h7 g; L% W7 }! C# ]
wget http://vault.centos.org/7.1.1503 ... l7.centos.1.src.rpm" `, X! c/ h* `  a2 j8 W, Q- i7 N
再尝试直接编译看看:
4 W6 I5 c8 Q0 r+ `- {& @) b7 Lrpmbuild --rebuild ntp-4.2.6p5-19.el7.centos.1.src.rpm- b' O4 G5 D* ~' H
上面的动作会告诉我还有一堆相依软体没有安装~所以我得要安装起来才行:
- g. a/ K# r" ^$ \6 y; yyum install libcap-devel openssl-devel libedit-devel pps-tools-devel autogen autogen-libopts-devel) P% {. L0 {0 q
再次尝试编译的行为:
5 u# ^2 R, t. n* O' Zrpmbuild --rebuild ntp-4.2.6p5-19.el7.centos.1.src.rpm
( k6 s" a- F2 t# ^1 {2 \8 f4 d最终的软体就会被放置到:2 E) ^, A# L8 W, q
/root/rpmbuild/RPMS/x86_64/ntp-4.2.6p5-19.el7.centos.1.x86_64.rpm) j3 w/ ^0 Y+ ^( W7 f
SPEC编译安装4 L* N# ~# ]/ c, u) U0 v: K* P+ C
目录说明6 }0 C( F, G" l, M7 O
如果你的rpm的版本<=4.4.x,那么rpmbuid工具其默认的工作路径是/usr/src/redhat,这就使得普通用户不能制作rpm包,因为权限的问题,在制作rpm软件包时必须切换到root身份才可以。所以,rpm从4.5.x版本开始,将rpmbuid的默认工作路径移动到用户家目录下的rpmbuild目录里,即$HOME/rpmbuild。
7 |6 z) X! r* {
5 G9 T  F7 P2 T" X) g首先yum -y install rpm-build rpmdevtools,然后rpmdev-setuptree来创建工作目录,也可以不安装rpmdevtools,直接使用mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}来创建。具体的各目录的含义如下:
, q& Q0 ?! F! i* p% ]4 d( h" h. J' e! p9 ~
默认位置        宏代码        名称        用途0 T/ m) B- @& _3 A/ y
~/rpmbuild/SPECS        %_specdir        Spec 文件目录        保存 RPM 包配置(.spec)文件$ w: F: C; e7 q7 R1 G
~/rpmbuild/SOURCES        %_sourcedir        源代码目录        保存源码包(如 .tar 包)和所有 patch 补丁) O! l5 N* s& f8 x! @5 |
~/rpmbuild/BUILD        %_builddir        构建目录        源码包被解压至此,并在该目录的子目录完成编译* d, a; S! Q! ^3 t! T4 `6 D; ~
~/rpmbuild/BUILDROOT        %_buildrootdir        最终安装目录        保存 %install 阶段安装的文件; B( L/ S2 k6 Q
~/rpmbuild/RPMS        %_rpmdir        标准 RPM 包目录        生成/保存二进制 RPM 包
0 T& H/ i3 L" d1 }1 E6 M% e& V. ?4 ~) u~/rpmbuild/SRPMS        %_srcrpmdir        源代码 RPM 包目录        生成/保存源码 RPM 包(SRPM)
3 K- _6 F# h6 |6 i使用rpm -ivh来安装srpm包时,会生成很多文件在/root/rpmbuild下:
+ u) W' k& u# R! G9 ]5 z7 V' W& _' s
[root@localhost ~]# rpm -ivh ntp-4.2.6p5-19.el7.centos.1.src.rpm' U3 Z( z0 O% j4 K& N4 s1 g9 B9 Z
Updating / installing...
# g! n4 Q5 H7 b0 d' {: Y* d* [   1:ntp-4.2.6p5-19.el7.centos.1      ################################# [100%]
+ _7 s0 K/ z7 S  f* ^; W[root@localhost ~]# tree /root/rpmbuild/2 r( s5 H' \, a' h
/root/rpmbuild/
+ H0 P3 W1 ~% c3 U3 W, [, L├── BUILD: s2 g$ @+ \7 ?; D4 _% L3 t
├── BUILDROOT
+ C* D. L9 D0 p. P5 w* O├── RPMS
8 A+ Q6 T, ~7 a├── SOURCES
3 C. ], L: V% I6 a6 w$ O. L│   ├── ntp-4.2.4p7-getprecision.patch* ], \$ b& Q/ H4 O$ J: X6 w
│   ├── ntp-4.2.6p1-cmsgalign.patch- L9 b; b- |& d$ {! f8 W5 j6 G. `5 H
。。。
& G% {- Z0 `+ A# f/ L│   └── sntp.sysconfig
/ M/ U- F4 k; R7 j8 ]├── SPECS
; ~' w( w$ J' ~+ N│   └── ntp.spec# @8 h6 a% X: ?" T5 ^5 B- w
└── SRPMS
9 ~7 l% i& d. W解压完成之后,srpm本身就提供了spec文件,可以直接通过以下方式直接安装:% T0 ?7 d) |2 b$ v/ S0 ?

$ l, i4 q0 J+ \! y# G6 P" ][root@study ~]# rpmbuild -ba ntp.spec   <==编译并同时产生RPM与SRPM档案
% B$ g4 q- r/ ]0 C) @[root@study ~]# rpmbuild -bb ntp.spec   <==仅编译成RPM档案  H  Y* A. k, Y
spec打包流程
) v5 `, q5 t7 N& e1 P" U' \SPECS下是RPM包的配置文件,是RPM打包的“图纸”,这个文件会告诉rpmbuild命令如何去打包。“宏代码”这一列就可以在SPEC文件中用来代指所对应的目录,类似于编程语言中的宏或全局变量。当然~/rpmbuild这个文件夹也是有宏代码的,叫做%_topdir。9 o# H& }; z3 @

  ~+ R6 A( w9 v, M$ y) N& u打包的过程有点像是流水线,分好几个工序:
% g, M" S* U- G( l9 |7 {4 r( N' r& N9 j( j% q
首先,需要把源代码放到%_sourcedir中;  |- L* u- ]$ [/ l4 Q% D
然后,进行编译,编译的过程是在%_builddir(~/rpmbuild/BUILD)中完成的,所以需要先把源代码复制到这个目录下边,一般情况下,源代码是压缩包格式,那么就解压过来即可;& M0 ]8 K3 b7 G# {! z' X2 |$ T7 k# J
第三步,进行“安装”,这里有点类似于预先组装软件包,把软件包应该包含的内容(比如二进制文件、配置文件、man文档等)复制到%_buildrootdir(~/rpmbuild/BUILDROOT)中,并按照实际安装后的目录结构组装,比如二进制命令可能会放在/usr/bin下,那么就在%_buildrootdir下也按照同样的目录结构放置;8 U7 }9 p) u! r8 r
然后,需要配置一些必要的工作,比如在实际安装前的准备啦,安装后的清理啦,以及在卸载前后要做的工作啦等等,这样也都是通过配置在SPEC文件中来告诉rpmbuild命令;% h" }: b% v* Y$ F& s
还有一步可选操作,那就是检查软件是否正常运行;1 X. e' I4 t0 Y" y
最后,生成的RPM包放置到%_rpmdir,源码包放置到%_srpmdir下。& O! w0 d) e) x- j" N5 P
spec文件内容
- W  w& x! H: F' d- H( x: h使用vim a.spec之后,会自动生成spec的结构体,内容如下:
9 b) x* r$ m0 |7 u  F
  n. s3 {! e7 }; U2 C2 c2 eName:                                                                ==>软件包的名字,后续可以用%{name}来引用5 \6 r# Y2 F& K" @4 `$ _9 m
Version:                                                        ==>软件版本0 L1 a9 ~" f0 U0 p8 q1 n
Release:        1%{?dist}                                ==>发布的序号
5 ~# ?4 A' ^9 Z  FSummary:                                                        ==>软件包的摘要信息
) J9 p* D* S5 h6 G* l$ I2 d
4 w3 k6 r3 _2 `  u# p" EGroup:                                                                ==>软件包的安装分类,参见/usr/share/doc/rpm-4.x.x/GROUPS这个文件
- x( O# d, K6 e% [- [! S/ N4 Z7 k6 LLicense:                                                        ==>GPLv2,授权方式, p* V3 k; u* m5 h  f
URL:                                                                ==>这里本来写源码包的下载路径或者自己的博客地址或者公司网址之类,无实际用处
* I- o6 \6 u. [0 gSource0:                                                        ==>%{name}-%{version}.tar.gz源代码包的名称,这里的name和version就是前两行定义的值。如果有其他配置或脚本则依次用Source1、Source2等等往后增加即可。
7 q' u$ X) n# [/ q% n+ N* h, q! H
+ F+ c; m$ N3 H8 R3 A& N  O! \BuildRequires:                                                ==>在本机编译rpm包时需要的辅助工具,以逗号分隔。假如,要求gcc的版本至少为4.4.2,则可以写成gcc >=4.2.2。5 [4 K4 I% r4 ]2 k' k0 ~+ q6 I
Requires:                                                        ==>编译好的rpm软件在其他机器上安装时,需要依赖的其他软件包,也以逗号分隔,有版本需求的可以
) V; g7 ^+ U7 B
0 z/ W' z) ^  Q) f' Q%description                                                ==>软件包的详细说明信息,但最多只能有80个英文字符。
4 W$ [0 |0 E$ O# X& s0 b) E; e# J! j9 g
%prep                                                                ==>读取位于 %_sourcedir 目录的源代码和 patch 。之后,解压源代码至 %_builddir 的子目录并应用所有 patch。( |) M. q6 U) Q3 K" t
%setup -q                                                        ==>使用这个语句实现%prep功能,仅能解压Source 或 patch 定义好的文件2 m" G3 y2 F* w2 y

2 x. v. X# F  e0 n%build                                                                ==>编译位于 %_builddir 构建目录下的文件。通过执行类似 ./configure && make 的命令实现。$ a+ E" \% p/ h( f' @
%configure2 u: q# A2 S$ Z; K& n1 Y- S4 g% y
make %{?_smp_mflags}) j+ D1 D9 _/ u

+ n0 S" F0 I9 N%install                                                        ==>读取位于 %_builddir 构建目录下的文件并将其安装至 %_buildrootdir 目录。这些文件就是用户安装 RPM 后,最终得到的文件。注意一个奇怪的地方: 最终安装目录 不是 构建目录。通过执行类似 make install 的命令实现。
$ T) u3 [  V" P% F) b3 [! Bmake install DESTDIR=%{buildroot}
7 P# n* n; G% k+ J/ J$ s# ^; w4 w9 O' H
%files                                                                ==>软件文件和目录
1 n# ~% }* \$ @' J# |# J%doc                                                                ==>软件说明文件
) X, P  ]' A- X* S; m4 c  ~2 H  v0 w! J" R8 v5 _! d
%changelog                                                        ==>更新说明,星号(*) 后面应该要以时间,修改者, email 与软体版本来作为说明, 减号(-) 后面则是你要作的详细说明啰
4 S$ E+ a/ m. F4 F) F; B除了以上这些,还是以下阶段:
* D' w# O6 w- H& d3 U- |! P9 t6 j
" A9 r9 G2 e) K0 ~% V%pre 在目标系统上安装软件包之前执行的Scriptlet。注意跟%prep的区别。8 o8 p; C) ^9 G
%post 在目标系统上安装软件包完成之后执行的Scriptlet。' f4 l1 r, Z4 d, D5 {% V; e% ^
%preun 在从目标系统卸载软件包之前执行的Scriptlet。
: L1 _( |2 G% O. d" I  _9 x%postun 从目标系统卸载软件包完成之后执行的Scriptlet。
6 ]7 T" {9 B& y1 P, f2 i7 R. f以下介绍一下比较重要的阶段。1 N1 y4 C# C! [6 Z
1 s" `5 A" i* g: ^6 @  P2 l
%prep阶段
: f1 ^+ i- I0 p7 z9 [这个阶段里主要完成对源代码包的解压和打补丁(如果有的话),而解压时最常见到的就是一句指令:%setup -q。这句指令可以成功执行的前提是你位于SOURCES目录下的源码包必须是name-version.tar.gz的格式才行,它还会完成后续阶段目录的切换和设置。如果在这个阶段你不用这条指令,那么后面每个阶段都要自己手动去改变相应的目录。
( d' j# H+ N& a1 w
4 [! o5 a4 b4 X如果在%prep阶段,只使用了%setup这个宏变量,代表了会运行以下操作(假设Source为cdplayer-1.0.tgz):, M8 x/ i( ?$ D. k0 x5 |/ V

" n; r: C9 i! Scd /usr/src/redhat/BUILD, F7 \" |* }, D6 M
rm -rf cdplayer-1.0
: N6 ~, x$ {: c0 Y9 Q) a, ]: J) ?gzip -dc /usr/src/redhat/SOURCES/cdplayer-1.0.tgz | tar -xvvf -; B/ H% N: _8 ]) l1 h
if [ $? -ne 0 ]; then/ D3 \2 e& l: K9 m, @: R
  exit $?8 R, r$ d8 ~: A$ [/ Y' x# ~) [
fi; t; Q' n; a* z
cd cdplayer-1.0* |, X( h, [) }' {; u
cd /usr/src/redhat/BUILD/cdplayer-1.0
+ h- ]+ s5 y/ e( ]2 rchown -R root.root .- T4 l  c$ g; e$ D; |6 I
chmod -R a+rX,g-w,o-w .
2 |% ]' f" v1 I3 ]& y. Q可以看到,默认操作为先进入BUILD目录,然后再删除%{name}-%{version},再解压,最后再修改权限、属主等。参数-q是指不输出运行的过程,还有其他参数如下:
6 b, N& I: e& o+ L) _6 |
0 n5 r1 O7 e$ H7 \- h5 d/ r5 j%setup -n newdir 先删除/usr/src/redhat/BUILD/newdir目录,然后将软件包解压在newdir目录;再进行这个目录进行权限设置
3 u" E; e) f( N9 ^%setup -c 先创建目录,进入这个目录后再解压。与不加参数的%setup比较,仅仅是多了mkdir 以及 cd 这2个命令
- w! ^% i. o; J5 c%setup -D 解压缩时,不会去删除目录。与不加参数的%setup比较,少了rm -rf操作4 A( j' \$ S% \  Z! J- \
%setup -T 不进行解压的操作。与不加参数的%setup比较,少了gzip以及if判断语句
$ R) K, n1 {  i& h! l/ b. t( a6 v- B1 D. |; x) D# |: ?
%setup -b num 将第num个source文件解压缩。如果是 %setup -b 0,就会解压2次,可以使用 %setup -T -b 0,这样就只会解压一次了。但只效果跟 %setup 不加参数的效果是一样的。# h* d/ M. g6 X
%setup -T -a num 先进入目录再解压第num个source文件1 P1 F) ]4 y( ]0 _/ R5 v/ [8 R
1 E$ C/ t0 m8 \8 W0 G, u# g1 o

' f0 T' H+ O0 q, ~3 r%patch 最简单的补丁方式,自动指定patch level。
/ N! m8 G- k& k/ K% X, J2 A& m%patch 0 使用第0个补丁文件,相当于%patch ?p 0。' z5 _, J% i" A% V) w! ^: x
%patch -s 不显示打补丁时的信息。
7 }) R4 G7 Y; ^$ \+ F: M%patch -T 将所有打补丁时产生的输出文件删除。6 q8 t1 d! x/ Y1 Z4 R
*************************************/
" I7 Q1 s8 q# }%setup -q -n %{name}-%{version}
, w" r- ~# l& B, _0 T4 i+ |
' h' l6 c" ^. G( E$ ?+ n! X/* 如果原来只有一个“Patch:”,您增加“Patch1:”,则在SPEC文件%setup行后面的% ]  |9 z% n* N- I
   %patch -p1后面新增一行: %patch1 -p1 依此类推.+ S% i7 \/ h$ }( C
*/" Q! A2 h* \$ g! h; m
%patch0 -p1; J- M- u3 m% p
实例,如果%prep的内容如下:
2 @# [# p8 n$ n+ P& |" l: I8 r8 p( S2 D; R, E
%prep$ `& m7 d3 S% D1 |! I% }
%setup
# j* w4 W+ L& U  @" \. g/ v% O! x%setup -T -D -a 14
( [; Z% C, b1 Q9 v. R: C%setup -T -D -a 15( v, ]0 f9 y2 G- g  {
其运行的过程如下:: r& V0 I9 }! o
8 \! D* u+ L' f+ T7 h- V: v
[root@localhost SPECS]# rpmbuild -bb nginx.spec
+ @4 l/ ~) E1 HExecuting(%prep): /bin/sh -e /var/tmp/rpm-tmp.N1Tdpo
. @8 H6 _" J; I- L! _+ umask 022
" V, x! w: H# W# g+ cd /root/rpmbuild/BUILD6 u+ I0 R; L0 U  {
+ cd /root/rpmbuild/BUILD
; e: B' k* v% V4 i, d: q1 F+ rm -rf nginx-1.16.1
1 B4 C' e- V3 o# W! D9 c- C+ /usr/bin/tar -xvvf -+ J5 y. J7 p; H+ T! `1 \4 G2 U
+ /usr/bin/gzip -dc /root/rpmbuild/SOURCES/nginx-1.16.1.tar.gz
% t- m. I6 f4 E* M) I7 _& |...
! r) G/ p  ~  P& S6 \+ STATUS=0/ h7 S5 h3 F! A0 F) h
+ '[' 0 -ne 0 ']'
# u6 e+ ]4 C" H+ cd nginx-1.16.1
4 G1 L" ?, N3 ^& r! k4 D+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .' X# s3 D# Q) a1 ^6 }
+ cd /root/rpmbuild/BUILD$ c3 S: q2 H$ x1 i8 H2 q$ ?; \
+ cd nginx-1.16.1/ p1 e6 a) B& e8 m, |1 |7 r# t
+ /usr/bin/tar -xvvf -
' d) U, t+ a0 y- l/ v+ /usr/bin/gzip -dc /root/rpmbuild/SOURCES/nginx-http-concat.tar.gz) L( j( G; g/ L4 M8 p. C. d
...2 U9 p# q. C# e0 `! H
+ STATUS=0
4 C5 s& H! G, s2 ?0 Y  C  D+ '[' 0 -ne 0 ']'
2 O& d9 ~/ `$ k; n$ z4 P+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
$ K5 `' B+ @0 F4 g+ cd /root/rpmbuild/BUILD6 c6 h9 e& l& l# n- a
+ cd nginx-1.16.1# F: M3 y- J  n7 A6 S' G
+ /usr/bin/tar -xvvf -) s/ G3 w' o; O$ u/ u
+ /usr/bin/gzip -dc /root/rpmbuild/SOURCES/ngx_cache_purge.tar.gz
  e4 g& P0 _5 D8 F8 C& s...3 ~4 r( V: d: F# G! ~6 p* I4 j
需要注意的是,%setup -q 是指解压不输出任何提示消息,只会解压source0的文件,即第0个source文件。%setup -T -a num 先进入目录再解压第num个source文件,进入目录的意思是进入%{name}-%{version}这个目录,即spec前面定义好的Name以及Version。
7 S  J& t! B! i# b" n5 Q( q
$ j1 ~) H6 [4 q9 j2 K% B1 Qhttps://book.huihoo.com/maximum-rpm/s1-rpm-inside-macros.html5 F0 I2 b1 J5 z( ^
; I- T) ~  _  v5 Q
%build阶段
6 v- L* c) R8 q% O9 s+ g这个阶段就是执行常见的configure和make操作,如果有些软件需要最先执行bootstrap之类的,可以放在configure之前来做。这个阶段我们最常见只有两条指令:4 p% U' n2 J& l/ p2 i6 u5 G

% |. E7 M2 k+ O( z: f8 ?% \%configure
, e9 u' O2 M! w% pmake %{?_smp_mflags}- G. U5 Q' h0 D5 I3 W* ^
这里的%configure是个宏常量,会自动将prefix设置成/usr。另外,这个宏还可以接受额外的参数,如果某些软件有某些高级特性需要开启,可以通过给%configure宏传参数来开启。如果不用 %configure这个宏的话,就需要完全手动指定configure时的配置参数了。同样地,我们也可以给make传递额外的参数,例如: make %{?_smp_mflags} CFLAGS="" …
& x; c+ Q% ]# [( {( ?( L) |, q: W/ ?: L# @! T, ~0 D3 R
%install阶段
9 S& v1 M. c- [. }& {这个阶段就是执行make install操作。这个阶段会在%_buildrootdir目录里建好目录结构,然后将需要打包到rpm软件包里的文件从%_builddir里拷贝到%_buildrootdir里对应的目录里。这个阶段最常见的两条指令是:
% W' A) i1 A7 `" F" f
8 [8 r; w1 {4 m+ ^% w' u  O! qrm -rf $RPM_BUILD_ROOT
# i( A- s% b3 B/ ~" cmake install DESTDIR=$RPM_BUILD_ROOT9 y( S- l1 ]. i2 h; C9 g  Y# b3 O
其中$RPM_BUILD_ROOT也可以换成我们前面定义的BuildRoot变量,不过要写成%{buildroot}才可以,必须全部用小写,不然要报错。9 L4 C+ A- G0 c1 G) w# {- C: b0 X2 n: g
! p% a( @4 V3 {6 g7 N
如果软件有配置文件或者额外的启动脚本之类,就要手动用copy命令或者install命令你给将它也拷贝到%{buildroot}相应的目录里。用copy命令时如果目录不存在要手动建立,不然也会报错,所以推荐用install命令。3 c- S& ~* ]( B8 z" h2 o, W

# }) v& U- H1 J' J5 \- k: D" D制作rpm软件包的阶段
5 s9 j% {5 Y2 j+ \这个阶段必须引出下面一个叫做%files的阶段。它主要用来说明会将%{buildroot}目录下的哪些文件和目录最终打包到rpm包里。
1 j) Z0 C$ \) d- |# [3 `
. R3 t3 H5 i4 `  f) b) A* ?%files$ D3 X6 v9 R! f
%defattr(-,root,root,-)
/ D5 a- _3 f6 ~3 [. P# `%doc$ U1 k# {1 j4 v# j
%defattr 表示的意思是: %defattr(文件权限,用户名,组名,目录权限) ,如果不牵扯到文件、目录权限的改变则一般用%defattr(-,root,root,-)这条指令来为其设置缺省权限。
' U$ H0 ~* w8 j: o# x' \" E- \9 \  d& U" z6 ~$ i2 J+ A
关于%files阶段有两个特性要牢记:  e  d/ R- q. x) a1 [- Y0 l% X& c

+ {/ O, |) r( i) z%{buildroot}里的所有文件都要明确被指定是否要被打包到rpm里。什么意思呢?假如,%{buildroot}目录下有4个目录a、b、c和d,在%files里仅指定a和b要打包到rpm里,如果不把c和d用exclude声明是要报错的;
! Q/ L$ H  q# t4 {( i如果声明了%{buildroot}里不存在的文件或者目录也会报错。
- e  P7 P, y$ q, E1 [! t4 [代表路径的宏列表+ ~3 {6 a! R; M* j
如果您看到一个不熟悉的宏,您可以使用rpm --showrc 或者 rpm --eval %{_bindir}以下方法对其进行查看:4 A6 V7 ^; ?8 U$ F8 W1 v
6 |4 B; Y! [" B
$ rpm --eval %{_bindir}: h7 l6 i1 ]" d7 D9 n8 ^4 U$ G
/usr/bin' q+ k* r& l8 Z$ ]" G- }; S
' P! B) V( Y1 }4 l$ d6 S
[root@localhost noarch]# rpm --showrc |grep buildrootdir
  L$ l- ]2 f# ^+ g) I# `-14: _buildrootdir        %{_topdir}/BUILDROOT0 O8 p7 e  \+ c3 f5 z8 P; K
-14: buildroot        %{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch}
* S2 @* T8 d$ T+ O也可以直接查看/usr/lib/rpm/macros文件,以下是常见的宏:
7 ]1 V1 {! |1 K+ X5 _$ U( |" N3 n  s+ y0 h* s
%{_sysconfdir}        /etc, l$ w, N1 Q& N: R, M' o9 f+ i' P
%{_prefix}            /usr
1 R4 B6 P4 z$ P%{_exec_prefix}       %{_prefix}' V6 N2 D, z( V7 `" q
%{_bindir}            %{_exec_prefix}/bin  Y+ @% w0 S4 m, O7 Z
%{_libdir}            %{_exec_prefix}/%{_lib}
1 p" o6 K7 s8 l- N3 O0 n, [) E%{_libexecdir}        %{_exec_prefix}/libexec
1 [  m0 W/ `/ o% q%{_sbindir}           %{_exec_prefix}/sbin
9 L' y& p6 w. q) S3 ~%{_sharedstatedir}    /var/lib
& D" V, S9 M: }9 R%{_datarootdir}       %{_prefix}/share
) z6 Q6 t0 }) N( X4 }%{_datadir}           %{_datarootdir}: i7 ^- \  x' d- D+ |* @- X
%{_includedir}        %{_prefix}/include
1 \2 Q4 `" B  G% p' o+ h) }2 B4 {3 e  g%{_infodir}           /usr/share/info1 Y- N6 H) J. A0 v- {% @, ~9 |7 E
%{_mandir}            /usr/share/man% m* M% ]0 d2 c7 z
%{_localstatedir}     /var
* G, i  s# J3 x  S. V8 u2 C%{_initddir}          %{_sysconfdir}/rc.d/init.d
0 C8 N$ Q, g9 {' Y- n%{_var}               /var
' }( n$ c1 T' j( C' U- _%{_tmppath}           %{_var}/tmp
& E2 |/ t4 n  o% o. Z( w' Y%{_usr}               /usr
, \" V6 R  @) O+ y' ?3 r% C%{_usrsrc}            %{_usr}/src
# L  z8 }) ~! k; }) C4 w%{_lib}               lib (lib64 on 64bit multilib systems)
% j  x1 e6 x/ Y8 j0 Y%{_docdir}            %{_datadir}/doc) h) U9 B4 ]9 t
%{buildroot}          %{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch}
1 R' h' m- f) n: h3 {; o" k' z9 N$RPM_BUILD_ROOT       %{buildroot}( V2 S7 @' E# D1 @+ X* O" r2 A9 k
要注意的是%{buildroot} 跟%{_buildrootdir}不同。%{_buildrootdir}对应的目录是~/rpmbuild/BUILDROOT;而%{buildroot}是%{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch},有关其他内容可以参考 https://fedoraproject.org/wiki/P ... PM_directory_macros6 [4 T4 z" y! U  L
! ]6 y. e: M, O; R. J
实例1:打包shell
3 d$ Y4 N. W# @- t6 h5 u可以把一个平时写的一个脚本打包成一个rpm包,spec文件如下:
+ ?) `+ a9 ]  Z
2 U) R6 T7 X, H. D+ A' A4 w$ ^[root@localhost SPECS]# cat disk.spec
0 O6 L$ J) T0 C( f/ u& oName:                showdiskinfo
! x* U0 f+ p+ ]( _Version:        1.0+ f+ Y" n' |9 |) z, ~7 ~
Release:        1%{?dist}
( X( v0 `) A" H& j! eSummary:        Show Raid and Disk info
+ C& j( [# S, [0 d& ULicense:        GPL' E7 s- G7 Z& e6 U1 \
URL:                http://www.wumingx.cn
/ V  z# y  i! ?) K0 u5 M" f" |, MSource0:        showdiskinfo.sh
5 g0 f6 [" K, z; Z* t4 {$ K3 u$ N6 X  c, k
#BuildRequires:
, [' F6 x) b+ ARequires:       bash
. P. L" h  K6 u0 W
, `4 X# o, ~5 q4 B* I%description+ L- c1 X  V: q
showdiskinfo shell script.
' y. K' o5 L; |" s9 ^
: o1 S( h* S  ?9 R1 e' M6 i%prep
% b* U/ W2 e. {2 R9 H5 J9 _! ?#%setup -q" |, ?* k& _  ]% D. |7 ]

6 D, w3 l9 d. E6 ?/ B. ~+ f7 |%build3 m# ^1 ?: f9 D" D2 {0 E* W' k
cp %_sourcedir/showdiskinfo.sh %_builddir/showdiskinfo
2 E. Z% |; ?9 H  {4 I, C) B- X6 d% G& B# Z. w3 H6 k3 v
%install
4 B7 E% G  F( K8 Mmkdir -p %{buildroot}/usr/local/bin0 `% h& q. v, w: ]5 K  S* J/ a
install -m 755 showdiskinfo %{buildroot}/usr/local/bin2 M3 T& u# h) Z7 g
+ S" \! j4 g8 k
%files  p. ]" |, Q& N7 K; Q
/usr/local/bin/showdiskinfo
3 M6 W/ o% E1 x  O& s. D8 g%doc
2 o$ C3 e, u# s! E% h  i" m2 S0 r%changelog
4 z2 l0 P% ^* }8 f  s; b2 I* E开始编译:5 M5 k/ z5 `9 @0 j! A

. H7 t/ `- W( k) _2 v8 q[root@localhost SPECS]# rpmbuild -bb disk.spec
2 ~1 H3 W" {) N4 k1 mExecuting(%prep): /bin/sh -e /var/tmp/rpm-tmp.agda2b2 K# D" m5 A1 S$ ?! {' T
+ umask 022
/ Z* l) Q5 ]3 \$ t) n0 E" C, r+ cd /root/rpmbuild/BUILD
/ n* V& y. }' O9 V7 z' x# b+ exit 03 |7 k4 x6 A6 _5 \. j
Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.spexQx
: R/ Q/ C; }* t7 ^1 X+ umask 022* F- l4 s% w* N5 `1 x, R2 s
+ cd /root/rpmbuild/BUILD. T7 w) P! V; t6 b
+ cp /root/rpmbuild/SOURCES/showdiskinfo.sh /root/rpmbuild/BUILD/showdiskinfo$ }9 c3 C% g: W" R
+ exit 0
% v% w% U, X! j& h- C, k- RExecuting(%install): /bin/sh -e /var/tmp/rpm-tmp.grcfHT
. {/ o" V0 K" s' K& n8 q4 x6 E+ umask 022
) B; D2 C0 m" G' f# Q! N+ cd /root/rpmbuild/BUILD
; G+ k2 |/ s6 T. K/ u& W9 e+ '[' /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64 '!=' / ']'3 H+ A% }8 e6 E+ r# ^: C0 y
+ rm -rf /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64$ [) X; N7 E' X$ h* |( o" V
++ dirname /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64- l# n1 f+ z+ z2 O- r
+ mkdir -p /root/rpmbuild/BUILDROOT
$ J0 D/ [! V) s+ mkdir /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64
6 P) s$ t* ?. f2 X) ]7 ^  Q+ mkdir -p /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64/usr/local/bin" ~* f# t# a: i6 ]2 z6 K$ t
+ install -m 755 showdiskinfo /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64/usr/local/bin
- i: i" C' Z* U  f+ W1 z; u3 O+ /usr/lib/rpm/check-buildroot# ~: ?8 v, ^$ g6 v; h" [  k# x
+ /usr/lib/rpm/redhat/brp-compress
/ J9 b) F$ X, p8 x8 c+ p- q, Y+ /usr/lib/rpm/redhat/brp-strip /usr/bin/strip' s8 V' {6 A2 I  Q# Y3 F4 b
+ /usr/lib/rpm/redhat/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump! A3 \8 S- \& R9 \$ |
+ /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip
) D8 J3 x/ N; Z+ i0 U) o( X# H+ /usr/lib/rpm/brp-python-bytecompile /usr/bin/python 1) \& M. p* J+ Z5 a) ?2 g
+ /usr/lib/rpm/redhat/brp-python-hardlink
( K$ S3 y2 S/ d# P1 b+ /usr/lib/rpm/redhat/brp-java-repack-jars6 g( c! v" `* S- A+ Z
Processing files: showdiskinfo-1.0-1.el7.x86_646 w7 s- Y8 g2 _1 r* U
Provides: showdiskinfo = 1.0-1.el7 showdiskinfo(x86-64) = 1.0-1.el7" l" c& C. X- K1 Z  u1 ?
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-12 Z. N4 H; _2 U
Requires: /bin/bash4 s. B3 [' T5 z9 V& \
Checking for unpackaged file(s): /usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64. h9 b: y7 X3 p, A% f
Wrote: /root/rpmbuild/RPMS/x86_64/showdiskinfo-1.0-1.el7.x86_64.rpm
/ i1 g5 p) a5 {7 F4 _; M+ _  yExecuting(%clean): /bin/sh -e /var/tmp/rpm-tmp.4uHq3D
" {3 i2 T$ A1 m+ umask 022
; t3 K8 L" P1 N+ cd /root/rpmbuild/BUILD" U0 m1 P' I; ~9 P( b5 i# n7 E& e, |
+ /usr/bin/rm -rf /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64
' @% u4 j' g1 s4 Y" j+ exit 05 ~* n4 G/ v0 h* ?3 l/ x# N& p5 W
可以看到编译成功了,文件保存在Wrote: /root/rpmbuild/RPMS/x86_64/showdiskinfo-1.0-1.el7.x86_64.rpm下,开始查看:
3 B& \% [8 p+ w$ v+ E9 z
9 G8 C6 ?5 |1 V5 L2 i7 `7 H[root@localhost SPECS]# cd ../RPMS/x86_64/) W: n# w# k7 _0 s
[root@localhost x86_64]# rpm -qpi showdiskinfo-1.0-1.el7.x86_64.rpm
6 D1 ^7 q4 l# `0 lName        : showdiskinfo6 I+ M/ Y. B6 @0 _1 |8 D4 G. _
Version     : 1.0
8 q( z6 R* M: j' {, D. J' l0 ERelease     : 1.el7
9 L+ F5 i/ G; K% k  O* y( ]Architecture: x86_64
! g& N6 \- p0 W* p- ?3 kInstall Date: (not installed)- a- D# ^: x! q/ l5 s
Group       : Unspecified% D: g. v. d2 p) b& K5 M$ o
Size        : 38390
4 p+ {! d4 C5 wLicense     : GPL; w2 e' c( y9 `! c
Signature   : (none): m+ V  m7 H* K' D2 S! {8 {
Source RPM  : showdiskinfo-1.0-1.el7.src.rpm0 e1 ]' P2 o& O
Build Date  : Fri 08 Mar 2019 06:41:42 PM EST
9 b3 d/ @8 {  N( w" pBuild Host  : localhost7 F* v& B8 Q3 Q& E. C( L' G
Relocations : (not relocatable)
! r: G0 @( [, pURL         : http://www.wumingx.cn
# S) u3 p* K2 x) f/ v; ~6 XSummary     : Show Raid and Disk info! Q2 {! Y/ X% U' ~% O4 R6 {
Description :
9 f" I# h' r, F& t, Tshowdiskinfo shell script.: f7 _/ }9 v' |  K8 D1 n& M. z
[root@localhost x86_64]# rpm -qpl showdiskinfo-1.0-1.el7.x86_64.rpm; P7 R* X, a: c6 R, o
/usr/local/bin/showdiskinfo
8 _8 @9 V2 B( ~& p/ u0 `7 ^#开始安装4 G* d! d6 ^- k! g# z3 G
[root@localhost x86_64]# rpm -ivh showdiskinfo-1.0-1.el7.x86_64.rpm+ Y! G) d- J# U# a: V. O: l, m+ ^2 a
Preparing...                          ################################# [100%]
2 ^4 }; Y$ U1 O7 U2 W; FUpdating / installing...5 Q1 F5 q0 W- Y- f  Z
   1:showdiskinfo-1.0-1.el7           ################################# [100%]3 u# P8 q4 d5 {$ h& X' N
[root@localhost x86_64]# ll /usr/local/bin/
4 i) u$ J4 Q1 B1 C9 E( U) t4 d4 w, b1 ?total 40% n& {, I8 X0 i! Z: S. f/ l9 |
-rwxr-xr-x. 1 root root 38390 Mar  8 18:41 showdiskinfo
; q7 }( ~& o( V' r; I[root@localhost x86_64]# showdiskinfo
2 C- k- b) m7 z( Uno raid% M" W, O& G: F$ M
此内容参考了 https://rpm-packaging-guide.github.io/#hello-world ,可以阅读原版。
  D  c" U: H# |" C2 y& t6 k# T
5 L! |6 [( i+ R; z" K; ?* Q4 j实例2:打包main8 T& H$ X& s$ |; d. [) x
此代码来源鸟哥私房菜,先来处理原始码的部份:
* Z$ R! k5 Z& l- @
" S! `' a# K' a[root@study ~]# cd /root/rpmbuild/SOURCES / s) E) o, B9 r1 j1 P
[root@study SOURCES]# wget http://linux.vbird.org/linux_basic/0520source/main-0.1.tgz
# I. v& j- \: I" j2 p[root@study SOURCES]# wget http ://linux.vbird.org/linux_basic/0520source/main_0.1_to_0.2.patch
% j8 N$ J! M+ L[root@study SOURCES]# ll main*1 F! [% I3 f9 s& H* K: S# f
-rw-r--r--. 1 root root 703 Sep 4 14:47 main-0.1.tgz
* y8 A, u; w: k; o4 A' x-rw-r--r--. 1 root root 1538 Sep 4 14:51 main_0.1_to_0.2.patch1 T* h7 k5 x; \3 A& d
到SPECS目录下创建main.spec文件,建议使用vim创建,会自动生成格式。也可以用rpmdev-newspec -o Name-version.spec命令来生成SPEC文件的模板/ H7 {  L3 S; S
4 ^' @" E- R; ~+ Z$ o7 K
[root@localhost SPECS]# cat main.spec
3 E" C0 O& ]* yName:                main
7 r# E6 z& H. J# B; F- S+ \/ [% PVersion:        0.1
/ @5 P8 c4 x! Z; g! d# ?  w& GRelease:        1%{?dist}
$ X+ Q4 k' O# b3 x  l! nSummary:        Shows sin and cos value
5 U( Q7 b+ D) d/ B2 M) F3 z" \* _% m' R
Group:                Scientific Support
3 w3 T) {# w1 u; FLicense:        GPLv23 T& i: S! l  d$ i% n
URL:                http://www.fangdm.com/
, f6 O2 D" a4 \1 X6 FSource0:        main-0.1.tgz; k" b6 m: J2 q# z8 d1 u8 E
Patch0:                main_0.1_to_0.2.patch
7 d2 [7 k; {1 d7 \$ @) K. l5 J0 A/ B5 I3 |; m, l
#BuildRequires:
0 N, r& D9 y+ N& {, |/ Y% B#Requires:5 Y( j0 _3 Z/ }- {# l
$ m. ?, C/ [# Z. W  D) A
%description
7 o" C/ @& A- Z2 N+ S& SThis package will let you input your name and calculate sin cos value.
2 L* Q: @0 q. V) C' d! L) }: ^+ ?$ \0 \2 K: m: a  s
%prep' I" C# I6 a( ~% B5 Q1 X
%setup -q6 c2 ?9 [) |  |; P
%patch0 -p19 l4 m) c7 |* F8 A$ k8 {0 V- K
) x; S7 E, e: O1 G+ u9 L2 q
%build2 x) i, a  ]6 j  C& b$ Q
make clean main
. X9 D- w3 B. W' ?) w8 k) a& o$ _, \/ ^! A" s
%install
/ ^- U8 h1 I) m5 H" L$ a1 `9 ^2 \mkdir -p %{buildroot}/usr/local/bin
  W. g$ d$ P- C* n4 x* L" t* h$ n- u  Ninstall -m 755 main %{buildroot}/usr/local/bin/ n% Q  r1 z( d

3 u( z! C# e6 t# u%files% j. x8 r& A! `
/usr/local/bin/main, e* v$ n0 x- N/ B: Y
%doc9 {! S7 n; y6 u7 S% q  d
" _( I/ n& e& z3 t8 S% F
%changelog
! H  u4 Y0 {" e8 Y) Y0 G* Wed Sep 09 2015 VBird Tsai <vbird@mail.vbird.idv.tw> 0.2+ v* \  R$ i! R9 r) o
- build the program
3 e+ {/ Z6 r9 b0 s) G$ y然后就直接编译rpmbuild -ba main.spec,再安装rpm -ivh main-0.1-1.el7.x86_64.rpm
, J( U% s& v+ {2 i
0 r) h/ b2 O0 ^4 v- e% q; K[root@localhost x86_64]# rpm -qi main6 ~0 K8 V9 x0 }% T3 k
Name        : main7 g$ h8 f' r  b) S" e5 l/ j
Version     : 0.1
1 C! S4 e8 G. O' ~6 ]/ sRelease     : 1.el7
4 X& [  H, n6 d( I' |Architecture: x86_64
/ X4 z- u6 j, [! P- N7 ^2 V/ cInstall Date: Thu 07 Mar 2019 05:42:50 PM EST
! R2 F' ?; J' B( c  Y" lGroup       : Scientific Support; V6 k4 e% T0 `% {( m: \5 G5 q) O& n
Size        : 7272
" B" u# C! [0 I) `6 G+ W( N1 ELicense     : GPLv2, F9 j- ^, V; v: l/ A/ L
Signature   : (none)
$ \6 R- r9 N9 _  e6 D( R8 QSource RPM  : main-0.1-1.el7.src.rpm- {1 _2 f3 R0 i! e+ X
Build Date  : Thu 07 Mar 2019 05:42:07 PM EST4 O/ f6 e3 C/ k6 u* K4 _; G1 K8 V
Build Host  : localhost: s) Z3 J9 V4 `, G
Relocations : (not relocatable)) G# K9 Z8 r' g4 R2 `
URL         : http://www.fangdm.com/- f1 r( J# R# O  H$ B/ ~/ B1 K/ E& H
Summary     : Shows sin and cos value* I- f& s8 Y/ c& ^5 j1 X" l6 H
Description :
! m( `; J, u* k5 T( U9 ^This package will let you input your name and calculate sin cos value.& A* J) ~0 j" y" s- b
实例3:打包hello. S3 d) y! D! l  M
使用区域语言(Locale)文件的程序应遵循 处理 i18n 文件的建议方法:0 {7 F+ `, v0 Y8 |. f
$ B) [! e4 t8 L" c
在 %install 步骤中找出文件名: %find_lang ${name}
* n0 b. V( s9 R+ b; n1 l添加必要的编译依赖: BuildRequires: gettext4 x  z, a8 B$ f- m+ U: |
使用找到的文件名: %files -f ${name}.lang
; g5 V, K0 O/ l5 F, `%find_lang此宏将找到属于您的包的所有语言环境文件(按名称),并将此列表放在一个文件中。然后,您可以使用该文件包含所有语言环境。8 u: m% B" e1 l$ E: A

" m1 m" T& i* Q[root@localhost SPECS]# rpm --eval %find_lang
  h" V+ {" u, |% O3 o8 B/usr/lib/rpm/find-lang.sh /root/rpmbuild/BUILDROOT/%{name}-%{version}-%{release}.x86_64' s2 r$ x; t6 W& n$ P, H
[root@localhost SPECS]# rpm --eval %make_install
( A; G* p# C- ^( \  X# S/usr/bin/make install DESTDIR=/root/rpmbuild/BUILDROOT/%{name}-%{version}-%{release}.x86_64" N' A4 o1 @# t' }' N' k, n4 H
%find_lang %{name}在这个spec里面等价于/usr/lib/rpm/find-lang.sh /root/rpmbuild/BUILDROOT/hello-2.10-1.el7.x86_64 hello
! [( L# _+ H) }: A! d* w" L9 D4 y* _9 W1 m: A$ o$ P3 j
而引用的方法是:%files -f %{name}.lang即可。/ _6 r" a: m/ z8 X0 }4 H

; r$ F" I# ~4 f3 S* T%make_install是等价于make install DESTDIR=%{buildroot}。
8 n8 ^+ A4 a6 e4 P8 {% y# l% E' U  u8 Q# E7 e9 j1 G- z
[root@localhost SPECS]# cat hello.spec
- E4 u; f" ~* XName:           hello4 F* i! @5 W: k) O1 N/ V3 X+ X
Version:        2.105 I- a, ~) V2 ?$ V
Release:        1%{?dist}0 ~* i* Q+ {% [0 b
Summary:        The "Hello World" program from GNU
$ v" V1 ^6 o. s  {" ?1 C" o2 c1 i) j9 {7 E$ d
License:        GPLv3# [4 x0 y" u$ k; S; d, d) `5 F# w
URL:            http://ftp.gnu.org/gnu/hello/4 ?. d& D0 G* L  `: H- D  }
Source0:        hello-2.10.tar.gz4 c5 V% K: R$ l) Y$ Z, ~
2 \8 Z8 ^( G+ H( ^: u5 e
BuildRequires: gettext
; l% \- i; h# Y& x4 u1 ~#Requires:
& l4 s, P+ Z6 h5 u1 n' W8 Q2 x4 G2 W! ~! k8 w- k' C
%description: y% A2 R7 K% F$ Z' \% c2 h
The "Hello World" program, done with all bells and whistles of a proper FOSS
( _% \1 |( [" N) lproject, including configuration, build, internationalization, help files, etc.
, Q) {4 g9 _6 J% c' E
' V4 b" j$ e  p6 h%prep
" ?; a) J- |; y. a( w%setup -q
, g( _+ o6 \; ^* y) c! e- Y3 N2 n: c, S& M. h" U3 N) E9 X

( N/ j( i3 D8 q* T' y%build9 r, n$ }: C: W! ~3 j5 h/ h9 T* @+ Y1 ]
%configure
- j$ i1 e: V7 G6 B6 Emake %{?_smp_mflags}4 m, N% c$ F" j7 g$ {# q

% _+ g) S5 }0 u" r3 x4 a%install; p# A  x; M9 v, [8 o
%make_install
4 c/ x$ T# k7 \6 n) C%find_lang %{name}5 p: l7 {5 ], F7 B$ W! n6 q
rm -f %{buildroot}/%{_infodir}/dir7 o9 N0 l4 X" t0 Y1 r* s& Y7 a# q
  h( ]/ F* j0 s" @
%post: e; D$ u; f  U" `  J
/sbin/install-info %{_infodir}/%{name}.info %{_infodir}/dir || :3 O0 X5 d1 M( R$ I# S& g
+ H7 A$ c7 _+ p+ ~+ m) s9 J" ^% \
%preun
4 `- ^, E7 `; X' \( g, r( x; Q: {. Iif [ $1 = 0 ] ; then
- Q* Z8 b- E. N3 g6 m3 b1 ~/sbin/install-info --delete %{_infodir}/%{name}.info %{_infodir}/dir || :- b: H4 ]$ N( N: Q
fi+ Z4 b3 K# [1 {# [# ^0 p! P3 {* T# G

* D7 ?; o8 ?$ D" G%files -f %{name}.lang% ]0 ^& r" L/ K0 D- b8 j
%{_bindir}/%{name}- n* X8 C1 Z8 u3 R: N

& z" r( w/ O3 e0 N8 [%doc% E9 ?& W' i. z. s( `
%{_infodir}/%{name}.info.*. \0 a5 @9 |+ t! r1 l
%{_mandir}/man1/%{name}.1.*# f5 q4 G; }5 V  c

0 V* r3 f( s+ Q# ~  B; `%changelog0 Y; ?: h/ Y; i$ ^6 ]
然后直接rpmbuild -bb hello.spec进行编译,此实例来源于:https://fedoraproject.org/wiki/H ... o_RPM_package/zh-cn
, A8 ?- R1 O9 o4 B
0 f" o: e5 R: Y0 \5 \# z7 y实例4:打包smartmontools
1 E, [2 h7 F1 S' t5 B/ ~0 X2 tsmartmontools 7.0已经支持json格式的输出,对于采集的话,有很大的优势。目前在centos官方上面可以找到centos7的包,如https://cbs.centos.org/koji/buildinfo?buildID=25069,但是还没有centos6的,所以需要自己写一个spec。5 B, p, {  M; h% S3 _  X7 u
; W: G5 ?9 D$ d. k5 a
访问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文件了。4 H: f2 F% L- K* ^9 k. K7 B" W

' c4 G9 W3 g0 V5 E- @[root@7ftbv7mdz7cdpc ~]# cat smartmontools.spec
$ L( w: }1 {9 s: Z3 d  RSummary:        Tools for monitoring SMART capable hard disks4 A  h# m$ a) G% [# T
Name:                smartmontools
. Z  @, D* {0 c& X1 \% BVersion:        7.0
9 m" l4 z" Y% ]Release:        3%{?dist}
: g7 U2 a9 N+ |. A* q( O& oEpoch:                1
6 O+ v/ Q  m& WLicense:        GPLv2+
# f9 p6 l  `: gURL:                http://smartmontools.sourceforge.net/; Y5 s0 _8 e5 h0 Q  D0 b
#Source0:   http://downloads.sourceforge.net/%{name}/%{name}-%{version}.tar.gz/ q3 q: @, |& ~' N5 j1 `+ j
Source0:        %{name}-%{version}.tar.gz5 k! A, w, P: S0 G- w! ?
Source1:        smartd.initd
) i7 w. v8 s' X7 s: _Source2:        smartmontools.sysconf) z9 F7 q7 S, \" c( H/ k/ F
Source4:        smartdnotify4 d) E3 f! A! |  F3 a3 z/ H" K
#semi-automatic update of drivedb.h
8 s& H9 G7 u/ w3 D4 `6 ~- ^3 A/ x- i%global                UrlSource5        https://sourceforge.net/p/smartm ... rivedb.h?format=raw
2 S) k% q2 ~& n0 T; a% fSource5:        drivedb.h  [  D4 M* F# D8 ^+ [
% F! E# y7 B  J& F, m& s, Q4 y
#fedora/rhel specific! J6 W8 r# a, M- U% N
Patch1:                smartmontools-5.38-defaultconf.patch( j8 ^( v, G: O; n5 A+ Q! m. o

: T" \- v) Y- p#BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)- k. `! N  g( N( D
Requires:        fileutils chkconfig initscripts9 a, `  h( W/ z
BuildRequires:        readline-devel ncurses-devel automake util-linux groff gettext
4 K; ?% T/ Q  U; {BuildRequires:        libselinux-devel libcap-ng-devel
0 W5 z9 _" W$ L* ?5 E5 ]: `+ f. Q2 d1 q' f
%description  Y! L8 Y/ R9 M! t  O* _3 `/ b8 K
The smartmontools package contains two utility programs (smartctl  y( a2 E1 w* `
and smartd) to control and monitor storage systems using the Self-- c; y* |, Z8 P: Z
Monitoring, Analysis and Reporting Technology System (SMART) built6 R6 `" U+ }; U& \1 r' S6 v
into most modern ATA and SCSI hard disks. In many cases, these
1 X( A( |" t! h: ]1 K+ |utilities will provide advanced warning of disk degradation and7 J. O* j% _' }
failure.) d- m9 s: |/ j  L) U

2 `6 O5 e' h% U" y2 J( ^3 \* w8 C%prep0 U/ c& S8 V8 M; C: E3 Q
%setup -q
( U8 w" S  M" `  }%patch1 -p1 -b .defaultconf
9 P6 i8 q- {3 l4 n0 J4 z
& `5 M8 U1 `. i) x8 @, }* V# update SOURCE5 on maintainer's machine prior commiting, there's no internet connection on builders
8 G2 J- @2 {. W#curl %{UrlSource5} -o %{SOURCE5} ||:
6 u6 M* D( e/ T, j$ \0 Pcp %{SOURCE5} .
3 N$ r# ?( m6 @$ C7 f+ h4 q( E0 ]8 n% {$ v
%build
: x$ f, h2 C; @8 I1 K7 Yautoreconf -i0 A/ s6 j$ d- ^; ]: O: J9 }
%configure --with-selinux --with-libcap-ng=yes --with-systemdsystemunitdir=no --with-cxx11-option=no
1 R+ [2 k6 g" O$ s" v$ x5 w%ifarch sparc64. f0 P) u4 E" R9 ]* f# R
make CXXFLAGS="$RPM_OPT_FLAGS -fPIE -fno-strict-aliasing" LDFLAGS="-pie -Wl,-z,relro,-z,now"
+ y3 o" E: n& A: q; c: l5 K7 h; h%else
% y+ R0 t: c" k' C% Q! g* umake CXXFLAGS="$RPM_OPT_FLAGS -fpie -fno-strict-aliasing" LDFLAGS="-pie -Wl,-z,relro,-z,now"% m' G/ }, `1 r2 M- c. U5 |# U
%endif
4 ^1 d5 t; t+ p, b4 \( y9 r& W; _$ A- j1 `
%install
- ]  b: S% H, M- D# `rm -rf $RPM_BUILD_ROOT0 l( u6 x- X% b: \) S6 h# x
make DESTDIR=$RPM_BUILD_ROOT install
8 G: e8 W- \+ |2 j/ Y7 z
8 a) A+ f8 `, g0 _# E$ [rm -f examplescripts/Makefile*
" w4 i; l6 g: `# \2 n/ F0 D" tchmod a-x -R examplescripts/*
& @; g+ ]: n- ?6 R! i3 r4 Kmkdir -p $RPM_BUILD_ROOT/%{_sysconfdir}/%{name}/smartd_warning.d
4 R- l& u7 [( P4 ?/ X/ vinstall -D -p -m 755 %{SOURCE1} $RPM_BUILD_ROOT%{_sysconfdir}/rc.d/init.d/smartd6 {6 Y6 h7 w7 X! ]# U5 [5 S3 u2 u) C
install -D -p -m 644 %{SOURCE2} $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/smartmontools
+ M# y/ c3 \- O# @: ~' g/ T7 O, Xinstall -D -p -m 755 %{SOURCE4} $RPM_BUILD_ROOT%{_sysconfdir}/%{name}/smartd_warning.d/smartdnotify
- u3 Y+ V& ^! G' v: R6 arm -rf $RPM_BUILD_ROOT%{_docdir}/%{name}  b$ I' v4 W9 d! _1 P2 _: l
mkdir -p $RPM_BUILD_ROOT%{_sharedstatedir}/%{name}* L9 n* v" ]+ S6 y  Y7 p

* _& j' K8 ?! u* ]" [: @' R%clean- ~- h7 K& {. W+ i! c1 N, X
rm -rf $RPM_BUILD_ROOT7 J7 Y2 R/ m; f3 B0 }
$ i5 e& e) ]. k" h0 W5 v' d
%preun; S  }  }9 c5 h! D
if [ "$1" = "0" ] ; then' y& Y4 \1 b4 \) }1 m* T' w
/sbin/service smartd stop >/dev/null 2>&1
; u! ?. l4 F2 d- s /sbin/chkconfig --del smartd; R% }+ w2 E1 g9 q! f# K4 P
fi( [/ s( o+ T- C5 F

2 z3 Z  b( V/ X0 {+ l1 G6 L! I%post( o# q- M9 Q5 c1 s! g4 c# c
/sbin/chkconfig --add smartd
) {7 V& G0 p; J# |+ c( w
; \, V8 X  r; c  h9 O1 k
+ J; w/ P  m: G& }' g%files
8 u3 j* L7 {4 r& `%defattr(-,root,root,-)4 L/ g5 s8 d0 Z
%doc AUTHORS ChangeLog COPYING INSTALL NEWS README
/ I5 u0 a" r- O& X" q* E/ V, ?' o%doc TODO examplescripts smartd.conf
7 }0 u5 B( V5 t+ _! ?%{_sbindir}/smartd
+ y! L' W: h3 @) Z& W%{_sbindir}/update-smart-drivedb
7 L$ X/ s4 D$ ?%{_sbindir}/smartctl7 E5 A  t# x4 W; |' _8 C
%{_initddir}/smartd
; C* {" q9 c0 A& k6 c5 a( {' P%{_mandir}/man?/smart*.*& _9 T: [: N! m) l, A1 U
%{_mandir}/man?/update-smart*.*
' M6 `7 L6 j* V% U/ J! o%{_datadir}/%{name}
( f7 J; n( a/ g; \. b, u. q%{_sharedstatedir}/%{name}
$ ~: H: o  ^% k%dir %{_sysconfdir}/%name- J1 f9 Z$ x" d8 D/ M
%dir %{_sysconfdir}/%name/smartd_warning.d
. u2 K( U1 N( {7 E5 @8 w%config(noreplace) %{_sysconfdir}/smartd.conf
+ K/ u* D* C" s" Y, R) R+ x" [9 \%config(noreplace) %{_sysconfdir}/smartd_warning.sh4 S# R$ f* ~+ D2 v: x
%config(noreplace) %{_sysconfdir}/%{name}/smartd_warning.d/smartdnotify3 t8 q7 g& f. Y' ^9 ]
%config(noreplace) %{_sysconfdir}/sysconfig/smartmontools0 `$ y# W+ w' M1 X# Q/ m
( s8 V8 X, z" P  F1 ~
%changelog5 `; q: m- ^  m, R( S0 d
* Thu Sep 26 2019 fangdm <8@8994.cn> - 1:7.0-3
1 [' N0 r  B8 v  q: I" T- create smartmontools 7.0 base on centos 6
8 l' b' T+ `8 X( j# p2 g* L注意,Source这几个文件一定要存在,从上可以得知,加入了启动脚本、配置文件等,准备好了之后就可以使用rpmbuild -bb smartmontools.spec来编译,经过多次失败后,根据报错信息进行调整之后,终于编译成功了。8 X& _4 ]; Y# U+ K; g. V

. m) J. O# r7 l[root@7ftbv7mdz7cdpc SPECS]# rpm -qp --changelog /root/rpmbuild/RPMS/x86_64/smartmontools-7.0-3.el6.x86_64.rpm
; ^5 ~. j' \% K4 p* Thu Sep 26 2019 fangdm <8@8994.cn> - 1:7.0-3  \: k, N, j/ ?
- create smartmontools 7.0 base on centos 6
' ]( x3 d5 r" w4 P  `1 v8 Z1 j) j. `6 s$ d$ @# Z
[root@7ftbv7mdz7cdpc SPECS]# rpm -qpi /root/rpmbuild/RPMS/x86_64/smartmontools-7.0-3.el6.x86_64.rpm
- D. k2 y2 R0 \% s8 ~+ F( T( KName        : smartmontools                Relocations: (not relocatable)
# j* ]" c0 B; r7 h. k6 Y% AVersion     : 7.0                               Vendor: (none)% n  g4 f9 ?  o8 t: @
Release     : 3.el6                         Build Date: Thu 26 Sep 2019 10:53:19 PM CST* G' _4 B; |1 G" \+ U- s  L% S5 O
Install Date: (not installed)               Build Host: 7ftbv7mdz7cdpc
2 Q/ N1 _5 u$ o( M0 N0 n3 zGroup       : System Environment/Base       Source RPM: smartmontools-7.0-3.el6.src.rpm& m  B% y" {( n) S9 R$ A, t
Size        : 2081911                          License: GPLv2+* O$ d# S3 S. c* H9 X: v+ `$ M
Signature   : (none)
' b' [' U8 b/ w/ F+ i# }URL         : http://smartmontools.sourceforge.net/
& o) o, H' l8 U8 ?6 {Summary     : Tools for monitoring SMART capable hard disks6 g  K/ F3 n' ~( D* s7 B3 c
Description :6 n8 n1 g" W6 d
The smartmontools package contains two utility programs (smartctl
% g# y. J6 |; i  \( p, n, y0 \7 pand smartd) to control and monitor storage systems using the Self-
! L/ q3 L" N. ^+ K  b! L5 |Monitoring, Analysis and Reporting Technology System (SMART) built+ T$ ]+ D' I& }0 |8 Z
into most modern ATA and SCSI hard disks. In many cases, these4 H! L# u* n: C5 a0 W0 M
utilities will provide advanced warning of disk degradation and
' N5 _9 ]( C1 Y" e7 u  e  A# cfailure.
  c$ f# w/ O3 H& e, \另外,在%preun阶段有使用了if [ "$1" = "0" ],表示的意思是uninstall,如下图:
7 z3 L3 d' F$ M! Z$ F; z' ~2 q% Z2 y% G

$ m% h8 t$ k8 m' R1 ]; J
/ G$ i: \' G/ v0 `0 e- u8 h  J实例5:打包nginx6 y0 @# `5 F* z/ |; a8 c; }3 D
用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进行安装。有生成了如下内容:
+ y# _/ f9 ^# x7 w$ ~
) G, D6 p% e+ M# B4 t[root@localhost rpmbuild]# tree
" Q# ~9 B3 N3 N+ C! v+ e.7 `  u  P* k8 x# L  D8 z6 P
|-- BUILD) R3 U3 `3 X0 m" p3 d) d; l
|-- BUILDROOT/ w( N& L1 U& x$ P6 B
|-- RPMS' t+ S5 g+ d& _( c( N0 v, Y
|-- SOURCES# H) b' m9 D5 U" l6 W
|   |-- COPYRIGHT5 K8 L4 g7 b# O* R2 D+ u! i
|   |-- logrotate
: T, F' }$ O1 r|   |-- nginx-1.16.1.tar.gz
8 v& W" R. L' \5 k, g8 \! v|   |-- nginx-debug.service
" G, N: A/ D( g4 w/ F  f|   |-- nginx-debug.sysconf7 Y& B7 p& ~. s1 w
|   |-- nginx.check-reload.sh
" C: {: p2 @  C" M2 V# V4 G|   |-- nginx.conf
( u- v6 B9 U3 I$ }0 y0 g5 l|   |-- nginx.init.in
' ^# @/ K( w* y4 H' o|   |-- nginx.service% L1 c. {! G) U: Q
|   |-- nginx.suse.logrotate
% r  l0 C2 c. e8 n7 A|   |-- nginx.sysconf& q/ w$ D" Z/ Q( A& e9 Q% I& I
|   |-- nginx.upgrade.sh  H* t$ I3 [6 q; |
|   `-- nginx.vh.default.conf6 {4 n3 i2 B3 |9 R
|-- SPECS
) d1 G) `2 `' {+ [" v0 k& |3 f# _|   `-- nginx.spec
$ E" A1 S* p; o, a`-- SRPMS# V0 y; Y+ k' w' L
主要是SPECS以及SOURCES这些文件。查看nginx.spec之后,大部分都有写好了,并且都兼容了centos 6/7。添加了gperftools GeoIP-devel ngx_cache_purge nginx-http-concat这四个模块,修改如下:, D2 o# Z0 E% w
# j8 R2 J8 ?! l" \
[root@localhost SPECS]# cat nginx.spec
* z4 f8 \! R8 l( l1 g#
/ E- [6 G3 g. [0 m, T8 i2 i%define nginx_home %{_localstatedir}/cache/nginx
1 }8 [+ Y: }: D7 m1 {! v4 I%define nginx_user nginx
( t" k9 Y: c+ [. c5 v2 @. m%define nginx_group nginx- Y: T* M5 Z" W( E
%define nginx_loggroup adm
% ?: i2 m/ }5 ]2 c- V; `0 ?7 k% k' Y2 [- D: Q" o( E* B
# distribution specific definitions- I8 _& [0 x4 D" `1 T
%define use_systemd (0%{?rhel} >= 7 || 0%{?fedora} >= 19 || 0%{?suse_version} >= 1315 || 0%{?amzn} >= 2)9 b8 K. M8 z& `$ T: c
& X2 F  ]; h1 E6 s+ U* I
%if %{use_systemd}
# N! V7 l6 [3 R$ @) zBuildRequires: systemd! d9 v1 U; S" X
Requires(post): systemd
/ }/ U& X/ t0 o8 a' a3 r4 yRequires(preun): systemd6 J' Y' {4 o' i6 H
Requires(postun): systemd: r: r) v% X- |0 ^* ]' d0 A1 ^* I
%endif
# u8 k2 b# d- R- D3 r8 n; J/ u! g' X4 B; ]& F6 n( v/ c2 j# a
%if 0%{?rhel}
1 b. ]! z$ [  d0 Q# J%define _group System Environment/Daemons
, A' F3 F$ E  ]0 V/ k6 J, a# e%endif/ G- ~/ |5 s2 p8 L% o5 n) V$ w: G
7 l* y1 r1 X/ \" ]
%if 0%{?rhel} == 6$ g& I9 O6 d3 ^
Requires(pre): shadow-utils& j/ Z. Z6 I. t; l( w& p" B/ E
Requires: initscripts >= 8.36! D  F+ J3 u! W% @5 G  P
Requires(post): chkconfig
, f/ ]. Y& U5 v0 F, BRequires: openssl >= 1.0.1
5 {  H& p% U/ g& MBuildRequires: openssl-devel >= 1.0.12 i3 d& d0 z; R, Y! _  R
%endif' a" P0 r% e  a% I8 ^
1 W; T: L& C: o
%if 0%{?rhel} == 7
2 ?8 z* v2 B  w2 P* A%define epoch 1" v* o0 A/ L" G8 e+ s6 o" k; b# J/ A
Epoch: %{epoch}
2 }% k+ P" L6 XRequires(pre): shadow-utils gperftools GeoIP-devel
" z$ u  ~- ^( U" j9 YRequires: openssl >= 1.0.2. ?3 M" `/ Y* N& B/ g( |
BuildRequires: openssl-devel >= 1.0.2
- ^5 C; d/ M4 U  DBuildRequires: GeoIP-devel gperftools
. ~, U& ?$ q" c( M%define dist .el7; }" U  `1 s1 P. A. V, v0 V
%endif4 ], [5 W8 s' D. M( S

" Y: ?! A* K( p" A; s) u2 _%if 0%{?rhel} == 8$ n4 N" K4 S9 a
%define epoch 19 o% O6 m4 @5 X" k4 [; R3 _; i/ c* V
Epoch: %{epoch}
: t. B0 U! g: A6 y' BRequires(pre): shadow-utils
4 O: f# H- t4 u2 z1 f6 j' \BuildRequires: openssl-devel >= 1.1.1
+ R) b/ j9 S/ N, T1 D%define _debugsource_template %{nil}
/ G  m7 q8 W5 h$ Z9 ?%endif) z2 X4 ]: |% y, F# m4 }

. S: ?" Y0 Q9 ^' Z4 e%if 0%{?suse_version} >= 1315+ N; w$ ?- o' l& D, X  c' A
%define _group Productivity/Networking/Web/Servers& {* n+ o' D$ Y
%define nginx_loggroup trusted
/ _/ m' @5 G: L/ f8 DRequires(pre): shadow
3 `0 x7 O: X+ ]/ l1 lBuildRequires: libopenssl-devel* p4 j8 N/ W, h9 {1 n6 g3 k  c$ e
%define _debugsource_template %{nil}
1 d, @6 Q4 d" u! X%endif
1 {6 D5 e* c; ?" ], f
% A9 W$ T  P: s, G+ k$ z. z# end of distribution specific definitions4 A4 X3 O" V. ^5 ^5 w3 _6 l
% ?1 d- w9 r, C9 y# L3 x
%define main_version 1.16.1
- [! D1 ~; l2 g- @" v% a%define main_release 1%{?dist}.ngx
7 X& P. Q/ w( _- e0 R+ a# X0 T7 D3 b9 R6 c3 `
%define bdir %{_builddir}/%{name}-%{main_version}
& k( H7 K* x' k' z4 s  G5 o9 J% Q/ [/ W: m: y4 U5 c% q
%define WITH_CC_OPT $(echo %{optflags} $(pcre-config --cflags)) -fPIC
8 V( c8 e9 Z3 {% V%define WITH_LD_OPT -Wl,-z,relro -Wl,-z,now -pie
* _! x! B+ ?) B4 b/ ]
8 N3 I0 V! Z7 }% r%define BASE_CONFIGURE_ARGS $(echo "--prefix=%{_sysconfdir}/nginx --sbin-path=%{_sbindir}/nginx --modules-path=%{_libdir}/nginx/modules --conf-path=%{_sysconfdir}/nginx/nginx.conf --error-log-path=%{_localstatedir}/log/nginx/error.log --http-log-path=%{_localstatedir}/log/nginx/access.log --pid-path=%{_localstatedir}/run/nginx.pid --lock-path=%{_localstatedir}/run/nginx.lock --http-client-body-temp-path=%{_localstatedir}/cache/nginx/client_temp --http-proxy-temp-path=%{_localstatedir}/cache/nginx/proxy_temp --http-fastcgi-temp-path=%{_localstatedir}/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=%{_localstatedir}/cache/nginx/uwsgi_temp --http-scgi-temp-path=%{_localstatedir}/cache/nginx/scgi_temp --user=%{nginx_user} --group=%{nginx_group} --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module")6 a( ]" Y8 ~( q/ I
# t: |; a/ J- e1 H# Y- ^" I" x
Summary: High performance web server7 d, Z4 L1 c# I
Name: nginx5 F" K* q9 I$ T4 K! T  j. r
Version: %{main_version}  v$ @, u; }/ V* n: \
Release: %{main_release}8 s3 o1 e+ ]4 D
Vendor: Nginx, Inc.
+ r6 r  O6 Z8 G  u# a$ R/ f) YURL: http://nginx.org/
7 N, H; p2 L4 t# \Group: %{_group}: n/ b. L* B; m0 {

7 U2 w0 _* H" J! |3 `Source0: http://nginx.org/download/%{name}-%{version}.tar.gz
4 A( u- i+ ~: B+ B9 a7 n2 }Source1: logrotate* O; J3 I* e* w
Source2: nginx.init.in6 x0 O( \# u& c# e
Source3: nginx.sysconf; f3 z% b& ~; @( a) |
Source4: nginx.conf
) t) E: o2 Y9 hSource5: nginx.vh.default.conf
1 f4 K- P; D0 SSource7: nginx-debug.sysconf% V4 D" ?. o0 }' U4 {# q* s
Source8: nginx.service  E! L: {' M3 }5 v3 H
Source9: nginx.upgrade.sh3 ]0 n' F  d! z: @0 w* i/ f
Source10: nginx.suse.logrotate
8 {$ ^; P" u# S$ j0 }Source11: nginx-debug.service" U0 E) z6 @' P+ K5 a' I$ j/ `7 v
Source12: COPYRIGHT
' ]6 I2 D1 C) ]& m6 W+ A! LSource13: nginx.check-reload.sh
, y; e/ U& S+ tSource14: nginx-http-concat.tar.gz
) Z1 y! s. U0 l2 F+ t/ sSource15: ngx_cache_purge.tar.gz
) _% k! D+ l$ O; G% ~
( l7 y* c2 N5 S5 n. z9 ]0 N, D* yLicense: 2-clause BSD-like license
) j  x0 z5 j$ Y- ~
: H2 t. S3 F, g0 CBuildRoot: %{_tmppath}/%{name}-%{main_version}-%{main_release}-root7 D" {  \' m; a8 z
BuildRequires: zlib-devel* b- e8 t* U4 H! c" H. p
BuildRequires: pcre-devel
$ I$ l7 V+ Q4 l* y; o5 N3 e8 M! e( n% h: W3 u" M" p5 O
Provides: webserver% Z! }9 Y* O9 O% `/ l9 s. G4 D

9 w7 X- `- Y* R3 @5 C) l%description/ O. v9 F" [  u
nginx [engine x] is an HTTP and reverse proxy server, as well as, K$ I! O7 X) r
a mail proxy server.- r2 C8 Y2 ^) w/ q
- @3 E7 O0 v7 F7 Y! ?5 w
%if 0%{?suse_version} >= 1315' n+ ^0 h4 ?: Q  Y( I
%debug_package% N) n# M# r0 G: g  \; k
%endif
) Y' Z/ Q2 N: Z. f$ U6 A
) r) X. j4 [& U6 l%prep
. E  b; e/ H2 M& \%setup
5 ~* K* r8 |  w1 E! c) Q: @& Y%setup -T -D -a 14$ F( [1 H$ i9 Y/ n4 {7 u: X
%setup -T -D -a 15
' o, h$ K+ p3 ~0 S/ U& }8 dcp %{SOURCE2} .' e5 E" n+ F( {& M- Q& {/ D6 a3 J" L
sed -e 's|%%DEFAULTSTART%%|2 3 4 5|g' -e 's|%%DEFAULTSTOP%%|0 1 6|g' \
6 X; A" I* i; a$ r- @  j    -e 's|%%PROVIDES%%|nginx|g' < %{SOURCE2} > nginx.init3 Q. z+ h; n# F; y8 r0 t
sed -e 's|%%DEFAULTSTART%%||g' -e 's|%%DEFAULTSTOP%%|0 1 2 3 4 5 6|g' \
8 O- s3 b  C  }5 S: T    -e 's|%%PROVIDES%%|nginx-debug|g' < %{SOURCE2} > nginx-debug.init6 {0 \, V% E  H' n9 o
- p( V: d0 g5 N! F6 f6 z/ g: c
%build
- T. d/ Q( l( r; e2 M0 [. W# F./configure %{BASE_CONFIGURE_ARGS} \
7 e# }/ Q6 W; ^& \( X7 y' g) {/ x+ V- i    --with-cc-opt="%{WITH_CC_OPT}" \5 q" s9 Z/ m$ U5 T3 c
    --with-ld-opt="%{WITH_LD_OPT}" \
: o! v4 Q" `/ d/ K* f. \1 M    --with-debug \
1 O) L: @- P2 g1 e# [2 s        --with-google_perftools_module \$ y3 r- L" y# E, Q
        --add-module=ngx_cache_purge \
. \  l" }* T- {1 U' R7 c        --add-module=nginx-http-concat \
0 `2 @/ Y1 @: |! ~0 A, {; @% N) B- u        --with-http_geoip_module: q6 E: x7 s" T4 E
. a3 n% e7 m# q3 ?3 L
make %{?_smp_mflags}
' t+ j& T5 o! G# l+ U%{__mv} %{bdir}/objs/nginx \* z# _) E) h8 a8 x
    %{bdir}/objs/nginx-debug
5 ~! F0 N/ i1 p" e7 q- R4 w, i./configure %{BASE_CONFIGURE_ARGS} \7 m* f4 T  w5 c4 z
    --with-cc-opt="%{WITH_CC_OPT}" \# g- c7 F# m6 B/ @9 x. G6 e
    --with-ld-opt="%{WITH_LD_OPT}"# Y; Z. }8 S/ d9 h* f0 }0 U
make %{?_smp_mflags}$ {0 r4 u0 ^! n

5 g, m, Z+ w' y6 m* O+ b/ @( H%install
  Z; r) N# l" ?8 C/ i# a; q6 a2 e9 O%{__rm} -rf $RPM_BUILD_ROOT; z' R0 `; j9 R
%{__make} DESTDIR=$RPM_BUILD_ROOT INSTALLDIRS=vendor install
! f# s; o0 ^6 n: g. z& E& _. |' z/ |
%{__mkdir} -p $RPM_BUILD_ROOT%{_datadir}/nginx% I) c& g8 e3 H, r$ C5 Y3 Y  m
%{__mv} $RPM_BUILD_ROOT%{_sysconfdir}/nginx/html $RPM_BUILD_ROOT%{_datadir}/nginx/
( y0 r, w: I. f7 S9 u: v( ?
2 Z6 ^* y' J% ^  `9 W  @% d, ^6 n%{__rm} -f $RPM_BUILD_ROOT%{_sysconfdir}/nginx/*.default
0 j& U- E; G. I3 m3 @%{__rm} -f $RPM_BUILD_ROOT%{_sysconfdir}/nginx/fastcgi.conf5 t/ g: J$ G  ~3 p) Y+ V  a

1 {  |1 c8 z+ Q6 k, [%{__mkdir} -p $RPM_BUILD_ROOT%{_localstatedir}/log/nginx6 j( y! X1 m* H3 L
%{__mkdir} -p $RPM_BUILD_ROOT%{_localstatedir}/run/nginx
* f! ?% ^$ c: u$ f8 O%{__mkdir} -p $RPM_BUILD_ROOT%{_localstatedir}/cache/nginx
. q, x% P3 V1 a% Z: C' Z6 g# O& V) n& J2 K6 w1 t
%{__mkdir} -p $RPM_BUILD_ROOT%{_libdir}/nginx/modules
  E% N+ N. T. T4 \) {  ~) Xcd $RPM_BUILD_ROOT%{_sysconfdir}/nginx && \% @& u9 Q, h% a$ ?$ ~7 }3 P' z
    %{__ln_s} ../..%{_libdir}/nginx/modules modules && cd -
: p; v' y" ], B' z' p" J8 r% J( s4 b) b+ p5 N
%{__mkdir} -p $RPM_BUILD_ROOT%{_datadir}/doc/%{name}-%{main_version}
3 Z. O( J( ^5 }7 A+ A5 T8 }" ^2 W%{__install} -m 644 -p %{SOURCE12} \
$ V0 x; `  U/ \7 v    $RPM_BUILD_ROOT%{_datadir}/doc/%{name}-%{main_version}/
( w- o" L. _4 I7 L; p
, x+ A& [& \0 D# }7 ?%{__mkdir} -p $RPM_BUILD_ROOT%{_sysconfdir}/nginx/conf.d. k- |4 b4 i0 m- c
%{__rm} $RPM_BUILD_ROOT%{_sysconfdir}/nginx/nginx.conf: i# _; b: M% ]  e* I
%{__install} -m 644 -p %{SOURCE4} \
2 s! F! v% V7 k6 n! O1 g# q    $RPM_BUILD_ROOT%{_sysconfdir}/nginx/nginx.conf
# y+ ~5 |5 O$ Z+ M% o) q) t%{__install} -m 644 -p %{SOURCE5} \
( A: A. }! d& o9 S7 c    $RPM_BUILD_ROOT%{_sysconfdir}/nginx/conf.d/default.conf
  y/ b! I4 h5 d" j+ g! }* m, h; t( W7 j# z  z
%{__mkdir} -p $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig
" g( S- G. {0 E0 n% m/ k! o! t%{__install} -m 644 -p %{SOURCE3} \
, x! Z* T9 f. p9 _( s    $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/nginx/ R' v5 t$ G8 A, [1 b
%{__install} -m 644 -p %{SOURCE7} \
! h8 z$ |( [5 j& Y    $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/nginx-debug2 I6 n% K( R! w4 [+ W

5 j) G( }2 T5 w, M( B%{__install} -p -D -m 0644 %{bdir}/objs/nginx.8 \7 m0 M& _8 i5 l! r6 a$ v4 p
    $RPM_BUILD_ROOT%{_mandir}/man8/nginx.8
+ }3 _% _) ^7 V* K, Q& Q, d  U; J/ A8 v' q. k/ \8 i
%if %{use_systemd}
' v6 |6 y# U  E' u9 x# install systemd-specific files% J: A: t# [9 j
%{__mkdir} -p $RPM_BUILD_ROOT%{_unitdir}& y) F- q' O! ~0 F
%{__install} -m644 %SOURCE8 \6 Z# A5 Q) z; u, g5 P3 ]
    $RPM_BUILD_ROOT%{_unitdir}/nginx.service9 l# \+ Z$ F: s1 A5 S
%{__install} -m644 %SOURCE11 \8 s$ C6 C  r; S. v8 @
    $RPM_BUILD_ROOT%{_unitdir}/nginx-debug.service
( E5 s  |* K4 l  c: W%{__mkdir} -p $RPM_BUILD_ROOT%{_libexecdir}/initscripts/legacy-actions/nginx
0 M. [$ {7 G1 G* u%{__install} -m755 %SOURCE9 \- I" q( H% W1 a$ j
    $RPM_BUILD_ROOT%{_libexecdir}/initscripts/legacy-actions/nginx/upgrade
! ^: u2 g; L0 m8 x%{__install} -m755 %SOURCE13 \
% Z$ g$ u  }  a* V7 \4 A. O, C    $RPM_BUILD_ROOT%{_libexecdir}/initscripts/legacy-actions/nginx/check-reload
& j. d& w& v( @4 }3 ~' d" k%else# ?: Z  f, p: j" q
# install SYSV init stuff
' H/ q  _& l/ `& @; M* J%{__mkdir} -p $RPM_BUILD_ROOT%{_initrddir}; u/ B  V) f5 @( \' q
%{__install} -m755 nginx.init $RPM_BUILD_ROOT%{_initrddir}/nginx) O9 W% D! e& r; V/ |3 W! Q
%{__install} -m755 nginx-debug.init $RPM_BUILD_ROOT%{_initrddir}/nginx-debug
+ t3 J4 S* T+ ?9 F0 S%endif
% V* g2 R  K0 P* q0 T
8 o. K0 u- v6 x# z' }# install log rotation stuff
+ n$ v; v2 g0 v0 o: E+ u% |) H%{__mkdir} -p $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d
8 L. G9 s# A. W%if 0%{?suse_version}' S. R" P1 H1 W2 C  U# ]' t
%{__install} -m 644 -p %{SOURCE10} \
% O. \5 l+ s7 K" p    $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/nginx
' U) ]# z8 d* s  W; R/ h2 j; ?%else5 ?2 P3 z; W3 N
%{__install} -m 644 -p %{SOURCE1} \
5 K; A; n3 R& Q% ?* d" a    $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/nginx' r) W( e$ V) e
%endif  ^. v1 X9 Q/ t8 c: y

( i  G" A( E5 T7 _3 g- X%{__install} -m755 %{bdir}/objs/nginx-debug \7 R  v& U) @% @0 A
    $RPM_BUILD_ROOT%{_sbindir}/nginx-debug& h. E, s+ }7 H" u# Q4 q, ^

/ I. m" Z/ o. a7 O. C%check
" G% x) T7 C( s! y%{__rm} -rf $RPM_BUILD_ROOT/usr/src2 W( {/ c* P! I1 O8 d8 y) P0 k
cd %{bdir}: u: b4 v" f8 M% C6 y9 C. t; P% E  ]
grep -v 'usr/src' debugfiles.list > debugfiles.list.new && mv debugfiles.list.new debugfiles.list
0 w9 B8 X! I0 }. {9 L. ucat /dev/null > debugsources.list2 M3 C/ }, ~8 {
%if 0%{?suse_version} >= 1500
7 o7 Z5 `$ }+ V4 Y- mcat /dev/null > debugsourcefiles.list" t$ X+ g. ]5 g9 L9 o
%endif( C. R, N& l0 d2 a* n2 }
7 R; q. Z. ]. D1 _
%clean# x4 V& P1 C, Q/ _* M0 H% F; f) g
%{__rm} -rf $RPM_BUILD_ROOT8 y8 y1 F& y3 \6 A

+ T2 X! w0 o) z9 \%files
2 X: b% w5 z. d; I" k# K3 x8 y$ ~%defattr(-,root,root)
) }$ ^8 W  _' X9 S0 c
3 A$ [) j$ C7 @4 C5 |  v# u%{_sbindir}/nginx4 a% B6 z( t5 K) D& q6 M
%{_sbindir}/nginx-debug2 ?- M1 i- {4 J% {* M! E2 B

: G. v0 M1 T- w5 {7 i' M%dir %{_sysconfdir}/nginx
! a& f4 E2 I) h' a3 [" K# e5 A% \%dir %{_sysconfdir}/nginx/conf.d$ U' C1 Z; p. W
%{_sysconfdir}/nginx/modules6 C1 J3 _: B- g$ T0 b7 B# G

+ h# c6 g( O) T& o. ]4 {+ |. h2 V%config(noreplace) %{_sysconfdir}/nginx/nginx.conf
4 x) L6 Z2 Q, o7 b- c0 T, y%config(noreplace) %{_sysconfdir}/nginx/conf.d/default.conf
/ n" y  Z) D" _%config(noreplace) %{_sysconfdir}/nginx/mime.types
9 S. u# j" x  s$ }5 @1 S%config(noreplace) %{_sysconfdir}/nginx/fastcgi_params# a; s6 a6 v* C. d
%config(noreplace) %{_sysconfdir}/nginx/scgi_params3 q+ u. U+ ^+ F; u5 Z5 e
%config(noreplace) %{_sysconfdir}/nginx/uwsgi_params
& x" M& k/ v8 |%config(noreplace) %{_sysconfdir}/nginx/koi-utf
& O# _" @6 V3 e%config(noreplace) %{_sysconfdir}/nginx/koi-win
" \  M% n. z6 g9 m% G% d%config(noreplace) %{_sysconfdir}/nginx/win-utf
4 g* X& d3 Z  m+ ^8 f
# E) R' K, v! G. j%config(noreplace) %{_sysconfdir}/logrotate.d/nginx5 {1 x, V& F7 @4 U' a, U
%config(noreplace) %{_sysconfdir}/sysconfig/nginx
2 x; C1 f" c. o9 i%config(noreplace) %{_sysconfdir}/sysconfig/nginx-debug
& @) C' {. X( ?( m0 f3 e2 e4 f%if %{use_systemd}
* d3 x8 G9 B# S! t& h2 |%{_unitdir}/nginx.service
$ K2 [2 @7 m( `- v, K: S%{_unitdir}/nginx-debug.service
5 E' H7 r- ?- m) P# B%dir %{_libexecdir}/initscripts/legacy-actions/nginx- L8 x/ D4 j/ y: Y+ z4 z
%{_libexecdir}/initscripts/legacy-actions/nginx/*
9 r; z: e- e: _) I" U0 A2 K%else: ^7 T0 ~1 f9 ^1 _  ^
%{_initrddir}/nginx
7 L& F* s1 G$ D9 x, A+ c4 t% ~8 h; f%{_initrddir}/nginx-debug& k+ \: m- m6 l; R% \+ q
%endif( k  l7 k' O+ k' e) n' Y/ V
( o' _! \% n: J) m& k( I
%attr(0755,root,root) %dir %{_libdir}/nginx
4 R5 z. n4 F: `$ ?- A1 S: T0 P4 x5 u%attr(0755,root,root) %dir %{_libdir}/nginx/modules3 [3 S3 M. J. c. h: V
%dir %{_datadir}/nginx8 t3 P" b0 e- C; ~; T3 r
%dir %{_datadir}/nginx/html* G1 H$ O  F& `, t
%{_datadir}/nginx/html/*
& N% S  w- ^  p, `3 n' R0 y) b/ O0 ~+ v6 Q* {
%attr(0755,root,root) %dir %{_localstatedir}/cache/nginx
$ O( V- A2 ?/ \" c6 W) V& [6 r%attr(0755,root,root) %dir %{_localstatedir}/log/nginx3 y, J1 v, C+ i4 G" v* g% l: f9 K
# F2 K% }( |+ o4 B6 v$ \
%dir %{_datadir}/doc/%{name}-%{main_version}
) Y& y4 k2 p& a/ Q1 @$ j%doc %{_datadir}/doc/%{name}-%{main_version}/COPYRIGHT  e6 V% A( ~9 j! @" l
%{_mandir}/man8/nginx.8*0 e  r" l& ?- ~( t

/ k) h0 N1 Z& V( L) P& s1 i' S! b%pre
' k5 y' d: `0 W0 R1 h+ ]# Add the "nginx" user
6 O" I5 _6 B  }% Agetent group %{nginx_group} >/dev/null || groupadd -r %{nginx_group}! R7 ?" N9 z8 B* q5 H3 }
getent passwd %{nginx_user} >/dev/null || \
5 M0 `  e  T* J5 g8 y# U    useradd -r -g %{nginx_group} -s /sbin/nologin \
1 p/ y8 E4 s" a6 X0 w# Q8 a    -d %{nginx_home} -c "nginx user"  %{nginx_user}
6 r: f% `' A+ {( Vexit 05 W+ V. _+ ]7 ?& N/ A4 [8 {
+ V2 U$ E; N) d  J+ W
%post
( j0 X9 P- l5 {5 ]* |# Register the nginx service
" W% l6 i& C8 Tif [ $1 -eq 1 ]; then
& A9 z  t* y+ a3 p%if %{use_systemd}
& n. W2 I! l6 E    /usr/bin/systemctl preset nginx.service >/dev/null 2>&1 ||:/ d7 a$ Q6 k( G6 n. E4 I( Z# H
    /usr/bin/systemctl preset nginx-debug.service >/dev/null 2>&1 ||:+ c( z0 z6 Q. F% i5 H8 f
%else
) R5 N' ?( \) z' f    /sbin/chkconfig --add nginx
( F, z# V1 ]/ o3 D0 s) }) {1 Y; Z    /sbin/chkconfig --add nginx-debug8 f- c1 E. O8 S0 x0 U3 g
%endif: D! p; `: d) C# O1 ~% ~. _& f9 r! R
    # print site info
7 V1 D3 q+ |- y( F! d& J    cat <<BANNER& N3 O2 N; H5 |7 y0 U4 x
----------------------------------------------------------------------" i  L6 E8 S5 P0 m# _

: Q! w/ r, {! G8 v; L) oThanks for using nginx!' ~- D. d* y' P1 e" ?

! B2 L5 m) x& {) V4 T9 _Please find the official documentation for nginx here:
* w) ~/ l; g7 K% i! S* http://nginx.org/en/docs/
) ~9 n8 n( {3 A4 g" M. [  G' E. }' p- U1 d8 {+ J; Z8 P, \8 `
Please subscribe to nginx-announce mailing list to get- g0 J  O+ O- w- v! n
the most important news about nginx:# `! k* k/ r! n8 @
* http://nginx.org/en/support.html
  s, u  P, R* `- P' {  b9 k7 @, B5 L/ J/ _
Commercial subscriptions for nginx are available on:6 w! I- K2 ^5 h: ]. W. z
* http://nginx.com/products/
8 i$ e4 j5 N6 R4 X
3 l; t+ r, d( s5 G' h6 p2 }----------------------------------------------------------------------! o9 K+ {  P" f4 _1 a. x+ A& _
BANNER
) R; n7 e# H- E
/ t; B( j, g, i5 }. J3 d    # Touch and set permisions on default log files on installation
; W. h+ G+ z/ x, [
' Y. B: L% s% b    if [ -d %{_localstatedir}/log/nginx ]; then; o4 W( o3 q, a
        if [ ! -e %{_localstatedir}/log/nginx/access.log ]; then7 b! I$ D: J8 a$ k' b
            touch %{_localstatedir}/log/nginx/access.log
- S  P! b: K1 w/ Z* {7 H% G            %{__chmod} 640 %{_localstatedir}/log/nginx/access.log  v2 W& j+ g; i1 X" W; F
            %{__chown} nginx:%{nginx_loggroup} %{_localstatedir}/log/nginx/access.log; o2 ], \8 j( Y, @; j
        fi
  Y2 U) j! v# @( u" P4 V) B
6 b# h' D  p! u. l9 _/ h        if [ ! -e %{_localstatedir}/log/nginx/error.log ]; then6 q4 b1 C5 J) k4 P. r
            touch %{_localstatedir}/log/nginx/error.log4 Z% n4 X0 M  I6 n
            %{__chmod} 640 %{_localstatedir}/log/nginx/error.log
7 ?" C: ^9 I4 i: S7 O6 B            %{__chown} nginx:%{nginx_loggroup} %{_localstatedir}/log/nginx/error.log
; y% `# {% K* o" V: C        fi$ V1 h4 B7 P  u/ v3 a
    fi" [- c: D" G, U$ n: y! G
fi
8 u$ S. m& ?2 V9 V' Q# n2 {
: I  H/ y4 x. z& ~( ]0 o+ Q%preun: b" D9 d+ X: P% ~5 B! }* q1 ?$ j. B
if [ $1 -eq 0 ]; then& p% z7 v% e" K" n( v8 R
%if %use_systemd
8 q- {& I$ Y3 }  V$ N+ n1 @    /usr/bin/systemctl --no-reload disable nginx.service >/dev/null 2>&1 ||:
- Y3 [8 l' f! j4 d  J5 g0 {- V' J    /usr/bin/systemctl stop nginx.service >/dev/null 2>&1 ||:
' ~2 K3 f; ~" C1 ~/ v%else
. D1 y  B- |5 y: Z    /sbin/service nginx stop > /dev/null 2>&1
5 j8 {: w" a! m( j2 B    /sbin/chkconfig --del nginx
4 i/ Y2 u! Y( m4 s* E$ s6 H" @' e: x    /sbin/chkconfig --del nginx-debug: ^/ N4 X, L4 C% C) x
%endif
! ~! W, e0 ]/ n4 Zfi" Q% K4 @2 U: c5 \8 O4 W
6 T4 k6 x' D/ |+ E* |5 w
%postun( {; I. t% l+ K4 G# a. B; t
%if %use_systemd
4 c; [$ x* e3 J+ A) d) h# x( b/usr/bin/systemctl daemon-reload >/dev/null 2>&1 ||:+ n% x' T" G. l$ [5 E
%endif
  S# I5 d* O; Q. C7 v9 ?$ ~$ Wif [ $1 -ge 1 ]; then5 d# a  O9 F0 U1 F
    /sbin/service nginx status  >/dev/null 2>&1 || exit 0
  v( v. a; M5 C4 b    /sbin/service nginx upgrade >/dev/null 2>&1 || echo \
6 M9 A6 \+ Z5 H- P        "Binary upgrade failed, please check nginx's error.log"
0 E/ X: r$ d8 a+ \. lfi
7 s- K; F; c- k! T( |
8 G0 b  q. Z& K7 j' S7 l* k& R1 M%changelog+ l4 f& J+ s  @6 s7 D% g
* Tue Sep 30 2019 fangdm <8@8994.cn>. l2 d* c! i! D# J/ @7 O  m
- Add modules nginx-http-concat and ngx_cache_purge
- L! W) B8 {' I! M" ~( ]6 `' |; n: [
* Tue Aug 13 2019 Andrei Belov <defan@nginx.com>
2 a* q& C' _' ^: I$ z$ W- 1.16.1) F2 k& t9 d% }' r. b( F  I2 z3 l0 I
编译完成之后,查看changelog,是成功了。; |' s$ V; x2 J! p8 O% K# ^: \) T# I' C
7 x8 ]$ P8 v+ ?8 {+ p7 z# x+ O. g
[root@localhost SPECS]# rpm --changelog -qp /root/rpmbuild/RPMS/x86_64/nginx-1.16.1-1.el7.ngx.x86_64.rpm; k& Q% V% w$ m
* Mon Sep 30 2019 fangdm <8@8994.cn>
: l$ A0 S& a3 G% t* T8 R- Add modules nginx-http-concat and ngx_cache_purge
" o/ _) t$ i& e: q7 m; c0 s
) c9 I" e: _+ ^* Tue Aug 13 2019 Andrei Belov <defan@nginx.com>
. h. y4 V2 a" k" m- 1.16.1
2 h: a4 a3 c6 `* `fpm打包方法
9 J, c' G: u8 n! V+ h7 G* |) g使用fpm这个方式也是可以将tar打包为rpm包,其打包流程大致是这样的:
8 i) K( q' Z. l: D' h/ H: ~2 z* A# ]. X7 s( g" J% I4 |9 |. Z3 g
编译安装被打包软件,指定安装的临时目录,如指定--prefix=/fpmbulid  S. F6 D4 j3 G& A
创建安装脚本、卸载脚本
  m0 E) f: e+ T; t1 m安装FPM工具
" M+ M9 B! v- k3 F. E. O使用fpm打包
0 h- I- ]5 ~% I2 U' |: a3 f9 |$ Z) L4 \5 r
 楼主| 发表于 2022-10-20 15:00:06 | 显示全部楼层
gcc相关知识
先编写一个C文件,其第一行表示包含文件在/usr/include/stdio.h下,如果没有申明,则需要使用参数-I /usr/include指定。
复制
1
/ u4 {' G5 S) [2 d) N5 B, b2% v$ q- A  m( @' _7 @
3
" o+ Q# V" d, D, S4, a# U) N3 j5 Y- g, _. a
5
4 a7 p# U' E1 Y  f6
3 ^# \! O+ n& X2 C8 i3 ^  l7 s7
( x( u  T9 {" S# n; x: Q# e6 i8; Q; S1 ^  ^& a3 W! o) C: m
9* p( \! D; J2 [# g' C
10
5 T. o4 L- c+ p' U/ g0 a11
4 q0 l+ J$ h6 u- w: a4 f/ O12
. ?) }7 D6 Z+ j( F5 t13
+ g+ ?* u& M9 P( J, s$ C- i. y+ |9 ]14; t9 |! x* Z8 j+ c% Z/ ]
15
) q! V" L( h: n) k16' i/ E+ k4 E9 p4 ~$ e) `9 I
172 p& T5 S# I% m, `
18( C9 N8 O5 G" d
19/ `4 V" |, G: f& W& r7 g* b
20
  f0 T4 V. H  B1 {& v
[root@home ~]#cat sin.c! L0 a; u% i! T3 N+ V! e' w
#include <stdio.h>
0 G& z; w% I; C5 ^/ ]int main(void)" @) q2 `. ]/ T9 a( `
{% R3 D3 B+ d( d/ X5 W; ~: X
        float value;- |; ~8 r& q+ y3 B3 |+ j
        value=sin(3.14/2);
# y2 V) U+ G* i! @; v6 {2 |        printf("%.2f\n",value);
% K" x# g# q6 w- R* D; G}
9 ?0 J( J, U: M' X1 A  P% W& J+ e2 k% z. w/ C+ _# U, y
[root@localhost src]# gcc -c sin.c) u. Q5 H. e: ^! f! K+ X# h
sina.c: In function ‘main’:
' L: Y7 m% {2 ~$ ?" vsina.c:5:8: warning: incompatible implicit declaration of built-in function ‘sin’ [enabled by default]
1 ]4 {5 i' P. y+ q  value=sin(3.14/2);
3 A4 l3 T8 [; d        ^
# B" e" _: Y4 A8 Q* C, m[root@7ftbv7mdz7cdpc ~]# gcc -c sin.c -lm -L /lib/64 -L /usr/lib64% l; R1 K9 ^5 g" W( J: |0 o
sin.c: In function ‘main’:
6 P0 F  }, V- N6 asin.c:5: warning: incompatible implicit declaration of built-in function ‘sin’
6 A9 N+ ^9 M$ h" G+ E! i[root@localhost src]# gcc -o sin sina.o
# ?1 u' ~* r+ P5 Q) R' y[root@localhost src]# ./sin
" P# E0 {6 V% e  j& |! p4 X1 c1.00! X! m5 k+ D1 d1 Y2 M; j/ {: ~3 S

" |3 S4 L" o, l+ w
& B1 H% o4 l7 W, V. i
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 里面搜寻) v- i& ^, u9 G/ R" b5 P( ^8 s
总结:
5 a/ K! ^  k4 q' W, O) a
复制
1
1 E. S" ]2 p' i% y  Q2" j& K$ K2 h( S
3! I0 w, X6 T, T" P. n& V
4& Z* `" C! E0 d8 E$ I, B
5
+ q# e( D7 A& a61 J' b  F  }5 v$ j
7$ I! t" [6 g' k1 v
8& C% k# q  n4 A: Q+ h
9; S% X1 E) P+ R# @
10
  L2 L& M0 d) }$ F% s11
5 l$ T! |; o- {8 Q' T' G, [12
' ~$ f6 ]' _) M! n( _1 l$ D13
$ j' `* I4 v) F) c/ j146 f& j0 ]. l: e6 @# w
15
# A2 x# I& B# K( d6 n6 R% A; }* A: s16: g9 S( b5 i7 E$ R8 R
17
7 I+ z) ~: \7 b2 T! I18
, a" _4 l& U% z3 f4 j19& W4 X% M$ E: b
20
: |% l. k! Y5 u" |21! v# r5 }4 X, l
22* |' h0 N- M# @( n4 ~2 @
23+ T; j7 |( K* g+ b
# 仅将原始码编译成为目标档,并不制作连结等功能:
# ~" D" r1 A0 i- G  C- S& r" q0 p( b[root@www ~]# gcc -c hello.c
0 Y6 G2 N; P' k6 s  c6 S/ P# 会自动的产生 hello.o 这个文件,但是并不会产生 binary 运行档。. _0 y! j; r$ ]7 H% k: V

$ e6 ^: b. e& o+ \# 在编译的时候,依据作业环境给予最佳化运行速度
4 |3 d" l0 ]- q[root@www ~]# gcc -O hello.c -c0 `  R6 s# z% e0 q6 g
# 会自动的产生 hello.o 这个文件,并且进行最佳化喔!
7 H% O  B+ l/ s' p$ J! p7 |7 V; D5 G4 k9 i* Y7 A3 c
# 在进行 binary file 制作时,将连结的函式库与相关的路径填入. L+ k, |3 a2 @3 p  \# Z
[root@www ~]# gcc sin.c -lm -L/usr/lib -I /usr/include
# U; u7 O) D. i$ ^# 这个命令较常下达在最终连结成 binary file 的时候,1 y, Q2 p+ N" X+ S
# -lm 指的是 libm.so 或 libm.a 这个函式库文件;$ n3 y+ q" r  A
# -L 后面接的路径是刚刚上面那个函式库的搜寻目录;
- C7 u! H2 x( A: o# -I 后面接的是原始码内的 include 文件之所在目录。6 V1 Q8 T2 |- ^6 z" g

6 E" ?  m2 U. y: B# 将编译的结果输出成某个特定档名
# O8 `9 i9 Y" q( l& j* C[root@www ~]# gcc -o hello hello.c
! O7 U( ]/ `& ^/ G# -o 后面接的是要输出的 binary file 档名2 h  b- z, Q. F1 j' c  f( \  M
: }3 C6 t" O: T& L. Y) k
# 在编译的时候,输出较多的信息说明) X" z# l, m8 H0 b5 P6 I  t
[root@www ~]# gcc -o hello hello.c -Wall
$ R; E9 |* c/ a% @: @: J- H5 ~# 加入 -Wall 之后,程序的编译会变的较为严谨一点,8 e( i+ h* [& c# n) ]- Q9 t
# 所以警告信息也会显示出来!  Z7 L% t9 b4 Z: O' Y4 ~

  b% k4 N) l( [
7 o; r% T7 ~& I2 z9 ^/ t+ V1 e

9 C# y  M. e+ X( l' ~另外,我们通常称 -Wall 或者 -O 这些非必要的参数为旗标 (FLAGS),因为我们使用的是 C 程序语言,所以有时候也会简称这些旗标为 CFLAGS。
0 J2 _; B% ?* g8 u1 C$ d
4 V. L! Z) V) E' ~+ q- W7 y
makefile介绍实例
首先,下载wget http://linux.vbird.org/linux_basic/0520source/main.tgz然后开始编译:
复制
1/ K' a- b# n' I0 c
2  ^2 \" c, j4 `$ M% {; y" Q: t- d
3
0 v4 R9 G7 h0 H1 p4
4 K' j/ T3 y% P) K' R, w5$ K6 M0 \, p% i) y& A2 v7 M$ t
6. \  z. @- G, C
7
8 P3 U1 p; q1 b  b) [82 g, x7 }6 n, {1 m; e8 ]8 F) C
92 [( O/ j9 a3 F
104 U$ `. t! ^  Y  s, ?
11
1 W9 a6 A( L6 `9 r123 u1 A) r4 e9 t2 D, B0 A) y
138 ^% h9 M2 e$ q% P: U* `
145 W! K; F* S4 H3 K; d" O
15
4 G0 @$ a) x& L& m169 g" s# R6 ?$ {. N$ }7 D3 Z
17
" I) U  A+ @# [7 }5 m18
9 {5 }$ M  A8 g7 e; h8 r2 N194 @0 ^6 Y4 l& u% j; q% R
20) v% \, ~5 L8 D' F2 ^. e0 r
212 Z1 f7 F  j7 U% e5 g" T/ v
224 S$ y) ], u7 l* `6 S, V
[root@localhost main]# cat makefile
* @# P1 V1 E) `) A; zmain: main.o haha.o sin_value.o cos_value.o
% g) {# o$ d, O% z2 [        gcc -o main main.o haha.o sin_value.o cos_value.o -lm( g' G# _9 D& @1 d
clean:
, T$ u& u5 s$ a* H$ u  `        rm -f main main.o haha.o sin_value.o cos_value.o
. `! Y% m; h, h0 \: s       
! d+ g, |6 u: @( v- o[root@localhost main]# make
/ b! V4 `* o9 W. ~cc    -c -o main.o main.c
2 @  ^  l  @( B8 X$ I, Wcc    -c -o haha.o haha.c
' E% ^5 m" P/ a1 s' K, t: _8 scc    -c -o sin_value.o sin_value.c2 I8 |/ B; A) s  K& ?; Z
cc    -c -o cos_value.o cos_value.c
( j1 u4 b9 a( I9 ^( Z1 H% G/ Bgcc -o main main.o haha.o sin_value.o cos_value.o -lm4 a. Q  Y! H& v# p1 R

4 y  U! ?- {! O0 h  N[root@localhost main]# ./main
% |) C/ u% y( B, j. j2 {" lPlease input your name: fdm
4 S, h% p# M/ K! FPlease enter the degree angle (ex> 90): 33- D! B- e, l* O  F" I6 {: C$ c- Q- h
Hi, Dear fdm, nice to meet you., R3 }* P1 ?+ k7 t( }3 r6 M. k
The Sin is:  0.54
4 o* g( K  M0 \6 c0 l) yThe Cos is:  0.84
! v0 z7 o7 X" X* x0 {
. W4 {$ e" o# T# H[root@localhost main]# make clean! s2 P6 a& E- Z
rm -f main main.o haha.o sin_value.o cos_value.o
% K0 T: a5 ?2 Y$ m3 m  N
# m; K" v  K* R4 O5 e% o

, p$ ], |  c  `# p0 N8 @makefile 的基本语法与变量
make 会主动的去判断每个目标档相关的原始码文件,并直接予以编译,最后再直接进行连结的动作。
  • 在 makefile 当中的 # 代表注解;) G4 M8 |, I# L* W! m
    • 需要在命令行 (例如 gcc 这个编译器命令) 的第一个字节;
    • 标的 (target) 与相依文件(就是目标档)之间需以『:』隔开。就是可执行程序的文件名。复制
      10 w; n) \8 {) M1 u& r" F* w0 h& H$ R
      2
      / C& g( e5 o# Q( I9 \& l
      标的(target): 目标档1 目标档2
      6 Y  _, R& }' @. H        gcc -o 欲创建的运行档 目标档1 目标档2
      % Q# u  g; w+ Z. G7 W  U( }

      ! V3 e. k& ^; b1 Q
      8 m4 l' k9 _$ W. O& S# u  E' n" E2 ~( S
      9 }/ x7 O  y8 A8 H) ^
如下,makefile 里面就具有至少两个标的,分别是 main 与 clean ,如果我们想要创建 main 的话,输入『make main』,如果想要清除有的没的,输入『make clean』即可!而如果想要先清除目标档再编译 main 这个程序的话,就可以这样输入:『make clean main』
还可以进行简化,使用变量来减少程序的修改量。$@:代表目前的标的(target);gcc 在进行编译的行为时,会主动的去读取 CFLAGS 这个环境变量,可以写到makefile
. ]6 y% A. K: f. g7 N2 P
复制
19 B) ?' Z5 {* t$ z1 E: t
2+ J3 Q( M9 i  J- n  @( D
33 _" X/ J# m. A9 j* H/ P' s
4/ R  g2 p: b9 h  c! j4 j
5
+ D; B0 @$ z. z2 p6
) o% u( z* p3 V8 M! A. w3 Z7
5 T) F0 U- e0 x6 \5 I8! F8 o+ C$ a; g$ w
[root@www ~]# cat makefile! o' R6 |, Z3 I9 X% b! E! }
LIBS = -lm
3 T  `3 t. O. N6 l5 g5 {  _OBJS = main.o haha.o sin_value.o cos_value.o
/ D( P% Y; a. [CFLAGS = -Wall% `. G" J" S( |  D+ O  T  \
main: ${OBJS}
$ T1 i6 U: `9 d& Q4 E' I$ S        gcc -o $@ ${OBJS} ${LIBS}7 x1 M; O8 S! u( e
clean:, L. r6 y) R, _9 d6 \% j0 P: b( W) E8 Y
        rm -f $@ ${OBJS}& ^" ]8 O1 X/ ~8 ^+ p8 b4 A$ U2 |
6 W  F+ B5 i# m) f
$ O& P; D7 w0 R

3 U: Q2 @6 a1 j, L
由於 gcc 在进行编译的行为时,会主动的去读取 CFLAGS 这个环境变量,所以,你可以直接在 shell 定义出这个环境变量,也可以在 makefile 文件里面去定义:0 h. s" F% q( V3 b7 M" \
复制
1% O6 ?! F8 }* w" _. ^
2
! ?0 J# H9 \/ d
[root@www ~]# CFLAGS="-Wall" make clean main  I) c; f* J4 j3 L9 _! p* b& X1 g
# 这个动作在上 make 进行编译时,会去取用 CFLAGS 的变量内容!6 a; \+ R+ Z% M3 l( y$ O8 c. F# z1 _

. ]6 g! c) m% O
3 |: H+ w* }5 T5 n1 K6 q
* ~, L/ R6 h# }( u
make与Dockerfile相接合
此小节内容来源于 high-iowait-process
如有下列Makefile文件内容:
复制
1( c+ p1 M: p  ]$ n* I0 [; h# o; ?
2
6 N# \! t1 U9 C9 Z& |5 R  W$ P# \3
! E7 Y4 ?9 k  K3 _) A9 q6 T% z, t- N4
  X/ G( P5 _% z8 x' X8 K5. Z6 W- O9 z% b9 f
6, G3 B7 }6 y- h! @" ?! Q. E
7* R+ e: O! d3 h& D1 z1 i8 t; h
8, v8 W5 u+ i$ Q; _: i3 `  g
98 T! `6 M8 c( E; y! @
10
3 d# p  f7 R1 d( J; _# R11. v2 b* ?$ F* s
12
" M! Y, j) l& u: T# \- D13
9 c" d0 w# m4 V+ w+ f) L; S14
. n: e# O0 N/ B' F15
' f: [$ T+ q( \16
$ B& Z0 p6 t. j9 w17
9 h$ S1 E& |! X( _/ I/ x0 S: G8 Q18' }8 v% q' d- T4 `$ m% u, y
19
; {' u# i8 }, O9 V: J0 h; O206 a; H: [# T  c, W
21/ {5 @) e! x4 C+ s) ^
22
9 k2 y* f6 z  G- @/ x# R23
# T+ M: E. [# H) N24- s: t" `0 `9 t6 ?0 l
25
" U# j% N5 n- r+ v; U. _26; ~# d/ O7 J' w! ]7 \
276 u# s1 i0 t% n5 @8 N
28
6 y+ \; L! Y6 ^6 v* G% w7 V! B3 G  F29! a1 B. M  ^" e0 I1 Y8 V
30* g5 ]" l4 C6 x/ x
31
( N9 A9 j  O. e7 L& X3 Q
.PHONY: build
% H) F0 Y0 j" E0 h1 |build:
" y/ N: B( X$ B7 v; I' {        gcc -o app app.c
0 w) Q( _) d: @8 ^5 n+ O9 B        docker build -t feisky/app:iowait -f Dockerfile .
) h5 B, [" l" O) l5 U$ T) w/ Q6 t7 S        gcc -o app app-fix1.c- M9 _9 f/ B9 N8 o7 m  m6 B
        docker build -t feisky/app:iowait-fix1 -f Dockerfile .
, R/ d) ?' F* x: B+ Y) w        gcc -o app app-fix2.c; i" x6 B- Q! \/ z
        docker build -t feisky/app:iowait-fix2 -f Dockerfile .
; }4 b! K& u" e/ Y6 Z9 m& D' n1 F- m- ]$ q, L
.PHONY: push8 d0 s" W5 q$ ]& q8 e& J
push:1 P- T* A4 \& \( x1 E- z0 ^5 a
        docker push feisky/app:iowait6 p) g; k9 B, q2 p1 G
        docker push feisky/app:iowait-fix1# E, h+ k8 J6 r6 z/ G: c9 M
        docker push feisky/app:iowait-fix2
4 j2 I' X- N3 ^# S
  R7 J9 x: }! ]5 M$ o) O7 f* m.PHONY: run
4 p- g$ x% o( e/ W! z3 y; drun:
+ b: _8 y/ V) u9 c6 i  i( F" V5 S        docker run --privileged --name=app -itd feisky/app:iowait
" F+ }5 h1 O! R. |8 S# c4 _5 _4 W% E( ^& g5 Q* g9 w! N8 B
.PHONY: run-fix14 R8 J8 o$ o: i2 R
run-fix1:; j% U! x1 u% V; ^
        docker run --privileged --name=app -itd feisky/app:iowait-fix1- l, }( `9 S# b6 {$ Z9 [  A

8 R$ \7 v- @% E) [.PHONY: run-fix2
' p8 q5 ~+ F4 w+ N/ b7 ?run-fix2:
0 l0 s) M- m* W' u        docker run --privileged --name=app -itd feisky/app:iowait-fix2
; N$ n* A* O) _! R
3 K3 L* j; j; `/ n* G  v) X) f% K.PHONY: clean6 E- P* Z3 R4 m" r; [6 k$ T
clean:
5 i& D! Q" @- H0 a1 k0 K        rm -f app
# W, h$ a! g2 r" s* o, s        docker rm -f app || echo "Container app already deleted."5 K  |0 e0 \# @1 B

: t6 ]% r% U" O8 W/ g

) P- z* M5 }! q, ^# b5 l
这样写好之后,就可以使用 make bulid 来生成镜像,使用 make run 来运行镜像,使用 make clean 来删除镜像。所以这看上去就有点像脚本的函数一样了。
变量的基本语法
  • 变量与变量内容以『=』隔开,同时两边可以具有空格;
  • 变量左边不可以有 ,例如上面范例的第一行 LIBS 左边不可以是 ;
  • 变量与变量内容在『=』两边不能具有『:』;
  • 在习惯上,变量最好是以『大写字母』为主;
  • 运用变量时,以 ${变量} 或 $(变量) 使用;
  • 在该 shell 的环境变量是可以被套用的,例如提到的 CFLAGS 这个变量!
  • 在命令列模式也可以给予变量。) f, b2 T1 S# `6 o
yum安装相关环境
  • 如果是要安装 gcc 等软件发展工具,请使用『 yum groupinstall “Development Tools” 』
  • 若待安装的软件需要图形介面支持,一般还需要『 yum groupinstall “X Software Development” 』
  • 若安装的软件较旧,可能需要『 yum groupinstall “Legacy Software Development” 』4 a/ F) f- H7 h& F% B% U4 G
编译软件步骤
  • ./configure 创建Makefile文件
  • make clean 会读取 Makefile 中关於 clean 的工作,可有可无
  • make make 会依据 Makefile 当中的默认工作进行编译的行为
  • make install) z' Y+ i- f/ F+ [
如果未指定安装路径,则编译安装的目录是放在/usr/local/etc、/usr/local/bin、/usr/local/lib、/usr/local/man下。
rpm知识
此内容与编译无关。可以跳过,同时此内容也来自于鸟哥私房菜,是一本好本啊~
RPM 安装 (install)复制
1. K% i5 v, W+ S9 f4 ?
2% r. V3 ]8 T2 }. N
3
4 Z) q  L( B( `) T# n0 B4
$ G  o, h2 B1 O+ V$ g. N56 d. w3 w, P  A
6& F1 z3 v1 Z2 N
7! _( E; h$ ~1 {- n: d1 D4 o
8$ l: [8 e2 G* p3 Q- b! q
9
1 w5 }& V/ ]5 [6 ]10. G6 Q4 @1 v: C& H/ |
[root@www ~]# rpm -ivh package_name3 t+ u1 f, p+ A$ i# L0 t
选项与参数:7 I5 T; j( w$ ]
-i :install 的意思
2 v2 S4 X' u0 m  n-v :察看更细部的安装资讯画面6 X- u7 ?" {' l7 f
-h :以安装资讯列显示安装进度8 c* I" j$ n( c1 L

. `1 R3 x. I  B0 i" c$ M-Uvh        后面接的软件即使没有安装过,则系统将予以直接安装; 若后面接的软件有安装过旧版,则系统自动升级至新版;
1 y, H9 T- k- ?' U+ C* R- p-Fvh        如果后面接的软件并未安装到你的 Linux 系统上,则该软件不会被安装;亦即只有已安装至你 Linux 系统内的软件会被『升级』
6 A* }3 c$ x$ W: h$ U* x: F* Q: A/ B! {1 Z
[root@www ~]# rpm --rebuilddb   <==重建数据库
- d+ `9 o0 ?% S* A, |
  g: T: o7 T( e$ f  [" n9 ]5 Z$ d

# D. d& Z4 j5 m2 O- u* [
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 使用时机:不想让该软件在安装过程中自行运行某些系统命令。, d+ U3 D) u- N7 t& D
RPM 查询 (query)
RPM 在查询的时候,其实查询的地方是在 /var/lib/rpm/ 这个目录下的数据库文件。/ Q4 s+ H+ c  ?
复制
1
; `8 [  ~" W( w5 H; ?2- P! ]9 ~. V) ~  F, T" \, T2 L
3
# d7 s; ~* e) g7 d2 U! j8 {7 H4* |' v, J8 T$ @( {4 ^+ g0 r
[root@www ~]# rpm -qa                           <==已安装软件
' Z! t4 \2 J. Q, O6 K, {[root@www ~]# rpm -q[licdR] 已安装的软件名称       <==已安装软件" d8 j2 g% K$ G) L
[root@www ~]# rpm -qf 存在於系统上面的某个档名      <==已安装软件
. h$ _; M% |: O2 N[root@www ~]# rpm -qp[licdR] 未安装的某个文件名称  <==查阅RPM文件; u5 E' ]" u. F

0 X* e$ s5 n  Z6 g; m

; c+ g, o" D5 L) ?4 b8 U8 L) {0 O$ y% {
  • -q :仅查询,后面接的软件名称是否有安装
  • -qa :列出所有的,已经安装在本机 Linux 系统上面的所有软件名称;
  • -qi :列出该软件的详细资讯 (information),包含开发商、版本与说明等;
  • -ql :列出该软件所有的文件与目录所在完整档名 (list);
  • -qc :列出该软件的所有配置档 (找出在 /etc/ 底下的档名而已)
  • -qd :列出该软件的所有说明档 (找出与 man 有关的文件而已)
  • -qR :列出与该软件有关的相依软件所含的文件 (Required 的意思)
  • -qf :由后面接的文件名称,找出该文件属於哪一个已安装的软件
  • -qp[icdlR]:注意 -qp 后面接的所有参数以上面的说明一致。但用途仅在於找出某个 RPM 文件内的资讯,即未安装的名称
    ( G+ L% p+ a: P' S
RPM 验证与数码签章验证
验证 (Verify) 的功能主要在於提供系统管理员一个有用的管理机制!作用的方式是『使用 /var/lib/rpm 底下的数据库内容来比对目前 Linux 系统的环境下的所有软件文件 』也就是说,当你有数据不小心遗失, 或者是因为你误杀了某个软件的文件,或者是不小心不知道修改到某一个软件的文件内容
复制
1$ z6 j3 m' t) G3 f& Z# W
2
- U9 l9 i0 o& [" @; p/ x2 a3
& ]3 a0 l' T. X. h! t4
7 B% R- F4 L) P( R. O& G3 N56 u3 d) a2 ^8 t( o. O
6% z- S$ D9 W$ m
7
8 ^+ J, _! U) d8 Z# r9 R85 `' f5 j- N$ y. q
9
8 c. q: v3 h+ S$ X10
$ K. |1 X, B0 ~11
5 o% K' y) p2 R7 }' M  _# F12
" u# [# ]; R0 s+ g6 |: w4 g8 a* ~3 C13
$ W# y. h: X# t5 s' V/ Q
[root@www ~]# rpm -Va; {& x6 l* `) G3 f3 H  p
[root@www ~]# rpm -V  已安装的软件名称
% B4 A* H9 A0 T& l8 C[root@www ~]# rpm -Vp 某个 RPM 文件的档名7 w8 v+ i, p. K( `2 t: }
[root@www ~]# rpm -Vf 在系统上面的某个文件
6 v, R3 z7 N9 C( O4 s& g& l5 q+ T' R& ^5 K
选项与参数:
' M+ r+ C9 q9 J  C-V  :后面加的是软件名称,若该软件所含的文件被更动过,才会列出来;9 P1 [' b. U: x5 I' X
-Va :列出目前系统上面所有可能被更动过的文件;
* c+ K4 E" |) R: a4 J-Vp :后面加的是文件名称,列出该软件内可能被更动过的文件;
3 }' R0 P) X- |, n3 x, D8 I2 a-Vf :列出某个文件是否被更动过~
, ?, Y! A$ ~5 m- j
0 s  l, ?/ a- Z* d- j4 W[root@www ~]# rpm -V logrotate  {" H* n2 R; }2 E' H
..5....T  c /etc/logrotate.conf/ u; H, ?3 h& F# Z; {3 Q7 x

. x# E+ f0 ~0 ]7 k( M* S" s

. ]+ V! p& Q6 `1 T! i3 A
第一列的含义有以下几种:
/ a: J3 Y9 O: ~3 _
复制
1
  g0 a& w- @# O# v! c9 N( d: e29 r% _9 a8 i) k: |
3
- O( F8 o9 Y0 c3 M1 K. H- a% V4! Q; ]# H% H5 j, k, L
5
2 q+ z7 a, Z5 N9 X+ U65 o; y0 X- x  b- u. V# O
7, Z$ k8 W$ ?5 s; |
8
. x& l, J% r  |
S :(file Size differs) 文件的容量大小是否被改变" `4 j- M# x' z- h+ r) b6 m# l* V' t
M :(Mode differs) 文件的类型或文件的属性 (rwx) 是否被改变?如是否可运行等参数已被改变5 _$ y  V6 O, g1 O% S7 P: {( y1 d
5 :(MD5 sum differs) MD5 这一种指纹码的内容已经不同$ K$ G: Y. F9 O' _5 c6 C/ z
D :(Device major/minor number mis-match) 装置的主/次代码已经改变0 u7 f8 a! ^: X! w6 M
L :(readLink(2) path mis-match) Link 路径已被改变4 h, x3 ?' T1 M9 Z5 _
U :(User ownership differs) 文件的所属人已被改变. m4 z7 A2 p$ u0 Y
G :(Group ownership differs) 文件的所属群组已被改变
! R. [' ?* Y" b& e8 J: v1 C( IT :(mTime differs) 文件的创建时间已被改变7 T" H' X8 W; n$ h8 o+ h5 I3 v

: w8 B7 I' R! G+ w! P! J6 T5 u
' j+ G0 Q% b) ~3 g8 U2 ~# X' A
$ ]; _0 \1 i1 S+ F( ^+ D& T
第二列的含义有以下几种:
复制
1* Z$ D3 K* Q. J+ x& I2 u
28 ~: K( R2 D% b+ l3 S% b$ j$ ~3 c
3
6 D8 q6 B* [$ J7 I" r4( T: U  }* p% x" b( _4 D: ^
55 U, g1 j0 _6 b* O$ v& E0 J" d' J
c :配置档 (config file), {" T; _, [/ ~8 W( I8 P
d :文件数据档 (documentation)
, g9 x1 F% c0 [, ig :鬼文件~通常是该文件不被某个软件所包含,较少发生!(ghost file)9 d: @, f/ l9 J# I
l :授权文件 (license file)7 Y' W2 ~0 G$ D: u/ x$ I
r :读我文件 (read me)
3 b! M& \: I+ G7 |+ M3 r
3 C8 U3 C* S+ b" O; \, R' {

: C) o& _  J$ v' G/ z+ {2 \' O数码签章
软件开发厂商可以数码签章系统产生一个专属於该软件的签章,并将该签章的公钥 (public key) 释出。 当你要安装一个 RPM 文件时:
首先你必须要先安装原厂释出的公钥文件;实际安装原厂的 RPM 软件时, rpm 命令会去读取 RPM 文件的签章资讯,与本机系统内的签章资讯比对,若签章相同则予以安装,若找不到相关的签章资讯时,则给予警告并且停止安装喔。
复制
18 M( s* v6 u6 J7 I! ?( N) H" v
22 E3 c5 h4 r8 ~
3% A! O' e) A0 ~. r
4
6 O/ h7 z6 |( h$ l4 I# E+ g  g; F5
3 V  w7 m, {* w6& T7 @  n" P8 m) [0 i2 P$ G
7
% n/ s6 ~, u( U7 r$ e1 b8
6 |& F" J2 j" `( e( B
[root@localhost ~]# ll /etc/pki/rpm-gpg/RPM-GPG-KEY-*
+ h. V. x9 Y& w/ s$ t' K-rw-r--r--. 1 root root 1690 Nov 23 08:16 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
( ~8 G3 O% w5 L. A-rw-r--r--. 1 root root 1004 Nov 23 08:16 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Debug-7( s+ n5 y3 i# c/ R# n' ]
-rw-r--r--. 1 root root 1690 Nov 23 08:16 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Testing-7# }* z% L7 ]3 q8 p) K
-rw-r--r--. 1 root root 1662 Oct  2  2017 /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7  [) z  z4 x) B' `7 i
-rw-r--r--. 1 root root 1340 Mar 23  2017 /etc/pki/rpm-gpg/RPM-GPG-KEY-remi
: W& ?  w5 r& O5 k; o: e-rw-r--r--. 1 root root 3100 Mar 23  2017 /etc/pki/rpm-gpg/RPM-GPG-KEY-remi2017* ^% d/ S' Y8 f# `5 k/ c% e1 y
-rw-r--r--. 1 root root 3143 Jan 16  2018 /etc/pki/rpm-gpg/RPM-GPG-KEY-remi2018- T6 B9 n/ s+ a$ ^% c, F

2 t1 R2 w) [- Z& D! ?

4 `/ M& M, n+ F2 Y: Q$ e% n$ CSRPM相关知识
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 不但进行编译跟打包,还同时进行『安装』了
    ' C5 _( y9 a6 H' k* d$ `3 ]
示例:
复制
11 R1 @- M0 s6 S9 c2 d
2+ E5 j% y* }7 f; T) X
3
2 ]: C) X' L: ^, p/ J  U! I4
* l( i" S! y! X. J. s( t4 h% g/ q5" O, [1 K+ l! L- Z* e- A8 r1 G- L
6
+ m8 G' o/ p  v6 Y) H' m7 K7
& h4 U. i0 z3 l1 ^  _! ?8' k4 e/ k# h) b5 Z3 L
9
$ ]( \4 O9 a8 D- F# Y# V9 B* |, j- N104 Y: A% }. ^6 N7 X
先下载软体:
2 x8 T( ^  \) y9 D# T3 swget http://vault.centos.org/7.1.1503 ... l7.centos.1.src.rpm. K1 \5 o' ~* m( a
再尝试直接编译看看:$ s. q6 r* C& }1 z6 _
rpmbuild --rebuild ntp-4.2.6p5-19.el7.centos.1.src.rpm+ m/ l1 }3 p7 d6 F
上面的动作会告诉我还有一堆相依软体没有安装~所以我得要安装起来才行:# K" x0 u& E3 A; Y) l
yum install libcap-devel openssl-devel libedit-devel pps-tools-devel autogen autogen-libopts-devel
; V  L! F9 H  `$ _% V( m2 w  t; y再次尝试编译的行为:: e, m9 x; c- |# R6 v4 D: c8 R0 u
rpmbuild --rebuild ntp-4.2.6p5-19.el7.centos.1.src.rpm
7 v) _  [2 {7 T) @" [3 M# D4 Q最终的软体就会被放置到:
% d. z* v4 q& g4 P( F; S8 t/root/rpmbuild/RPMS/x86_64/ntp-4.2.6p5-19.el7.centos.1.x86_64.rpm# F1 }+ ~+ ?- X/ j

4 k$ I  t* z) Y
0 D! L$ F. u7 v7 _6 d- `
SPEC编译安装目录说明
如果你的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}来创建。具体的各目录的含义如下:
默认位置
宏代码
名称
用途

, R' o! o% u" m9 T2 |" j
~/rpmbuild/SPECS
%_specdir
Spec 文件目录
保存 RPM 包配置(.spec)文件
0 \7 @9 ^7 P- h$ \' g) Y
~/rpmbuild/SOURCES
%_sourcedir
源代码目录
保存源码包(如 .tar 包)和所有 patch 补丁

+ @# U8 g- \8 |
~/rpmbuild/BUILD
%_builddir
构建目录
源码包被解压至此,并在该目录的子目录完成编译
3 @/ ~! T. D% f/ W9 `; D, c2 Z
~/rpmbuild/BUILDROOT
%_buildrootdir
最终安装目录
保存 %install 阶段安装的文件

6 x' e7 h8 G( Z! w
~/rpmbuild/RPMS
%_rpmdir
标准 RPM 包目录
生成/保存二进制 RPM 包
/ A2 e' K, p. }2 e8 r
~/rpmbuild/SRPMS
%_srcrpmdir
源代码 RPM 包目录
生成/保存源码 RPM 包(SRPM)

- V; ?0 h7 _! [3 a
6 B0 g6 M8 a6 ~0 p3 Y# C
使用rpm -ivh来安装srpm包时,会生成很多文件在/root/rpmbuild下:
4 y4 g8 |9 k6 ~
复制
1. Y3 q: d- u1 N: d) D; G
2/ i  H7 j0 z( {5 Y( a, n
3
  T; j  }" @5 l' T# ~8 h4/ B1 j2 {% u8 x  l" g" g
5
2 h% @! Y! F; k3 ~2 E# [5 `$ t60 d8 n7 u" G! P8 p
7
% i( Y9 B0 u/ f0 c& x5 c  i8
5 E2 |: }% z+ J% j) t: O95 M1 L* y: Z" |0 m( U& X6 Q
10
+ s7 I% P5 D$ @11. o. j7 \- z5 m7 U. w- @/ P% C
12  u4 f- H& K- f, x/ ^
13
5 m/ k, i/ W# X4 b2 h14. y% W( B: r; U! i
15
7 Y7 p5 \" i/ U4 J! C2 E, l  M  z16) V+ n  @5 C7 V- c0 k9 B2 }
[root@localhost ~]# rpm -ivh ntp-4.2.6p5-19.el7.centos.1.src.rpm
7 V0 ^3 M; o; yUpdating / installing...8 l" U+ e3 @. w* ^0 o
   1:ntp-4.2.6p5-19.el7.centos.1      ################################# [100%]/ @) E4 q6 Z' d+ x4 q5 X% V
[root@localhost ~]# tree /root/rpmbuild/
$ t) k& h' G5 s0 y: @; ~( V- f/root/rpmbuild/
% v* A- w' C1 |├── BUILD2 ~0 E& m$ m+ J, U% S
├── BUILDROOT: y. B1 Q/ F4 ?
├── RPMS
; \7 ^; s% K+ H├── SOURCES
( L4 f0 G% \; d8 S- A( \│   ├── ntp-4.2.4p7-getprecision.patch2 ^% Y! `* T0 ^3 _# m
│   ├── ntp-4.2.6p1-cmsgalign.patch
) \9 G1 r3 o! u; i+ r。。。( E' ~; r# B7 t$ L
│   └── sntp.sysconfig
! c. j8 J2 h9 W* f├── SPECS( ~0 b* O. k, ]/ K9 |$ ], b
│   └── ntp.spec
) p& L% [* E* _/ c1 ^) t& z└── SRPMS
& N$ }# y  @! \6 o
) I) n& i8 t1 E6 l- ]4 R- }
7 M# Z; n9 _6 N4 L
, I  W3 ^' ?" T, s. E
解压完成之后,srpm本身就提供了spec文件,可以直接通过以下方式直接安装:
复制
1
! C+ i7 D" G# U) e0 Z  J/ w22 x* i" ^  E( U
[root@study ~]# rpmbuild -ba ntp.spec   <==编译并同时产生RPM与SRPM档案 3 p4 c4 v% Y8 `. o. x1 G
[root@study ~]# rpmbuild -bb ntp.spec   <==仅编译成RPM档案/ d1 n/ T4 g: [& }+ v

7 i4 p. X! y" [! P# H
% [% T2 g' U- O8 j7 c3 h8 y8 `0 @
spec打包流程
SPECS下是RPM包的配置文件,是RPM打包的“图纸”,这个文件会告诉rpmbuild命令如何去打包。“宏代码”这一列就可以在SPEC文件中用来代指所对应的目录,类似于编程语言中的宏或全局变量。当然~/rpmbuild这个文件夹也是有宏代码的,叫做%_topdir。
打包的过程有点像是流水线,分好几个工序:
  • 首先,需要把源代码放到%_sourcedir中;
  • 然后,进行编译,编译的过程是在%_builddir(~/rpmbuild/BUILD)中完成的,所以需要先把源代码复制到这个目录下边,一般情况下,源代码是压缩包格式,那么就解压过来即可;
  • 第三步,进行“安装”,这里有点类似于预先组装软件包,把软件包应该包含的内容(比如二进制文件、配置文件、man文档等)复制到%_buildrootdir(~/rpmbuild/BUILDROOT)中,并按照实际安装后的目录结构组装,比如二进制命令可能会放在/usr/bin下,那么就在%_buildrootdir下也按照同样的目录结构放置;
  • 然后,需要配置一些必要的工作,比如在实际安装前的准备啦,安装后的清理啦,以及在卸载前后要做的工作啦等等,这样也都是通过配置在SPEC文件中来告诉rpmbuild命令;
  • 还有一步可选操作,那就是检查软件是否正常运行;
  • 最后,生成的RPM包放置到%_rpmdir,源码包放置到%_srpmdir下。
    + Q6 g, `/ ]' }
spec文件内容
使用vim a.spec之后,会自动生成spec的结构体,内容如下:
复制
1
7 g) f5 T: [% a/ X+ j1 u6 \2
1 i* `7 D3 u( a# P3# R5 v$ m3 k: R/ o& S$ q& g
4. h& h( q; B# T
5# Q) V! Z. ?7 _
6
6 ^5 T6 T1 C; N9 w7
  N+ `; X; f. ]7 [0 m8
1 b$ u- n; X6 ]3 I% p* V9
) @% w8 ^4 C- C10" Q# D* E% t4 `
11* C" k* F; J8 O7 n; v$ [3 G
123 T  S8 S& t7 K4 ?
13' N1 c& h: {+ k' O& t
147 Y2 a# m0 T, z3 j$ u# L) I
15
7 F* q7 a$ ?8 F16% {5 p% m8 \5 L/ d  Y* H, T
17; z/ ^, L) s: [, _8 A# c. N0 w! M4 i, j
18' t% a: n1 g, ?/ X0 l
19
( {. C7 m2 ^1 \& ~1 B: q20  t: f8 a0 I1 K7 I  y* {  K
219 q8 v. }  L4 B$ b2 k
220 p' o: D  Z4 I- b6 \- ]9 g; V
23% }1 _$ T" S' [9 c5 z! `1 P5 s
24
9 a( L% z4 z9 N: Z25! t& O' V8 Y! V
265 k5 i% U5 p; Z9 y  W( y0 }; ]
27: i$ M/ r# Y0 O+ ]! B
282 x: [/ ~1 D5 n
29
: G4 \7 g, `9 B
Name:                                                                ==>软件包的名字,后续可以用%{name}来引用% j6 {7 w) P1 J8 r2 L- m$ o
Version:                                                        ==>软件版本
8 e, [! a  z4 V' \' Z6 \4 uRelease:        1%{?dist}                                ==>发布的序号7 F3 j, k$ T' s# d
Summary:                                                        ==>软件包的摘要信息1 a" k; ?! S; B/ ~. z8 \

9 f. j+ }* @, z2 D+ S+ G, z* LGroup:                                                                ==>软件包的安装分类,参见/usr/share/doc/rpm-4.x.x/GROUPS这个文件
! v7 \( k$ Y6 OLicense:                                                        ==>GPLv2,授权方式$ t7 m/ R2 E/ j. ?  [( l/ Y9 K
URL:                                                                ==>这里本来写源码包的下载路径或者自己的博客地址或者公司网址之类,无实际用处
6 M( M; ^9 {$ ^2 ?* Z) K% i% U& iSource0:                                                        ==>%{name}-%{version}.tar.gz源代码包的名称,这里的name和version就是前两行定义的值。如果有其他配置或脚本则依次用Source1、Source2等等往后增加即可。2 ]: `0 R, W8 u6 \! M" b' `
3 {& k3 Q+ X7 |3 L! G
BuildRequires:                                                ==>在本机编译rpm包时需要的辅助工具,以逗号分隔。假如,要求gcc的版本至少为4.4.2,则可以写成gcc >=4.2.2。3 j2 y) }2 a, p/ H
Requires:                                                        ==>编译好的rpm软件在其他机器上安装时,需要依赖的其他软件包,也以逗号分隔,有版本需求的可以$ E; a; f$ @4 F9 s: y0 A! @  A

2 R$ w6 f3 B' J. P# R9 P%description                                                ==>软件包的详细说明信息,但最多只能有80个英文字符。
3 W  }# Y) {/ Y0 ~+ B1 y! \$ }% y* }3 B
%prep                                                                ==>读取位于 %_sourcedir 目录的源代码和 patch 。之后,解压源代码至 %_builddir 的子目录并应用所有 patch。5 w+ B3 g6 J1 s4 o
%setup -q                                                        ==>使用这个语句实现%prep功能,仅能解压Source 或 patch 定义好的文件
. p) C, O* T8 L1 ~
9 f9 B6 s& V2 D6 F) s# }! u%build                                                                ==>编译位于 %_builddir 构建目录下的文件。通过执行类似 ./configure && make 的命令实现。
& u, r) o6 w+ f2 r%configure5 A+ l7 K' x" i
make %{?_smp_mflags}
- D3 p: f1 E' r; M3 U
. t$ @" U& D. }4 E: H%install                                                        ==>读取位于 %_builddir 构建目录下的文件并将其安装至 %_buildrootdir 目录。这些文件就是用户安装 RPM 后,最终得到的文件。注意一个奇怪的地方: 最终安装目录 不是 构建目录。通过执行类似 make install 的命令实现。& j) q3 O2 d, S1 h6 R
make install DESTDIR=%{buildroot}6 @5 b% Q$ g' c- n# z9 i
) J: a8 w' h  v* k. N# R/ V2 r
%files                                                                ==>软件文件和目录, f3 c  |, D* z" |
%doc                                                                ==>软件说明文件' a$ b9 }+ ~5 w% c" s$ K: `
+ X! w% K# \* T" ?3 f8 p6 t
%changelog                                                        ==>更新说明,星号(*) 后面应该要以时间,修改者, email 与软体版本来作为说明, 减号(-) 后面则是你要作的详细说明啰9 I+ R* l8 [2 v5 O; q2 T

8 O) ~% Q$ o6 D" u: m  M2 n1 F
' T- b0 ^: n! a  d# n+ {
除了以上这些,还是以下阶段:
  • %pre 在目标系统上安装软件包之前执行的Scriptlet。注意跟%prep的区别。
  • %post 在目标系统上安装软件包完成之后执行的Scriptlet。
  • %preun 在从目标系统卸载软件包之前执行的Scriptlet。
  • %postun 从目标系统卸载软件包完成之后执行的Scriptlet。+ m: ^0 a( H% ~; w
以下介绍一下比较重要的阶段。
%prep阶段
这个阶段里主要完成对源代码包的解压和打补丁(如果有的话),而解压时最常见到的就是一句指令:%setup -q。这句指令可以成功执行的前提是你位于SOURCES目录下的源码包必须是name-version.tar.gz的格式才行,它还会完成后续阶段目录的切换和设置。如果在这个阶段你不用这条指令,那么后面每个阶段都要自己手动去改变相应的目录。
如果在%prep阶段,只使用了%setup这个宏变量,代表了会运行以下操作(假设Source为cdplayer-1.0.tgz):
复制
1
' H& P, u" A, g: i0 ?! Q! ~2+ N( ^4 T9 @. k. z
3+ S3 S  e, d- O3 Q  ^, Z6 p
4
% D. M7 G( M2 a# M  v52 G( \6 O7 K& W4 I' p6 x9 Z; S
6% S% a4 z2 a$ n  x5 l  V
7
  T2 C4 J' g: t" M2 F* ~- ^! p8: a1 K( X4 @$ J' n1 R0 t4 B* w
9
/ T) Y* Y. n% ~- N: N( ~10
: h/ C' r" t6 E: l& `; V9 J0 k( e
cd /usr/src/redhat/BUILD' c2 A: x6 }  g- \! ~" }7 O
rm -rf cdplayer-1.0
, r, E! `% D' ?2 D1 M; ^gzip -dc /usr/src/redhat/SOURCES/cdplayer-1.0.tgz | tar -xvvf -6 Q: p9 \# c7 @# V1 Q6 N
if [ $? -ne 0 ]; then
4 I  a9 A0 z7 F2 x& h4 c9 H  exit $?4 u: N) S( R* x$ \( y
fi: E. X7 Z: X. |$ y5 H1 x( d
cd cdplayer-1.0; p* ^: [0 D; K/ R2 m
cd /usr/src/redhat/BUILD/cdplayer-1.0
/ w: I7 G1 v6 Z3 ?/ d# jchown -R root.root .$ N5 z$ W: C; A7 r6 W& U
chmod -R a+rX,g-w,o-w .
6 z( J! ]# `3 K: }& G4 x

1 Z5 ^! o) e! k, m7 ]& E) z0 ?
1 u* u1 q" R# F- V, o, v. V
可以看到,默认操作为先进入BUILD目录,然后再删除%{name}-%{version},再解压,最后再修改权限、属主等。参数-q是指不输出运行的过程,还有其他参数如下:
复制
1
( i' p! {1 |" J  F2
) D/ o  u. ~2 a/ v. ^: w3
8 X( U( {( a& `8 y+ ?: T47 R  T8 {( q+ ~2 Y: s' U$ i# D; {
53 Y, y1 `3 S  ~% c6 S, e7 F
6
: a3 a" c# Z. K7 E74 A1 [. G2 N: O% q2 n4 O5 H7 S
8
# x* G1 v5 h* R! |. P$ N( Q7 D9
) b) K- k, t" Y. j10+ S* H; _8 D1 W0 l  j# Y
11; s: e% Z1 v5 n" w
124 h5 ]. G6 ~4 A4 v
13, a3 p" y3 X; w- X" Z) {
14
# J% \) L6 l* r: j; w% ^% Q15
; n# @5 Z& b1 f0 d" ^16$ x8 M. r* ?3 I' V$ T; G5 }& p
17
+ w% h& N, S( U1 N187 [! M) _5 D) X1 v$ `* t0 Z
19
" ^' x, M( |3 ^7 C5 x8 s20
- b# v. D6 f, I" l
%setup -n newdir 先删除/usr/src/redhat/BUILD/newdir目录,然后将软件包解压在newdir目录;再进行这个目录进行权限设置# V; t& v$ M4 \% S  ~% [9 a
%setup -c 先创建目录,进入这个目录后再解压。与不加参数的%setup比较,仅仅是多了mkdir 以及 cd 这2个命令. a' J1 c) K+ ^' e' Y2 u4 q
%setup -D 解压缩时,不会去删除目录。与不加参数的%setup比较,少了rm -rf操作' ?' ^1 ]4 c% m# E# Q% Z  C
%setup -T 不进行解压的操作。与不加参数的%setup比较,少了gzip以及if判断语句
. q( b0 w' A5 v! S6 R# @: x& G' b8 y
%setup -b num 将第num个source文件解压缩。如果是 %setup -b 0,就会解压2次,可以使用 %setup -T -b 0,这样就只会解压一次了。但只效果跟 %setup 不加参数的效果是一样的。
$ j' o* I% `) ]  a7 r/ S%setup -T -a num 先进入目录再解压第num个source文件8 }9 N/ ]6 d& u6 F

8 B" m3 T- ^2 x1 f! w# E5 s
% Q$ i3 t& S2 \% z" m%patch 最简单的补丁方式,自动指定patch level。
' y% d  ^; @& e2 G: v. o%patch 0 使用第0个补丁文件,相当于%patch ?p 0。
6 f; M5 _1 p  L- d& o%patch -s 不显示打补丁时的信息。
- ^+ N/ r5 t6 y& T/ W%patch -T 将所有打补丁时产生的输出文件删除。
8 s2 s' K! x* t$ p*************************************/
$ y! e; |" w3 H% _5 z% v2 m%setup -q -n %{name}-%{version} 3 C2 B% F$ m2 Q# X( G. O* i6 _

! y  L7 U" o( @- A/ W0 K" [/* 如果原来只有一个“Patch:”,您增加“Patch1:”,则在SPEC文件%setup行后面的" i" I$ j' ~0 {5 [5 ^9 k
   %patch -p1后面新增一行: %patch1 -p1 依此类推.
1 T; ~: \/ f% x */
1 c$ A8 O) P: B2 K; v# @; G, U# A%patch0 -p1
, K4 g/ O2 e5 H7 n
3 h+ w* Y- F- l/ E

! y# f/ [+ T& A
实例,如果%prep的内容如下:
复制
1
7 \) [9 s5 }# j* C1 v9 f' w$ o2
. `# U) o% S: G/ m37 m; i$ |- I1 h' Z! j& q
4
4 a7 ~, G+ Q2 {$ h
%prep
3 H+ }, @' P9 u/ \%setup
+ [+ d8 o! P& p7 [%setup -T -D -a 14
: r2 m7 y" L8 R5 w4 F" }2 c%setup -T -D -a 15" N! z4 `2 e+ [- Z

4 N5 b9 s6 M6 {( I
+ p! E8 N0 M" h" j3 T; h& F
其运行的过程如下:
复制
18 o9 A  e- b) g
22 b; X- R$ B" J! l6 E5 m
3! m2 K4 H4 [" G* R
4  Z, l2 y9 F* r) E
5
# W/ g* X. Y! M" U+ B  w! P% |6! \7 H3 b( K/ M$ w& E
7
; ?8 i1 i5 f9 M- z" N( ?8
# @2 }) O7 Q" d9: O- }6 g: e  r9 ^: }) G
10
7 l- s7 l+ N9 i0 e- D) u4 {, ^  y119 e  f% _" l$ k3 J8 w( [9 X
12# `. X  O3 y# z6 U+ K' u9 F+ [# `
131 p$ a7 N9 H: l
14. R. `/ h, r, G/ W8 J
15
( v( F" h& M+ B, c+ c% Z16! E% x* j7 l9 r$ ~6 B
17
. G0 g# M4 J6 F( Z18
) U* e2 g. A6 T/ k" U; Q% M1 Y19  O& k9 @: @, V0 E6 X. A% U) d5 n
20
) _6 W5 \: y& G21" u+ w& ]' P+ J/ c& F
222 F2 k+ ?' ?, r/ I; }; ?, G
23
6 j& d5 M7 m5 @. d* Y- `9 z24
) V3 h+ r  c0 u; a25  J: V* C! S' s: h  r
26
" \0 e' f# K: u8 y
[root@localhost SPECS]# rpmbuild -bb nginx.spec
8 b# \# r. H  e" |' x. A3 s; AExecuting(%prep): /bin/sh -e /var/tmp/rpm-tmp.N1Tdpo
% w9 S; T9 c9 R6 C+ umask 022
  S# V0 j+ J5 e. C1 n7 A0 {; p3 F+ cd /root/rpmbuild/BUILD
7 |% t) n1 X4 u. E) z* k+ cd /root/rpmbuild/BUILD
* \1 f2 u" Z5 Q, G! {9 Y+ rm -rf nginx-1.16.1
9 n% `  @: r3 N% p- v  Y+ /usr/bin/tar -xvvf -
% ^; N6 K1 J! O2 K/ I3 Q) L3 ?+ /usr/bin/gzip -dc /root/rpmbuild/SOURCES/nginx-1.16.1.tar.gz) F3 z4 q( P% Z: Z
...
) m$ t& j7 Y; a6 O+ STATUS=08 `" O/ {$ g' ~3 `( R# E. |
+ '[' 0 -ne 0 ']'9 e! t, e- g, ?/ r  D2 T
+ cd nginx-1.16.1% x* r& ^$ u1 d  `$ t
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
8 N3 }- i$ A/ Q/ k+ cd /root/rpmbuild/BUILD) \1 r6 o0 D5 V4 v. O
+ cd nginx-1.16.15 q6 ]/ r9 H8 K3 U
+ /usr/bin/tar -xvvf -/ a( r( h5 m3 v& L% l- V
+ /usr/bin/gzip -dc /root/rpmbuild/SOURCES/nginx-http-concat.tar.gz
( }; f6 s- [) P' B' H  H...
' U/ |7 k5 S4 l+ I, u# i# R9 O5 E+ STATUS=0* x5 Q; ^, V/ R. B8 ~( g$ b5 ~; D
+ '[' 0 -ne 0 ']'# s; l4 j- I8 i, |! @& @: ~
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
1 b- S) L4 r1 z% N* d; f+ cd /root/rpmbuild/BUILD
3 Y* P2 N3 m7 @3 z1 F7 R# t9 T+ cd nginx-1.16.1( Y$ M1 c( [% P2 u; l
+ /usr/bin/tar -xvvf -  g  w3 e, I. S1 B! G9 |' k
+ /usr/bin/gzip -dc /root/rpmbuild/SOURCES/ngx_cache_purge.tar.gz/ K3 W4 c- A5 v) K7 \2 J( r. Y
...  C4 Q6 G- R% t1 `0 c& }4 J3 z' b
+ E# M) Y: S: {1 {0 o8 N9 o% R

) r  N, m: c* S) W需要注意的是,%setup -q 是指解压不输出任何提示消息,只会解压source0的文件,即第0个source文件。%setup -T -a num 先进入目录再解压第num个source文件,进入目录的意思是进入%{name}-%{version}这个目录,即spec前面定义好的Name以及Version。
- t" b9 C1 ~8 i+ R4 r7 n& j- J! z

1 T, v$ u. L: s. Z$ j
%build阶段
这个阶段就是执行常见的configure和make操作,如果有些软件需要最先执行bootstrap之类的,可以放在configure之前来做。这个阶段我们最常见只有两条指令:
复制
1
  }& M5 r, F& I7 U2- J0 A3 c0 L  X; W' U
%configure% r+ c7 Z1 v6 w! A' r- z
make %{?_smp_mflags}
7 |" L. H7 _: f) u

" S- V: O4 p' ]4 s+ U0 V
  \/ B6 V- e3 T9 {( v
这里的%configure是个宏常量,会自动将prefix设置成/usr。另外,这个宏还可以接受额外的参数,如果某些软件有某些高级特性需要开启,可以通过给%configure宏传参数来开启。如果不用 %configure这个宏的话,就需要完全手动指定configure时的配置参数了。同样地,我们也可以给make传递额外的参数,例如: make %{?_smp_mflags} CFLAGS="" …
%install阶段
这个阶段就是执行make install操作。这个阶段会在%_buildrootdir目录里建好目录结构,然后将需要打包到rpm软件包里的文件从%_builddir里拷贝到%_buildrootdir里对应的目录里。这个阶段最常见的两条指令是:
复制
1
* k' U2 ^3 b5 b2+ L; h  z" p1 @$ I0 c
rm -rf $RPM_BUILD_ROOT5 o) }; s# H7 y  l& i3 e
make install DESTDIR=$RPM_BUILD_ROOT6 k: t2 u- y( t
# M9 c8 U: M8 t% ^6 g+ T7 v

7 K( x& h- D% \
其中$RPM_BUILD_ROOT也可以换成我们前面定义的BuildRoot变量,不过要写成%{buildroot}才可以,必须全部用小写,不然要报错。
如果软件有配置文件或者额外的启动脚本之类,就要手动用copy命令或者install命令你给将它也拷贝到%{buildroot}相应的目录里。用copy命令时如果目录不存在要手动建立,不然也会报错,所以推荐用install命令。
制作rpm软件包的阶段
这个阶段必须引出下面一个叫做%files的阶段。它主要用来说明会将%{buildroot}目录下的哪些文件和目录最终打包到rpm包里。
复制
1
: s4 C% S  `6 F7 w1 [2
& d7 D" ]) G0 m$ b9 M$ ~3  S! D2 t- U7 m. n3 s. X' v
%files6 T" m8 J- X7 p3 j9 k% v
%defattr(-,root,root,-)4 }8 X6 y* @& N0 n* u
%doc& x5 r' K3 ^  g
/ |0 z" C3 n' o- O  L$ k) O

4 X1 j& l6 Z9 ~9 S0 X# D
%defattr 表示的意思是: %defattr(文件权限,用户名,组名,目录权限) ,如果不牵扯到文件、目录权限的改变则一般用%defattr(-,root,root,-)这条指令来为其设置缺省权限。
关于%files阶段有两个特性要牢记:
  • %{buildroot}里的所有文件都要明确被指定是否要被打包到rpm里。什么意思呢?假如,%{buildroot}目录下有4个目录a、b、c和d,在%files里仅指定a和b要打包到rpm里,如果不把c和d用exclude声明是要报错的;
  • 如果声明了%{buildroot}里不存在的文件或者目录也会报错。
    % m3 P7 T4 x& i; ~4 t
代表路径的宏列表
如果您看到一个不熟悉的宏,您可以使用rpm --showrc 或者 rpm --eval %{_bindir}以下方法对其进行查看:
. {: D! ~, f9 f+ r+ L4 z; @
复制
11 \7 F% G9 ^) w% g/ R6 j! s* A& p
2
4 B6 v9 s5 t- d' T3. W& w) @% X) h7 f' M
45 h6 E; X6 K$ K7 ?5 s5 t
50 M. Q) W( q) [
6
$ D# C, A- b  Q$ ?5 h; p: o8 V
$ rpm --eval %{_bindir}
5 F" j- {0 G% ]5 n/usr/bin
/ r7 B- x5 K1 H$ y) A/ a* v
1 V6 i3 b; L: }[root@localhost noarch]# rpm --showrc |grep buildrootdir" f4 h6 K" @8 t/ T
-14: _buildrootdir        %{_topdir}/BUILDROOT
6 D! B6 o( i/ N- z% s-14: buildroot        %{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch}
" m, @" m+ N1 X: Z! O
9 e% r+ I2 D8 I) f6 E( F  z+ D
5 j, T( J; j! h  A" u' e/ `! U* Z% |  y
- @2 d" d6 Z! Y  a) w
也可以直接查看/usr/lib/rpm/macros文件,以下是常见的宏:
复制
1
0 x, a, J5 G& [) _1 K3 [0 X1 v( |2
: v' x( A" I+ B: S6 j+ y. ]( K$ Y3
3 N7 O' H, v5 V' I6 o4
& C- J9 ?7 x, U3 e8 F% X5 c5
  a3 x* C3 l8 N/ X. A6
! D  P5 ]9 r* w% |8 ^7
+ [  s) ~' C; x1 q5 K; `! m8: x3 m0 j/ x, w) T- ?
9: K$ {) M  s2 A: J
10
. R6 N+ T, F0 N+ \! w& O6 d11
1 A% A6 j5 E4 [( n$ {, P! p124 J3 }- c" P* o# d
13
" e& x  h( v# G2 T' s2 H1 z14
8 b+ r1 C2 L; Q6 S7 X153 H4 A  l+ c5 U# [0 e
165 H' w. I& a- d9 X
17$ |, P2 t& N5 m* c0 {
18% j, L/ e, T5 K; M; V
19! F1 ^4 A% X8 g( b3 h4 g) b+ f
20
# X5 L7 R3 ]/ N# s/ Q5 ~' ?21
& i5 A2 M' \( v1 P% `6 _22
  Q8 n/ n" @8 Y$ Z237 L& D; y: i& N( G& e
%{_sysconfdir}        /etc
5 l0 I# V+ ?4 g) P/ Z1 y' t%{_prefix}            /usr. Z9 V0 {# ]/ I* R, D! J! `
%{_exec_prefix}       %{_prefix}% F/ {8 t7 }" z. T& j6 |/ E# W& t
%{_bindir}            %{_exec_prefix}/bin
- ~( B* F# [# g& `%{_libdir}            %{_exec_prefix}/%{_lib}4 Q/ ], W) \( A9 G" E
%{_libexecdir}        %{_exec_prefix}/libexec
* I' D3 S8 [4 _* x% u! h3 V' x3 R%{_sbindir}           %{_exec_prefix}/sbin& u& L- [" w) g
%{_sharedstatedir}    /var/lib
3 g5 \  H( l! h3 f; H%{_datarootdir}       %{_prefix}/share
4 k# {8 ]) @. D3 r%{_datadir}           %{_datarootdir}
9 j' {7 d3 K9 Q0 G% h! M! S3 ^4 i%{_includedir}        %{_prefix}/include; D8 x) g+ a/ G2 I0 g+ U& o" M
%{_infodir}           /usr/share/info
' O: p1 {& w! O! h" U%{_mandir}            /usr/share/man9 a$ c/ }9 m% W# e9 |0 P" P% ~
%{_localstatedir}     /var
+ F" B; Y* u) i( ?2 V- C7 ^! I6 z- Y%{_initddir}          %{_sysconfdir}/rc.d/init.d7 v, O9 o4 z  C
%{_var}               /var/ [3 W( D. i5 h: F3 _
%{_tmppath}           %{_var}/tmp; [! `5 O: k  ]- D* H. {+ U
%{_usr}               /usr
' Q7 f; W, B3 |% d/ m%{_usrsrc}            %{_usr}/src
& v0 Q5 T& B, V$ y% |%{_lib}               lib (lib64 on 64bit multilib systems)9 t8 o" `9 T8 N+ n1 q  y3 O; V/ Z
%{_docdir}            %{_datadir}/doc5 P' z9 {. r; u- u
%{buildroot}          %{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch}
5 K: S# v+ A, A. ~1 E( ]" y$RPM_BUILD_ROOT       %{buildroot}
% t5 v& R1 V) ?" E7 t2 A+ f5 |5 i% B" b

4 ~8 `$ `# e8 G$ i/ U- u2 }

- D5 D" r- g1 Y7 U# k2 @# G6 [要注意的是%{buildroot} 跟%{_buildrootdir}不同。%{_buildrootdir}对应的目录是~/rpmbuild/BUILDROOT;而%{buildroot}是%{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch},有关其他内容可以参考 https://fedoraproject.org/wiki/Packaging:RPMMacros?rd=Packaging/RPMMacros#RPM_directory_macros9 Q$ {) M; I2 {7 n$ Y4 q% J
6 l* w3 K( M. P; P) Q  Z
实例1:打包shell
可以把一个平时写的一个脚本打包成一个rpm包,spec文件如下:
复制
1: p7 q* @) ?% d- H& M
2
% I* U7 i: C3 [, H- s37 b$ K7 X, L) c) Y/ F0 ~
4
* E' Q2 I# \. T- _1 ^% s9 ~5
2 B; I; |. W$ b5 ~- \4 P5 I6
- ]$ p' o. U6 k5 V; v, X# a1 I7' ]3 s; {$ G& D; k2 r
8
- P" I, c7 Z5 T. }9
2 t) v' ^. S; A$ a4 W10
, m; b1 U# J2 U7 j11
+ |9 R& e' q& X, d12
1 E: U' m# o$ b: r4 z) f13
/ n; `2 L$ \( b! _; ?- q, Q- @9 g142 p8 x- g: g7 }2 q2 e! t' {: \
15% c% g$ R4 e# F0 w
16
2 \8 V6 K/ @1 {( J" B0 k0 N17
1 ^! B, u- Y" y% r18
) Y; l  N+ z4 C  B$ F. h0 ~198 O: d# W+ l! {: l! V6 J# X3 R- ~% {
20
+ K% I& ~+ W: C: x/ m8 T, Z0 b/ v21
0 y( R% `5 m  ?* b: t6 P22
3 x# _8 R0 P- V1 [23
' T: K: `1 l' w1 c( X+ l24/ I, V( o; ^$ m$ V! K
25. D4 S/ |1 I" }% G8 U* y
26
9 N8 }/ D8 _+ ~' \4 e5 E271 W' G  L9 K" w) N
28* c8 i7 s/ w1 F- E- e3 F3 n1 f
29
$ a% g& E% b- D( a
[root@localhost SPECS]# cat disk.spec
& k( w3 H! y8 c3 `9 jName:                showdiskinfo, L) H& f: `" K1 I4 }! n
Version:        1.0
: D. B- H; E# q" XRelease:        1%{?dist}
: l" @7 c2 x$ xSummary:        Show Raid and Disk info; K2 c6 }6 }( p
License:        GPL7 n" j) V5 p/ l$ C1 u% a8 l1 g* [* M
URL:                http://www.wumingx.cn) U! W( N3 _  v( L4 a' _! m
Source0:        showdiskinfo.sh( o1 p0 |0 y$ G1 u/ K

' x, Z3 G& C5 X. K$ K; I) p#BuildRequires:/ U2 p5 b* `' n! J5 v/ L. y% p
Requires:       bash
9 e! w* K" U/ H( X: _" Y# b! F1 |7 O  V/ d2 F
%description# w8 e/ x5 {3 m. M
showdiskinfo shell script.
" B3 d9 ]  h' V: q8 G9 p# Q4 {% O' d( \6 _; ~
%prep6 ^" G& Q& O" G9 b# b- ~
#%setup -q
! D8 Z6 e9 g. g' j. g( n0 R
  t$ c3 g8 y3 q& w%build, ^! K& ?8 `% Q
cp %_sourcedir/showdiskinfo.sh %_builddir/showdiskinfo
+ G! a4 k+ o! E( m+ r1 Q( \9 ~
" V) y! O1 r6 {* d2 ?7 f%install, O' r* K' }+ |( M! [2 k
mkdir -p %{buildroot}/usr/local/bin! C$ p! g6 Q9 j  F0 G
install -m 755 showdiskinfo %{buildroot}/usr/local/bin# S9 W+ V" i) I* p
- \4 F4 i, c- V
%files
5 ]1 f4 y0 [9 D4 u/usr/local/bin/showdiskinfo
' U6 B& p: W% d%doc8 y+ Q0 n! t' }
%changelog
& h5 h3 d/ e3 V  h1 e; p
8 Z9 O4 P. x3 z" w, L. ^
0 U0 c7 Z& E# |3 {7 M. Q- R4 G
开始编译:
复制
10 Y7 L* q, x  f" b
2! F/ M* b# X5 N% `; A: F
3& E+ x& Q1 g, Y
4
# \2 M5 `) `* d, U0 A5  D( K. P5 r; B( _0 ]9 V
6
. e: s! q% @( A3 c7 b8 O$ w7# {1 J# M4 e/ o4 n& \' r9 c
8
1 B! B7 l" ~$ N- ]/ ~4 N2 V91 d3 p4 J8 @$ Y) c) L
10
# x8 j; k* C5 g3 _+ _113 _7 t' ?3 y, G. @$ D/ G7 Y
12
) b4 d- z4 R, O: p4 \; r136 k: A. J3 d0 g; A. F# a5 N9 {
14
7 g: u! W5 c, s( v- j4 @15% \% f1 d5 U' V+ O- S" U
16
% f6 u* G2 _( t17
  Z3 O1 M/ U( l6 `9 K+ `184 B8 G/ l6 }( {3 t- F! N
19
8 d; `( r: S1 l# u8 H- ]& @# [20! F2 l5 ~- c$ e$ i/ g4 Z
219 n0 Z* K# W5 y2 Q/ J/ o
22
7 ~! n4 S) x! G0 b# Z4 q23
- w( u$ r1 ~' q/ s; O, L24& ?$ x$ N% K; h) d8 B- q9 c
25
+ B% Y6 j3 U8 b3 q8 z265 I$ L7 |' b  f* d5 z+ t
27
9 ^% H+ V, @+ ?4 n/ h) @5 ^28; g; Z: a. k. K0 |6 C
294 \$ g" X: U" f9 j
309 }) ?" K9 U, Q. Y( p# M
31
; r9 k! I0 S- u' J: }: G328 b+ W& X1 s0 w4 L- z' P2 W
335 f3 q# ^2 \3 r  U& \3 d
34
4 U- s; q9 b7 b& `4 L355 ?7 U' d6 ^, ?
36
6 X. B; l2 m) a1 {, a# M9 C37$ ], f6 Q& H. g, p6 [
38
. u8 T: I9 l6 {! I, l' X39
+ P: ]. \) n# I# s% E
[root@localhost SPECS]# rpmbuild -bb disk.spec7 H8 N( S! l; z
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.agda2b3 A( S5 f- }3 s  s
+ umask 0223 k; z  C% Q3 w" _0 K
+ cd /root/rpmbuild/BUILD
/ I! {7 }7 Z6 w+ exit 0
; ^# i2 u' x0 F1 w8 I7 l2 U% w1 J% R1 ZExecuting(%build): /bin/sh -e /var/tmp/rpm-tmp.spexQx
9 v2 o1 J6 s) z* e. c3 l+ umask 022' W- E- k) R: E& H
+ cd /root/rpmbuild/BUILD
' P/ d5 W+ \3 ^6 E+ cp /root/rpmbuild/SOURCES/showdiskinfo.sh /root/rpmbuild/BUILD/showdiskinfo
+ t" \; X  ~% D; \! d! x" N* R+ exit 06 \4 q+ L, I! y* {+ y6 q( e
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.grcfHT
, m, F: S. F: E* f4 T' Y+ umask 022
' e1 C5 d2 X+ n& X0 s7 f5 s3 |& p  `+ cd /root/rpmbuild/BUILD3 d* G2 C9 [& o
+ '[' /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64 '!=' / ']'
$ c) Q$ l0 Q  u+ rm -rf /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64
' N( S+ U2 J! o) Y" Q++ dirname /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64; _2 Y3 ^8 M6 H
+ mkdir -p /root/rpmbuild/BUILDROOT
) {0 g% V0 `) O/ s. e+ mkdir /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64
" p7 w$ a/ u* K6 D+ mkdir -p /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64/usr/local/bin
0 m: Y* S" l8 O) H# }/ Y) K+ install -m 755 showdiskinfo /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64/usr/local/bin
, }8 {2 E9 _, ?& ?, m+ /usr/lib/rpm/check-buildroot
4 s) r" b5 v- |$ y" K: s! h% t+ /usr/lib/rpm/redhat/brp-compress! `0 M; z  U) E& S9 \% w  W, I
+ /usr/lib/rpm/redhat/brp-strip /usr/bin/strip
, o/ L4 R+ i; x9 _+ /usr/lib/rpm/redhat/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump
. n5 z( A# b- l  z- }) \+ /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip5 D7 w1 R1 \3 ~6 r6 C/ E' C8 G  [
+ /usr/lib/rpm/brp-python-bytecompile /usr/bin/python 1
; t  b- {' d6 i! `% U7 `% f  j7 E0 Z+ /usr/lib/rpm/redhat/brp-python-hardlink
9 N8 M9 G3 x+ w* g+ /usr/lib/rpm/redhat/brp-java-repack-jars9 e' w% ?( M( C: K
Processing files: showdiskinfo-1.0-1.el7.x86_64
: E& p& |! g& s0 h/ W4 i2 lProvides: showdiskinfo = 1.0-1.el7 showdiskinfo(x86-64) = 1.0-1.el7
/ G# J: K6 B6 R$ Z) }Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-16 j; A* N5 N# H7 M7 D9 ^
Requires: /bin/bash
. l4 e0 p, p( s+ [1 U' Z9 a- sChecking for unpackaged file(s): /usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64
6 n$ C7 u* q' l( W' IWrote: /root/rpmbuild/RPMS/x86_64/showdiskinfo-1.0-1.el7.x86_64.rpm1 Z8 `, f, \. w4 ]/ P0 N  j
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.4uHq3D
5 ]- ]+ e2 l' _  q/ a+ umask 022
4 L( ~+ O9 Q' t- M7 ^9 _+ K  W+ cd /root/rpmbuild/BUILD
$ j$ K. l4 e& J+ b0 n* o. ~' E7 ~+ /usr/bin/rm -rf /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64
$ K& a, {; u- c, v+ exit 0
& _9 N! Y; H7 {2 [: `2 e

; k' X% E$ z* u# ?

, y2 s$ }* |& Z, l% h9 Q
可以看到编译成功了,文件保存在Wrote: /root/rpmbuild/RPMS/x86_64/showdiskinfo-1.0-1.el7.x86_64.rpm下,开始查看:
复制
1
0 c$ Z. V0 T+ @2 u2& V, l2 l/ p2 B  z9 Y$ G
3
4 F; j: W1 E% q/ Q$ @4, ^! H$ h! I9 I6 R, @
54 J6 }- P: k- Q! A9 o- F. {2 l; {
6# R4 S7 _" E5 p% ^
7
% r) B# M9 n8 `+ W7 [1 Z2 w8
  |2 A4 o: B: G7 K" X! h2 B9
# A* D! T! [) E9 I: i- L10
2 G# X* k# @- o) ?. N11' s; G( e5 F1 g% V/ ]
12* x' X* b  L  b3 v# Y, P$ X
133 O7 G* z1 @9 y! g% K; b* R
14
; V' G9 Z. J0 E' h, E15
1 t+ ^+ c% _5 V8 ?. {" T16: K2 v" v+ `2 [% K; S
17
- K0 s; i- o, f1 q* Q18
% v4 G( O6 ^) t' G5 D( }19
0 c# G8 r+ Z( j9 n20
& v  m! Q0 t! N8 u% E- R3 u! _7 k21
1 |  [3 Q: H' _5 E* K" |" y5 C22( X, V' F$ W7 t% Y& A4 M
23
4 i) F# ]* u: [, _, {: v5 y0 ~) F24
- z) o+ x2 L' N' M5 B* ~* w257 l3 U8 j( u' x% b
266 \. P# F3 j1 f/ u5 V  p
27
4 s. a2 A5 M. @# w28
4 @" W" r1 a3 o) b9 i( K2 K29
8 H, A0 R  W& B+ r* M" S) i# B: y+ w30
# Q9 N5 t& U  U31
8 z8 H% k8 [+ s
[root@localhost SPECS]# cd ../RPMS/x86_64/
5 X6 c- @* ^" R8 o2 {  C* K1 a[root@localhost x86_64]# rpm -qpi showdiskinfo-1.0-1.el7.x86_64.rpm. k( B9 h+ i! `1 `
Name        : showdiskinfo9 M' A8 s0 }! P/ W
Version     : 1.0
9 f  j7 b: m5 E% {/ G! o$ yRelease     : 1.el7# ^, x, G* k1 m# b4 Y
Architecture: x86_64! x9 S: I8 |* Y
Install Date: (not installed)
& c# [2 l% `' @/ {Group       : Unspecified
) G2 M! V4 B+ p/ r; KSize        : 383903 x5 ^! B3 w1 t) \" T: m
License     : GPL) k. |6 q: N  b; p" S
Signature   : (none)
! p, z4 h1 D% B. E) uSource RPM  : showdiskinfo-1.0-1.el7.src.rpm
% ^- r+ |- B8 n( |$ xBuild Date  : Fri 08 Mar 2019 06:41:42 PM EST  G) k" ~/ u" s3 L* }, }6 y7 |) e1 O
Build Host  : localhost
' G/ ~, Y. t9 j4 ]Relocations : (not relocatable)1 W8 {" A- o* z3 O
URL         : http://www.wumingx.cn' t+ N, Y+ n/ x) y' E
Summary     : Show Raid and Disk info
! {0 K2 P7 c: Z$ CDescription :
4 k: _2 Q8 a$ D4 Jshowdiskinfo shell script.
( ~- b& r& h& R) W# x# C) n6 b4 S[root@localhost x86_64]# rpm -qpl showdiskinfo-1.0-1.el7.x86_64.rpm4 v+ i* p1 i; h9 }6 @
/usr/local/bin/showdiskinfo" K- `1 W& ?, T9 {8 p' t" H
#开始安装
' @+ |$ G) x2 C. m4 a[root@localhost x86_64]# rpm -ivh showdiskinfo-1.0-1.el7.x86_64.rpm
* E: I6 W0 t; m& y2 T0 ^, f! |$ F2 bPreparing...                          ################################# [100%]
! W  f$ \" ~0 r& U5 f/ s3 \Updating / installing...
: }6 k5 ?! c6 E% H9 ]. l; h' I" T: v   1:showdiskinfo-1.0-1.el7           ################################# [100%]
3 Q- X9 n& a7 n0 @& H[root@localhost x86_64]# ll /usr/local/bin/) W. _+ Z* x3 b* O. `8 r8 M
total 40
5 g- i0 V+ i) t/ n5 [: {0 S6 w  g& O7 Y-rwxr-xr-x. 1 root root 38390 Mar  8 18:41 showdiskinfo
8 k# U+ S) G) s' o1 B+ ^[root@localhost x86_64]# showdiskinfo
- T5 ^* L0 y! ~  {; n# mno raid
, Z* u+ [; M0 H. n- }

' l% M# s# T. R) H

. K/ }* E! w0 ]$ [+ X/ I5 E3 I! {
此内容参考了 https://rpm-packaging-guide.github.io/#hello-world ,可以阅读原版。
实例2:打包main
此代码来源鸟哥私房菜,先来处理原始码的部份:
复制
16 K) Z/ O, n- ?* A
2& b  h+ E8 P% j9 U. i
3$ @3 S4 ^5 M" b+ |
4
0 C0 u/ E. Y- w# S( b( ?+ M& F5
$ a0 k" n4 W. W" j% M# q6
( f5 u7 [  `! p0 K9 M
[root@study ~]# cd /root/rpmbuild/SOURCES
$ l: [2 W$ T3 A# b) L8 D& D[root@study SOURCES]# wget http://linux.vbird.org/linux_basic/0520source/main-0.1.tgz
2 j2 ]  X$ t. {; ?[root@study SOURCES]# wget http ://linux.vbird.org/linux_basic/0520source/main_0.1_to_0.2.patch ! u# w1 U/ k, i9 q, r
[root@study SOURCES]# ll main*- q1 m9 R$ i4 Z) o$ b
-rw-r--r--. 1 root root 703 Sep 4 14:47 main-0.1.tgz
3 B3 o. v. b& r3 _) G( `, H-rw-r--r--. 1 root root 1538 Sep 4 14:51 main_0.1_to_0.2.patch: _1 v. [1 T! h9 e" j& t2 F- U4 b

$ X7 E* \/ k% K5 |7 _4 U

6 U0 M9 Y% F- b& k
到SPECS目录下创建main.spec文件,建议使用vim创建,会自动生成格式。也可以用rpmdev-newspec -o Name-version.spec命令来生成SPEC文件的模板
复制
1. v5 i9 ^  Z; n5 U( ~0 ]
2* k4 F& \) w! l8 J, a
3! Z9 _: h. Q1 `- v+ S2 [3 x" y
4
! d; F" F  }: y3 }. W* n5* @2 n5 p7 t# q* j" p0 B8 m, \
6% e9 P, b# _' q) T0 W
7
3 A: n* C$ E8 {+ V6 ~; ^. h8- I: C) j& z( _
95 ?' Q0 {% L; G8 a% j
10
7 n* e2 W* a( E0 w1 z11
9 b2 }* Q1 N1 |; |6 b125 h0 S. v5 x: b' C: N
134 a5 l7 V5 Z: f3 O+ h
14
. p# K4 m- ]: r1 w7 g15
' ^& r% l/ [; ^5 r/ f16
, A$ x+ w# ^$ G1 F- V. J17
' w' F) f, W) W1 \( {182 A: p& b. S/ V. r
19
5 v' I* O4 J/ x6 O6 W: D20/ L" a% {( {& _
211 V/ ?; f) q5 q& i& M
22+ r# L2 f9 H# s
23
, J% }2 \! P8 e! U2 Q' z7 {& p7 u24
, E2 m9 L' B$ i0 Q2 O2 L2 I' x25
0 Q, x3 T; @3 T4 Z5 L6 q" l0 F; f26
0 x$ @/ K/ [6 V: O" V27- p+ _' E, L- v& l
28
. e9 j" b3 E& @7 H29& {6 s: _$ Z0 V* C
30
" A7 o% @; f. z6 L* w9 j+ Z31
7 v0 t# a# c0 [; [; W4 C% m32& G% |' `( n9 W. D
33
! @3 S& {) Q. h4 p0 `* t34% v1 c' ^, _* I
352 d( B5 a. {+ P7 P' ]! N! b* Y9 r
36
0 R1 t' B& h7 K/ b0 ~/ y
[root@localhost SPECS]# cat main.spec( t; ?; r) C+ W
Name:                main
) ]! i2 |1 ^- u4 [# rVersion:        0.1
/ g) q. `& n9 j  V* wRelease:        1%{?dist}) \& u% E( V' V( o) |6 {
Summary:        Shows sin and cos value& i1 b5 H  [5 G4 T9 y

" a6 R8 T8 ~8 L! P  VGroup:                Scientific Support* s* E" w, z: w& u$ c: }1 Q/ e; B
License:        GPLv2' S8 f! L& N% z
URL:                http://www.fangdm.com/
" ^8 Y, M! {) LSource0:        main-0.1.tgz
2 u% m& n/ E) xPatch0:                main_0.1_to_0.2.patch
" f( q6 m; t6 `: @$ R8 i. Y+ Q( s8 H, D, }) B
#BuildRequires:
2 w* ?; r# i) }# T. F+ ~#Requires:
. L4 O0 M" _) F; s( O4 l' d  {) k( v& @# B$ ]+ ^
%description
; s/ w5 A8 q' C( l" kThis package will let you input your name and calculate sin cos value.* N* ?0 f$ P. d1 K
2 s4 w+ f" B3 N" H( G- t3 x1 N
%prep
7 f! A& C! [! t% b6 z$ N%setup -q9 A- D+ X( g! S% u2 x) h# ^
%patch0 -p15 {, _7 y9 n9 O# F
/ m7 v; R7 _& l8 b- }7 x
%build3 ^2 n( [# ], G, p
make clean main
% W3 d2 e# g) z% n9 Y; G4 M( \3 Q: U  {
%install: X$ |$ ~+ F4 M
mkdir -p %{buildroot}/usr/local/bin
9 _- _5 u# F( E5 Linstall -m 755 main %{buildroot}/usr/local/bin. O" l2 B( G2 `& n" f
. a% A1 H9 n$ `7 P& c8 O0 L
%files
! Z2 @0 O- t8 X% `/usr/local/bin/main
( S/ c/ s4 P, C( W%doc
" h/ P7 y% j( p" |1 U; a6 U, A
" E0 ?7 S! I5 b3 Q8 N%changelog& I3 M  Z+ |- e( Z, t0 s
* Wed Sep 09 2015 VBird Tsai <vbird@mail.vbird.idv.tw> 0.24 @& [0 O" S- A1 W
- build the program6 Z3 }9 q9 o6 v  H
0 O0 ?  I& y5 S# H% e4 _

5 J# r' o; q6 {2 x% P/ \
然后就直接编译rpmbuild -ba main.spec,再安装rpm -ivh main-0.1-1.el7.x86_64.rpm
复制
1
, t7 m; {* q1 T6 w; s! v2
5 X# {1 J: @5 k& a4 H7 O31 u* v" E+ @9 }' m5 H! `. M
4
" q4 S  O! F9 C/ i5% }6 D5 v8 c' g( c) N- o: |
6
3 S7 m7 w8 s; Q& y7
# W- K: E4 t  o0 x) M' S; ]2 r, V8+ b3 W% d% p/ E( O" z, m3 M/ k7 J7 `
9
5 O; B  C) I0 M10
8 Q# a' }  ?, V8 V8 ~1 M. j11
; ?. C( j% ^" Q& p1 d9 h/ }12
* {4 [2 U6 V! Y0 p2 p4 Q, V13  K* f2 t& \( H3 D4 U+ n7 B( U
14$ A1 k0 h& `" C% e5 g6 a, g) V
15* o- `4 n% J2 u0 [1 @% a( i$ n
16! G1 Y7 [" k' C
17
7 s" A3 ^) b3 z3 q3 h! N9 {- A18, q) H* [& K8 M8 p! T
[root@localhost x86_64]# rpm -qi main
- J! U$ @5 F- o/ q3 F% YName        : main
; X; |; {8 W4 B8 o' g3 w) T+ p6 ^Version     : 0.12 @9 G. m! y& H6 E  c* S# {) y
Release     : 1.el7
7 K7 A9 [2 k" s9 z$ Q9 K5 G, y; ?Architecture: x86_64# M* c7 A+ e* H3 S$ B
Install Date: Thu 07 Mar 2019 05:42:50 PM EST
8 {( M5 {5 A1 ^1 D* g% ~+ `Group       : Scientific Support' m7 A0 @( W# I
Size        : 7272
1 D) e5 a* k! m  U9 }5 x9 W  j$ Z+ ILicense     : GPLv2
2 e& n! k8 U8 }, m4 O1 M4 BSignature   : (none)
* o, g& x' ]+ D- T4 ?# X3 OSource RPM  : main-0.1-1.el7.src.rpm
) z. s! `1 j3 d) K; vBuild Date  : Thu 07 Mar 2019 05:42:07 PM EST
8 d3 i/ z5 g5 W; _Build Host  : localhost
8 ^  k: G! X1 f: M. X/ O8 a* RRelocations : (not relocatable)' p; a0 O1 S$ }: u. @3 d
URL         : http://www.fangdm.com/
2 d: D2 y: ^/ a% D2 ]Summary     : Shows sin and cos value
8 p* R* Y# p' x; _' E  HDescription :6 t/ W: i2 {7 g% Q+ m
This package will let you input your name and calculate sin cos value.- K+ Y! X+ \; G# g
5 G) F0 F& z# Z/ L

* _7 _! \7 }- H) L+ f实例3:打包hello
使用区域语言(Locale)文件的程序应遵循 处理 i18n 文件的建议方法:
  • 在 %install 步骤中找出文件名: %find_lang ${name}
  • 添加必要的编译依赖: BuildRequires: gettext
  • 使用找到的文件名: %files -f ${name}.lang
    , Z; g" u  k) n  U
%find_lang此宏将找到属于您的包的所有语言环境文件(按名称),并将此列表放在一个文件中。然后,您可以使用该文件包含所有语言环境。
1 O4 q3 S. P  Z/ k6 e' _
复制
1
' I' c9 m2 A5 t3 M) {# @29 v: r# E0 A( N9 Q
3
- G$ R* _% s% F% y42 u  }! e4 M, {6 Z9 |
[root@localhost SPECS]# rpm --eval %find_lang
4 k0 g/ }5 u! `) Q3 ?4 a/usr/lib/rpm/find-lang.sh /root/rpmbuild/BUILDROOT/%{name}-%{version}-%{release}.x86_64# U$ J% F" b7 C8 |
[root@localhost SPECS]# rpm --eval %make_install$ o9 V8 E: n" \8 w; t$ N
/usr/bin/make install DESTDIR=/root/rpmbuild/BUILDROOT/%{name}-%{version}-%{release}.x86_64
0 Q( v& V9 d$ J9 _' d
& {0 b" J8 A8 S. ~
2 b5 w+ I! e& \1 A

6 y6 ~/ e) o$ y% s+ {$ z+ M1 [
%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}。
复制
14 j  `" j) X5 \/ P, O
2. A, x/ l! a: f: b4 z
3
3 }; N8 g8 J9 i( X3 |49 m$ f8 w$ ^; `
5
$ Z$ q2 P4 i3 e) a7 A2 ^8 w$ y6
& v( r& i8 [: w+ v7& K0 \6 P" p7 `3 i3 I
84 D  |* k1 Y  t7 g# K
9
& Z9 W9 U. ~# I8 Z4 }  b10
# i8 c7 Z( b6 b5 T11
4 p5 M% W6 m& [: C12% @  |4 N/ J1 Z% n
13
9 b! e# K! F* R' x14" b, m5 l9 D; g
15
2 ~% s* |9 g) j, I! K16
- D: a! J$ o7 P8 W& w! s2 ]  {* S17% A5 X( P3 ~/ _0 P( ]! M% `% o) J* `
18
; Y/ w; B* c" L( \2 v( F- Z19. e/ c5 N7 e* \
20
- T- i1 W, D/ e210 ~/ k" y. o. a& Z# p2 I
22
. K+ @: I3 ^1 H6 ~5 a: z" x23
8 H4 U$ `8 a3 D2 z# C247 e4 U& q4 `( O8 j3 [  w/ Z9 X1 y
25' n9 _1 D3 N- L3 [6 t8 |
26
7 g) K' d" m9 i& K% F27& b9 o: J4 a6 |# u3 ?: n# d( U8 X$ y2 d
28: I4 }1 |- m: O" p) T
29' X5 E( i8 K1 s. B  u$ Z4 a1 V  n
301 w6 g! @- D7 ^# B. @
31, v2 o8 m/ s/ l, V3 \' w
32( Q; K' ?  H1 E9 l& `' @
33
. n3 e  b: M( k8 h5 H344 C% S! D% a. P$ ]" t$ }
35
* V# ^: N- e" Q) v$ F36
0 G  [8 t2 S& }2 G# V  N37
6 B9 y/ ^% s6 e! W! t( _, k7 z; j38; s  ?& X, P/ Y4 X$ X1 ]! g& u- @
39/ t9 f) Q, E9 c/ j1 g
40) T& h5 P# Q/ i; T- `
41+ O6 e0 z) {+ f5 p. B* P
42* x# L$ i2 H7 B4 o3 q6 f
43. ]( q4 A5 J7 T* b6 y: u
44# K& f( B& d; e! d# u4 p; U/ x
45, F, L9 m' L, L% P
46
1 `' H3 e- l9 E1 a
[root@localhost SPECS]# cat hello.spec
4 [) F9 O- z4 H1 |- F/ W6 nName:           hello$ c+ _* G0 g+ ]
Version:        2.10
! w4 f8 V: K1 XRelease:        1%{?dist}9 }* N* o; j( Z/ ?) A$ B
Summary:        The "Hello World" program from GNU( _" X; v! S, `; s4 f
6 \! u; y2 O5 z/ y9 O( q
License:        GPLv3  S% `: h, b/ u- v$ F& W+ ?
URL:            http://ftp.gnu.org/gnu/hello/7 }, H/ q$ h, h; c8 [+ o3 D
Source0:        hello-2.10.tar.gz0 |+ s& d% P; w, Z; n# y
/ l4 `1 |4 \1 p7 R1 x$ a
BuildRequires: gettext/ @& r- o% y! m5 R6 ^
#Requires:4 K: O# Q! J( ^% m" K8 w, K5 i0 q0 t

3 F* _1 h3 h! [# Y%description1 h# H9 e8 J& `2 Y
The "Hello World" program, done with all bells and whistles of a proper FOSS
1 {- X6 ^/ J7 Xproject, including configuration, build, internationalization, help files, etc.
7 y# K, Q/ y$ D' t
  r5 f0 E$ H$ K3 B1 q$ V%prep
: ]0 v1 f4 }# g9 d* j; c* H0 E%setup -q7 H; S% r; l8 r; ]) v- t
  ]' B: f. s- J) }. O4 ~
9 M$ c. @- f0 k4 I$ s" B- M
%build
* S( r  X; L/ T, q) G$ K" P6 b; B%configure2 |  u3 S. @% r) I. X
make %{?_smp_mflags}
- y" ]" i# Y2 O
, u: F+ A$ l+ f4 M%install% F7 W( N: R) z5 r" s
%make_install
* J+ S  H* `! y  P( i! p) D%find_lang %{name}; p/ w  }# z2 y6 {
rm -f %{buildroot}/%{_infodir}/dir
0 [; z; l, M; ^6 M6 G
1 @9 W  f! g' s# m' N: i5 i' s%post
7 q4 [7 O: c" B7 c( `/sbin/install-info %{_infodir}/%{name}.info %{_infodir}/dir || :
' X2 I( g0 p2 B, f+ E( P7 q
# x8 j7 @: x+ F1 K6 Z%preun. s* p$ Z5 f8 [0 {7 W" U, ]
if [ $1 = 0 ] ; then
2 H+ h0 |3 ^: v4 [5 H& s! W; g- d3 n/sbin/install-info --delete %{_infodir}/%{name}.info %{_infodir}/dir || :4 }/ U6 o8 {8 q5 n% y
fi
% |7 W4 H8 X7 X- ], v! a& x
0 Z( E( Y7 T4 ^# C* |( Z& @. I1 R- S%files -f %{name}.lang- W3 \$ z6 U* K" {  _: x/ T
%{_bindir}/%{name}7 s  X% T; R4 G# z# E
" |9 K! `. }; ]
%doc+ ~3 `4 U* R% M( p& X
%{_infodir}/%{name}.info.*) \- Q+ E4 c( m6 b$ F& V& k+ Q* S
%{_mandir}/man1/%{name}.1.*4 J! e4 @, c) S! f
( [, g& G5 o/ h  B2 |; Z) m
%changelog/ Z5 `7 f) ]  }/ o! V8 g: @
; F$ i1 f$ p+ [# W; m+ [  v: z' b' Z
& ]( `) v4 v# N% G
然后直接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- l( d* o6 w; g4 p/ j
2
0 i9 D2 |* S, t+ }" q# F; H4 h31 W/ E+ B7 C4 S
47 s8 Z8 q) o9 y6 I* H
5
. Q$ x, r" u( h- d3 g% a2 Z: o8 `6+ E! p, W0 L; o) [# b; U  p
7
  X$ D; Q+ ]$ K+ T9 E- S3 u% ?80 n3 @, F. K( f. R; \1 {
9
" e* e9 a+ ^2 U  r6 ?" b8 n9 ~, T10
. C+ o0 ?  x1 N- W11# h6 D+ ]! R. ?8 b; U- F
129 s9 V1 C; Z& h* y/ R
13
  F  y' a6 x2 H( h$ y* l14
" K: W& t, U# [0 w( ~9 h15
1 ]% _4 T0 Q5 s) ~4 b6 s16
( ^2 C3 x, Y2 n" v  v9 L( h0 ~17* C' B) m3 {4 s. P, U
18
' \, ?' c; I9 w194 T8 Q" c/ g5 l$ s4 F& l7 O4 Y
20
& K, j, v- w( d: W21
! M' M2 ^) C3 T7 T. k- r) {. G; k22
5 @- E- Y0 m( I% _8 x# Z" R; u" @( H* W236 |5 V- e* R) n* i: G; k) n
245 L9 ~4 h" v" N
25
2 I3 \  }2 Q9 w1 X26
3 N5 f& g/ Y9 ]. C! N! \274 A! @0 H9 {- O3 k
28
+ g2 M' v" x6 l7 ~3 q; ]- T, x29$ X8 |2 G1 i5 u, b& Q9 A, i7 @
30% P$ j1 {# L3 V9 Y& s7 L
31
% y: d+ g0 V' e' x32
. l# D/ g6 E% s# [33
$ [% J7 S0 f6 S- p' s34
- y9 }4 {* _: I. I4 \( S! ?& g8 A/ g35
( w0 P5 i+ N8 B: K% \366 x. f- A8 x' k) s" P6 Z- `9 S) S
37
# k  G7 C# t" H' z' h$ X7 v38* w% i2 y% n7 I0 {& u, G& K
39
# R8 X& D1 Z  Z40
- R- Q( ?5 n8 I+ @41- d8 H4 F: T& f
42
6 \% c4 h8 c- l# l6 E( y43! Q/ V6 F- s" g5 Q
445 A$ L4 q4 i( N& w4 x. d' T9 `
45' Y& @9 M+ w1 @; `2 c  Y
46
8 Q* u& J; W/ s8 D# z* j7 {, n& z" K; n47
/ k8 V: O8 E7 X+ `, h2 y& a& c48
$ }2 N$ u3 B* R( C& K; y+ ?, g2 Z495 B! P2 G0 Y" h. ~: |
50
% ?9 E4 s: }( j& Y( a- _51
; o1 y/ q1 a/ y7 G: P52
9 V" `9 X- o1 ^' N) N53
5 b0 k5 K7 \2 `6 y+ @54
7 U$ @1 j7 q6 }$ ]5 E/ U, x! h% y55
6 ~2 _/ u: a4 ^! w. B56
( Z# ^7 A0 u7 i* x; _# [( N2 j57
" y2 f7 s* k9 o/ S. G/ P586 d" ~5 C7 L. M
59
% U5 x# {1 }6 t+ O" \# b602 ]& F! }( V* R
61) L% M7 U( n8 E# m; w7 b7 X! p$ r, c
62
$ ^( Y# T, d- Z  O; t2 ?63  c. O$ C% e- i7 G( n
64
. P7 H7 u9 L' N4 U2 ^65$ D) D: t. e! k8 i' z3 s! t7 O. z
66& m' w* @/ m& a+ |1 [4 n
67
# k) h5 m$ A, U# u68
: a% d- R; X/ g+ A9 G+ V5 {, p69
- m' p, F2 \1 F+ a5 s; E$ |( \, u70
! s7 z" N3 N3 K; R71
+ N- Q( V  v8 W72# \7 E& h: S8 d3 s* Q! ?
73
0 [, g, `8 ?$ l" O  ^( h74
& E- Q8 |; ]* |4 h8 L75; r: n8 j1 k3 l
764 h1 Q6 v3 n7 Y
775 ]1 O1 G1 Y0 ~0 I6 @" i' ^
78
4 k* f# A6 j1 b' p) D- D79
  o) p1 w, t+ V80
3 g* f; V/ {- `/ @0 D4 _! K6 ?81
: B- E" J; r1 D) V82' j( |/ J, T& O3 C
83
* R9 c. D% Y8 y; F84
9 q2 e% s8 ^% L! n0 x( c# Y85
! l& Q) u: r, I* t6 m5 ~7 W86% P& y7 C5 r9 Q2 B' ]' V7 @; m
87
/ T$ j8 T3 v/ f7 M1 \  M88
, _3 j1 d/ W7 O0 ]% M6 e89
! M3 b" m5 J7 J* }& P90
' p- ]9 }+ b% m91
2 k2 `0 v% m& U0 s92
# e- S4 f+ |/ B4 h0 D: H  u938 N8 x! P% h/ x/ n1 z1 L2 f% Y; k2 W
94
% _0 g& u. u+ A4 T$ h! \4 @95  O: w/ ]- J' [( D& C% U; |
96( ]6 M4 {* w$ k2 E
97
) W+ E: ], z6 e$ N. L+ @& o98% d# i8 w* j  f  r3 F) q8 k( ^
[root@7ftbv7mdz7cdpc ~]# cat smartmontools.spec+ p8 F  W* V. X* m" i
Summary:        Tools for monitoring SMART capable hard disks
* {! C1 L; H0 T2 K  C+ CName:                smartmontools" u/ {2 U& c4 q0 S7 N" v, \
Version:        7.0
6 V% `* S) r5 Y6 T+ FRelease:        3%{?dist}
/ T, ]1 p& `2 L4 IEpoch:                17 o5 f* V. _/ ?, a/ S8 t
License:        GPLv2+2 |/ ^% n* H6 d/ B
URL:                http://smartmontools.sourceforge.net/: t2 `) R) Z2 y8 M7 M' Q
#Source0:   http://downloads.sourceforge.net/%{name}/%{name}-%{version}.tar.gz
  f8 Z) j* f* j$ s' \" D( f5 @Source0:        %{name}-%{version}.tar.gz
4 L6 V( H5 n& kSource1:        smartd.initd8 g. o2 \/ D. q% o( n/ d
Source2:        smartmontools.sysconf  l1 P" c7 k5 }
Source4:        smartdnotify( V5 E+ Q4 z" c, k/ r3 {7 S( K% ~5 v
#semi-automatic update of drivedb.h/ R/ T# I8 S( V7 z$ \9 f
%global                UrlSource5        https://sourceforge.net/p/smartm ... rivedb.h?format=raw# J6 H3 `4 Z% H! g
Source5:        drivedb.h# A" W3 A. d% h- f
& @0 d  J) c- X
#fedora/rhel specific* r2 w6 ~8 F- e
Patch1:                smartmontools-5.38-defaultconf.patch& K: q8 h1 |4 m$ u
/ k7 |+ V$ G4 Q$ Q
#BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
2 b% L9 ?) m, T2 s; vRequires:        fileutils chkconfig initscripts
" a  B# S2 f. @2 h1 i3 P. h; MBuildRequires:        readline-devel ncurses-devel automake util-linux groff gettext
1 y3 X! t  a3 q/ }/ i0 O  ^0 dBuildRequires:        libselinux-devel libcap-ng-devel( N3 A. j- g3 R/ e2 u8 Z

* |/ G) R$ r  `/ W7 i4 `2 t%description& m4 a4 D& w  T; b4 {
The smartmontools package contains two utility programs (smartctl
& l2 P# [+ r8 f3 dand smartd) to control and monitor storage systems using the Self-
/ c1 I3 J# W9 A+ l! fMonitoring, Analysis and Reporting Technology System (SMART) built! F% R; T. {1 K' T: [4 g  V/ Y
into most modern ATA and SCSI hard disks. In many cases, these
9 @# P% ], [6 R  o# Butilities will provide advanced warning of disk degradation and& |2 v! o7 A2 b
failure.# M% G4 U- b" s5 \& y* ^5 y

( ~6 J/ H( Z$ u9 x) u. I3 f%prep
8 v( u. @0 l7 q; p" R%setup -q$ Q2 @6 t8 X- G' K& K1 s
%patch1 -p1 -b .defaultconf" e7 S8 Z! C1 u/ X0 j' q) ^" ]% [  v

# F! ]+ r3 g# h9 Q3 q1 i# update SOURCE5 on maintainer's machine prior commiting, there's no internet connection on builders
; n! n; O% l" _: R3 N#curl %{UrlSource5} -o %{SOURCE5} ||:
5 C9 ~/ k2 |& ?8 ?- Y1 V/ acp %{SOURCE5} .
1 V% D4 l" [/ q8 M5 r" l9 f2 K
8 l) o1 b+ z9 Z- Y; s! d/ }% ~. f%build, M2 J  L7 Y  L% p. I& e
autoreconf -i
# Q: K9 @2 ^* A5 G/ l6 m* A5 h%configure --with-selinux --with-libcap-ng=yes --with-systemdsystemunitdir=no --with-cxx11-option=no% m" R' f1 a2 o# q
%ifarch sparc64: I# @2 k* J1 l% Y, J
make CXXFLAGS="$RPM_OPT_FLAGS -fPIE -fno-strict-aliasing" LDFLAGS="-pie -Wl,-z,relro,-z,now"4 M# l( u$ X3 y+ C3 F6 a
%else# n* Z: [# e) ?) d% ~
make CXXFLAGS="$RPM_OPT_FLAGS -fpie -fno-strict-aliasing" LDFLAGS="-pie -Wl,-z,relro,-z,now"+ U: j2 x- ^5 Y2 V. e/ ~  W
%endif
' B" E' b" {# i, k
) o% k7 c6 m9 {8 j; h6 X8 u( ?4 b%install2 L  S6 }; b' B
rm -rf $RPM_BUILD_ROOT+ H! r3 ^4 \# r# Y
make DESTDIR=$RPM_BUILD_ROOT install
5 A3 A9 p! i) V5 b8 u% e9 C2 F
8 L0 J3 [( g6 }4 Y! ?4 P5 \rm -f examplescripts/Makefile** J3 _. C3 ]0 z& Y5 d
chmod a-x -R examplescripts/*& r+ p3 W% G+ O# X
mkdir -p $RPM_BUILD_ROOT/%{_sysconfdir}/%{name}/smartd_warning.d
& B. l8 L3 s& }. Winstall -D -p -m 755 %{SOURCE1} $RPM_BUILD_ROOT%{_sysconfdir}/rc.d/init.d/smartd8 S0 ^5 L# I  u, s! W# F! e
install -D -p -m 644 %{SOURCE2} $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/smartmontools% I$ {/ S! M' q' d1 O2 z
install -D -p -m 755 %{SOURCE4} $RPM_BUILD_ROOT%{_sysconfdir}/%{name}/smartd_warning.d/smartdnotify0 s3 S* Q5 \& \3 ~
rm -rf $RPM_BUILD_ROOT%{_docdir}/%{name}  a7 s6 T3 k$ C$ j  H+ D2 G% B' i
mkdir -p $RPM_BUILD_ROOT%{_sharedstatedir}/%{name}
& y0 P) A8 g) z5 W
/ N; [# N% V% C. i/ G7 [8 S- H%clean
; @% {! h7 t4 @3 p, trm -rf $RPM_BUILD_ROOT
+ `6 ?1 e3 M, [5 z- T
- k" m+ d0 H4 p" ~' S9 j+ r" A! F%preun" A# v, J; f' O; I/ W, c
if [ "$1" = "0" ] ; then
7 N7 [& B) _4 B) N  c' @8 q /sbin/service smartd stop >/dev/null 2>&1
/ }1 k0 n2 l% H! D /sbin/chkconfig --del smartd0 h' _! {& M" e$ x% {- M
fi4 G3 l! C9 c1 [/ v/ H& h

$ g0 U: J1 Y3 }8 T7 U0 B) i3 k4 p%post
1 O& F. U5 ~6 g1 K8 J1 c/sbin/chkconfig --add smartd
; o( E* c6 T9 C* x6 w7 Z% }8 [, x) J# _. S  N2 g

0 q; a( \9 \5 }- W9 |2 T%files
; E/ v3 m0 `7 g' H6 G; |%defattr(-,root,root,-)0 W$ T7 z; D0 Z
%doc AUTHORS ChangeLog COPYING INSTALL NEWS README
% S. p1 R' X, E%doc TODO examplescripts smartd.conf  d2 R. j/ M, ^
%{_sbindir}/smartd) W( a8 p. v) j: I) a, e
%{_sbindir}/update-smart-drivedb
  H0 c, |3 B2 Q+ R1 I& P%{_sbindir}/smartctl2 {# s: F" V& o7 O. Y
%{_initddir}/smartd
) v4 l( d9 C% X0 A  G9 j: r%{_mandir}/man?/smart*.*
; j2 ^; t; n% N% b9 q+ M2 y1 D%{_mandir}/man?/update-smart*.*
% o7 K5 o: i' O0 Y3 ^%{_datadir}/%{name}
" g. P3 `: w. N. O1 d%{_sharedstatedir}/%{name}6 u4 ~6 m+ k* Y* F" L* @
%dir %{_sysconfdir}/%name$ M; w# d4 P+ O+ w! o* G& N( V
%dir %{_sysconfdir}/%name/smartd_warning.d
' f! G( m# ~" _. x* y9 r7 q%config(noreplace) %{_sysconfdir}/smartd.conf
% S7 L! A2 B% \. B- s%config(noreplace) %{_sysconfdir}/smartd_warning.sh$ v* Z5 Z2 }& M* `* x$ b6 I$ p) q( A
%config(noreplace) %{_sysconfdir}/%{name}/smartd_warning.d/smartdnotify
! {6 k7 n' D- q9 H5 n%config(noreplace) %{_sysconfdir}/sysconfig/smartmontools& Q, U- ~5 n2 K$ [1 A
4 T5 L0 Q4 B; T- |  J5 h; `8 M$ b
%changelog& o% Z9 O+ o/ U- {. g/ G( n9 d/ S& r
* Thu Sep 26 2019 fangdm <8@8994.cn> - 1:7.0-31 f% _5 a) [0 S
- create smartmontools 7.0 base on centos 6
' t0 |% @* @9 n) H
7 T( ?# w/ L% q% w5 S

; c4 ]8 k( S. j: w& G1 F
注意,Source这几个文件一定要存在,从上可以得知,加入了启动脚本、配置文件等,准备好了之后就可以使用rpmbuild -bb smartmontools.spec来编译,经过多次失败后,根据报错信息进行调整之后,终于编译成功了。
复制
15 x. s0 U/ X4 o* x) [0 \
2
+ Z+ C6 s9 z, U/ h2 `32 b$ X) d8 v5 [0 ~5 d  H) p
40 T  w6 t; Q, s; T& j9 [
5
9 f. v+ e( q$ D! A, |6: H$ U  r8 V% C* I$ ^8 ~5 ]6 k1 `
7
) y( ]: T% _) T  ^' }' h4 C% c8
9 y4 i7 q9 d' K9
; n+ `  k4 G( u' R! }10( ?- F, J( |# t& g% G1 c
11
  P: w! e4 P2 f) C  b12' Z6 [. y/ c  V5 N
13  C6 p# H0 y, Z
14
" V' U3 n) J+ m) a' T15
/ D8 z( M* p* j! z16$ c: M( J. m# D& j# R. ]
17' r/ g) ~$ }" O6 I
18
8 \: l* j, l8 i. W# f197 ~' `+ `1 h& m8 v8 i
209 @6 ?8 u" \& s- v
21
. m6 C' J  l; \4 @$ u/ H9 C! O
[root@7ftbv7mdz7cdpc SPECS]# rpm -qp --changelog /root/rpmbuild/RPMS/x86_64/smartmontools-7.0-3.el6.x86_64.rpm
' I, n& R# W% D( K0 y( K; Q* Thu Sep 26 2019 fangdm <8@8994.cn> - 1:7.0-3
8 d8 R# v0 n( K! \- d- create smartmontools 7.0 base on centos 64 }: L$ {  [8 T) g

) d7 d+ B. K6 x3 u2 X$ T# a[root@7ftbv7mdz7cdpc SPECS]# rpm -qpi /root/rpmbuild/RPMS/x86_64/smartmontools-7.0-3.el6.x86_64.rpm
7 |2 }$ F/ ^# D- P+ aName        : smartmontools                Relocations: (not relocatable)
/ t" V; y9 E6 H2 T6 h; g) vVersion     : 7.0                               Vendor: (none)6 f# _: s* |3 R$ N% C- M* @. H
Release     : 3.el6                         Build Date: Thu 26 Sep 2019 10:53:19 PM CST1 a0 x" |( c+ A  K
Install Date: (not installed)               Build Host: 7ftbv7mdz7cdpc
- y( {- D6 C4 L! ~* b# C% VGroup       : System Environment/Base       Source RPM: smartmontools-7.0-3.el6.src.rpm
; k! j; _# W; u( {5 c' xSize        : 2081911                          License: GPLv2+# g) ?; y3 h& v9 c( ^$ f( W6 C. _
Signature   : (none)% l0 c+ ?/ j) }" e2 H
URL         : http://smartmontools.sourceforge.net/
! s) O& t0 e# {# M* SSummary     : Tools for monitoring SMART capable hard disks. H- B7 |2 U& `# m3 I
Description :
3 E% Y. C7 K( f( S5 i6 ]The smartmontools package contains two utility programs (smartctl9 ~9 f. L- {) n3 B0 m
and smartd) to control and monitor storage systems using the Self-
( Y) a$ U2 ^8 [6 j8 q0 L  ]$ u( ^Monitoring, Analysis and Reporting Technology System (SMART) built8 i* K# N4 X1 F
into most modern ATA and SCSI hard disks. In many cases, these
) n( X% A, z) Wutilities will provide advanced warning of disk degradation and' W, {! U& |9 \( }
failure.
0 J+ F+ N4 `7 T8 ]" a

$ X* X8 i! @8 E( @3 h' s6 h; f
8 X( b& J0 `2 K, s7 b. n$ T, U
另外,在%preun阶段有使用了if [ "$1" = "0" ],表示的意思是uninstall,如下图:
实例5:打包nginx
用tar包打包成rpm的最简单的方法就是在网上找到相对应src.rpm的版本,这里面有包括了spec文件,可以少走很多弯路。nginx官方在释放tar包之后,也会相应提供的rpm以及srpm包,这次我们先在 http://nginx.org/packages/centos/7/SRPMS/ 下载好nginx-1.16.1-1.el7.ngx.src.rpm,使用rpm -ivh nginx-1.16.1-1.el7.ngx.src.rpm进行安装。有生成了如下内容:
复制
1
- D- `6 b* r& i$ u2+ K7 Y- X6 f+ i- C! \  Q3 n8 B
3( |* X$ i6 Y2 Y4 O. ?" k
4
0 Y. F" R7 b/ ]- f& [5
* Q: ]- p9 @; F2 |0 T6* X9 \! J( M+ A' D
7- T: h7 F1 v& E) s, R
8; A6 L" w& Q5 g, e4 z7 o  {
9/ g( B/ {4 c5 K5 a+ L  K
10
8 b* \/ Q- L4 @9 H6 k1 F11
$ [& T$ V: M( B& n* O12
5 ~' k" \) y, B133 l8 i1 Y, D- W( g' Z" r
14
! g7 N; ~: p5 k! L/ Y5 ]% p9 _15
" ^1 N5 m  u* i+ ^- {16
+ Z& u% S. ?9 V8 [3 l, L17
& x6 o$ _( |3 s- L1 f18
+ n4 _8 t$ Y5 l- p3 a19
5 w( e5 w( H* O% O20
) h) U" j4 D1 ]9 j. s21
& M$ H6 B' m4 v3 J2 E, i7 M: Z22
, c1 ?( v7 A2 p" J
[root@localhost rpmbuild]# tree
6 Y% m/ ~9 x* I3 b0 G1 j.
  z% }/ z( J1 q5 ]# q% `|-- BUILD! n, T% o4 v4 w3 d% o+ `. ]
|-- BUILDROOT3 e5 U1 j0 }1 S2 E! I
|-- RPMS
0 ]3 }& \5 ]1 C# A5 W" O|-- SOURCES
# H# @. \: _: ~2 L) l2 |! Q|   |-- COPYRIGHT
0 A+ `: E9 v3 z2 L|   |-- logrotate
$ a! ]' ?% ]! o: |/ M. |% a|   |-- nginx-1.16.1.tar.gz2 {. @5 H, q9 q% x! W
|   |-- nginx-debug.service
3 `& F& f8 O* V  F3 y|   |-- nginx-debug.sysconf
7 Q# V4 M# t6 s9 J) @% C/ W|   |-- nginx.check-reload.sh: M: T! _6 Z: P) }' {& H
|   |-- nginx.conf& i; c# g! ?1 F
|   |-- nginx.init.in4 V/ W& A$ F7 ?* b# N  u; q. Q3 |! p
|   |-- nginx.service$ E/ E) F4 ^2 ]
|   |-- nginx.suse.logrotate1 u, R8 q# J! J+ x# `- a6 E
|   |-- nginx.sysconf0 l+ m* f( {/ v$ y  r  p
|   |-- nginx.upgrade.sh$ e4 M4 K& J5 Z1 G0 _9 ]
|   `-- nginx.vh.default.conf) e0 ~" x1 ~* T' @4 D, p
|-- SPECS. [) [6 W% [  w
|   `-- nginx.spec
8 r% K& c3 v1 A, E/ _6 u. v`-- SRPMS5 h6 ^5 W/ W; T% Z! G
4 M: T/ S) [2 I! g. G

- t9 m1 X8 w9 z$ X
主要是SPECS以及SOURCES这些文件。查看nginx.spec之后,大部分都有写好了,并且都兼容了centos 6/7。添加了gperftools GeoIP-devel ngx_cache_purge nginx-http-concat这四个模块,修改如下:
复制
1
3 x9 u! @- b& [! f1 |2
& E) Z" N+ J, B- `& X" Q; U- E; u3
7 ?% g- M5 q* w4( {$ [4 \. z# C
5
; _  S# T3 ^- @6
. x8 i/ p' J- I- c/ X) ~5 u7' [) J2 h+ ], H5 V2 I
8
8 ]! s% P) V5 O3 f8 j( g; G" N* k99 c' z0 _: f, s6 M+ Y
10& O1 U& z$ D# b6 [& j5 P
11
* p- p# U9 {, q9 V! B) D121 @! ^, \# d$ {+ H- p
13
3 [5 G. o4 A7 x, T140 a- R1 u2 Y" C
155 m# w! |) H/ X3 P
16
6 m. f4 H$ v8 w2 Y) x17: N+ |, x6 O2 b. g  |6 H& m
18* h# C! x" g( c! h9 Z
19
1 G- g/ t# C! a1 p3 {$ k/ S' i/ ?20
7 Z' L9 x; E6 ?- |210 j" B  J0 A: R
22
1 v( X$ Q1 g% c3 [23  Z6 k* u- L" q9 ?; ]
24
! {9 Y3 C4 D: B: s: L255 e' u0 ^- b- x
26
7 V: L, q, j% x1 g  R* _' a& ~27( d1 a5 ^2 ^* v8 h/ w
281 g6 B7 `8 i! J* f, D5 q/ s
29
7 M9 ]. t$ L* }. c309 B5 W9 r- M8 J0 E8 R6 D1 }
31
* {- f- S1 Y- n: }2 G32
$ O' ?6 M5 G, m5 Z+ f33
, V1 `" C. G* L  W' Q% t4 W$ m34& K4 m4 ?! D$ B6 b2 W
35
4 T8 }/ E/ n8 _9 e1 \36
1 C5 F9 g$ g5 L! ]37
+ A2 o1 s% J0 u  J+ [38
# A$ d& _* A0 s9 P3 E39* A' Y+ d6 X. {7 q, l
40; q$ @1 k" C6 ^, S0 w, @! k/ w
41
1 s$ o2 M9 r! Y/ X+ X1 V4 i42
1 s6 \' T! V$ a43
+ _" ^$ X" Q* }' g( R44
4 b$ Q7 H& m% }5 ]" K45+ t( r6 {1 E# M
46
- q' g; N  b. W47+ y* _; O, W" x. @
48; K* p7 e$ {; [9 b# p" @
49
1 {+ s( v) l9 k. c) |0 v6 E50
$ C7 M2 Y% H$ f* Y51
6 C8 p) @: K2 ?" W; J3 N. ~' ^9 e523 S( E; q# a! z
53' k5 ^) Q6 b9 f% o: F% Z, K. t1 o
54, r. ?" E, k. j. D$ E0 _
55" o4 {) F; u  B; {- E" S
56
9 [0 L  @3 E" Q; j( f, F: v57! u) |3 |) }' o& Z
58
" u3 b/ \9 Z6 z7 Z/ e' n59
' F6 S/ Q" u' `) P  Y2 D60
4 ?. V# y+ W% n& S615 m9 j9 X, B. }5 e; L( L- k
62
9 e' h. W  N) r+ y; y$ C! N' g( q63
- I$ N8 V7 u1 |1 ?64
4 P) g* |3 ~( u8 i. q) w# A65) L. V& v# g, l( X7 `7 i; ?
66
- I  |- l4 a( R" N. r67
/ f& g; t- `- e0 {681 D- T* n# R8 K& w
69% L0 K8 M0 M" b- X) T7 W# Q9 x
70
; y$ }* Q* t: x" E4 z. E# d71) s) U" J0 l6 y$ i! J
72
& w' S6 b" l# k/ k73! C. i7 i! i, J0 s
748 g7 _% j8 ^1 G7 D6 g* c/ Z
75
" V. h0 k  C, r0 V' V6 I76- x2 `/ ?$ U, _' E# `
77( e* O. Q( ^% e. z( ?/ s; t
787 s* b- F7 m, n8 k0 k/ X5 s
79
3 o$ d. g9 I/ G& r- ^" p3 V' j801 v* _( @( t/ z, ?9 [0 k! @( Z
81# z" y' V. ]$ f4 g; f0 }: Z) C
82/ _6 d- q+ j* E( C! s0 K+ j
83
0 i% U: O* ?/ ?8 G1 e% G84/ `6 [, ^7 t  {7 b7 K
851 R1 H7 [! G) n& K
86
) }; E' ^; G& `# }5 [/ Q872 c$ ?& P# `0 m- ^
88
5 O0 @: U* S8 N7 n0 ~* k89+ g2 Q% f7 e; K) o  T  q& R
90
) b! a4 r5 O" a7 x: L! I91% r3 g4 J8 Z, e1 o* e
92
9 H4 J) m* D4 D+ J93
% B: l& E; C' U9 O9 G94+ \  ?; N" b$ Q  _( a) ?, A% [% _
95
  j% Q& Z+ M0 Y+ F  A7 Q( Q96* q5 ]1 B0 d  ^# W- ]: B4 q  Y9 \+ [
97% w' c* t/ `" o6 [
98
8 C6 J) m5 \: b' d994 [. ^: H8 N$ o. f+ E
100# T2 C' E* ~; G! ?' e0 {2 [+ f
1016 g& f, I# l6 x. @/ m
102
% x1 z8 D6 N- T3 J/ x% W( j103# i& Q) F0 A6 y
104
, i; n/ e% U3 x% a105& i& N+ S( a8 X4 _9 m+ {& S
106  w6 \8 u* _2 y! N. A% W
107' J) j( c6 t) P# E' z/ f# V! R1 H
108
! J) F5 p; N# I% z5 C109$ e0 ]4 b) y! Z
110
8 b  R# |0 M' _" E( l111/ Q0 `8 f4 E5 a$ u
112
2 U6 {7 k+ A' u. c5 s113
% r) g6 b" t; a7 Z# u; r5 @114
; U! O/ O  F4 I+ ]4 u" n8 ?/ f+ @115, o" }* E; e' T. _& S& G
116  j; O3 I* f5 d7 Q: ]/ E1 `
117( a9 v- L: N! V
1184 O# `6 Z6 o! S7 K( D' \
119
1 T# y; K7 Y7 T9 g( Q120
0 V7 _% q' k6 @% s' K1217 R0 m# R+ g# L' U
122
2 p* P/ ^- x. X4 F  R  ~6 M4 O0 h123
6 I. @' \& j1 K3 y( r2 E! ~2 M! T124  e7 c. g7 [! R3 T
1254 m$ B3 w# j8 u) b0 W* F
126
' t0 F. r) v4 D# S$ ~. R' Y; r127
. `0 v# t$ T: r. l: {; C* ^128; `! a# h$ V" r6 Q
1291 p$ P0 M- A, P+ k
130
" l) j9 {2 }0 l' L& G131% N# \9 N) o0 ^9 C
132
  z' X& |! b+ b" r" M7 t2 {1336 e) k  h; ]& I. x- z" u7 [3 z: ?
1347 k) T) f5 B7 _% n- s/ f( ~
1352 q9 I) V. A" ?7 ]( i; C: q
136
9 m6 R3 K, j0 I7 z2 R& }4 x137  {0 y" U: y- W6 _& A
138
7 T( P: p, w" o* k139
4 w$ R, z: e' p. }* d' E! V140: j0 p& [( b( |: z
141( S& ]! W8 R- X( c: b, j. x6 r
142
9 |# A1 t# p) G+ J2 ]% n- e1433 n& h8 d0 }0 ]. X/ e3 C1 A4 @
144! Z" ~* {+ z1 ^& n6 m% L
145* P( w( Y( _9 m" P
146
4 J) M/ f. w, S0 P( i: R. b; Z147
: R; G$ A- z; e- L3 P& R! {8 q9 k- t9 z148
% K  ^5 _6 m, Q6 N1 G4 b; y149
6 x  a5 j" J( Q- j150
- h3 h4 p6 m, t151
: Y2 ]& ^( V3 N' @8 r7 A- S152
( Z" _0 r' Y( n: S, Q6 A153
  S' `7 A/ F9 E& G. a' ~154  L3 I# S) S" J, H. q* }
155  a3 R6 t. K: }" s1 w$ c# u' X
156
' `- G2 [: C( q( N$ k2 K157
' \, |0 l' Z5 V1 _1 o8 v158
; _& [& Z6 a; h0 @$ D159
2 l/ V( ~: k& M% g+ {6 k) o1603 T2 K: O* b" o3 e4 ^+ n. V
161
: g! w% _/ ~& X4 Z/ d7 [* @0 W1626 z! E8 \# Q4 T8 f
163) Q4 o4 C/ @2 j8 x8 v
164
5 R5 ?8 I- p& h8 z165
+ C4 O: [. E: V. [$ ~9 X9 b166
2 _7 _0 j1 R, j7 W9 h2 D167% b+ Y! b8 ~9 P  \' W4 R& Y
168
' L# Q4 u+ ?% D0 q2 W/ z1 B169
9 G, Q. y; U1 T9 B) f+ _170
; E4 z3 m$ n. o$ E3 {# u! p) Y171# [( I% H5 Z0 w; Z8 h: D: g4 ^
172
* D/ C  Z+ ^% J& p7 u- w173
, a- `  }% s' G- {174
  G6 U0 Q8 C* K: Z5 d175
0 I* t5 v" E  v- D/ o) I/ z176
) z( m+ B7 B3 |5 C0 k177
7 ~1 W; f* ~. }0 h: j9 t8 ?- i8 Y178) }; Y- _; W: w; `! M0 D1 X
179' ^& x& T: C" R) J! ~, q
180
# M/ p1 u5 M0 [  I( h( P6 z181( ^  b3 `5 A5 t
182* w4 n  L2 B# F
183$ h4 T0 P+ W; r- f! |8 J
184+ F( Q# T% C7 N' M+ k3 ^6 J
185) ~6 h4 r8 W7 P$ J, g2 |* h
186
9 L9 u" y5 _0 S187
9 U) L; R  F/ @2 [188
4 Z  s! z$ m* n& j' _0 K) u2 e- _189( A! R8 E) j9 P6 I* j
190
" ^5 e$ `4 {. s# q5 }9 z* V3 G191
0 G2 Y. I# s3 p5 z) n$ i+ R192
/ ]+ c5 M  f% X8 ?( P( Q  {193" B/ [8 A' s: ?7 J5 `% A
194( }4 B, {1 U( q; `4 n' _; G
195' E& F7 ?! O7 \
196: j5 |' Q, f' P% E1 G
197* T" K8 ^9 k0 [; R- p
198
4 b# s/ e0 [) Y! D2 E: |. H6 P1999 G, y% Z/ i! q  j3 l
200: j; e' V  i* I, j
201
8 p  W1 R3 @  N; U* U202
/ f2 f* h2 @" g/ e4 k: `2033 ?) H% R2 F* }" i6 y: V
204" @- E" `( Z% u7 b  B& f
205
2 G4 f6 U3 s8 l8 j9 }206
& ^% ~: q: U* |* d3 ~2079 O' Y" Z7 ?2 c! v
208* }/ s4 ?. e' e* `9 Q7 K. w
209" y8 R8 ~1 O+ V% V6 p/ A+ X
210. ?+ d8 P1 y. h9 D( `# F: K0 w
211
  o$ y4 I/ K* x- l9 V  x9 @212  Z. e9 m2 ]$ u5 C3 I3 [
213
7 o8 L, `0 V' U/ u( a214
7 b* v* }  y, S- P215: g1 Z$ {* i, y1 G# u2 T7 \2 a
2169 Z! p4 K# Y( B- R2 E6 J* @
217
+ u& T: }& l! D218
+ ~! y8 F+ {% k2198 }  ^+ x  e' T0 l7 A& ?9 }/ N
220/ S. ?3 K0 i' @2 t5 p1 a
221
: V1 l. o0 e+ @5 l  R2 {222
. \5 |0 x& q: M" {223" |! A2 v" m9 E7 p/ \
2241 f8 X- \  i" B
225
9 Q' d4 v6 E: M226- `  P' m- ~) b) V6 N8 x
227
0 [& f/ E# A1 Z. U2286 V; I# x$ s4 F
229/ P/ l0 P$ Y: t. Z
230
8 G1 M0 F* L! E$ D. \231, D+ V3 x" z- L% _' Q. p- a
232) `1 Z9 Z6 a; M7 F) y
2337 ]5 O, @* Q. c# L, e8 W
234
) W' O) B5 y( s3 n9 s5 C  ~4 i235
% C1 `5 s. Z, o; E236! T6 p! G& _5 t5 g
237
9 ~# @8 S: ^' N8 ]$ R2389 d! X9 v' v  C+ F5 J
2399 B$ ^5 Y% O  b, ]3 g3 V
240
4 I9 }% u: L) m  j241$ [. O* g) h2 B* [+ W# C
242
5 P9 l0 G6 e3 K: m243
3 k* q/ [2 ~; M3 d1 e( C244
8 X% I, [/ A. U245
5 V) Y/ C4 a8 S, O9 |1 b246
& j# v  p& t) S* F2 t9 Y247
2 O' ~2 v" H- i! D2480 A7 y$ j/ l# C4 E5 Y, i# O
249
1 V3 U. A0 Q, R/ n- \- `4 `) d250$ f/ `0 P$ s2 a( g
251
9 N8 ~, z0 E. u/ m7 d  l252
/ `3 L: C! \2 [, _/ `253
7 H, z8 Z$ G, V& ?! V8 i3 J254
; G! i6 T  [/ y5 }2557 d0 A& W# N7 w+ T
2565 u+ y/ c; J; S% i: H" U% N! J+ {
257
6 P  p- }4 h+ X% x258% @/ C" G# H7 _
259; s& U) ]' M# T9 m4 Z% T
260
- _3 ?6 ]5 m# }+ b5 z261* B- [' D  }5 ^1 R* e8 v
2623 s3 [6 S2 A% j0 X: S; Z9 p
263
! z: \8 F! K( a( I" U! W; Q1 u264
/ L( t- Q& R* g2 i265/ P0 w2 e6 h. h' A7 n. `  y5 h
266
1 L! P" w0 e/ x  j) q; u0 n. a; S1 w2670 D7 g! g0 G( C: r; x
268
4 _6 P0 R# f& M1 p# K' A8 ]# A2699 w( a' ?( \5 {: h( b  W
270
4 p0 e. B1 r  ?# @( E% q/ S+ J271. F5 m0 _1 p& r
272
  i0 h* z; ?- \273
2 G2 t3 X8 i' V6 m+ K- c274( ?2 x9 Q( l+ B2 V% z( z: _
275
$ \7 T" a3 d9 Z- b" u$ A276: A* `$ E* B, Y; w2 J/ E+ b/ A5 z
277
+ P; `6 @7 J6 A0 f- i- V# t0 b278
( r$ G; g0 O6 a; w+ c279
' B( z! i1 p4 S# U7 X3 _280
7 p7 Q  L' T  \& _# S2817 `) G) {  a/ l, N5 B+ u
282
9 P% g% P( k5 ]& n; T# Y( U283
; l$ |( q: I& o$ k# u) t) D% C  ?* j' S, b284
; e9 t1 u* W  X2 Z' D6 D# P285
! t9 N/ N3 x. P2 E. G$ ]286' M# `: v# i: z- h6 \8 l# `6 z
287" U" ~* k# ^$ n; _* a
288
2 v' b: L. G" ~  {5 X2898 `' W" ]1 T7 j: `, S# U! J
290
5 X/ S+ s# {& U& q. z291
! U$ ^2 q9 b& G2 [' |# s% }292
" U' j; N0 U+ X2 b0 d293
8 c# k+ O' i  w% M8 n) i( e' y+ u294% N! c4 F0 a) R4 Y! i' y
2951 {1 o0 n# Y/ l* ]+ O( @
296! c0 e1 `$ p* Q5 U1 d- n
297
* J+ x2 m; n7 a. V, f* l298, o8 v$ ^1 Y# [
299+ i' k. U6 e1 @9 q8 i
300
0 K2 L( D( b+ ~301
% w7 J$ i# \  ~  w7 x3026 ^; i/ d1 u8 @3 m# L/ Z
303
# k5 Y: a) [+ H3 [# }3 S. c8 ~304
8 Z: [( Q0 m& a8 H9 s+ m; d3056 s4 J' r& u2 }/ R' E
306
+ @% i& R& t8 l! j2 c3075 K' U; T" _1 o* F
308
3 K/ {% u2 S) X, d% F3 }1 w3 m! o309
9 W- y; o, k! j: [4 H. M. d) N310
  w; x  ]' M5 I& @4 R311
: n3 c2 g  g& n) R5 @; I  |312
- ~6 Q1 E; V# i2 u( e: K* f+ I313* j+ b4 k% ]! k! i
314# o& P: z* u) B- H; H5 Q7 D
315" ]# D7 d8 f" j9 @. H  F
316
6 q( v9 N! V- z  |; ?3177 h  D$ V* T( X$ e" [3 k. h8 P2 D
318
6 s; g2 }# X3 J: ]& q+ |319
3 f5 U! z, F4 w, `2 t: b320. }9 Q' J8 v3 F' |
321* N+ O  O. h/ ^5 F( z
322
; ~6 S4 R  T& o& d$ x5 L  w323; l7 `) ~) Q  x; |5 n; h0 l/ n8 B
324
/ h! L* n. j7 I. y1 S/ x/ E8 p0 q325
- d  R2 [$ s9 i9 A326& A1 u) T. _0 _& {
327* E) p( \+ u! }1 c
328- R9 h1 h9 C& a, j
329; O2 J# m5 p$ T* h
330* j$ f- p! j8 {1 c& Z0 a6 C  [
3311 l% A5 M: `! V* [: i2 g' F9 q) C
332! D/ e" G5 _* B. L! Z# M5 l
333& r! I6 K; K: T/ B" Z
334+ i( z6 Q. ^5 B! c: Y5 j; v
335
$ a( f" y0 B( \* C336
; m- R+ S( b+ |3376 P# f% a8 [: \: S
338
4 H( a9 \$ e5 q) {339
: H) {$ {2 {& ?# E' I  ^" k3409 \' J6 R. R" Y; f3 a
341
! U3 [! s# P! b342! c8 Y) M* B; Y! j% A* i# p! v- T
343
# {. [: ~5 k, g% ^$ g/ J344
, V9 F! i& I  J, M5 n/ ~* y$ A345. N  p  k- A! [4 ^
[root@localhost SPECS]# cat nginx.spec
0 [8 @  h* ]$ {7 H+ \4 m! @. S; l#3 ^+ c+ Q) }( D+ X. ]
%define nginx_home %{_localstatedir}/cache/nginx; L' k* K! u, X, O& U* `
%define nginx_user nginx9 B* F% d8 @! C1 y
%define nginx_group nginx7 l6 q* Y# G( H5 L& D3 \. X
%define nginx_loggroup adm' t' |: O$ K6 u; [, q- R

; X, j! F: Z  @# ]  |/ ]# T3 K# distribution specific definitions+ R$ Z" X2 ]( X3 M# P
%define use_systemd (0%{?rhel} >= 7 || 0%{?fedora} >= 19 || 0%{?suse_version} >= 1315 || 0%{?amzn} >= 2)
, ?& p; j5 G, [- @# @( l, N: G$ h! Y
+ e# {" {) Z. x5 T%if %{use_systemd}1 l9 x& i& y( W& _5 F
BuildRequires: systemd; T4 }9 j: a8 d# B
Requires(post): systemd
. c, d3 j( K3 q2 b' CRequires(preun): systemd
5 ~& H  m. f% h2 o1 K" }Requires(postun): systemd
0 q+ G5 g' U' S& P2 ~%endif
! R9 f9 r$ C* y3 M' K' \/ [: Z/ p9 o+ ~- V7 S0 e
%if 0%{?rhel}
0 f5 A- L8 J& q; @( F%define _group System Environment/Daemons
$ n  o" _/ ~9 T5 L4 N%endif8 \5 m8 V6 u# P) ~

/ V7 D9 x/ \4 ^1 W) u%if 0%{?rhel} == 6% g4 D3 B( C* u+ ~* F' p9 c" A' f8 w5 _1 v
Requires(pre): shadow-utils6 w7 B, k+ A8 V: U- Z; }6 ]% a
Requires: initscripts >= 8.36
  d1 F8 x7 q- b3 d: ^+ qRequires(post): chkconfig3 @# U/ m: w9 t) Y6 e9 N& s! t* M) `
Requires: openssl >= 1.0.1
+ r9 N/ ~/ \5 mBuildRequires: openssl-devel >= 1.0.1
% E  G2 F# H/ O/ U' `4 v  ?( S%endif
9 \5 q: S% g* n8 l
# {! @. z( q1 T0 ^%if 0%{?rhel} == 7: K7 u; T$ [7 b
%define epoch 1
: B4 G, j# Q2 ^5 v' P! f9 _6 K6 IEpoch: %{epoch}6 }( S* |- C1 d
Requires(pre): shadow-utils gperftools GeoIP-devel5 w1 x% F& P2 }5 a$ @$ g$ p
Requires: openssl >= 1.0.2, }4 c# z0 y  D& V( Q
BuildRequires: openssl-devel >= 1.0.2
& P1 b* v6 v" s1 \+ _  lBuildRequires: GeoIP-devel gperftools
: e; H: C  E7 J%define dist .el7
1 T1 w$ A( k; i8 p, j7 e%endif
* e+ F- m) U. |! X
) ]: V# d& \8 u/ W' ^4 X%if 0%{?rhel} == 8+ m: _6 f( u$ k7 Z  P$ |. b% L- @
%define epoch 1
7 X9 A: c  W4 m3 e6 ?2 {# @Epoch: %{epoch}
# R. }; F2 {  O8 n9 DRequires(pre): shadow-utils
" h* E, i8 Q/ m) S# A% G, E  M: D( ^9 SBuildRequires: openssl-devel >= 1.1.13 d2 Q/ J. w/ z" k
%define _debugsource_template %{nil}# f/ }7 |6 J7 n7 C* d: D! t  x% l* ^
%endif
4 W+ E! e: q& b3 k1 }5 W2 {. w  [! v7 n: F0 y  ~  b4 r- |
%if 0%{?suse_version} >= 13150 j9 {6 M' a( V4 _  r9 B3 y
%define _group Productivity/Networking/Web/Servers
* z& i% {/ Q2 c' [%define nginx_loggroup trusted5 r" {9 X2 q) ~, ~5 C. _
Requires(pre): shadow! o8 g: a, _- F6 C. O( t! Q
BuildRequires: libopenssl-devel- ~. t2 t3 g) P3 Y3 V0 Y
%define _debugsource_template %{nil}1 G! ?) r7 I& _5 q) {' o+ T' X, }
%endif
# `. ]" y& |  T
6 {, N+ _& i/ ]5 S1 t5 _. P! I1 w4 U# end of distribution specific definitions
( b- w9 `2 Q. l+ b
# _$ h/ r8 a' _1 C) F! |1 O7 i%define main_version 1.16.10 J2 \/ t. {, M% e. R& `# a
%define main_release 1%{?dist}.ngx, U) H0 M6 y- ^* J' n4 J2 Z

/ J1 C* }, W3 _3 t%define bdir %{_builddir}/%{name}-%{main_version}
" L/ P7 E1 [, l. L$ b0 @+ B5 g) W; c2 X% C, r- k" e1 R+ p2 P
%define WITH_CC_OPT $(echo %{optflags} $(pcre-config --cflags)) -fPIC
# t" b& m! Z3 A, D0 W1 e: X" z%define WITH_LD_OPT -Wl,-z,relro -Wl,-z,now -pie! a1 [: Q1 ?7 s( W
+ p8 K) h" v; p7 W) ?
%define BASE_CONFIGURE_ARGS $(echo "--prefix=%{_sysconfdir}/nginx --sbin-path=%{_sbindir}/nginx --modules-path=%{_libdir}/nginx/modules --conf-path=%{_sysconfdir}/nginx/nginx.conf --error-log-path=%{_localstatedir}/log/nginx/error.log --http-log-path=%{_localstatedir}/log/nginx/access.log --pid-path=%{_localstatedir}/run/nginx.pid --lock-path=%{_localstatedir}/run/nginx.lock --http-client-body-temp-path=%{_localstatedir}/cache/nginx/client_temp --http-proxy-temp-path=%{_localstatedir}/cache/nginx/proxy_temp --http-fastcgi-temp-path=%{_localstatedir}/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=%{_localstatedir}/cache/nginx/uwsgi_temp --http-scgi-temp-path=%{_localstatedir}/cache/nginx/scgi_temp --user=%{nginx_user} --group=%{nginx_group} --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module")
7 t  X2 a' ]0 |8 ]  y/ C) y% r$ d) b9 Z! O: T! A" p
Summary: High performance web server: b8 n# A% e5 b' }1 \/ W1 [
Name: nginx
+ R3 b2 _3 Q( GVersion: %{main_version}: C' }2 M' ~- O2 b/ u( L
Release: %{main_release}. G0 U) m3 ~  H! A' A
Vendor: Nginx, Inc." N7 w3 _/ j# v  a7 J* J7 O
URL: http://nginx.org/
) M  ~5 G2 m2 e+ u7 R' R8 s( yGroup: %{_group}" ?8 u0 f7 y6 W' {! g! N' y! v

1 L) O2 j" ^1 ]% mSource0: http://nginx.org/download/%{name}-%{version}.tar.gz
6 ?. E' ^5 s% t" L5 W2 a0 `Source1: logrotate1 t0 Y2 [/ i& f
Source2: nginx.init.in! w+ _  d  z& l( [: s" M- V
Source3: nginx.sysconf
0 i$ I- E5 Q! m( QSource4: nginx.conf
' M6 D# Y: |6 z+ t* y* KSource5: nginx.vh.default.conf
- k3 R3 S+ d& O+ W# nSource7: nginx-debug.sysconf7 s! [: J8 a: B& g
Source8: nginx.service9 l6 \' u1 C- x+ T3 S
Source9: nginx.upgrade.sh
0 A0 f+ Z7 ~% u1 sSource10: nginx.suse.logrotate
+ o' A2 t1 S' t8 J1 \Source11: nginx-debug.service
# |  F) r- k' c. d# ~+ vSource12: COPYRIGHT& P1 G$ x) j& E- T
Source13: nginx.check-reload.sh5 X. V, r/ a! Q  p+ H0 M
Source14: nginx-http-concat.tar.gz2 G/ k6 L) |- I( @
Source15: ngx_cache_purge.tar.gz
* q3 s3 m+ }" O. F
+ `( [& f% z3 q2 O9 iLicense: 2-clause BSD-like license; y  i  t2 v: g, v8 i, t" H
5 o* W$ |4 l8 _0 F
BuildRoot: %{_tmppath}/%{name}-%{main_version}-%{main_release}-root+ o5 }0 z" ^' e& g
BuildRequires: zlib-devel
9 Z( `% z' B* g, G: [( N5 aBuildRequires: pcre-devel
7 w+ p8 ]* x. v% P) j! ?/ ~+ `. W" _: y( K& s" j
Provides: webserver, L/ P9 U8 x  }* I7 e4 h9 ^* R

6 I, @! n: Z7 P# o& f" Z%description% b& r! `* J# c  g+ J
nginx [engine x] is an HTTP and reverse proxy server, as well as
& f: u; V3 z" r0 R! C$ B9 Q  ?2 ?a mail proxy server.7 L( C; s& v2 v- I
( Q/ n" e7 x( R1 {2 p% t
%if 0%{?suse_version} >= 1315
1 u& ^. G  q0 x( f8 d3 {%debug_package
9 m( m! j+ l" x4 o  [0 L%endif
8 _* J! @, o  g, \* Q" X0 b# \! P$ l$ U& ^2 {- S$ q5 L
%prep4 P$ l, ]2 G; C0 `* a+ I
%setup$ @  F, [4 I  u, R# k
%setup -T -D -a 14
8 ?% x4 u, j- A5 X%setup -T -D -a 15+ e, o3 Y% u% p( e
cp %{SOURCE2} .3 V3 i$ \8 ?( I
sed -e 's|%%DEFAULTSTART%%|2 3 4 5|g' -e 's|%%DEFAULTSTOP%%|0 1 6|g' \8 A/ t" y& L9 I3 B$ N
    -e 's|%%PROVIDES%%|nginx|g' < %{SOURCE2} > nginx.init
+ Y% O, o! M9 C( ^3 b) h$ g% esed -e 's|%%DEFAULTSTART%%||g' -e 's|%%DEFAULTSTOP%%|0 1 2 3 4 5 6|g' \# k9 P1 n3 m* D: @! X
    -e 's|%%PROVIDES%%|nginx-debug|g' < %{SOURCE2} > nginx-debug.init8 g/ ~6 F/ X/ p' w
% s) B1 M, W  D. {! ^
%build
% L( ?* H" ~3 [0 |./configure %{BASE_CONFIGURE_ARGS} \
7 O0 f: r# K* ?- V7 S. V5 z6 O    --with-cc-opt="%{WITH_CC_OPT}" \6 ]5 C* W! C0 w! I
    --with-ld-opt="%{WITH_LD_OPT}" \
8 M6 ?" r7 L  h; x* ]6 t1 e    --with-debug \. N6 s$ ^* ?" ^1 C2 s
        --with-google_perftools_module \
9 d0 ~3 k0 U2 r, K, g$ N7 E        --add-module=ngx_cache_purge \+ e$ C$ B( K5 u; O+ G6 B6 s
        --add-module=nginx-http-concat \
* p& ]/ m+ [: f! q        --with-http_geoip_module4 F; ~  U$ V  o4 @
5 N, T0 M3 _$ x+ y2 q
make %{?_smp_mflags}
6 J& C8 t, c3 X2 T. X%{__mv} %{bdir}/objs/nginx \' _7 G& Q( Y# y: y- M2 `. Y1 n' s
    %{bdir}/objs/nginx-debug
9 d* D- Q; d$ v* f/ W( _7 E9 k2 L0 m./configure %{BASE_CONFIGURE_ARGS} \6 z2 _3 W8 _% v# B/ Z, y
    --with-cc-opt="%{WITH_CC_OPT}" \
% Y/ ~( ?8 v. @8 G' c/ V- B    --with-ld-opt="%{WITH_LD_OPT}"% C+ t3 M  c0 z, T; b- U
make %{?_smp_mflags}4 u; Z2 R0 R) V3 o" w
3 c# I) L) u/ ~- p! q
%install, H( l: A5 G: ~* d
%{__rm} -rf $RPM_BUILD_ROOT
6 d) |2 [7 {: }: i# w" b4 S- p%{__make} DESTDIR=$RPM_BUILD_ROOT INSTALLDIRS=vendor install
6 r8 p2 B7 J3 o0 E" I% G; \- w6 o) V) e/ B. O2 d$ r8 ^& M
%{__mkdir} -p $RPM_BUILD_ROOT%{_datadir}/nginx
; b2 U2 z  B& c/ [5 @%{__mv} $RPM_BUILD_ROOT%{_sysconfdir}/nginx/html $RPM_BUILD_ROOT%{_datadir}/nginx/. J% M1 P% T( s

3 |2 T3 Y) z, |( \& c2 F%{__rm} -f $RPM_BUILD_ROOT%{_sysconfdir}/nginx/*.default+ w% G( k( E. b* s) v. c/ D" D6 P6 W. }; `
%{__rm} -f $RPM_BUILD_ROOT%{_sysconfdir}/nginx/fastcgi.conf, [" x# {! T- v3 B. a# J8 F( |/ R

: L  d  u) x% a" H) k. b%{__mkdir} -p $RPM_BUILD_ROOT%{_localstatedir}/log/nginx0 L+ @+ @* L+ g# g- m
%{__mkdir} -p $RPM_BUILD_ROOT%{_localstatedir}/run/nginx
2 ?: M6 c4 ^. I$ t3 R; f%{__mkdir} -p $RPM_BUILD_ROOT%{_localstatedir}/cache/nginx& r% W% l5 N$ Z- r
, H1 j, u$ M1 {/ {7 X: T
%{__mkdir} -p $RPM_BUILD_ROOT%{_libdir}/nginx/modules7 S3 ?* M* r/ i  F. v
cd $RPM_BUILD_ROOT%{_sysconfdir}/nginx && \# J2 t0 p. q7 L9 J* b. k$ n3 V
    %{__ln_s} ../..%{_libdir}/nginx/modules modules && cd -
- D2 O+ D( j7 z4 W: N3 X) d% K7 }, s8 `
%{__mkdir} -p $RPM_BUILD_ROOT%{_datadir}/doc/%{name}-%{main_version}
% w& I, J4 O2 h%{__install} -m 644 -p %{SOURCE12} \# H* R7 A) A5 s  \' r
    $RPM_BUILD_ROOT%{_datadir}/doc/%{name}-%{main_version}/# j3 @9 C* H" Q) |: _. o2 m* e2 S) Y

3 k8 \7 a) X0 [. b5 L: h%{__mkdir} -p $RPM_BUILD_ROOT%{_sysconfdir}/nginx/conf.d4 @) I) Z4 K% b1 \
%{__rm} $RPM_BUILD_ROOT%{_sysconfdir}/nginx/nginx.conf
) ^$ Z3 G8 ?$ [: x+ l6 _7 g%{__install} -m 644 -p %{SOURCE4} \* t8 Q0 {* r" y9 T+ {
    $RPM_BUILD_ROOT%{_sysconfdir}/nginx/nginx.conf* k) f7 C5 z8 g  W3 z( B2 C4 G! N  L
%{__install} -m 644 -p %{SOURCE5} \
7 C6 y+ p' L6 ^7 I7 \7 Y    $RPM_BUILD_ROOT%{_sysconfdir}/nginx/conf.d/default.conf) P3 r1 l( e9 [8 z% y

! s9 C3 X- f0 u3 }% E& e, }/ |) z8 e- w%{__mkdir} -p $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig, f4 f% N8 J/ P: x7 B) X& g* l
%{__install} -m 644 -p %{SOURCE3} \0 c" h+ B6 L$ S* u/ }4 O0 u
    $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/nginx
( W) g1 B# K) Z' I%{__install} -m 644 -p %{SOURCE7} \
' b! b# d5 D8 O- k, h% Z  m    $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/nginx-debug7 H# Z( b  j2 L
6 y1 s7 n* I8 c) X3 a( y. u; b5 M
%{__install} -p -D -m 0644 %{bdir}/objs/nginx.8 \4 u6 i5 S( f. a! S4 T" l
    $RPM_BUILD_ROOT%{_mandir}/man8/nginx.8
# U7 a+ w# g# m3 w/ f' N: |' M0 u. n  Y  q( m2 I$ o) q/ L; p
%if %{use_systemd}# F& \' Z+ Y% T3 w; d0 s4 g" r- Y
# install systemd-specific files
4 V  j+ S: e) v9 k%{__mkdir} -p $RPM_BUILD_ROOT%{_unitdir}! C$ {0 U/ d! Z  X$ {/ j: |
%{__install} -m644 %SOURCE8 \
* L3 i- N9 Y( y, q    $RPM_BUILD_ROOT%{_unitdir}/nginx.service! o( g7 U. W5 m  u2 `* _
%{__install} -m644 %SOURCE11 \
7 C7 Y) C) w; I) I    $RPM_BUILD_ROOT%{_unitdir}/nginx-debug.service
! F8 {3 x$ P' ?8 t; e2 z! k%{__mkdir} -p $RPM_BUILD_ROOT%{_libexecdir}/initscripts/legacy-actions/nginx
. Q7 }, Q3 Z- g/ ]+ o0 z%{__install} -m755 %SOURCE9 \+ i1 L: }: d. z. s, K
    $RPM_BUILD_ROOT%{_libexecdir}/initscripts/legacy-actions/nginx/upgrade; X6 O( L& H) d# s( x( ^6 t
%{__install} -m755 %SOURCE13 \! O# ^& ~! q4 n( r% F+ ?: r
    $RPM_BUILD_ROOT%{_libexecdir}/initscripts/legacy-actions/nginx/check-reload3 R0 c& h6 @5 a
%else+ n  X+ t6 Z: E1 P& E
# install SYSV init stuff/ t5 R. `) S+ `% z$ E
%{__mkdir} -p $RPM_BUILD_ROOT%{_initrddir}4 n$ w4 p" g5 Y5 j  I6 t8 y: g
%{__install} -m755 nginx.init $RPM_BUILD_ROOT%{_initrddir}/nginx
3 M$ \& h: ^# J' j%{__install} -m755 nginx-debug.init $RPM_BUILD_ROOT%{_initrddir}/nginx-debug
: ?: W* i$ J( e. ]+ H$ z: ~%endif
9 p* l  s" O( `9 B2 ^% l& S; B1 O/ m8 E# h+ @- W* {) C
# install log rotation stuff
" @5 f: I* Z1 @%{__mkdir} -p $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d$ X2 F% {' v" x- g, N  f& T6 k, V
%if 0%{?suse_version}% x! c; k5 z  K' B: ?
%{__install} -m 644 -p %{SOURCE10} \2 Y- f  i7 B) E- m3 |; x) L
    $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/nginx
2 Y( W0 A- c  J. {' }9 y; ?3 m%else& [/ u/ A; D- d9 D* p
%{__install} -m 644 -p %{SOURCE1} \+ `: H/ |) D) b, H
    $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/nginx' h9 Q& X: ^/ \$ w; G  Q* H
%endif, R4 D& |1 d/ c) I+ q- T$ C
. w5 Z8 J5 y% A' A) F/ W
%{__install} -m755 %{bdir}/objs/nginx-debug \5 p/ B4 Z5 W6 X; f# S5 n* G
    $RPM_BUILD_ROOT%{_sbindir}/nginx-debug( e+ ~, c6 [$ ]2 j' a, n

! Z  ]/ J8 Z) c2 n%check" o8 \0 n% Q  a' X" g$ U2 N7 k
%{__rm} -rf $RPM_BUILD_ROOT/usr/src4 t8 q; I+ h3 y" a0 @
cd %{bdir}; b* S5 g+ a# p
grep -v 'usr/src' debugfiles.list > debugfiles.list.new && mv debugfiles.list.new debugfiles.list
- \6 p0 ]3 Y0 R& Scat /dev/null > debugsources.list8 d! _. [0 E9 F
%if 0%{?suse_version} >= 1500. _/ h+ c1 k# W+ r4 F# ^; @
cat /dev/null > debugsourcefiles.list' F( a: A2 _6 [$ }
%endif! C( x) p% t) x' f( L7 O
) U; i( `9 b& ]8 K
%clean/ i3 A/ M4 H6 b  u1 r! e! o" T" T
%{__rm} -rf $RPM_BUILD_ROOT
; |) n8 m/ F2 t, s# N' f
0 c- m) ]% X& U! Z1 ?' q%files) k1 G, G8 ~( |3 g/ n
%defattr(-,root,root)
4 g: q% i2 j+ T1 d' e; X
4 O& j0 W; T, w, X) g%{_sbindir}/nginx
) x8 N' m0 u/ p/ I# I%{_sbindir}/nginx-debug5 k+ @! J4 Z) C" U! [0 s
6 `% K3 c( N- P7 U
%dir %{_sysconfdir}/nginx2 g6 U; P/ x, B! U
%dir %{_sysconfdir}/nginx/conf.d) J$ V8 H0 d, N
%{_sysconfdir}/nginx/modules) E6 W8 W8 C* l% ^& ~

3 m' [7 y" o# S) H; K%config(noreplace) %{_sysconfdir}/nginx/nginx.conf2 _. V) V; j" m' f* g
%config(noreplace) %{_sysconfdir}/nginx/conf.d/default.conf8 r* E. [$ o& I' g+ {& V+ i
%config(noreplace) %{_sysconfdir}/nginx/mime.types/ H6 z- t) {) w
%config(noreplace) %{_sysconfdir}/nginx/fastcgi_params- X7 G4 S- b+ W( G
%config(noreplace) %{_sysconfdir}/nginx/scgi_params/ k& Q7 S, F% J5 o' p
%config(noreplace) %{_sysconfdir}/nginx/uwsgi_params
+ S# R3 }: x$ ?; C1 ^%config(noreplace) %{_sysconfdir}/nginx/koi-utf
$ v' U( A8 V; Y# d& g4 [- O%config(noreplace) %{_sysconfdir}/nginx/koi-win
& T# ?! @: g$ L%config(noreplace) %{_sysconfdir}/nginx/win-utf
! X+ E; V- X) N1 v; w9 W6 T# G) E) F% Z$ V% p0 i  R& U
%config(noreplace) %{_sysconfdir}/logrotate.d/nginx3 Y. e% f# Q& P& i& ~
%config(noreplace) %{_sysconfdir}/sysconfig/nginx/ j/ B" P3 F$ {3 N( I0 {
%config(noreplace) %{_sysconfdir}/sysconfig/nginx-debug. t3 M+ s0 W' ?& W: Y! A+ e
%if %{use_systemd}" G% s& X3 v! d
%{_unitdir}/nginx.service# ?: D5 H( n4 x8 a8 b
%{_unitdir}/nginx-debug.service
( d  [* ]" i9 {%dir %{_libexecdir}/initscripts/legacy-actions/nginx4 p( ~0 m. ~2 o7 N( [
%{_libexecdir}/initscripts/legacy-actions/nginx/*+ W/ j* `4 \* c- g8 `
%else
$ f! B' Z+ X7 x( n3 a* O$ G%{_initrddir}/nginx/ f, }7 `7 d! b0 g
%{_initrddir}/nginx-debug0 @5 K+ R. w3 z
%endif
# r( d8 W8 y! \& Q- V( O* z. R' S$ q
. I* \/ H& _+ M( r2 Q+ _0 a" w%attr(0755,root,root) %dir %{_libdir}/nginx
' H- T* J0 u" r  E- d%attr(0755,root,root) %dir %{_libdir}/nginx/modules
2 U% P  @( }8 s9 V%dir %{_datadir}/nginx
6 u# A# E4 l; a8 b  Z/ I%dir %{_datadir}/nginx/html6 K1 R# i& d$ d8 G) B
%{_datadir}/nginx/html/*& N. d+ i7 l, \! y# P# }0 O

! x! r) o5 o+ y; Y; a%attr(0755,root,root) %dir %{_localstatedir}/cache/nginx( i9 q' L  |: k: e
%attr(0755,root,root) %dir %{_localstatedir}/log/nginx' \4 [; {4 b* {- [  u& o

1 `+ l, q% U5 i. d%dir %{_datadir}/doc/%{name}-%{main_version}  S+ B0 e3 r; K. ^3 C; V
%doc %{_datadir}/doc/%{name}-%{main_version}/COPYRIGHT2 q! {6 S  [: \9 M' k
%{_mandir}/man8/nginx.8*
6 C3 y! d8 d( y2 F1 W( Z- ~# `/ X+ |7 n: j  X7 t
%pre: m. n: C2 G# r! r6 ?( z% a# O
# Add the "nginx" user: U: g& t. i! G! i7 s7 e9 `
getent group %{nginx_group} >/dev/null || groupadd -r %{nginx_group}* D, f* g6 ]* D' H+ e' a6 J
getent passwd %{nginx_user} >/dev/null || \
$ Y) I8 L$ d1 }7 R1 ]    useradd -r -g %{nginx_group} -s /sbin/nologin \, s9 A9 O0 Z% I5 s
    -d %{nginx_home} -c "nginx user"  %{nginx_user}( X7 t4 S4 z$ ]2 a3 I, J& ]
exit 0
! _% I2 T  l1 K* v: W1 q
$ N" N. F' l$ d2 o! o%post
$ U6 l0 Q5 A) h" r# w# ?# Register the nginx service2 @1 r2 B2 `1 D; s
if [ $1 -eq 1 ]; then0 F6 a9 y' i, U
%if %{use_systemd}/ j5 J9 u4 g8 a! e! x% e, K5 f
    /usr/bin/systemctl preset nginx.service >/dev/null 2>&1 ||:
0 E  n2 r' Q8 Z    /usr/bin/systemctl preset nginx-debug.service >/dev/null 2>&1 ||:$ n. l6 n, o* S2 W% e$ P
%else
% I& _/ O; B; J: H    /sbin/chkconfig --add nginx
5 `, s. w( o! b$ d6 y8 E    /sbin/chkconfig --add nginx-debug
6 R$ b9 W5 E$ `%endif
# j* I$ T: X- z" B& D# |  a. w    # print site info# w( L3 r8 f! s& d! m  |( k
    cat <<BANNER$ {4 z4 F4 E/ t
----------------------------------------------------------------------
/ {' Q5 d" @$ U; `
( [5 ~7 I% m- LThanks for using nginx!, F" O% ]7 M: }4 t/ X5 G
/ }% Y/ d" u) k! x+ K
Please find the official documentation for nginx here:
; y% M, ?/ }. p* http://nginx.org/en/docs/# p. {% u$ T' Z, Y# N
/ t, [! ?9 |7 M& r3 h
Please subscribe to nginx-announce mailing list to get
* C  K3 y0 `! C$ c8 _2 E  f- Pthe most important news about nginx:
0 E: m6 b: n' T) z* http://nginx.org/en/support.html8 Q# D" ^: P- P  V

% k& X3 _" J" T8 y6 s- ECommercial subscriptions for nginx are available on:+ y" W/ j0 M1 Y9 o- C
* http://nginx.com/products/
& a' x' |3 C7 w7 o9 V- K( U, M. [: z+ u- ?( W/ I" l4 x
----------------------------------------------------------------------5 A, ~/ [) T3 @5 [6 |, d8 }8 Z
BANNER
0 \% K: d" \7 J5 ~$ u/ p$ Y  [1 B5 Y: b0 H3 D' {/ {
    # Touch and set permisions on default log files on installation  D! E& x8 |* P% K$ V
, G% x1 S9 m+ J
    if [ -d %{_localstatedir}/log/nginx ]; then$ t& f& y5 `4 L) u/ l- F- u
        if [ ! -e %{_localstatedir}/log/nginx/access.log ]; then
5 V3 `5 o; p& o            touch %{_localstatedir}/log/nginx/access.log/ @" M( ^. T. e9 e6 p' m
            %{__chmod} 640 %{_localstatedir}/log/nginx/access.log5 f# I! m5 y1 A3 B* d0 I; X2 I
            %{__chown} nginx:%{nginx_loggroup} %{_localstatedir}/log/nginx/access.log
1 b' S. G* ?( t8 k7 F, G        fi2 l# z0 l% N' _, L# h0 Y, H

5 ^2 m$ K  ~. x+ T9 P, y        if [ ! -e %{_localstatedir}/log/nginx/error.log ]; then- r' q/ e+ K% n; x! I; u. g2 B
            touch %{_localstatedir}/log/nginx/error.log2 R5 k) J8 V! z
            %{__chmod} 640 %{_localstatedir}/log/nginx/error.log9 p. T. _* ], X) ?, a/ j, |7 O. }
            %{__chown} nginx:%{nginx_loggroup} %{_localstatedir}/log/nginx/error.log+ j% i" d# j& S5 _
        fi
, L5 x& V& o" d; _% h    fi8 F6 {) |9 k$ P& r( x
fi7 {: r7 x4 @2 P7 a

) V) [: F4 A/ d1 j%preun6 c" s/ Z9 w( ?: Q
if [ $1 -eq 0 ]; then
) F# ?, _- t. H/ j9 ]2 `1 z* [- g%if %use_systemd: z! [1 G& s/ u7 v6 j
    /usr/bin/systemctl --no-reload disable nginx.service >/dev/null 2>&1 ||:
" w& }$ ~9 F1 a* y( X- ?4 x2 b    /usr/bin/systemctl stop nginx.service >/dev/null 2>&1 ||:
! f7 w, j8 c5 P, z& ?%else4 G- B! @$ F* k4 _! b0 _9 A+ e7 |
    /sbin/service nginx stop > /dev/null 2>&1
$ @# m/ p; S$ t% ?! ~1 W    /sbin/chkconfig --del nginx4 D. `$ q1 ~/ i+ D) q7 M
    /sbin/chkconfig --del nginx-debug
. F& c! j6 P/ g, X3 Z$ g%endif1 _! J  h* Z7 o
fi
2 x4 D+ A' j! d5 }' R
9 g6 D( W, p$ j7 D# a' ?7 o%postun
/ B6 a; z0 K4 }# J- }7 G%if %use_systemd
- k: [1 Y: X. L- Z. Z3 O, q: }" s/usr/bin/systemctl daemon-reload >/dev/null 2>&1 ||:
: {5 i, o9 ^! ]%endif
6 d1 p. _' s0 P9 j1 Jif [ $1 -ge 1 ]; then, b  M, ~9 i% c8 t8 Z9 n
    /sbin/service nginx status  >/dev/null 2>&1 || exit 0
2 u( @% J1 h1 p& F4 _; |; M4 s    /sbin/service nginx upgrade >/dev/null 2>&1 || echo \/ t' m- i+ n% ?7 P$ X5 a) h
        "Binary upgrade failed, please check nginx's error.log"
: \- m  u0 G  a6 x* v" p+ i: afi3 Q! x; v( [  v, Z! P. w' ^' F. A

% q- x& s6 L6 [%changelog! j% Q  c* `  h6 o- J! ?
* Tue Sep 30 2019 fangdm <8@8994.cn>) ^/ M8 r$ Y5 z3 H
- Add modules nginx-http-concat and ngx_cache_purge
6 j) L8 A6 R+ w7 I5 z; o3 \0 D" h& G6 Z3 B3 R. {9 I
* Tue Aug 13 2019 Andrei Belov <defan@nginx.com>0 W( E' K  i6 b4 n! L! R6 P
- 1.16.1
2 o% N% `. p( F+ n. w
2 o4 {9 ^  x5 O3 w

( M5 j' g( Q  a1 e8 g
编译完成之后,查看changelog,是成功了。
复制
1
/ K- `7 [% ^" A9 v2 f& x* m3 O2
) S1 K. F3 Z/ |4 u" |3! }& D) H, U2 k6 l  ^. l( b, n$ M
4
; {9 c3 U: m& U7 ^) m5. m, J4 C# g4 a1 u. X7 {
6# h, N* I/ X+ H  m
[root@localhost SPECS]# rpm --changelog -qp /root/rpmbuild/RPMS/x86_64/nginx-1.16.1-1.el7.ngx.x86_64.rpm1 Z# E" r: x9 z* ~
* Mon Sep 30 2019 fangdm <8@8994.cn>
3 d/ W% ]( `# z/ ^- Add modules nginx-http-concat and ngx_cache_purge
  F2 q1 ]: P% k% E4 p& s: {* M
* Tue Aug 13 2019 Andrei Belov <defan@nginx.com>7 y! w( y- f) l* Z. z3 g1 s8 X1 w
- 1.16.1, \- i+ _) Z, L/ `5 J% h  W

. W0 y% P1 Y/ R8 m, n' |. \
7 b  E6 F: U$ E9 U* G* A  I
fpm打包方法
使用fpm这个方式也是可以将tar打包为rpm包,其打包流程大致是这样的:
  • 编译安装被打包软件,指定安装的临时目录,如指定--prefix=/fpmbulid
  • 创建安装脚本、卸载脚本
  • 安装FPM工具
  • 使用fpm打包' C; A* M- c  h& S( @# j! v
( ?- I, ^( a6 P& A
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

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

如有购买积分卡请联系497906712

QQ|返回首页|Archiver|手机版|小黑屋|易陆发现 点击这里给我发消息

GMT+8, 2022-12-10 09:45 , Processed in 0.108589 second(s), 21 queries .

Powered by LR.LINUX.cloud bbs168x X3.2 Licensed

© 2012-2022 Comsenz Inc.

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