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

make编译安装,将tar转rpm包

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2022-10-20 15:00:05 | 显示全部楼层 |阅读模式
gcc相关知识
' F% x# ~- j" t8 Y; R3 u先编写一个C文件,其第一行表示包含文件在/usr/include/stdio.h下,如果没有申明,则需要使用参数-I /usr/include指定。
7 |4 @' V; y) X1 n. \; i% J" z: m4 c$ A
[root@home ~]#cat sin.c
7 e$ L4 c8 R) E$ f0 E1 v4 Q  Z3 `#include <stdio.h>& F  V# M% U$ K8 t# Y- S# i% X6 u
int main(void)$ M' |/ t' ^$ Q0 S, O7 O9 T
{
" t5 T' T0 `! R7 ]* {; r/ {. |        float value;: ], s& ~+ _5 U$ R- e: C- U, t5 z' y
        value=sin(3.14/2);
1 k, r' V& _3 T: r# ?' S. t# f        printf("%.2f\n",value);+ C+ b0 A6 r8 F, F2 ]: M8 g5 k
}
' o8 R  E8 Q5 O9 [/ b% C) Y
- d+ R. J7 I! o8 B9 y3 n# M[root@localhost src]# gcc -c sin.c3 F7 _' s& v. p+ n' V* j
sina.c: In function ‘main’:
3 }& _( }7 h& _- l' U& Hsina.c:5:8: warning: incompatible implicit declaration of built-in function ‘sin’ [enabled by default]
# W: B  u' v1 H  value=sin(3.14/2);8 v" k5 ^/ [* ]- R7 n
        ^+ w  O2 K- r" L- n4 J/ S. @
[root@7ftbv7mdz7cdpc ~]# gcc -c sin.c -lm -L /lib/64 -L /usr/lib645 K/ V/ `% {/ J# w; d* j
sin.c: In function ‘main’:
4 g$ e$ E, b1 ~8 n' S% wsin.c:5: warning: incompatible implicit declaration of built-in function ‘sin’8 \  ~4 D4 f) X: O
[root@localhost src]# gcc -o sin sina.o, g! x  Q) ?: ]" O0 l" n' i& u
[root@localhost src]# ./sin
7 Z# z  ]& D2 t7 l4 _$ Y1.00! g, p- q" v0 S) l* u  V
gcc sin.c全产生a.out运行文件,加上参数-c则生成二进制文件sin.o,再加上-o则生成运行档sin。# c, Z+ D6 _8 e5 I: Y' x+ J3 O

3 A6 ^1 w9 `8 H' Z% w- ~但是如果出现以下错误,这是因为 C 语言里面的 sin 函示是写在 libm.so 这个函式库中,而我们并没有在原始码里面将这个函式库功能加进去,可以使用以下命令gcc -c sin.c -lm -L /lib/64 -L /usr/lib64
( N5 J6 ^9 v* ~' L+ O; F2 u1 Z9 W! Q: j8 X0 I+ a
gcc -O 为产生最佳化的参数
* J! }  Q# }2 x: N. t$ h" C% G" C8 q3 ?5 n1 @: z) m$ f4 i
gcc -Wall 为产生更详细的编译过程资讯) t% i! j7 e8 e# \$ j% u& ~) D' b

# O# v3 b- l% b$ l. a* G-l :是『加入某个函式库(library)』的意思,4 C( R6 f1 Q1 ?6 u5 `
! g7 v) Y' g7 R. x0 Y' D8 ?& q; d
m :则是 libm.so 这个函式库,其中, lib 与扩展名(.a 或 .so)不需要写' J; R; ^2 t8 i% R) e( N
-I /path 后面接的路径( Path )就是配置要去搜寻相关的 include 文件的目录啦
1 i5 ~0 n0 q- }4 v-L 后面接的路径表示函式库 libm.so 请到 /lib 或 /usr/lib 里面搜寻
- l0 R. t- t9 H# R8 B! Q6 n总结:
- E& b% V/ x, F# q6 P: y
, p7 z# E* }! H' G- ~# 仅将原始码编译成为目标档,并不制作连结等功能:" c3 @8 r/ I, e( }! b
[root@www ~]# gcc -c hello.c2 z9 Z% `" x" C7 X
# 会自动的产生 hello.o 这个文件,但是并不会产生 binary 运行档。
) G4 v9 b5 N: T
! e; |# O3 u% k; _! [1 a# 在编译的时候,依据作业环境给予最佳化运行速度
$ G5 T" n/ M- U' t2 J4 E/ Q[root@www ~]# gcc -O hello.c -c5 A* ]- S/ }: N/ |3 b( H
# 会自动的产生 hello.o 这个文件,并且进行最佳化喔!3 }. ]8 u' ^6 E* v  C

8 d! o& B# o/ Q  V: Z. p* U# 在进行 binary file 制作时,将连结的函式库与相关的路径填入
5 m) v- X' ]- ?' U' `$ p4 C[root@www ~]# gcc sin.c -lm -L/usr/lib -I /usr/include) u! N  G+ O9 ^: N' J* n, K
# 这个命令较常下达在最终连结成 binary file 的时候,- }: L5 U* @# z3 Z5 J# a
# -lm 指的是 libm.so 或 libm.a 这个函式库文件;/ }. O- S( e- B* T' ^6 v
# -L 后面接的路径是刚刚上面那个函式库的搜寻目录;% z) N, U+ b! `* t/ S3 w" I
# -I 后面接的是原始码内的 include 文件之所在目录。
# [! _+ y6 n  {+ R( A# m
1 c$ U9 g7 _' G3 f# 将编译的结果输出成某个特定档名
9 e# o1 o' i5 b' l[root@www ~]# gcc -o hello hello.c
& E* u  o8 [- Z1 Y: O; R# -o 后面接的是要输出的 binary file 档名$ ]2 E# U" t0 b% w! J$ x0 ?, S9 U

* D7 \3 _+ J) s# 在编译的时候,输出较多的信息说明4 A+ }4 ]' t' l
[root@www ~]# gcc -o hello hello.c -Wall1 L1 R7 ^8 c* f+ {% R6 k8 A
# 加入 -Wall 之后,程序的编译会变的较为严谨一点,
5 D1 m. p# E2 a- Y: D' }) s+ T' v# 所以警告信息也会显示出来!
- ^5 E6 w# F+ Q' H- W另外,我们通常称 -Wall 或者 -O 这些非必要的参数为旗标 (FLAGS),因为我们使用的是 C 程序语言,所以有时候也会简称这些旗标为 CFLAGS。3 L) C+ g  l+ A( l4 }/ Q

7 l  g' p3 V4 Y/ [5 gmakefile介绍/ u3 J5 y% g$ j1 S( e" w; Y8 a1 Q+ M
实例
6 h2 R) z/ i0 R' k  L% x首先,下载wget http://linux.vbird.org/linux_basic/0520source/main.tgz然后开始编译:
7 y4 M7 N, y7 Q% C9 N' M
8 @7 Y  o: L/ V" p! g6 B[root@localhost main]# cat makefile
1 _9 B/ w7 D- @" I2 d5 y+ m2 Emain: main.o haha.o sin_value.o cos_value.o
. G) j/ C- a9 Q! h5 ^) {/ }% ]        gcc -o main main.o haha.o sin_value.o cos_value.o -lm9 @+ X6 Z! F* @- G1 {9 I
clean:
0 j9 {+ D5 I2 T1 T        rm -f main main.o haha.o sin_value.o cos_value.o
$ i" G0 s+ }) ~; L9 W2 S        3 G/ @5 p3 M9 v7 k" ^5 I) }  u
[root@localhost main]# make$ _, `7 j6 |7 y# V% x6 P; J
cc    -c -o main.o main.c& t- I; y" a7 A3 c6 z7 d! R
cc    -c -o haha.o haha.c
9 L# N( R& }, k% Ccc    -c -o sin_value.o sin_value.c% x8 ~5 T7 P. H# D
cc    -c -o cos_value.o cos_value.c
0 i5 c4 I5 r- Qgcc -o main main.o haha.o sin_value.o cos_value.o -lm( E( r- s6 r% z5 s

, t1 W7 c$ v* ^$ d5 r% ?* |[root@localhost main]# ./main9 B/ w- Y1 r0 D% {' W' ~' k) j0 N
Please input your name: fdm* f4 j. @$ o! ?8 o
Please enter the degree angle (ex> 90): 33$ M) @# {, s3 a& e4 J
Hi, Dear fdm, nice to meet you.* ^9 r! ~2 v# [8 @7 S8 o. |' B
The Sin is:  0.54
8 ]8 y4 Y) L2 z' d5 g* AThe Cos is:  0.844 ~& x  F8 Q* K6 w! |8 n! z5 _
+ I9 l# P4 n: a" p/ C
[root@localhost main]# make clean. w, E5 V3 O7 Q
rm -f main main.o haha.o sin_value.o cos_value.o' _. {% A2 e% d0 q# Q, L
makefile 的基本语法与变量" a# _$ g5 X2 U5 N+ I) }
make 会主动的去判断每个目标档相关的原始码文件,并直接予以编译,最后再直接进行连结的动作。
( e7 Z3 s( m0 f
8 ^- S* |8 w& Q- J# d在 makefile 当中的 # 代表注解;
2 w/ T4 ?8 d7 F9 Q需要在命令行 (例如 gcc 这个编译器命令) 的第一个字节;
& @3 r4 i+ o. Q标的 (target) 与相依文件(就是目标档)之间需以『:』隔开。就是可执行程序的文件名。5 g9 B% O) i: u' _$ I
标的(target): 目标档1 目标档2
( M4 g7 ]3 \  M! y' ^( H        gcc -o 欲创建的运行档 目标档1 目标档2
( |! e* W6 F7 t. d, l7 S如下,makefile 里面就具有至少两个标的,分别是 main 与 clean ,如果我们想要创建 main 的话,输入『make main』,如果想要清除有的没的,输入『make clean』即可!而如果想要先清除目标档再编译 main 这个程序的话,就可以这样输入:『make clean main』
' s  \& W# H5 [, V: R5 e' @2 ]$ b# P6 ~+ {4 x7 q
还可以进行简化,使用变量来减少程序的修改量。$@:代表目前的标的(target);gcc 在进行编译的行为时,会主动的去读取 CFLAGS 这个环境变量,可以写到makefile
4 m5 D; \" G4 b8 S0 ~( q: f
1 j9 A( ?9 \/ F+ U6 F- P  K1 g[root@www ~]# cat makefile8 G+ s! ]/ J* o
LIBS = -lm0 ~! R* O2 E8 x
OBJS = main.o haha.o sin_value.o cos_value.o# Q. y1 G! s8 m  ?$ G
CFLAGS = -Wall
; b( N3 |+ f/ w+ j. x2 Z4 Mmain: ${OBJS}
  w4 V  V. d. H' Q        gcc -o $@ ${OBJS} ${LIBS}! s. z* ^1 Y/ Z( ^8 D: l  J" O  m2 A
clean:
/ [! c: d3 k; A        rm -f $@ ${OBJS}
, u7 U8 v! g" q) Y# `5 [# J+ D0 e9 U由於 gcc 在进行编译的行为时,会主动的去读取 CFLAGS 这个环境变量,所以,你可以直接在 shell 定义出这个环境变量,也可以在 makefile 文件里面去定义:
3 f6 G' n+ F& h6 X7 o2 Q; A) X" [3 h* L2 I
[root@www ~]# CFLAGS="-Wall" make clean main
; C" F/ ]( P9 P0 {, {# 这个动作在上 make 进行编译时,会去取用 CFLAGS 的变量内容!
! ~( _3 O, I; U9 f4 C$ emake与Dockerfile相接合+ B( F9 D3 p2 W+ v
此小节内容来源于 high-iowait-process 。( [! |2 w0 j9 Q" E1 Q0 s
: q# A' ]! g' o. b" l8 E* v6 {, a
如有下列Makefile文件内容:/ Y, q! L5 O4 F& [" q

$ G9 W7 p5 [: S* ~# t.PHONY: build& t. x0 u, j$ \  B& z
build:
; x& G7 }$ X$ M/ r6 ?% c6 r+ O        gcc -o app app.c
- w! Z! w) V" x8 h1 f! Q4 O        docker build -t feisky/app:iowait -f Dockerfile .6 g) |* `9 o- P. k8 f3 i
        gcc -o app app-fix1.c
% ]0 W# ?; f  Q9 L( \7 U, C        docker build -t feisky/app:iowait-fix1 -f Dockerfile .$ S; ^$ R+ k. U1 |" ^( [% H* P7 S8 L9 P
        gcc -o app app-fix2.c5 h; a: d6 b# I' r5 A2 ]
        docker build -t feisky/app:iowait-fix2 -f Dockerfile .
' k  o( |0 x# t' I) T( n' d$ ~/ L- E3 h3 p  j% K
.PHONY: push
9 w& i  I, |1 A9 l& s& ?push:) O* R4 a6 b+ b7 D- M
        docker push feisky/app:iowait$ e" \1 ?$ [4 y  l) G; o  m# z* u
        docker push feisky/app:iowait-fix14 C. \8 `  u0 S6 }6 @! w
        docker push feisky/app:iowait-fix22 B5 Z0 m7 v$ q& ^

5 Z3 c; o, T6 D; a. X.PHONY: run
) _3 R2 ?" f1 n  E5 Q( crun:1 u: o* f3 L7 p9 y+ L5 A
        docker run --privileged --name=app -itd feisky/app:iowait- [$ d" X0 ^. }

, {2 e# H2 B* W- o& s- ^.PHONY: run-fix1
9 i1 w9 {* e9 f' B3 E6 wrun-fix1:$ O8 D$ ?4 F2 s8 U+ A
        docker run --privileged --name=app -itd feisky/app:iowait-fix1
9 A: k) }8 c. v+ o/ {' a' v; s
9 N5 n, e* q8 O# _. Y.PHONY: run-fix25 k& K' t. A0 ~6 R% R, N* V' o  p; `
run-fix2:% G( m7 ^* m. O* M: ~
        docker run --privileged --name=app -itd feisky/app:iowait-fix2$ Q! `& n* v( O" t0 R; n) M4 d) U
, d1 Y4 I5 u( `/ H
.PHONY: clean: B$ c+ I4 P( d+ u; w0 Q1 \
clean:( L" N/ X% D7 _2 h) q/ W
        rm -f app& Y  b! I- N* d* Y
        docker rm -f app || echo "Container app already deleted."
$ y. O, u- \) P9 s" p% ~这样写好之后,就可以使用 make bulid 来生成镜像,使用 make run 来运行镜像,使用 make clean 来删除镜像。所以这看上去就有点像脚本的函数一样了。: \1 D) e8 D8 C' j! Y; m; w8 C

, q/ p$ t$ s4 m; |3 N) U变量的基本语法" w1 Y; |# w& T' t) D6 Q: }% [
变量与变量内容以『=』隔开,同时两边可以具有空格;! E. R( K5 `: r' q9 Y
变量左边不可以有 ,例如上面范例的第一行 LIBS 左边不可以是 ;
$ |# L2 J6 b+ R: f变量与变量内容在『=』两边不能具有『:』;
2 c( u/ L0 r' f" A7 T: M在习惯上,变量最好是以『大写字母』为主;
2 o5 z: e: Q2 c3 i2 D, t运用变量时,以 ${变量} 或 $(变量) 使用;1 b2 _( ?; J3 E1 c
在该 shell 的环境变量是可以被套用的,例如提到的 CFLAGS 这个变量!
% I  Z8 A; h, v1 s/ {  l在命令列模式也可以给予变量。. Z( q- F7 M* x6 m) t! j0 F
yum安装相关环境
3 }! ^% `4 U: c- z如果是要安装 gcc 等软件发展工具,请使用『 yum groupinstall “Development Tools” 』
6 Y# Q6 ^3 u% ~若待安装的软件需要图形介面支持,一般还需要『 yum groupinstall “X Software Development” 』8 }. \9 b5 K, ~( r
若安装的软件较旧,可能需要『 yum groupinstall “Legacy Software Development” 』2 V7 _9 x( E. S1 Z$ u
编译软件步骤
) j7 W; u6 G6 o./configure 创建Makefile文件% I- W7 m8 z; p5 e
make clean 会读取 Makefile 中关於 clean 的工作,可有可无) G( ^2 J4 S+ R9 Q, U
make make 会依据 Makefile 当中的默认工作进行编译的行为* ?6 t) z+ ]+ q+ N# s  W# A" R. E
make install
# ~8 d: J1 }1 h+ N4 W1 Y  Z& e如果未指定安装路径,则编译安装的目录是放在/usr/local/etc、/usr/local/bin、/usr/local/lib、/usr/local/man下。
0 K7 f2 m9 ?: S  |- C# a1 S/ V* H* x
% B5 @# E3 S0 X) f3 crpm知识
( g. e$ M0 h4 a9 w0 y6 q此内容与编译无关。可以跳过,同时此内容也来自于鸟哥私房菜,是一本好本啊~# k! T+ [' S/ P

! o5 j0 e1 n3 |" I( y& h4 k' FRPM 安装 (install)+ A; a" {; e5 L" O1 H1 W8 I5 V
[root@www ~]# rpm -ivh package_name
2 l! n* z4 H- f: ~. I" \$ ]选项与参数:( o5 F$ h% b8 i' a7 M
-i :install 的意思, K& x3 ], n9 q
-v :察看更细部的安装资讯画面
  K7 o5 R3 Z& @9 m/ q, [-h :以安装资讯列显示安装进度
1 }: T8 o# w- b+ K5 H
% }2 r0 @1 }, q4 i7 M4 j- q/ g-Uvh        后面接的软件即使没有安装过,则系统将予以直接安装; 若后面接的软件有安装过旧版,则系统自动升级至新版;1 X$ ]4 p- s: ]! f- t
-Fvh        如果后面接的软件并未安装到你的 Linux 系统上,则该软件不会被安装;亦即只有已安装至你 Linux 系统内的软件会被『升级』2 ^4 V- z( ?: f/ l" d4 l% D% s
; ?6 W( W9 z! \0 `3 u& P! M
[root@www ~]# rpm --rebuilddb   <==重建数据库9 W0 y% g; m* T" r; T
rpm 安装时常用的选项与参数说明
# h; U' W! C* s0 @5 Y
; M1 `: y. p) m! g" E—nodeps:当发生软件属性相依问题而无法安装,但你执意安装时) k* z7 J, K3 r# Z6 K
—replacefiles:如果在安装的过程当中出现了『某个文件已经被安装在你的系统上面』的资讯,又或许出现版本不合的信息 (confilcting files) 时,可以使用这个参数来直接覆盖文件。/ U6 A& {( ?4 R7 B$ f
—replacepkgs:重新安装某个已经安装过的软件!如果你要安装一堆 RPM 软件文件时,可以使用 rpm -ivh *.rpm ,但若某些软件已经安装过了, 此时系统会出现『某软件已安装』的资讯,导致无法继续安装。此时可使用这个选项来重复安装喔!
$ I" B0 |/ F/ S6 V& h—force:这个参数其实就是 —replacefiles 与 —replacepkgs 的综合体!' {: d- |& v* k. e) e
—test: 想要测试一下该软件是否可以被安装到使用者的 Linux 环境当中,可找出是否有属性相依的问题。
: D; e+ p) y" }—justdb 使用时机: 由於 RPM 数据库破损或者是某些缘故产生错误时,可使用这个选项来升级软件在数据库内的相关资讯。; i, B, G; ?* c* X( w4 n
—nosignature 使用时机: 想要略过数码签章的检查时,可以使用这个选项。$ K2 ^% J& F9 }. \6 x7 _
—prefix 新路径 使用时机: 要将软件安装到其他非正规目录时。举例来说,你想要将某软件安装到 /usr/local 而非正规的 /bin, /etc 等目录, 就可以使用『 —prefix /usr/local 』来处理了。  N- _- V+ d, Y
—noscripts 使用时机:不想让该软件在安装过程中自行运行某些系统命令。) c  \- n* G3 Y0 c$ X
RPM 查询 (query)
; E; \; @. ]+ P3 ?$ c7 t& H+ i, HRPM 在查询的时候,其实查询的地方是在 /var/lib/rpm/ 这个目录下的数据库文件。- U! e  k7 h4 t" f! G

5 z! K; q8 b- l/ Y( E+ W, _[root@www ~]# rpm -qa                           <==已安装软件* h! Y, U6 n- O% m" [  ]
[root@www ~]# rpm -q[licdR] 已安装的软件名称       <==已安装软件4 `7 Y$ z1 t" Z7 y) n
[root@www ~]# rpm -qf 存在於系统上面的某个档名      <==已安装软件) h( K9 W0 n; x7 {8 {- m# m- M
[root@www ~]# rpm -qp[licdR] 未安装的某个文件名称  <==查阅RPM文件0 T+ b% R' r, k1 `4 v" l7 U9 [
-q :仅查询,后面接的软件名称是否有安装;! ?  ~) w' v5 r& S; K& ?
-qa :列出所有的,已经安装在本机 Linux 系统上面的所有软件名称;" y/ F$ V  G! }$ T6 F( d
-qi :列出该软件的详细资讯 (information),包含开发商、版本与说明等;7 a; `9 ^% Z5 U  J# w' t- p7 N
-ql :列出该软件所有的文件与目录所在完整档名 (list);
- l: K- S* {: V# X-qc :列出该软件的所有配置档 (找出在 /etc/ 底下的档名而已)
2 `  H, V. H$ L% {0 ~8 q8 A" @-qd :列出该软件的所有说明档 (找出与 man 有关的文件而已)
) D; D" h! \7 P' n-qR :列出与该软件有关的相依软件所含的文件 (Required 的意思)5 m# j- {, ]0 _4 m
-qf :由后面接的文件名称,找出该文件属於哪一个已安装的软件
5 d7 N$ |4 K) L5 ]3 `-qp[icdlR]:注意 -qp 后面接的所有参数以上面的说明一致。但用途仅在於找出某个 RPM 文件内的资讯,即未安装的名称
$ \& X. j# [) aRPM 验证与数码签章4 D. j( l: N8 ^# _- u. }8 F+ g
验证' [. ]! ~1 L! {1 S, D
验证 (Verify) 的功能主要在於提供系统管理员一个有用的管理机制!作用的方式是『使用 /var/lib/rpm 底下的数据库内容来比对目前 Linux 系统的环境下的所有软件文件 』也就是说,当你有数据不小心遗失, 或者是因为你误杀了某个软件的文件,或者是不小心不知道修改到某一个软件的文件内容
/ {5 I4 T. n0 q- O9 K$ \! D7 w4 Y" A) q7 u
[root@www ~]# rpm -Va
) g1 }0 B" d8 \. C8 E[root@www ~]# rpm -V  已安装的软件名称8 Q9 s8 f: Y+ c
[root@www ~]# rpm -Vp 某个 RPM 文件的档名: `* A* i# A) C7 a( U
[root@www ~]# rpm -Vf 在系统上面的某个文件2 b% Y. r3 B+ Q: B

5 b( H- ^; H* Y! \; ]选项与参数:
  n5 x  A, _2 o-V  :后面加的是软件名称,若该软件所含的文件被更动过,才会列出来;
7 O7 J6 C, Z) o-Va :列出目前系统上面所有可能被更动过的文件;: K/ y: W. o; J& b( ^- n# g
-Vp :后面加的是文件名称,列出该软件内可能被更动过的文件;) i) R. W, h8 f0 S
-Vf :列出某个文件是否被更动过~
$ Y2 D! A* {+ I
$ o6 A" C% p2 n[root@www ~]# rpm -V logrotate6 G+ [  \7 G  A4 h$ X
..5....T  c /etc/logrotate.conf2 t2 ]8 S  R* [3 T. d
第一列的含义有以下几种:
! b# R* J$ G, \5 P0 U
; o6 D9 y% n. j4 Q3 l$ f# z! ~S :(file Size differs) 文件的容量大小是否被改变
5 {' P& N6 E' I+ O  U! EM :(Mode differs) 文件的类型或文件的属性 (rwx) 是否被改变?如是否可运行等参数已被改变
1 p# B& ^" q* Q5 :(MD5 sum differs) MD5 这一种指纹码的内容已经不同
7 x3 {$ c( s+ n. m7 Z+ m$ SD :(Device major/minor number mis-match) 装置的主/次代码已经改变
9 r# V1 X- j+ M' c3 Q+ Z* R5 ZL :(readLink(2) path mis-match) Link 路径已被改变
& ^& m  K1 |3 CU :(User ownership differs) 文件的所属人已被改变
3 c, r, _4 ^) w$ @G :(Group ownership differs) 文件的所属群组已被改变
& u5 ^* u1 n- `' x. `1 eT :(mTime differs) 文件的创建时间已被改变
) l! \3 G& @* b* t+ g7 X第二列的含义有以下几种:9 u* S/ k. ]* F0 V/ p1 N4 p: i
7 X* m& a; w! L7 Q
c :配置档 (config file)
- d& C. ]- y$ w$ }d :文件数据档 (documentation)9 P3 K' S3 m: P( P# L$ {( @
g :鬼文件~通常是该文件不被某个软件所包含,较少发生!(ghost file)' q/ b" t1 H' L6 t8 q
l :授权文件 (license file)
" ?8 `2 N  u/ x9 n# A/ x, sr :读我文件 (read me)
5 @: s( A+ O" \% h( _数码签章7 i/ x0 {6 ?. c- [1 k- L: D2 m+ `
软件开发厂商可以数码签章系统产生一个专属於该软件的签章,并将该签章的公钥 (public key) 释出。 当你要安装一个 RPM 文件时:) o1 P, }9 w2 R& w
3 Q6 W: D& \$ j( ], Y( O9 n
首先你必须要先安装原厂释出的公钥文件;实际安装原厂的 RPM 软件时, rpm 命令会去读取 RPM 文件的签章资讯,与本机系统内的签章资讯比对,若签章相同则予以安装,若找不到相关的签章资讯时,则给予警告并且停止安装喔。
& \$ Y  _. R2 r, T0 e
( x$ x) c; l8 [5 \; R[root@localhost ~]# ll /etc/pki/rpm-gpg/RPM-GPG-KEY-*. z' o& M  G( t" p/ [5 s, D2 ^: `
-rw-r--r--. 1 root root 1690 Nov 23 08:16 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
! F2 |% c  i8 D. n9 y) V-rw-r--r--. 1 root root 1004 Nov 23 08:16 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Debug-7
. r) ]  d: P. w* P2 t-rw-r--r--. 1 root root 1690 Nov 23 08:16 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Testing-70 J  p, b  m; N' W
-rw-r--r--. 1 root root 1662 Oct  2  2017 /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
7 `3 _$ J0 B& T6 b7 l# ]-rw-r--r--. 1 root root 1340 Mar 23  2017 /etc/pki/rpm-gpg/RPM-GPG-KEY-remi6 o9 y: k. F  b- d; A, F
-rw-r--r--. 1 root root 3100 Mar 23  2017 /etc/pki/rpm-gpg/RPM-GPG-KEY-remi2017
* ]' k* \/ P( K- F/ e! B4 X-rw-r--r--. 1 root root 3143 Jan 16  2018 /etc/pki/rpm-gpg/RPM-GPG-KEY-remi20181 r9 _; }$ ]' J" t8 C4 m
SRPM相关知识
7 S! {9 x9 x* d9 ?( b& f+ nrpm的全称是Redhat Package Manager,SRPM是指 Source RPM 的意思,这个 RPM 文件里面含有原始码,特别注意的是,这个 SRPM 所提供的软件内容『并没有经过编译』。通常 SRPM 的扩展名是以 *.src.rpm 这种格式来命名的。srpm跟tarball的区别就是srpm提供了这个软件所需要的相依性软件说明、以及所有 RPM 文件所提供的数据。5 C, Q8 x% P$ d" K3 x

: ]: x4 y; Z* Y$ C0 Erebuild直接安装
) d( i* C4 E/ ]  A+ F下载src.rpm包之后,可以在不修改配置的情况下,直接使用以下参数直接操作:
3 p; V# _( v/ Q% I# r0 _* R# M. {% v2 \+ s: }
—rebuild:这个选项会将后面的SRPM进行『编译』与『打包』的动作,最后会产生RPM的档案,但是产生的RPM档案并没有安装到系统上。当你使用—rebuild的时候,最后通常会发现一行字体:Wrote: /root/rpmbuild/RPMS/x86_64/pkgname.x86_64.rpm这个就是编译完成的RPM档案啰!这个档案就可以用来安装啦!安装的时候请加绝对路径来安装即可
* q4 o* Q9 X7 J# ^2 |- m( y  L3 C—recompile:这个动作会直接的『编译』『打包』并且『安装』啰!请注意, rebuild 仅『编译并打包』而已,而recompile 不但进行编译跟打包,还同时进行『安装』了
, q+ T6 Q- F) v) c- C3 N0 O1 H, Y示例:5 g+ L  y& X, f7 ~

/ G7 x# ]7 Z. r2 P. ]先下载软体:
  U. V1 X6 x) k# Rwget http://vault.centos.org/7.1.1503 ... l7.centos.1.src.rpm3 I8 Y6 h3 e8 F9 L0 O$ d; r
再尝试直接编译看看:
' E) O1 L& q% z) W- I* Rrpmbuild --rebuild ntp-4.2.6p5-19.el7.centos.1.src.rpm
: _* [. t1 A' z$ S上面的动作会告诉我还有一堆相依软体没有安装~所以我得要安装起来才行:
' l* f+ r0 b. w8 i% W7 C0 wyum install libcap-devel openssl-devel libedit-devel pps-tools-devel autogen autogen-libopts-devel
  z3 ^) n1 Z* p: y) ]! N: s再次尝试编译的行为:
& T( n$ r3 M3 y* U! S1 L5 B6 V# ?, grpmbuild --rebuild ntp-4.2.6p5-19.el7.centos.1.src.rpm) n$ {: Z+ C* P9 V6 k6 p4 l
最终的软体就会被放置到:
* W; t6 [$ ~# Y/root/rpmbuild/RPMS/x86_64/ntp-4.2.6p5-19.el7.centos.1.x86_64.rpm3 }9 E1 }& i% Z- `8 x4 D
SPEC编译安装
1 K0 }3 ^8 T2 |5 \8 Q# h& q目录说明6 _# b7 y7 Y& }' `9 F; |" w, r5 `
如果你的rpm的版本<=4.4.x,那么rpmbuid工具其默认的工作路径是/usr/src/redhat,这就使得普通用户不能制作rpm包,因为权限的问题,在制作rpm软件包时必须切换到root身份才可以。所以,rpm从4.5.x版本开始,将rpmbuid的默认工作路径移动到用户家目录下的rpmbuild目录里,即$HOME/rpmbuild。  Q6 B; v: [+ t0 Z8 Q

$ |' U0 {8 R8 [* w+ Q首先yum -y install rpm-build rpmdevtools,然后rpmdev-setuptree来创建工作目录,也可以不安装rpmdevtools,直接使用mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}来创建。具体的各目录的含义如下:
- P- x/ m! F; `- O. `" R7 ~3 w; v5 T7 d% Y7 s
默认位置        宏代码        名称        用途
% Y5 ^- i7 ~1 b! U5 l+ e7 @# [~/rpmbuild/SPECS        %_specdir        Spec 文件目录        保存 RPM 包配置(.spec)文件
' G, z% P& C" r! u' D~/rpmbuild/SOURCES        %_sourcedir        源代码目录        保存源码包(如 .tar 包)和所有 patch 补丁
# q- I  M6 a" i4 ?. J1 N* t: q~/rpmbuild/BUILD        %_builddir        构建目录        源码包被解压至此,并在该目录的子目录完成编译
0 x2 x2 C1 O. I9 S% d8 w) C  @~/rpmbuild/BUILDROOT        %_buildrootdir        最终安装目录        保存 %install 阶段安装的文件7 p& J7 A( G) a8 }
~/rpmbuild/RPMS        %_rpmdir        标准 RPM 包目录        生成/保存二进制 RPM 包
/ u2 Q& a" r8 Z; T5 K8 h" [- T~/rpmbuild/SRPMS        %_srcrpmdir        源代码 RPM 包目录        生成/保存源码 RPM 包(SRPM)
0 b8 V, C( s' J0 E8 w9 x3 ?使用rpm -ivh来安装srpm包时,会生成很多文件在/root/rpmbuild下:
* W, {6 l6 i- n; u$ S6 x* G8 M- G3 l
2 e% t- \. z! T[root@localhost ~]# rpm -ivh ntp-4.2.6p5-19.el7.centos.1.src.rpm
# ~! d; U5 ]% w* VUpdating / installing...0 I8 C. N; n4 e6 h% g
   1:ntp-4.2.6p5-19.el7.centos.1      ################################# [100%]
! D" x, Y5 v: `, p3 r' ^[root@localhost ~]# tree /root/rpmbuild/3 ]( b+ v7 \  G* Z
/root/rpmbuild/
3 L) F: f- b- G: a- L├── BUILD7 _( n9 {- P, S
├── BUILDROOT- \  W! j# h5 `( e5 p5 e- S
├── RPMS# q9 J3 z2 j3 e( ?  p
├── SOURCES
2 ^* Z. A" A- |  v  s│   ├── ntp-4.2.4p7-getprecision.patch
, u' S9 j0 Q: ?& ?4 _8 S" V: ]3 F│   ├── ntp-4.2.6p1-cmsgalign.patch
3 V0 A) }. O" x* `。。。! e5 M1 E/ d& K, d
│   └── sntp.sysconfig
  F9 |, h) \' F9 R1 [├── SPECS
: T1 u( m. P/ }9 L+ j( L│   └── ntp.spec; k* ]. W- H( H$ W% h/ J; ~
└── SRPMS! M" m3 T  R; Z8 r/ L
解压完成之后,srpm本身就提供了spec文件,可以直接通过以下方式直接安装:% F" n' s" O  ]# g( y; H

1 }& K  m* T8 g/ v[root@study ~]# rpmbuild -ba ntp.spec   <==编译并同时产生RPM与SRPM档案 # y& w4 t0 G$ G: x: j. J
[root@study ~]# rpmbuild -bb ntp.spec   <==仅编译成RPM档案
* v3 V5 @9 a9 u5 M3 q  I. jspec打包流程3 x2 I- E8 h& w6 r8 r9 }
SPECS下是RPM包的配置文件,是RPM打包的“图纸”,这个文件会告诉rpmbuild命令如何去打包。“宏代码”这一列就可以在SPEC文件中用来代指所对应的目录,类似于编程语言中的宏或全局变量。当然~/rpmbuild这个文件夹也是有宏代码的,叫做%_topdir。, h. g% {( x2 s. r9 Y

5 Y0 q2 w  l3 x! n+ L; I" \, _" D打包的过程有点像是流水线,分好几个工序:: V; c. z, F0 C$ L* w
$ t5 o/ X& E5 T1 D' i" A$ r
首先,需要把源代码放到%_sourcedir中;( `: \4 \/ R- J" `
然后,进行编译,编译的过程是在%_builddir(~/rpmbuild/BUILD)中完成的,所以需要先把源代码复制到这个目录下边,一般情况下,源代码是压缩包格式,那么就解压过来即可;
* ?& p0 Y- c& x第三步,进行“安装”,这里有点类似于预先组装软件包,把软件包应该包含的内容(比如二进制文件、配置文件、man文档等)复制到%_buildrootdir(~/rpmbuild/BUILDROOT)中,并按照实际安装后的目录结构组装,比如二进制命令可能会放在/usr/bin下,那么就在%_buildrootdir下也按照同样的目录结构放置;1 n7 \8 z0 c/ [  P8 S
然后,需要配置一些必要的工作,比如在实际安装前的准备啦,安装后的清理啦,以及在卸载前后要做的工作啦等等,这样也都是通过配置在SPEC文件中来告诉rpmbuild命令;7 w9 x" J9 v: G/ L
还有一步可选操作,那就是检查软件是否正常运行;) a" r5 V( U0 Q% e) w
最后,生成的RPM包放置到%_rpmdir,源码包放置到%_srpmdir下。& q+ u' I: ^4 h/ i, v6 ?/ @  b3 W
spec文件内容
3 Q& ]2 A3 L8 H! e2 M- P5 C' A使用vim a.spec之后,会自动生成spec的结构体,内容如下:) X* Y8 N* i4 \; ?+ }( K

) M% \: g# D; j) t) T5 Z2 n$ D( gName:                                                                ==>软件包的名字,后续可以用%{name}来引用
3 Y& \3 w8 K& n* y* f; PVersion:                                                        ==>软件版本
. H2 s+ o6 j6 s7 Z* k& ARelease:        1%{?dist}                                ==>发布的序号
( Z( k1 d1 x( G" o  j8 q. eSummary:                                                        ==>软件包的摘要信息
8 X. O7 V7 Z% d
0 V) O0 M/ _4 N% F- ZGroup:                                                                ==>软件包的安装分类,参见/usr/share/doc/rpm-4.x.x/GROUPS这个文件5 Z' l; d3 S; h3 ]3 k' T
License:                                                        ==>GPLv2,授权方式; g) e, I* Z: b/ t& ?
URL:                                                                ==>这里本来写源码包的下载路径或者自己的博客地址或者公司网址之类,无实际用处
) B5 q& s8 V# \  M' |0 u9 ]Source0:                                                        ==>%{name}-%{version}.tar.gz源代码包的名称,这里的name和version就是前两行定义的值。如果有其他配置或脚本则依次用Source1、Source2等等往后增加即可。0 `1 Y1 U8 b. B% `3 u
( p! @& f# G4 Z$ O" y! d: a
BuildRequires:                                                ==>在本机编译rpm包时需要的辅助工具,以逗号分隔。假如,要求gcc的版本至少为4.4.2,则可以写成gcc >=4.2.2。# l$ F) B9 b; L5 ~
Requires:                                                        ==>编译好的rpm软件在其他机器上安装时,需要依赖的其他软件包,也以逗号分隔,有版本需求的可以6 n  m- P- ~8 e/ e

- Z3 I& q) M7 ~" L  l( M%description                                                ==>软件包的详细说明信息,但最多只能有80个英文字符。( Z, x/ ~; ^* [6 {9 ~

9 p1 f& l  q. x2 Z( F$ `" T%prep                                                                ==>读取位于 %_sourcedir 目录的源代码和 patch 。之后,解压源代码至 %_builddir 的子目录并应用所有 patch。+ W+ q& y9 O6 F- x; v' `. p$ g2 T
%setup -q                                                        ==>使用这个语句实现%prep功能,仅能解压Source 或 patch 定义好的文件
5 O! {! ?' R6 Q$ w) x& \1 M: c3 N" c# O  U' p. k
%build                                                                ==>编译位于 %_builddir 构建目录下的文件。通过执行类似 ./configure && make 的命令实现。/ z; T7 S4 F" |2 R: B4 \/ z
%configure
+ v% G- e; q# y+ s4 R6 j! jmake %{?_smp_mflags}
5 r( R; L  v# Q6 d. S
: j& X& P0 U% j/ P%install                                                        ==>读取位于 %_builddir 构建目录下的文件并将其安装至 %_buildrootdir 目录。这些文件就是用户安装 RPM 后,最终得到的文件。注意一个奇怪的地方: 最终安装目录 不是 构建目录。通过执行类似 make install 的命令实现。. n5 Z; e2 ]* U  y5 Z
make install DESTDIR=%{buildroot}
3 E1 K4 A# a9 e) Q* O
  v% D1 P7 h1 j6 |) ~& |5 I%files                                                                ==>软件文件和目录
4 Z( @- ]# `1 Z; g0 W$ a%doc                                                                ==>软件说明文件
* V5 O9 m5 E9 w! C. c- r( L0 S7 \: \5 _( k2 h3 A7 j4 k$ e) ?! R
%changelog                                                        ==>更新说明,星号(*) 后面应该要以时间,修改者, email 与软体版本来作为说明, 减号(-) 后面则是你要作的详细说明啰
$ z2 E% n$ _0 w& f* A除了以上这些,还是以下阶段:
8 X+ ~# a9 H$ b' o8 ]9 }, `+ i6 q0 y7 N7 p3 b0 B' J# E
%pre 在目标系统上安装软件包之前执行的Scriptlet。注意跟%prep的区别。# G* @, B- ~9 e2 |$ z+ F6 b" m
%post 在目标系统上安装软件包完成之后执行的Scriptlet。
9 n9 B# g" g" M; X! Y" e: x9 S%preun 在从目标系统卸载软件包之前执行的Scriptlet。
$ p6 Y) V8 S" E! t0 C%postun 从目标系统卸载软件包完成之后执行的Scriptlet。
! D9 G, j+ O: w# N  K* m. W以下介绍一下比较重要的阶段。
9 G1 _# D. {# i7 k; {* Z8 W/ `# B
2 u' Z5 B% z9 }" t8 G$ v%prep阶段; s1 i* y1 s. z! X8 J1 ]& I
这个阶段里主要完成对源代码包的解压和打补丁(如果有的话),而解压时最常见到的就是一句指令:%setup -q。这句指令可以成功执行的前提是你位于SOURCES目录下的源码包必须是name-version.tar.gz的格式才行,它还会完成后续阶段目录的切换和设置。如果在这个阶段你不用这条指令,那么后面每个阶段都要自己手动去改变相应的目录。
# ~8 ^6 _; B& L% p
3 G1 j% o- }# Q4 e6 V/ F! ~5 I: ]& h如果在%prep阶段,只使用了%setup这个宏变量,代表了会运行以下操作(假设Source为cdplayer-1.0.tgz):
3 j" T6 Z# [) s- x
9 d* C1 n" a# G* S' Qcd /usr/src/redhat/BUILD
- L3 Q( I2 G: z4 ?9 M+ J& ?4 xrm -rf cdplayer-1.0) U5 \6 [" t2 p1 y' b! o1 K  M9 w3 J
gzip -dc /usr/src/redhat/SOURCES/cdplayer-1.0.tgz | tar -xvvf -( T* p( A( L+ v% o0 @& |  ]) \' w
if [ $? -ne 0 ]; then* ~. M% k/ v2 ?: j( D" V
  exit $?
  h2 Z7 Q& I+ D8 b, b1 v& }4 g  T5 wfi
% ~9 x( l7 c+ mcd cdplayer-1.00 I9 I; U% z# f) r+ g- E" Y2 r
cd /usr/src/redhat/BUILD/cdplayer-1.0
# W: a) n$ s) r3 g9 n( J# v+ Qchown -R root.root ." c1 Q9 S3 I( R: m! n. v, ?
chmod -R a+rX,g-w,o-w .
6 v5 G/ e7 k* ?6 X可以看到,默认操作为先进入BUILD目录,然后再删除%{name}-%{version},再解压,最后再修改权限、属主等。参数-q是指不输出运行的过程,还有其他参数如下:
8 Z& v) D8 f) O7 K5 d) M1 O$ u% Z  r' u0 J9 }
%setup -n newdir 先删除/usr/src/redhat/BUILD/newdir目录,然后将软件包解压在newdir目录;再进行这个目录进行权限设置
7 d7 i8 ]( }" ?$ P4 \1 X# ]%setup -c 先创建目录,进入这个目录后再解压。与不加参数的%setup比较,仅仅是多了mkdir 以及 cd 这2个命令( x( Z# f! W$ M+ ?1 F8 F! ?' e% i
%setup -D 解压缩时,不会去删除目录。与不加参数的%setup比较,少了rm -rf操作
6 ~; u0 u; N. M0 M9 a4 U  ?5 N%setup -T 不进行解压的操作。与不加参数的%setup比较,少了gzip以及if判断语句
& e3 ]9 z( l7 j7 a3 x0 w* V8 y2 ~' o
%setup -b num 将第num个source文件解压缩。如果是 %setup -b 0,就会解压2次,可以使用 %setup -T -b 0,这样就只会解压一次了。但只效果跟 %setup 不加参数的效果是一样的。
- J4 Q7 h* C  Q) k6 c7 G* k%setup -T -a num 先进入目录再解压第num个source文件
7 V( b% D0 Z4 p/ ?( V9 A& @8 u& [' D) F( V
& G, B0 }+ Y7 v
%patch 最简单的补丁方式,自动指定patch level。2 R0 v/ L1 M3 d& Y$ s
%patch 0 使用第0个补丁文件,相当于%patch ?p 0。
2 ?: l/ i; ^, T' m( {%patch -s 不显示打补丁时的信息。
) G7 b; P; {2 d6 f1 G3 t3 t5 M  b%patch -T 将所有打补丁时产生的输出文件删除。
6 e# W0 N  a% ]0 u8 a: r/ U*************************************/: s0 e# |- @, t* ^" ]
%setup -q -n %{name}-%{version}
$ V. ]* m/ S2 T# D: l1 p4 w! \5 ^. Z/ O3 a1 F/ f0 y
/* 如果原来只有一个“Patch:”,您增加“Patch1:”,则在SPEC文件%setup行后面的8 H5 u' b( F8 O1 e8 J! h$ l) W
   %patch -p1后面新增一行: %patch1 -p1 依此类推.
$ e" u& B$ `0 g6 W- b* |5 I2 y8 F! d */& y( M' t2 K. {1 h# Y  F0 n
%patch0 -p1
9 o6 z* K( L% w- Q$ ?; Y实例,如果%prep的内容如下:
3 d% e& U: L" \8 [+ i  p4 N* ?0 u  `; f6 E
%prep8 U; F9 K, y, [: u6 g
%setup
- c0 F. _) j0 H! S/ O8 |* |. w%setup -T -D -a 14: o4 C5 `5 b: s7 }4 l2 w% r
%setup -T -D -a 15
; d5 X( f. @& k% l其运行的过程如下:
: ~! Z6 `! {3 O' T* m# D. k
& i& R$ b1 ]( P: E[root@localhost SPECS]# rpmbuild -bb nginx.spec
" S$ `: k: t: S& ]. {- yExecuting(%prep): /bin/sh -e /var/tmp/rpm-tmp.N1Tdpo
' Q: ?9 C% `' {2 ?& j; e8 Q7 T+ umask 022
' Z+ U% L( m- J* T% F9 Q* d& @2 d+ cd /root/rpmbuild/BUILD
! }  A% J6 A2 N9 E4 v/ t+ cd /root/rpmbuild/BUILD4 @+ F; A3 o& a5 }. n
+ rm -rf nginx-1.16.1
9 `. z( \; q* o, n6 A) M! ]+ /usr/bin/tar -xvvf -. W* L( D" i! j
+ /usr/bin/gzip -dc /root/rpmbuild/SOURCES/nginx-1.16.1.tar.gz. Y  ?8 v- ?6 d9 a8 C- `# [
...6 t5 ]. E) |2 l+ `9 `3 p
+ STATUS=0
$ q  l% K; r4 X7 [% x+ '[' 0 -ne 0 ']'& e1 A! ]5 c8 X' U: n
+ cd nginx-1.16.19 }* {0 a& @. @1 X& w5 c; e
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .# E$ m, N* L; V: F. V
+ cd /root/rpmbuild/BUILD2 a. F! L3 |( |  r7 }. F
+ cd nginx-1.16.11 N3 Q) A. I/ I$ c- Y
+ /usr/bin/tar -xvvf -
( X4 z- Q3 o% `3 {! P3 R. V% \+ /usr/bin/gzip -dc /root/rpmbuild/SOURCES/nginx-http-concat.tar.gz9 r3 M$ g% c3 k; m/ W8 |0 z& |# K$ a
..., C' k, \. z0 h: N
+ STATUS=0. R: D- Z1 G4 U2 `& i8 `6 g
+ '[' 0 -ne 0 ']'* u  r" E0 e& F
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .) L* l8 l( [6 S* w" P+ E
+ cd /root/rpmbuild/BUILD+ N7 l7 I& X3 N
+ cd nginx-1.16.1
6 @: {( @5 [  D6 u. ]+ /usr/bin/tar -xvvf -( \: ]1 R: l+ w0 c# b! E2 G: w' Q$ P/ p
+ /usr/bin/gzip -dc /root/rpmbuild/SOURCES/ngx_cache_purge.tar.gz
( n8 l2 M0 H( x2 x- c8 [...7 g2 V2 ~( b2 \; N0 R2 q+ {. L
需要注意的是,%setup -q 是指解压不输出任何提示消息,只会解压source0的文件,即第0个source文件。%setup -T -a num 先进入目录再解压第num个source文件,进入目录的意思是进入%{name}-%{version}这个目录,即spec前面定义好的Name以及Version。8 G( Y* J5 _- Z0 O& M5 z

0 Y/ G  N9 R& V2 T' Bhttps://book.huihoo.com/maximum-rpm/s1-rpm-inside-macros.html6 E# h/ O5 n. I1 n5 f' q

1 Z9 |4 H5 D6 {) G$ o%build阶段
- P0 Y! C& T; j- H$ a  t6 g这个阶段就是执行常见的configure和make操作,如果有些软件需要最先执行bootstrap之类的,可以放在configure之前来做。这个阶段我们最常见只有两条指令:, K- |& S; R5 o, X' @3 L
) l/ c0 y8 b9 V- t
%configure
) f7 x9 r  [' i9 @make %{?_smp_mflags}
% \4 f0 }( t7 G! ?$ w- L这里的%configure是个宏常量,会自动将prefix设置成/usr。另外,这个宏还可以接受额外的参数,如果某些软件有某些高级特性需要开启,可以通过给%configure宏传参数来开启。如果不用 %configure这个宏的话,就需要完全手动指定configure时的配置参数了。同样地,我们也可以给make传递额外的参数,例如: make %{?_smp_mflags} CFLAGS="" …
" G7 q% j1 k& t5 z2 N
- G$ y7 \8 K! H! T! q( T5 Q0 j. @%install阶段
3 O' w. g. M8 T- ^0 U) j' X' M这个阶段就是执行make install操作。这个阶段会在%_buildrootdir目录里建好目录结构,然后将需要打包到rpm软件包里的文件从%_builddir里拷贝到%_buildrootdir里对应的目录里。这个阶段最常见的两条指令是:% R' ]. }) N8 Y" T7 e8 @* ^1 t

  B& I6 t% V. Z& _* Trm -rf $RPM_BUILD_ROOT, C. b/ r: _7 |( T
make install DESTDIR=$RPM_BUILD_ROOT
( k: j, c; B8 v其中$RPM_BUILD_ROOT也可以换成我们前面定义的BuildRoot变量,不过要写成%{buildroot}才可以,必须全部用小写,不然要报错。( ?. @& z6 }8 Y! T) b

, E& ]& H" p# q: D& k8 Z& A如果软件有配置文件或者额外的启动脚本之类,就要手动用copy命令或者install命令你给将它也拷贝到%{buildroot}相应的目录里。用copy命令时如果目录不存在要手动建立,不然也会报错,所以推荐用install命令。5 U* b2 F0 N- y9 d0 Q7 {# k/ V5 k6 r
( @2 |& p4 v, q7 x" V
制作rpm软件包的阶段) Q. A. Q" u; `# h; W7 H4 I
这个阶段必须引出下面一个叫做%files的阶段。它主要用来说明会将%{buildroot}目录下的哪些文件和目录最终打包到rpm包里。
+ F& A( n( Y) a% {  b
6 G( O- S7 w. k; W; s2 a%files/ @4 p7 W4 _# _& `% N$ R  ^
%defattr(-,root,root,-)3 _. j# U6 D* i( r
%doc. f( ^/ v: p& E& Q+ p
%defattr 表示的意思是: %defattr(文件权限,用户名,组名,目录权限) ,如果不牵扯到文件、目录权限的改变则一般用%defattr(-,root,root,-)这条指令来为其设置缺省权限。8 [# u: p" Z$ B. ?3 y- [2 g
1 D& ~8 L8 z" b: F( G3 h- S
关于%files阶段有两个特性要牢记:2 x7 j# b- }! v8 ?: `* K

2 N" o1 C, n. M$ w1 Z%{buildroot}里的所有文件都要明确被指定是否要被打包到rpm里。什么意思呢?假如,%{buildroot}目录下有4个目录a、b、c和d,在%files里仅指定a和b要打包到rpm里,如果不把c和d用exclude声明是要报错的;+ S/ E( X3 H7 G& J) g# l  `( z
如果声明了%{buildroot}里不存在的文件或者目录也会报错。
+ @2 \, P: t' F7 Q/ q0 v1 @4 |( Z代表路径的宏列表8 s/ ]' m% ~6 _( N) u3 g" Z" [
如果您看到一个不熟悉的宏,您可以使用rpm --showrc 或者 rpm --eval %{_bindir}以下方法对其进行查看:
& a7 R1 H$ Q# k6 I# w( Z0 M+ \0 F
$ rpm --eval %{_bindir}
- c, h1 ?) p" k/usr/bin6 T: x8 _- ]) Q/ A) i: ^. z2 a

' g8 r' R- ^" |8 p[root@localhost noarch]# rpm --showrc |grep buildrootdir
0 ^" z1 C" {5 d' F, f-14: _buildrootdir        %{_topdir}/BUILDROOT( t  v% m/ ~& M) K- [
-14: buildroot        %{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch}, `0 ]6 ^  S: A$ c8 a
也可以直接查看/usr/lib/rpm/macros文件,以下是常见的宏:
8 P6 @% e0 A9 c/ d, }% K/ u, j/ t: v0 o$ |
%{_sysconfdir}        /etc
, H) z- l% z) Y9 u; W* ^4 d%{_prefix}            /usr* f; U; @( M9 t
%{_exec_prefix}       %{_prefix}
+ D: j" X" G: Z%{_bindir}            %{_exec_prefix}/bin# ~; Q0 |- |7 A, G) E
%{_libdir}            %{_exec_prefix}/%{_lib}
" I# F# t6 A5 X5 S- q6 Q0 }. u%{_libexecdir}        %{_exec_prefix}/libexec7 b- M6 K6 a8 C% |, E
%{_sbindir}           %{_exec_prefix}/sbin! C3 H9 W/ p3 V# z. Z0 x! @9 ^
%{_sharedstatedir}    /var/lib
, Q! r- m7 `/ b" s9 t) L* K6 j%{_datarootdir}       %{_prefix}/share
3 ^8 m+ d0 k" S$ e2 [%{_datadir}           %{_datarootdir}- x: N. J# ]. N1 S  M) F! Q
%{_includedir}        %{_prefix}/include
* z3 `. U! M9 y# f5 I, p3 S( T%{_infodir}           /usr/share/info* w( W) X5 Z" ~
%{_mandir}            /usr/share/man& A! I% u+ B0 m. Q9 m
%{_localstatedir}     /var2 h# R) _5 N, P% j6 W9 _
%{_initddir}          %{_sysconfdir}/rc.d/init.d% v  V3 _$ F' D/ E; q
%{_var}               /var  N, j! c# ~. y
%{_tmppath}           %{_var}/tmp
9 Y5 B8 z+ `7 p- t%{_usr}               /usr
# I# z7 d2 P* K3 k) D%{_usrsrc}            %{_usr}/src& L; a) A3 X7 D& s+ N  Y
%{_lib}               lib (lib64 on 64bit multilib systems)
' K, k, m4 x* X" O%{_docdir}            %{_datadir}/doc. L. C) X( \4 b' g: T6 p8 U
%{buildroot}          %{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch}% k) V0 A- s/ I1 L0 r& Z
$RPM_BUILD_ROOT       %{buildroot}
1 u& z  |* S) K" ]- p% e" _要注意的是%{buildroot} 跟%{_buildrootdir}不同。%{_buildrootdir}对应的目录是~/rpmbuild/BUILDROOT;而%{buildroot}是%{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch},有关其他内容可以参考 https://fedoraproject.org/wiki/P ... PM_directory_macros# e: s' D2 y  l' K; ]2 |

$ N  W& K5 b9 _$ G& P5 o实例1:打包shell( O6 Q( L1 K4 @% d: N6 L' A& {
可以把一个平时写的一个脚本打包成一个rpm包,spec文件如下:
& ~  e8 ^0 D7 L! c  s2 y, x& }6 v+ b) i8 a( z
[root@localhost SPECS]# cat disk.spec
9 C7 k# b" m/ f% L3 G; yName:                showdiskinfo
  C. U( X5 S9 CVersion:        1.0
) K- M( |2 J$ zRelease:        1%{?dist}$ a' a% H" B9 H% B  S7 d2 h
Summary:        Show Raid and Disk info
5 S1 V& }: Q: v8 _4 YLicense:        GPL
; `5 O) v/ a4 n! C6 v1 uURL:                http://www.wumingx.cn
' n9 [( ^2 V: o- s/ @( T* u1 ISource0:        showdiskinfo.sh' e) q7 W) [& _# r- p6 M0 u/ X

7 v7 _, `3 T- s( Y#BuildRequires:: ]) O$ U4 y" J3 n2 D& n
Requires:       bash
2 @# s- H* ?' ~7 r/ W2 F" F% }# O2 x# v7 s9 L
%description
1 |: y& _7 R5 _; K7 p, yshowdiskinfo shell script.
! E" v! y0 U" ~* a* [/ X, {3 o! N9 ~0 F6 m
%prep
2 Z% L2 b" o; x% a: f#%setup -q4 S8 P; h6 a" T
  ^+ g- ^  k& m
%build
# l" V: w; t8 o& \8 E9 Jcp %_sourcedir/showdiskinfo.sh %_builddir/showdiskinfo
1 [# s# U% b2 [( g2 \
; n& C7 @6 C4 v4 \# K, S2 f- R%install
2 F2 k% j3 {; l; L% y/ m% ^mkdir -p %{buildroot}/usr/local/bin; n5 k& M7 [6 `! w: z0 t
install -m 755 showdiskinfo %{buildroot}/usr/local/bin' k, `+ O& o4 g/ o; j

' z2 Q5 q, K8 f' u9 ?# ^+ X%files& I1 y9 X: }8 r! ~2 |
/usr/local/bin/showdiskinfo
# F8 G- y4 \: O3 d%doc
/ z4 g7 F# P  p) d+ |  [%changelog
+ P! O( |2 l9 T% b5 P开始编译:
0 B/ T  A* W. h. I
) ~) o) T" D6 g. m& C% n[root@localhost SPECS]# rpmbuild -bb disk.spec
. |* b) N: `! m7 LExecuting(%prep): /bin/sh -e /var/tmp/rpm-tmp.agda2b
9 a: |1 e# P' E! a0 g* [" O+ umask 022
( k% d- j# k+ A4 D, L. n+ cd /root/rpmbuild/BUILD2 _5 ?1 |7 _9 K) J* z1 _
+ exit 0
8 C' [% x* D# S; [Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.spexQx! p. d% G) {! }! _* M) t
+ umask 022
0 q9 u. E; l6 p( d) _) j# h1 }6 w+ cd /root/rpmbuild/BUILD
, h$ R' A3 y) M2 \* T0 l+ cp /root/rpmbuild/SOURCES/showdiskinfo.sh /root/rpmbuild/BUILD/showdiskinfo/ C. q1 i! O- L! z* [1 {; I
+ exit 0
. P) Y, P7 @' Y3 X$ C* cExecuting(%install): /bin/sh -e /var/tmp/rpm-tmp.grcfHT
0 s4 ?4 A7 K. r3 ^6 T, A5 v+ umask 022
+ U" K4 G" b0 w" i' y4 X( F# ^+ cd /root/rpmbuild/BUILD5 i$ o5 @$ P. Q3 K3 f) H) {
+ '[' /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64 '!=' / ']'
: t2 G6 I) C8 D9 m2 h6 j0 k# {+ rm -rf /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_641 p' K2 p4 X) v+ O- ?
++ dirname /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64* d, A. h. O' I  h$ j# B7 w" L
+ mkdir -p /root/rpmbuild/BUILDROOT8 T& j2 U7 C) J4 g* F  a8 W  \
+ mkdir /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_645 u0 H/ E, ?( z3 z) C
+ mkdir -p /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64/usr/local/bin
$ s( |* Q1 ?) e# A; }; B$ \- p3 q. O+ install -m 755 showdiskinfo /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64/usr/local/bin) [% N! B$ d3 {3 a: P$ U  w
+ /usr/lib/rpm/check-buildroot' h2 E5 o% O3 a( T( v; m5 S
+ /usr/lib/rpm/redhat/brp-compress# j% y( h+ z: r
+ /usr/lib/rpm/redhat/brp-strip /usr/bin/strip" n7 j* b5 T) i. `/ ?: b' z+ \9 W
+ /usr/lib/rpm/redhat/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump
4 ^+ [4 k: b" H% O: G+ /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip
5 S. a" J9 Y# l# P0 h3 H+ /usr/lib/rpm/brp-python-bytecompile /usr/bin/python 1
6 ]5 n0 f8 n% t  d7 G2 q+ /usr/lib/rpm/redhat/brp-python-hardlink7 |- g' k% [1 r3 f
+ /usr/lib/rpm/redhat/brp-java-repack-jars! ~( F3 Q  I% T% P
Processing files: showdiskinfo-1.0-1.el7.x86_64/ f+ a$ K( R4 c$ v
Provides: showdiskinfo = 1.0-1.el7 showdiskinfo(x86-64) = 1.0-1.el7& h' e( F3 Z8 {
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
. i5 n# R( x1 \4 U% T$ IRequires: /bin/bash
' K( R' z3 i& z( {1 DChecking for unpackaged file(s): /usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64
/ u; x7 F. w% wWrote: /root/rpmbuild/RPMS/x86_64/showdiskinfo-1.0-1.el7.x86_64.rpm
' h2 P  S  I, C8 KExecuting(%clean): /bin/sh -e /var/tmp/rpm-tmp.4uHq3D
" g+ a8 O3 @. m+ umask 022
' y5 f/ r0 {0 u4 o0 Q, L0 O6 A3 I6 E+ cd /root/rpmbuild/BUILD
& N- Y8 g$ D/ I( I( g+ /usr/bin/rm -rf /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64
& W4 g* w% u, w3 T/ I/ L+ exit 0) C  B: a6 }' }
可以看到编译成功了,文件保存在Wrote: /root/rpmbuild/RPMS/x86_64/showdiskinfo-1.0-1.el7.x86_64.rpm下,开始查看:5 I, ?8 j4 {' j# f$ z& |  A
. M5 c4 Y- p4 P1 F
[root@localhost SPECS]# cd ../RPMS/x86_64/6 F, R) A0 Y/ t  u5 j9 U
[root@localhost x86_64]# rpm -qpi showdiskinfo-1.0-1.el7.x86_64.rpm
+ x* _% Y  u  u0 F% ]+ |: ^) IName        : showdiskinfo
6 o3 }) x! r5 |$ N$ u" A& U. IVersion     : 1.0
' ~7 J7 Z% i$ _9 g2 r. Q: i& uRelease     : 1.el7( C, z' y4 z0 q2 X. v& N! j
Architecture: x86_64
: }( h9 R, T$ ^Install Date: (not installed)4 Y% o( l9 y% k7 B0 ~1 K; r" l" T
Group       : Unspecified
* A4 v- ~9 ^2 W0 h1 `- F1 DSize        : 38390% X6 X; j2 x; ]/ ~9 ^2 P9 Z
License     : GPL5 L, Y0 ~- X6 b' }0 |2 I
Signature   : (none), e1 h. a9 k% z2 B5 q+ o
Source RPM  : showdiskinfo-1.0-1.el7.src.rpm3 q2 {5 \8 g- m
Build Date  : Fri 08 Mar 2019 06:41:42 PM EST% _5 z8 m6 i7 f  @
Build Host  : localhost9 t2 {8 K  o+ F" [
Relocations : (not relocatable)
5 K$ P& M  k* r4 o. F4 PURL         : http://www.wumingx.cn
+ ^0 A% i# G; J2 e1 B5 C' MSummary     : Show Raid and Disk info) b1 q6 ^- W, u/ n
Description :
& |# u6 Q" J5 }) \showdiskinfo shell script.
2 R! @1 N; D) R( N- Q[root@localhost x86_64]# rpm -qpl showdiskinfo-1.0-1.el7.x86_64.rpm
% {! r+ R3 g7 J7 {1 n( M/usr/local/bin/showdiskinfo
% f" @0 I% c$ j( j$ w4 F4 e#开始安装
) V4 I9 @, M5 h5 e[root@localhost x86_64]# rpm -ivh showdiskinfo-1.0-1.el7.x86_64.rpm
. w! e7 Y" L* uPreparing...                          ################################# [100%]9 Y$ r: x0 ^, M# L0 w, d: a
Updating / installing...
4 D) U! I, X* @. x' e; p( P   1:showdiskinfo-1.0-1.el7           ################################# [100%]
0 N3 _5 \- V" s[root@localhost x86_64]# ll /usr/local/bin/3 b6 m( D4 |) k
total 40
  K: ?# _! U  v-rwxr-xr-x. 1 root root 38390 Mar  8 18:41 showdiskinfo
9 `; e" s6 K2 ?2 O/ z) _: X) E[root@localhost x86_64]# showdiskinfo4 f& S5 S* X0 I5 m/ v% E0 d
no raid
) ]7 V& P7 k- U$ K, R- r+ J此内容参考了 https://rpm-packaging-guide.github.io/#hello-world ,可以阅读原版。' ^8 N' h1 a  w- A4 V% ]

- N0 o" X  B* `4 k% A实例2:打包main
8 e3 _+ M1 k. p" ]( Y. S0 F: n此代码来源鸟哥私房菜,先来处理原始码的部份:& ?& ~& }3 c7 S( `
# F" i8 d3 ]1 f' p- V$ e
[root@study ~]# cd /root/rpmbuild/SOURCES 8 a  b+ ~( P* b) r
[root@study SOURCES]# wget http://linux.vbird.org/linux_basic/0520source/main-0.1.tgz 2 e# x4 n% ?, K, e" w  z3 N
[root@study SOURCES]# wget http ://linux.vbird.org/linux_basic/0520source/main_0.1_to_0.2.patch
0 }6 P% S) f! M; z! [$ A, |9 U[root@study SOURCES]# ll main*
- Q* D$ y) H+ j2 A; Z-rw-r--r--. 1 root root 703 Sep 4 14:47 main-0.1.tgz
/ O' H3 ^1 a& S, ~7 }( h-rw-r--r--. 1 root root 1538 Sep 4 14:51 main_0.1_to_0.2.patch6 ]/ z* B4 v1 T6 }( F0 C& O7 ?: a
到SPECS目录下创建main.spec文件,建议使用vim创建,会自动生成格式。也可以用rpmdev-newspec -o Name-version.spec命令来生成SPEC文件的模板
% K- u% B; D+ y) O- u
) c  t& N& z. g  F) }2 J[root@localhost SPECS]# cat main.spec
5 p1 u- o8 i$ l% P/ n% o* ]) KName:                main
4 j) H7 f  ~; r9 L! c; fVersion:        0.1. b! n3 ~) J  I4 K0 E7 J% p6 y# [2 f
Release:        1%{?dist}
+ R; z' n) w, b8 eSummary:        Shows sin and cos value
- l; u* h8 ]3 p( L3 s* y, Z6 d
6 s8 o  e6 r% b" O* OGroup:                Scientific Support
7 V( s, }' G, ~: C0 d- Z" P: d7 hLicense:        GPLv2
! E0 g: f( S6 `6 n2 n) qURL:                http://www.fangdm.com/
" R7 Q) u& o" ^: l" r. mSource0:        main-0.1.tgz
2 e8 c( p; N+ B! i# OPatch0:                main_0.1_to_0.2.patch
/ X9 K, _6 t/ p: C4 m8 v# r2 p4 c9 {3 h$ }
#BuildRequires:/ U/ X& B# F4 B9 b4 U, ]
#Requires:
7 b$ p3 f' j( s# {( Q. d/ j1 H7 |) G3 O. d) H, k! O; s3 z
%description
& c; {/ j1 N0 G2 B; O$ \0 EThis package will let you input your name and calculate sin cos value.
1 L4 w3 p+ ^, j
7 ]+ D' G( W/ Q, \- @, W( v) S%prep
/ }2 J( Y& _' E7 z4 Q! N' w%setup -q
- `0 E+ ^! H  n, s* S%patch0 -p1
) w0 y( |. B" a6 e* d7 B5 _9 a7 D1 Z9 t( d) S& w
%build
( e/ @, a3 f0 j1 c7 V$ rmake clean main* x/ P# C  B; A7 |0 x/ C6 {, ~( R

8 G( H, B. g9 ~+ J0 @8 T%install
9 T0 z1 u: w1 r0 z) n! q- Imkdir -p %{buildroot}/usr/local/bin7 `* Y4 E( l: P
install -m 755 main %{buildroot}/usr/local/bin
1 b& C$ C  e# s4 z6 f2 ?6 k
/ e0 F* l6 A3 c+ c%files) h! h& r) I) ~% ?3 ]- n! C9 V
/usr/local/bin/main" h' q4 L  L% k: K& R% ~
%doc
6 B% i! D9 t8 ^% z1 u8 {0 }# d
%changelog5 b9 r  ?# ]2 M
* Wed Sep 09 2015 VBird Tsai <vbird@mail.vbird.idv.tw> 0.2
/ X9 E9 Z3 R  A- U' D- build the program
: m% M3 W  k8 u* y, K9 s然后就直接编译rpmbuild -ba main.spec,再安装rpm -ivh main-0.1-1.el7.x86_64.rpm
: {$ l) V$ g' e0 W) u' K, \. X) W+ p9 [# X) O7 ?1 s! S
[root@localhost x86_64]# rpm -qi main
- f+ L/ S0 \- S( z$ V- I3 Z* r5 qName        : main. q4 w" W5 m/ w; S. l6 H5 ?
Version     : 0.1" ^# y- u0 c! N! W6 M/ n5 V  h& S1 p
Release     : 1.el7
) Z' G+ Z( Q7 N! T5 A) ~Architecture: x86_64; d; J  l6 f: \& f7 X
Install Date: Thu 07 Mar 2019 05:42:50 PM EST
( r/ ~4 |( U) F1 p4 n% s, O; pGroup       : Scientific Support: d4 `6 b7 _, C% y
Size        : 7272
" i8 F4 n% K9 K9 tLicense     : GPLv2
) ^" q+ M! T2 \Signature   : (none)
7 W4 k# Z# q9 }4 O- G# D/ hSource RPM  : main-0.1-1.el7.src.rpm
1 X7 }! R6 p7 PBuild Date  : Thu 07 Mar 2019 05:42:07 PM EST. R# _6 G: ~3 x8 _5 P
Build Host  : localhost* ?9 ^$ p& ]" C* g
Relocations : (not relocatable)
0 U# N0 G3 u7 `/ N' E( F# `URL         : http://www.fangdm.com/, B9 ^" F( p- w. h
Summary     : Shows sin and cos value2 d0 H: Z1 F. S3 l' Y- P5 L' c5 n
Description :
; Q6 h/ r( @! q0 a% Q8 @% g! HThis package will let you input your name and calculate sin cos value.
6 ]. I7 L# S; z% ?实例3:打包hello: C6 A2 Z5 |' ?5 {5 f! p% E) A
使用区域语言(Locale)文件的程序应遵循 处理 i18n 文件的建议方法:
$ \7 b3 J; u# x5 o
/ b- ]2 l: w; ?# Y/ ]在 %install 步骤中找出文件名: %find_lang ${name}5 `, O4 a# P4 U
添加必要的编译依赖: BuildRequires: gettext5 ^1 e# \% y# p
使用找到的文件名: %files -f ${name}.lang
0 J& ~8 o1 B5 D/ f: L& y%find_lang此宏将找到属于您的包的所有语言环境文件(按名称),并将此列表放在一个文件中。然后,您可以使用该文件包含所有语言环境。
/ N5 h4 w5 I0 w3 e) ?7 I2 a+ w3 ^3 Y$ t, z$ m) c: X( @1 c
[root@localhost SPECS]# rpm --eval %find_lang3 o8 H$ s6 W6 n% B# x& Y  b
/usr/lib/rpm/find-lang.sh /root/rpmbuild/BUILDROOT/%{name}-%{version}-%{release}.x86_64
& f/ w4 M4 z# v2 D; h[root@localhost SPECS]# rpm --eval %make_install
+ H# `0 G) U  C$ _/usr/bin/make install DESTDIR=/root/rpmbuild/BUILDROOT/%{name}-%{version}-%{release}.x86_64
# C% C; e1 X! h- n%find_lang %{name}在这个spec里面等价于/usr/lib/rpm/find-lang.sh /root/rpmbuild/BUILDROOT/hello-2.10-1.el7.x86_64 hello8 }: |2 q  o1 k: Q
9 n! d- `6 _. V. H& N
而引用的方法是:%files -f %{name}.lang即可。
8 U' K; z% M1 m- R, D" `1 Y6 S3 _' k: ^/ S! j  B: t( a
%make_install是等价于make install DESTDIR=%{buildroot}。7 g+ O  y, \, V" E7 I" q! ]
, o: z  Q: z! A0 U8 M
[root@localhost SPECS]# cat hello.spec' P: e4 t: \$ D& G
Name:           hello
' c! `" i/ l0 z7 ]9 GVersion:        2.10
- _, P( t! h% b+ r* i* b4 z: XRelease:        1%{?dist}
; e# M; R  g% S+ YSummary:        The "Hello World" program from GNU2 r. y4 A# W: b8 W/ w

( f1 _& w: U; ZLicense:        GPLv3/ t0 j( h+ c8 w: k
URL:            http://ftp.gnu.org/gnu/hello/4 F/ C' C- f. P4 l
Source0:        hello-2.10.tar.gz2 P: X5 y0 p- ]& @! [' G: T3 q: X
4 [' D5 {' s5 b+ c$ e' O- @9 [: w
BuildRequires: gettext
$ F" R( F  \7 F& {; N1 c#Requires:
( {" H8 j1 T# L' z3 H
' K1 L, _& q1 m5 ]3 n7 s% b%description
! K8 h" M" i5 `$ ~9 cThe "Hello World" program, done with all bells and whistles of a proper FOSS$ \. c* A: Q2 k- W' ]
project, including configuration, build, internationalization, help files, etc.
3 |- s' @: y, N8 y  P( [
0 T( r3 v  k; M  _+ N. j%prep
2 E# C) r' L0 k- i  j8 s%setup -q
( I* _) P; T+ I2 P( ?& v
1 w3 X9 R$ z+ l1 g* g, c+ [3 K0 J' z9 j7 _2 P
%build
) `, c+ y/ m. {1 u1 K  d%configure
, X7 F2 v% i: S' h9 hmake %{?_smp_mflags}
/ m/ \' |6 W) _# N+ E. v; W$ D& U8 [3 \, F( D: m( W  t
%install8 k: W1 \% ~% g+ ?3 F+ ?
%make_install
+ L, A: J% N$ N# E7 x%find_lang %{name}3 f% m6 U) h4 o5 m5 O+ s! i& G
rm -f %{buildroot}/%{_infodir}/dir
$ a$ |# D: V6 @7 Y4 O; e5 n( t# H& G; I: `
%post+ S; ?* s1 m- _) v
/sbin/install-info %{_infodir}/%{name}.info %{_infodir}/dir || :
/ m" h: A% D. R' {- D- W0 z( J- D% c& e) a0 `! x: [
%preun
& ]  l4 w- V5 q) `. q8 iif [ $1 = 0 ] ; then+ u" B8 f: r- S# \2 j4 H
/sbin/install-info --delete %{_infodir}/%{name}.info %{_infodir}/dir || :
+ e5 h3 l- R! G# j7 d3 Q! @, F" rfi) t2 N7 h8 l' f) K6 |
! W# F  |) E. \  L
%files -f %{name}.lang
. J" f& j3 f; |6 q%{_bindir}/%{name}& X, P5 M, I% |0 e  m; k

) }$ O% n' k  ~: @3 t%doc+ e$ M! |' o: v; n
%{_infodir}/%{name}.info.*
8 ~8 W: v- t- G%{_mandir}/man1/%{name}.1.*
+ i  I9 q% H2 U# W7 S& H
. A# d: o2 B8 l1 u8 Y7 @3 L%changelog0 u; \8 l/ e) [0 n
然后直接rpmbuild -bb hello.spec进行编译,此实例来源于:https://fedoraproject.org/wiki/H ... o_RPM_package/zh-cn
' h2 w' N/ u% V# }
4 Q# s5 a1 ?! u实例4:打包smartmontools
% h0 F. m/ Z! [0 l, M# gsmartmontools 7.0已经支持json格式的输出,对于采集的话,有很大的优势。目前在centos官方上面可以找到centos7的包,如https://cbs.centos.org/koji/buildinfo?buildID=25069,但是还没有centos6的,所以需要自己写一个spec。& }% g' \- Q% V& H$ g1 `: [

8 {9 p5 b" y$ a5 S1 n% c/ w访问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文件了。: D' e4 ]" h4 w5 K  I+ v
2 y1 L* O+ p. i  _" x( g# S1 P
[root@7ftbv7mdz7cdpc ~]# cat smartmontools.spec3 b4 m4 M. B' I: o: H( |
Summary:        Tools for monitoring SMART capable hard disks) G" b$ T3 E- G
Name:                smartmontools
( ?' `6 [2 y4 \; C8 b1 E7 W% qVersion:        7.0
, j" }% c, `0 u7 L/ I6 JRelease:        3%{?dist}- D, k' y6 v' W* a/ Y
Epoch:                1
# i' \% g+ H$ oLicense:        GPLv2+8 E9 W# J4 N& u0 P, ^
URL:                http://smartmontools.sourceforge.net/3 ]8 ^& ~( p4 O# H+ Z; T
#Source0:   http://downloads.sourceforge.net/%{name}/%{name}-%{version}.tar.gz8 J6 E; ~- M9 O, k4 P! Z# S4 J
Source0:        %{name}-%{version}.tar.gz
" ^9 g- X% G9 K9 T! R, n+ rSource1:        smartd.initd! @7 p2 I' o: `" f+ W& I- I
Source2:        smartmontools.sysconf5 w2 N( o( ^' @* H% S& l% E
Source4:        smartdnotify- Y* F7 S  j( k- z4 y
#semi-automatic update of drivedb.h/ D% s; H# b7 e# u2 [' }: f; E9 h
%global                UrlSource5        https://sourceforge.net/p/smartm ... rivedb.h?format=raw* n1 A7 K* C* y% U/ S, M( g% T
Source5:        drivedb.h+ N! n  `1 E: u" A2 ?

% ^+ I6 k* f2 \#fedora/rhel specific- m% f" c) d1 U" B  ?  {0 d2 }
Patch1:                smartmontools-5.38-defaultconf.patch: Q" M+ L: G! ~2 F
: n# ~$ c' O9 B4 f: s
#BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)9 |# l$ S5 M; g. Y
Requires:        fileutils chkconfig initscripts
4 [; l1 F6 ]8 a' s7 U1 qBuildRequires:        readline-devel ncurses-devel automake util-linux groff gettext6 Y: b2 s& E, w/ R0 @8 M
BuildRequires:        libselinux-devel libcap-ng-devel
/ y: Z6 u( _0 d3 _* E
1 \  p+ P8 H% K' k* U. b8 `6 F+ e%description# O1 e, s: M( M: z3 A0 G
The smartmontools package contains two utility programs (smartctl
. k! {! l  ]3 T% c  kand smartd) to control and monitor storage systems using the Self-& y/ m3 B0 H3 h- T- R. i
Monitoring, Analysis and Reporting Technology System (SMART) built! Y$ F8 o$ V* H" r4 G
into most modern ATA and SCSI hard disks. In many cases, these* ?+ z  W' K6 Y! l
utilities will provide advanced warning of disk degradation and
- W7 k' s  N# a0 _' c& Q7 c, J6 [failure.
5 y2 Q. H  Q% v1 F7 s6 t1 y. c! J! M: |/ S6 Y1 ~5 W4 W
%prep* o5 B% D3 T# T
%setup -q
' Q1 y$ T; Q/ r/ D$ ]% N%patch1 -p1 -b .defaultconf8 T$ I2 W8 Y* C" G# g( R  }

2 g3 c% T/ D  }3 k% y# update SOURCE5 on maintainer's machine prior commiting, there's no internet connection on builders
! d0 K% O' M- z  k' \3 ]! w- M#curl %{UrlSource5} -o %{SOURCE5} ||:
, S8 Y5 L, M% i7 N6 d: ocp %{SOURCE5} .
* c2 O* [7 h: }% B* Z1 u
. t; V) Q8 s. e9 C. p  s%build% V3 z) p1 t8 q( |7 {. }
autoreconf -i
7 o& N2 f) M, M, R( U  S, f+ i' _%configure --with-selinux --with-libcap-ng=yes --with-systemdsystemunitdir=no --with-cxx11-option=no% C1 ~: i  a+ }8 [0 }1 p+ x' d, k" H
%ifarch sparc643 w4 n4 ~- J' B
make CXXFLAGS="$RPM_OPT_FLAGS -fPIE -fno-strict-aliasing" LDFLAGS="-pie -Wl,-z,relro,-z,now"
0 W- z5 D* f2 b7 m4 p0 m8 h%else+ D# C/ ]1 U( h
make CXXFLAGS="$RPM_OPT_FLAGS -fpie -fno-strict-aliasing" LDFLAGS="-pie -Wl,-z,relro,-z,now"
8 J! `9 m/ [9 Q. x" P" X%endif
( i7 o5 g; B" f8 L" p3 m* r' L4 I: g
%install
; e" e' m; {* e. }+ ~  s. arm -rf $RPM_BUILD_ROOT
/ @* g* y  U4 a$ \7 emake DESTDIR=$RPM_BUILD_ROOT install: h' y# N5 I9 K, q$ A6 v6 ~& D/ ~/ k
, i4 F1 f6 H# Q% _) J5 }& ]
rm -f examplescripts/Makefile*
3 w. s' F2 ?3 Z# E' `# Lchmod a-x -R examplescripts/*( |6 w! T  I' b$ N  B) v8 h
mkdir -p $RPM_BUILD_ROOT/%{_sysconfdir}/%{name}/smartd_warning.d
& R+ q; s, `6 k" Binstall -D -p -m 755 %{SOURCE1} $RPM_BUILD_ROOT%{_sysconfdir}/rc.d/init.d/smartd
% X  \( H, ]0 f: _: W- [install -D -p -m 644 %{SOURCE2} $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/smartmontools  r  u# D: j, W/ C, r  B9 y
install -D -p -m 755 %{SOURCE4} $RPM_BUILD_ROOT%{_sysconfdir}/%{name}/smartd_warning.d/smartdnotify4 l8 I- a% m9 j! ~) F
rm -rf $RPM_BUILD_ROOT%{_docdir}/%{name}3 [4 @, t9 n- j; w! D( ~- X
mkdir -p $RPM_BUILD_ROOT%{_sharedstatedir}/%{name}$ w" ?8 \3 v- e* Y
+ V- X% a" E! [8 j
%clean
) e7 R' s0 ~  v' s' erm -rf $RPM_BUILD_ROOT
% F- p' p- t  y
8 L- c6 p% Z. o2 O' P! H%preun
- J& p( q9 s- K% `if [ "$1" = "0" ] ; then
0 Z5 N, f& n. |# N. _ /sbin/service smartd stop >/dev/null 2>&1) a# |+ B+ p+ [& A( z/ o
/sbin/chkconfig --del smartd5 C" q+ E. a0 I5 S: S5 i
fi# N; V; I% V" _/ {5 j/ V6 a0 P

& d- {2 h' Z( U0 c%post
, y" ?3 r0 z  c( E/sbin/chkconfig --add smartd; n2 E, ^6 Y$ w' j

" m$ y) @  z/ C  I: G" C2 n! t
$ w. b# R9 B" s# o7 _%files
4 [7 J) J7 O; w% z" F+ l% s+ M%defattr(-,root,root,-)
- g& v. @7 p" f2 \$ ^%doc AUTHORS ChangeLog COPYING INSTALL NEWS README
8 B4 g' c+ U2 K8 u% Z; N. n' C%doc TODO examplescripts smartd.conf
. g1 f! n% [3 J3 D%{_sbindir}/smartd
, ]/ J: ?& G4 I3 T( M* a%{_sbindir}/update-smart-drivedb6 ^! ?7 U# ]3 E4 o! S8 E0 Z8 r
%{_sbindir}/smartctl
- L% a" L4 [9 \" B6 i%{_initddir}/smartd
# f( T! ]" _( N; w8 G%{_mandir}/man?/smart*.*  `' M7 B% h9 B
%{_mandir}/man?/update-smart*.*6 [" ^1 m: K# _0 q" m3 a" B
%{_datadir}/%{name}
+ h9 b7 b( R, V4 U%{_sharedstatedir}/%{name}
  R9 x" T( G! u' X# [%dir %{_sysconfdir}/%name
+ ^3 f! A; i- C- a" F%dir %{_sysconfdir}/%name/smartd_warning.d& J, b: Z, x# H4 Z4 l
%config(noreplace) %{_sysconfdir}/smartd.conf5 t! l4 Y( M8 v7 i$ g% w6 b8 \  \
%config(noreplace) %{_sysconfdir}/smartd_warning.sh
+ k& r6 \4 \8 S# ~6 f* T! F%config(noreplace) %{_sysconfdir}/%{name}/smartd_warning.d/smartdnotify! L, a$ ~  e) f+ N
%config(noreplace) %{_sysconfdir}/sysconfig/smartmontools
( Q, E* y* O0 c) v" Q
$ I1 H: X  J; y0 y) r3 R0 o5 O' w%changelog
9 r- O3 Z1 {% n3 d$ X* Thu Sep 26 2019 fangdm <8@8994.cn> - 1:7.0-3
/ A9 E$ ]9 n: F( ]$ H) G9 j- ]- create smartmontools 7.0 base on centos 6
8 E3 M% N5 B$ [注意,Source这几个文件一定要存在,从上可以得知,加入了启动脚本、配置文件等,准备好了之后就可以使用rpmbuild -bb smartmontools.spec来编译,经过多次失败后,根据报错信息进行调整之后,终于编译成功了。
* T  }, B+ r; i
$ `( _. C+ a! E. W8 V  P[root@7ftbv7mdz7cdpc SPECS]# rpm -qp --changelog /root/rpmbuild/RPMS/x86_64/smartmontools-7.0-3.el6.x86_64.rpm
8 ~- X  X4 v5 v& ?& [* Thu Sep 26 2019 fangdm <8@8994.cn> - 1:7.0-3
' u6 S# M1 X* F7 \7 s- create smartmontools 7.0 base on centos 69 E3 \# f3 S; T% ?! u+ V/ X
# P& @( {7 W4 l( i3 E1 i: t* r  ^
[root@7ftbv7mdz7cdpc SPECS]# rpm -qpi /root/rpmbuild/RPMS/x86_64/smartmontools-7.0-3.el6.x86_64.rpm
- s8 c$ o7 |7 Y) m! z. P: vName        : smartmontools                Relocations: (not relocatable)
( M, j6 _2 i1 X' l  H6 l" ?Version     : 7.0                               Vendor: (none)
0 y: v/ y) k. d) b! {( {4 DRelease     : 3.el6                         Build Date: Thu 26 Sep 2019 10:53:19 PM CST
3 \0 E. Q8 p- G. i' @6 p6 {Install Date: (not installed)               Build Host: 7ftbv7mdz7cdpc) Z# |9 J! A4 o5 s
Group       : System Environment/Base       Source RPM: smartmontools-7.0-3.el6.src.rpm
1 z$ {2 R: P! n- x/ ^# l' z0 [  u/ F3 BSize        : 2081911                          License: GPLv2+5 c8 v" `) e6 ]* {
Signature   : (none)
8 j+ W  X. u+ f1 C- U. f0 O! QURL         : http://smartmontools.sourceforge.net/
: ^6 I# w9 C, m; _Summary     : Tools for monitoring SMART capable hard disks
* Z# s' C% t) G1 a1 g7 `Description :
# f, x' ]' \8 |' DThe smartmontools package contains two utility programs (smartctl
5 b3 h! s$ B2 v1 |! J; jand smartd) to control and monitor storage systems using the Self-
) N/ g  o: c8 _# y/ v/ ]; K0 ~8 DMonitoring, Analysis and Reporting Technology System (SMART) built- _4 n9 b1 Z/ y1 e$ h
into most modern ATA and SCSI hard disks. In many cases, these
7 r& I/ n8 ]) ~) k- _! Y7 u9 putilities will provide advanced warning of disk degradation and2 \1 h% s* z  d
failure.+ H1 j, N; y* E& B
另外,在%preun阶段有使用了if [ "$1" = "0" ],表示的意思是uninstall,如下图:% g: h' G6 _7 N5 w5 X" U" P

) G8 N! `+ Z" I+ l  ]- B8 K+ k  T! A0 J# ?4 _2 ~3 O+ Q2 w$ ]

- J5 N6 A+ r  v+ k实例5:打包nginx( U7 `, _% V0 N! H: v7 M0 u0 G
用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进行安装。有生成了如下内容:
/ U, ?2 T* V3 ~1 W' G+ u, f7 u1 P
( F3 E8 ]  V+ x  M: t$ K: j[root@localhost rpmbuild]# tree! T& A- t  U, n
.
6 P# ^1 T  ?! ~2 Q8 H' ||-- BUILD! |- l% W& G7 [+ ?5 h
|-- BUILDROOT4 A# t( E$ c7 C2 S7 m; I
|-- RPMS8 t( g' N5 b  T2 r  J; V% T7 N3 ^% }
|-- SOURCES
8 K& }1 b6 l. x  y6 P1 ||   |-- COPYRIGHT* ~& u  ]0 q/ O2 p" P" v7 T
|   |-- logrotate
8 a. G0 R/ `6 G3 \! _$ [|   |-- nginx-1.16.1.tar.gz3 @8 i+ k: W8 m- Q3 e: D
|   |-- nginx-debug.service
0 k) ~, g! ^' _/ r! \* Z" s6 g|   |-- nginx-debug.sysconf
5 _2 s! Z- ^0 \9 h7 ^|   |-- nginx.check-reload.sh! t. s- q0 Q4 F6 t4 n1 a9 S$ m
|   |-- nginx.conf: n' n: x7 I6 `% @6 U, J5 @1 X/ ]! H2 k
|   |-- nginx.init.in
3 S+ T) Q3 J6 S6 q|   |-- nginx.service: K5 ?# T" C* y; f
|   |-- nginx.suse.logrotate6 Z% z* P2 s1 m: r" ]# V- c& ?* k
|   |-- nginx.sysconf& M  G. Q: o( o0 ?  p. E
|   |-- nginx.upgrade.sh
, y" c$ n9 b1 i0 A$ @# s3 Y0 T|   `-- nginx.vh.default.conf/ U' l; A/ x7 r4 z4 D" M
|-- SPECS
% y2 f- o/ y4 I4 B& d& i- G0 U|   `-- nginx.spec3 P3 m& `" X8 I$ E0 b
`-- SRPMS8 Z3 \' ~3 e/ n; D7 @+ \
主要是SPECS以及SOURCES这些文件。查看nginx.spec之后,大部分都有写好了,并且都兼容了centos 6/7。添加了gperftools GeoIP-devel ngx_cache_purge nginx-http-concat这四个模块,修改如下:  x. O9 x/ \) {9 i

( m/ p( \& P8 ~" U1 q[root@localhost SPECS]# cat nginx.spec
$ Y% {1 x& |% n  p; o#/ n5 J3 A2 S' y- H: n1 k
%define nginx_home %{_localstatedir}/cache/nginx
+ l( T5 e$ Q3 K: g%define nginx_user nginx! \4 Q5 ^4 a! M" f+ f. B
%define nginx_group nginx3 V4 g7 [1 z$ ]0 g5 y9 N( P
%define nginx_loggroup adm/ n9 O, Q7 F. x$ j1 c4 L

1 U: n9 e9 P0 z' Z# Q. i- g4 H# distribution specific definitions
9 o4 B) \3 r' P1 J! q( b8 ?$ h0 ^3 j" f%define use_systemd (0%{?rhel} >= 7 || 0%{?fedora} >= 19 || 0%{?suse_version} >= 1315 || 0%{?amzn} >= 2)
7 M7 J) K8 c' D& @6 B6 f
% v: k5 K" X, g5 Q$ ]* }%if %{use_systemd}) E% V4 F% @4 z: [  q
BuildRequires: systemd% W/ F* y# ?4 @8 L( X% f
Requires(post): systemd# o9 J$ a/ r% W
Requires(preun): systemd
; r9 l$ A* H/ HRequires(postun): systemd" J0 p& D' h1 \5 Z' \) R
%endif  t; z- \% K6 f3 X: k4 L5 s' o
; ?* v" S  O# e
%if 0%{?rhel}. h' x8 y' B# w
%define _group System Environment/Daemons" M8 U4 k6 x1 B+ L' ^' e
%endif, S+ D1 j+ Y8 g' a& J

9 w7 L- s1 E9 W( z: {%if 0%{?rhel} == 6
* D: \4 \0 N7 U. Q% G5 u) L/ F, rRequires(pre): shadow-utils
' U: o! R, ?8 p2 G: VRequires: initscripts >= 8.36, @. x* k) g% d. x# b+ m
Requires(post): chkconfig4 J, Y2 K0 I. \' B
Requires: openssl >= 1.0.1
3 T: W5 l' q6 {& T8 v! KBuildRequires: openssl-devel >= 1.0.1
4 u) S( ]4 f! d4 z$ B%endif
. y4 `7 U5 X* \0 u0 m$ L6 i
8 N6 c+ I9 U7 {6 a, g%if 0%{?rhel} == 7% w9 Q& A  S7 q
%define epoch 1
1 j# W: s, p' M2 q+ MEpoch: %{epoch}; K% w7 }( F* g' I3 {2 z' o
Requires(pre): shadow-utils gperftools GeoIP-devel- q) a1 W' Q) Q1 ?! {- v  J
Requires: openssl >= 1.0.29 B$ M( r6 p4 \$ Z& p
BuildRequires: openssl-devel >= 1.0.25 t' `/ [" A' R2 m- y* t- {
BuildRequires: GeoIP-devel gperftools8 [6 K$ |  m* J1 b
%define dist .el7
: R% T, P+ m( j. k: A/ a9 Z! X%endif/ N' b% m9 ]& }8 n/ H
5 H& V/ y  O9 C  _" @3 t  u4 U4 B; F
%if 0%{?rhel} == 8
% r- V; p8 b" b* ~$ R/ A* k%define epoch 13 n. e3 ?- i6 f9 W$ Y
Epoch: %{epoch}
7 g5 N* p" m0 K  s1 R+ KRequires(pre): shadow-utils4 ?9 D" b* d- v6 T7 V3 r
BuildRequires: openssl-devel >= 1.1.1
. X& |2 x* T+ n, U4 |9 Q- [%define _debugsource_template %{nil}9 a1 c/ o3 u; Y  P
%endif
$ k* v1 y+ w% w4 Y8 a9 ~3 l
  ]0 c4 F2 u4 Q+ Q  p) S/ m%if 0%{?suse_version} >= 1315: e% R- i' q( n8 [: T
%define _group Productivity/Networking/Web/Servers" i# \" f: w1 @5 a; q# S5 b
%define nginx_loggroup trusted9 E* F* D; m; S5 @" S9 T, r# E
Requires(pre): shadow
" ~1 Y6 d% p7 `* `' V; }/ B" PBuildRequires: libopenssl-devel
6 l  }! L4 a1 O2 I: A2 n! I: `%define _debugsource_template %{nil}
; w) ]. K# s6 }% ^& n%endif
1 n, W7 i. i* ^% S
9 f% s' S. k' C9 y. p: T0 e# end of distribution specific definitions
/ d3 S, Y8 I1 g$ @1 V7 Y$ w5 {' a# B) ]9 x
%define main_version 1.16.19 ^+ z+ s& u& b' q" X* w5 `
%define main_release 1%{?dist}.ngx
& c- c0 _7 J, ]  i
% t0 B9 H. k8 C$ ~6 p4 j, H, s%define bdir %{_builddir}/%{name}-%{main_version}. p, F% A' I! ^6 h! n
. _! d# {* U) @
%define WITH_CC_OPT $(echo %{optflags} $(pcre-config --cflags)) -fPIC
+ g' S. L0 `2 Z0 {9 `+ M%define WITH_LD_OPT -Wl,-z,relro -Wl,-z,now -pie
/ `. a2 k. P: T0 e6 w+ m5 H& |: _* D
%define BASE_CONFIGURE_ARGS $(echo "--prefix=%{_sysconfdir}/nginx --sbin-path=%{_sbindir}/nginx --modules-path=%{_libdir}/nginx/modules --conf-path=%{_sysconfdir}/nginx/nginx.conf --error-log-path=%{_localstatedir}/log/nginx/error.log --http-log-path=%{_localstatedir}/log/nginx/access.log --pid-path=%{_localstatedir}/run/nginx.pid --lock-path=%{_localstatedir}/run/nginx.lock --http-client-body-temp-path=%{_localstatedir}/cache/nginx/client_temp --http-proxy-temp-path=%{_localstatedir}/cache/nginx/proxy_temp --http-fastcgi-temp-path=%{_localstatedir}/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=%{_localstatedir}/cache/nginx/uwsgi_temp --http-scgi-temp-path=%{_localstatedir}/cache/nginx/scgi_temp --user=%{nginx_user} --group=%{nginx_group} --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module")
2 }) h# I  r; g: A
. U: B' X5 G% USummary: High performance web server1 q4 J1 Y# \6 W+ @0 \) Y  g2 k  ^
Name: nginx* _9 ~1 o3 Q5 l5 K2 ?' n: X+ @
Version: %{main_version}
4 _! P! S* C1 W/ xRelease: %{main_release}1 B# _  G; S4 ]/ W1 d; H
Vendor: Nginx, Inc.
4 Y( t3 `2 M4 `& ~+ T/ K# tURL: http://nginx.org/
) q4 u1 k6 |* w# W9 i2 {Group: %{_group}; }7 Q- ?4 v, F

3 L2 P) E8 D5 w# {- tSource0: http://nginx.org/download/%{name}-%{version}.tar.gz' }6 g) N' d' ~! K% d
Source1: logrotate
- K% h# p! P1 b9 d% U' O# @Source2: nginx.init.in
0 Z1 C4 Y( N/ _- l2 q4 mSource3: nginx.sysconf
9 C4 U. q3 R' u0 e/ lSource4: nginx.conf2 X! Q( Q% q: l% F/ q
Source5: nginx.vh.default.conf+ S/ Z8 O9 F( y3 r& y  W4 S% y
Source7: nginx-debug.sysconf  I8 M5 T! J) X- P5 }
Source8: nginx.service
# y; _! J; Q, h0 C: m% ]Source9: nginx.upgrade.sh- ]# S3 }+ K; m& n* z  U
Source10: nginx.suse.logrotate
, b3 x7 f7 |9 @' W& X2 TSource11: nginx-debug.service* k4 f0 T8 w: }# f9 Y
Source12: COPYRIGHT
9 T% q8 T3 V, L9 G) CSource13: nginx.check-reload.sh/ L% T5 k+ ^; H( |* o& ?+ k
Source14: nginx-http-concat.tar.gz2 f& C9 r! e  H7 z
Source15: ngx_cache_purge.tar.gz
0 w! e  C9 e0 P- W
- l0 z6 S# W" c" }) `5 rLicense: 2-clause BSD-like license
- A+ w/ y8 ?+ @) z# O! E8 Z
, ?2 ?+ G2 l8 s& K( }BuildRoot: %{_tmppath}/%{name}-%{main_version}-%{main_release}-root
, ]1 T6 w6 [( [. y  F9 I  I9 yBuildRequires: zlib-devel
  `0 U, e* w) i6 JBuildRequires: pcre-devel
/ E/ \9 P( r8 l  Z# C6 X- F/ {1 D
Provides: webserver
7 j7 \6 `; v( W: Q9 L
$ |" {/ n. h; ?) N, K7 `%description
  i: x) z! N; w% u: }1 s" L9 W$ W% [nginx [engine x] is an HTTP and reverse proxy server, as well as2 V1 G, v2 A5 i& T
a mail proxy server.
$ V  w) g) Y& ^. ]# N* P
: ?) Q. C5 Q" |4 c%if 0%{?suse_version} >= 13157 w0 M" }% C9 Y
%debug_package, O0 E) ?2 w# V
%endif7 }; J, v6 C5 z+ s2 j( @( o
3 w' E* y$ \* G8 B1 S
%prep
% ^2 S6 v& A/ _" d! s( g9 k3 w%setup+ F% |. m$ z: d$ c
%setup -T -D -a 14
5 T5 E4 [/ ]9 }6 L; T%setup -T -D -a 15
1 v5 B' a  `  p1 D. u) \! Ycp %{SOURCE2} .
3 K, e+ f$ {* a. z  d+ f% x3 K& F. I9 I8 ?sed -e 's|%%DEFAULTSTART%%|2 3 4 5|g' -e 's|%%DEFAULTSTOP%%|0 1 6|g' \
* q* t$ P' P- r- e# ]    -e 's|%%PROVIDES%%|nginx|g' < %{SOURCE2} > nginx.init- ?' j0 f' J) g* s6 E1 D/ K
sed -e 's|%%DEFAULTSTART%%||g' -e 's|%%DEFAULTSTOP%%|0 1 2 3 4 5 6|g' \
, v9 D4 F" F* X$ @5 H* u* X% |    -e 's|%%PROVIDES%%|nginx-debug|g' < %{SOURCE2} > nginx-debug.init# ?, W: s* F9 C
) h2 l5 T% v4 L  d- m, c/ r
%build
$ T, Y: N7 @, f0 X0 L./configure %{BASE_CONFIGURE_ARGS} \
+ s1 K" {. \, ]0 M, h, o6 z    --with-cc-opt="%{WITH_CC_OPT}" \' z- P2 M! J, q2 I
    --with-ld-opt="%{WITH_LD_OPT}" \" h$ t) u, i- T  a4 U. Q+ e
    --with-debug \
" g& O* H) }6 g5 S7 |* e- v        --with-google_perftools_module \& u1 b$ e8 I1 |0 s6 p, X& J
        --add-module=ngx_cache_purge \
# t. s; B( H  l4 h        --add-module=nginx-http-concat \/ Z- l: J( n6 X; w" C, T( A
        --with-http_geoip_module
1 Z3 e& Z- {2 G7 m& Y& @+ t0 ^( S2 t
make %{?_smp_mflags}, ~( m% T) R! Y: ?# T% v
%{__mv} %{bdir}/objs/nginx \2 \. s0 A# p2 Q: v
    %{bdir}/objs/nginx-debug5 k9 S/ {" O: `
./configure %{BASE_CONFIGURE_ARGS} \) E$ W( v  M% I. M" ~' E, j* {
    --with-cc-opt="%{WITH_CC_OPT}" \
! M; w' {3 V3 ^: j0 `    --with-ld-opt="%{WITH_LD_OPT}"
3 [5 }: o% o3 D8 ^! g; L  \7 mmake %{?_smp_mflags}( a" U3 e) `5 T; A9 @8 j
! X4 @) {1 X; e6 i, H) @( q, m) E
%install
9 u8 I: L2 ?. K# C%{__rm} -rf $RPM_BUILD_ROOT9 O+ k) E5 b: p8 C7 y, F
%{__make} DESTDIR=$RPM_BUILD_ROOT INSTALLDIRS=vendor install; x3 _7 r; e; }2 t6 J! s, a; H
1 E, K- |" c+ w% h
%{__mkdir} -p $RPM_BUILD_ROOT%{_datadir}/nginx0 O; x, t( A6 i
%{__mv} $RPM_BUILD_ROOT%{_sysconfdir}/nginx/html $RPM_BUILD_ROOT%{_datadir}/nginx/  a. K: E& y8 D6 v6 p1 h

) D! |8 V2 C9 W- G+ b/ R' V%{__rm} -f $RPM_BUILD_ROOT%{_sysconfdir}/nginx/*.default
' D3 L& e& \- F: l3 D  e%{__rm} -f $RPM_BUILD_ROOT%{_sysconfdir}/nginx/fastcgi.conf
0 J1 b9 z+ a& S: K. U4 F
2 Q- D& E3 z3 q+ n%{__mkdir} -p $RPM_BUILD_ROOT%{_localstatedir}/log/nginx1 V! v& J# N9 z0 J" A% N& ?5 F
%{__mkdir} -p $RPM_BUILD_ROOT%{_localstatedir}/run/nginx
9 L  x; ], P- p/ u' C%{__mkdir} -p $RPM_BUILD_ROOT%{_localstatedir}/cache/nginx2 U5 x0 U+ V  H! n& E& G

- h. h; t' p9 [7 A& Y%{__mkdir} -p $RPM_BUILD_ROOT%{_libdir}/nginx/modules2 w- Z' W, l7 V/ S) Q. H4 s/ y
cd $RPM_BUILD_ROOT%{_sysconfdir}/nginx && \
# u& j0 g" h- s7 @: A! ]    %{__ln_s} ../..%{_libdir}/nginx/modules modules && cd -
' A* W: `1 I- ^: u/ L2 D) b
9 o) K2 ~9 p& w%{__mkdir} -p $RPM_BUILD_ROOT%{_datadir}/doc/%{name}-%{main_version}# ~+ s8 a0 Q3 r
%{__install} -m 644 -p %{SOURCE12} \4 I- C$ o* o  q% w' @
    $RPM_BUILD_ROOT%{_datadir}/doc/%{name}-%{main_version}/
$ g4 `% M4 y% s; r9 S$ f- o$ @3 W2 K* W! E: R. S$ ?7 w/ c& c6 [( q
%{__mkdir} -p $RPM_BUILD_ROOT%{_sysconfdir}/nginx/conf.d. e; N9 d) }4 z8 S1 J' ~: z; M0 H
%{__rm} $RPM_BUILD_ROOT%{_sysconfdir}/nginx/nginx.conf/ A* R3 J5 y( R, D& n" X7 S9 z
%{__install} -m 644 -p %{SOURCE4} \
$ h1 g% L& K6 D3 ~$ o* r" v7 n    $RPM_BUILD_ROOT%{_sysconfdir}/nginx/nginx.conf4 A. n& j) m$ l0 a- E: n& e
%{__install} -m 644 -p %{SOURCE5} \7 V% r+ M4 t" y6 }, }0 A& f9 G6 ?
    $RPM_BUILD_ROOT%{_sysconfdir}/nginx/conf.d/default.conf
" t9 @; H8 P+ }8 T; P9 S; c) i/ ~' N" O) M8 H, E+ X
%{__mkdir} -p $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig
, d- |, }( R3 Z%{__install} -m 644 -p %{SOURCE3} \2 z7 l5 c2 C! L$ P$ F* H7 v, ]
    $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/nginx' e, D8 I" X2 N2 Q6 E( p1 w. `  B
%{__install} -m 644 -p %{SOURCE7} \
' X% |4 V, R7 T3 ?2 g) @* j, ?    $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/nginx-debug- ?0 G  u- Q% _
; J' f+ G5 V% P
%{__install} -p -D -m 0644 %{bdir}/objs/nginx.8 \
8 h0 b- A1 m  f  l9 {2 b* G    $RPM_BUILD_ROOT%{_mandir}/man8/nginx.8
0 s/ j  c+ ^# n% x6 C0 G
" t" e/ ]' X4 v) O; C%if %{use_systemd}
) O* i- J( w! a' p" F8 o# install systemd-specific files
5 F, B/ ]+ h% G5 g  ~2 W9 M%{__mkdir} -p $RPM_BUILD_ROOT%{_unitdir}
( e, J( K# m1 `7 n1 ^%{__install} -m644 %SOURCE8 \, Y. X+ l9 @( g- ~2 U
    $RPM_BUILD_ROOT%{_unitdir}/nginx.service
* x$ `/ N" h, P3 J1 Q2 Q%{__install} -m644 %SOURCE11 \- `; J6 b' H& F2 h$ {* Z
    $RPM_BUILD_ROOT%{_unitdir}/nginx-debug.service& `9 P/ u$ A, N' v  u5 `  m( }3 n. X
%{__mkdir} -p $RPM_BUILD_ROOT%{_libexecdir}/initscripts/legacy-actions/nginx& W' M: L) R1 X+ ^2 L! S3 L
%{__install} -m755 %SOURCE9 \
9 y, U# r# w. h    $RPM_BUILD_ROOT%{_libexecdir}/initscripts/legacy-actions/nginx/upgrade
1 S# v9 O* D9 T7 u" u: Z+ Q%{__install} -m755 %SOURCE13 \) S# n6 q$ u" ?
    $RPM_BUILD_ROOT%{_libexecdir}/initscripts/legacy-actions/nginx/check-reload5 u: @8 z( A% c5 D
%else, N& E) |7 R# o1 c: O+ x
# install SYSV init stuff
* L! ]. C7 l; h%{__mkdir} -p $RPM_BUILD_ROOT%{_initrddir}7 S* V2 m4 M  e6 C: v
%{__install} -m755 nginx.init $RPM_BUILD_ROOT%{_initrddir}/nginx
) F5 g7 M7 I1 S1 T" ~4 r%{__install} -m755 nginx-debug.init $RPM_BUILD_ROOT%{_initrddir}/nginx-debug
% _' E3 d6 b/ x0 y%endif
* X3 Y5 s& J' }" u
$ z( x. ?: [2 k1 S# install log rotation stuff
* z5 j& W4 V  _9 Z. Z$ f%{__mkdir} -p $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d
# S# s# z# `; g: y& f7 Q; v%if 0%{?suse_version}1 I% H$ i& Z0 \. l7 ~
%{__install} -m 644 -p %{SOURCE10} \* w) V7 q3 `* D# Q
    $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/nginx/ L( q0 ]& L" A0 I
%else: p, h. O! @3 h
%{__install} -m 644 -p %{SOURCE1} \
, x5 L+ P5 V3 i( x3 q1 Y/ [    $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/nginx: [. z" r" k/ x/ f' f" O
%endif6 C/ W" N6 z& D5 e+ ~4 c8 {

3 }0 Z# |  A( c6 E: S7 G' [# `%{__install} -m755 %{bdir}/objs/nginx-debug \
) V5 x0 P* P8 Z6 k; Y6 y! O3 k7 Y    $RPM_BUILD_ROOT%{_sbindir}/nginx-debug/ \) e& g$ n2 R8 \8 d' f
7 t1 r& }: m% n; r: _& Q5 N
%check
* F2 _8 m* R6 a7 P8 O4 h%{__rm} -rf $RPM_BUILD_ROOT/usr/src
, @5 {% m* r( S& c) Q  q4 mcd %{bdir}( B3 y, f! z1 t& Q9 B; H
grep -v 'usr/src' debugfiles.list > debugfiles.list.new && mv debugfiles.list.new debugfiles.list( p9 ~5 Z7 K( R, G. ]& g
cat /dev/null > debugsources.list
& K' v  H% _5 M%if 0%{?suse_version} >= 15003 ^4 Y  F* x5 `: W8 Y& `9 K$ P1 q
cat /dev/null > debugsourcefiles.list! z# ^3 H. G& F4 r6 e* b8 M
%endif1 B; R8 N7 E* f5 i# @7 o! T) a

3 b7 K6 v  \- G9 b%clean! W9 K- G- z( t7 y
%{__rm} -rf $RPM_BUILD_ROOT
4 n5 d" [) `6 N" q4 u0 A' l5 P. h6 m' m7 p
%files1 A  {% M3 Q" ?3 C6 U6 B
%defattr(-,root,root)
+ I8 l1 J3 O) v1 K% e9 M3 `* a
; q0 _+ k( ?) Z! Q. f5 X1 V. @1 ?%{_sbindir}/nginx9 O9 s4 H+ h+ {( k/ p/ D2 o
%{_sbindir}/nginx-debug
8 P' A- I1 v  B2 m9 Q
" a4 D4 F& ~* r: e3 j5 Y5 K%dir %{_sysconfdir}/nginx& y  O* o, Y& T+ ^
%dir %{_sysconfdir}/nginx/conf.d
! f7 C- J3 n% f2 q; v, b) E& {%{_sysconfdir}/nginx/modules
9 R6 }+ j" B% s& l5 C) y! |5 h( Q# ]% F! h' Z/ R# f( f' t
%config(noreplace) %{_sysconfdir}/nginx/nginx.conf" {. h9 E& B4 Y$ {
%config(noreplace) %{_sysconfdir}/nginx/conf.d/default.conf
- e0 a. A7 s& _+ v0 R%config(noreplace) %{_sysconfdir}/nginx/mime.types
3 U3 R$ u4 f" f%config(noreplace) %{_sysconfdir}/nginx/fastcgi_params' {( X* J/ _: f, q/ F: w6 e
%config(noreplace) %{_sysconfdir}/nginx/scgi_params
8 U/ Z6 x9 K% ~% H%config(noreplace) %{_sysconfdir}/nginx/uwsgi_params5 q- z  w5 _2 \( c5 o2 n
%config(noreplace) %{_sysconfdir}/nginx/koi-utf% L; D) N4 ^3 K% b' n6 U0 c" V
%config(noreplace) %{_sysconfdir}/nginx/koi-win* C) L: E+ g/ w7 |: d3 m0 i
%config(noreplace) %{_sysconfdir}/nginx/win-utf# N; v) W0 k+ L" G. o2 ]
! }) c; B: c7 P/ J& P* k1 W
%config(noreplace) %{_sysconfdir}/logrotate.d/nginx
0 n; u+ ^# Z3 q! o. n: @" Y%config(noreplace) %{_sysconfdir}/sysconfig/nginx
* M5 e5 Q$ ^5 {2 K3 r# G" K%config(noreplace) %{_sysconfdir}/sysconfig/nginx-debug5 |8 I* O. k* G7 C1 ~
%if %{use_systemd}5 Q' `, e, z, S) a+ A
%{_unitdir}/nginx.service, |9 W9 Y- H- Z  }: W1 d
%{_unitdir}/nginx-debug.service8 c9 w# e2 j, a5 S% D9 m
%dir %{_libexecdir}/initscripts/legacy-actions/nginx7 f3 D6 [7 n' H- |! i4 `0 I" D- m
%{_libexecdir}/initscripts/legacy-actions/nginx/*; i8 {+ ?  I2 W+ y1 @
%else
: N1 t" i6 @9 ]+ j. }4 I* D%{_initrddir}/nginx: Q; g% N7 i0 q
%{_initrddir}/nginx-debug
0 a' P/ s/ ]* f; c%endif1 @% ^; J; o% c! `

# v4 \! C, U1 U' F! u  l%attr(0755,root,root) %dir %{_libdir}/nginx9 I9 b% L# i( t9 H2 h3 Z
%attr(0755,root,root) %dir %{_libdir}/nginx/modules# i1 l/ d$ n& s6 Q8 m8 E8 a
%dir %{_datadir}/nginx
  `- g7 F% O' @& W8 g9 z%dir %{_datadir}/nginx/html
( f; w# y- p: _%{_datadir}/nginx/html/*! C4 }% Q) A8 K8 w0 P- L; T
7 ?8 ^$ ~# x2 v9 {' i% H# u3 r
%attr(0755,root,root) %dir %{_localstatedir}/cache/nginx
# L3 n+ d% ]) p" [%attr(0755,root,root) %dir %{_localstatedir}/log/nginx
/ Q1 J! t0 h6 U1 ~: b
) E6 u; i' e. A+ W. K1 v1 I% D%dir %{_datadir}/doc/%{name}-%{main_version}, `, F9 q# A5 p2 A6 V
%doc %{_datadir}/doc/%{name}-%{main_version}/COPYRIGHT5 G$ c2 L9 Q: j/ C) Q. a
%{_mandir}/man8/nginx.8*
6 n" F# [3 U- `* }% n) j9 X
6 o/ S, A# [% ^6 h' l2 x3 a%pre
2 v$ l- [8 j. Z# Add the "nginx" user+ m( ~& X7 Z0 N, P
getent group %{nginx_group} >/dev/null || groupadd -r %{nginx_group}2 ?9 ^! ^5 G: y* c9 E3 z
getent passwd %{nginx_user} >/dev/null || \; t+ }: T8 W4 F
    useradd -r -g %{nginx_group} -s /sbin/nologin \
  v/ P: L6 _, m5 h    -d %{nginx_home} -c "nginx user"  %{nginx_user}$ p7 ~2 J! h, e. k
exit 06 r- K+ t, \* X- I- g! c% U/ i6 |6 [
* N/ w( `, w) G
%post
! Z; T' D/ Q3 C) `" `# Register the nginx service5 i/ [% M1 U0 K& P3 S2 d7 g
if [ $1 -eq 1 ]; then
. {, f3 O! f9 q2 }' E%if %{use_systemd}  M) \) y! q3 T1 l. U% @
    /usr/bin/systemctl preset nginx.service >/dev/null 2>&1 ||:% X) b1 E6 |$ K! q* v
    /usr/bin/systemctl preset nginx-debug.service >/dev/null 2>&1 ||:: d: \, M& k2 K6 }
%else: }5 b$ J) l7 l9 ^
    /sbin/chkconfig --add nginx
( G8 E9 h& A7 G! l% U: J) v& L    /sbin/chkconfig --add nginx-debug
; ]) I+ c, L5 k& b; b%endif: }/ ^9 L% N: y$ f/ K
    # print site info3 @6 M" \6 y2 W, q& X* T
    cat <<BANNER
1 a  h) t) D7 c  G; K----------------------------------------------------------------------
  E. Y, w) S; J5 g
' q" a+ l: J- {" _4 kThanks for using nginx!; W- d' ?' y% G& W/ R9 Y9 P, J

7 ~2 A2 ]! [* ]Please find the official documentation for nginx here:
: R* t, C9 N. [0 Z+ S* http://nginx.org/en/docs/" n1 u# f# ]1 [4 v# E
2 Y4 `0 ?) A3 \3 `# _; G
Please subscribe to nginx-announce mailing list to get
7 C. z" a1 W4 _9 r+ c  _8 Y( gthe most important news about nginx:) R$ R! U3 d  {" [% W9 f! V
* http://nginx.org/en/support.html0 H8 n5 Z/ Y9 q5 }# }
4 ]0 M9 v8 p4 U: H6 y  {6 t$ S" I
Commercial subscriptions for nginx are available on:! w3 e2 u+ }# f
* http://nginx.com/products/
/ }- R9 G9 x( e, T9 A4 E& |% P5 n9 o9 e+ e2 m0 v
----------------------------------------------------------------------
; }; g# [/ q% Y$ @" |BANNER& v, D  |7 ~6 @

+ I! h/ O( K! R    # Touch and set permisions on default log files on installation
. p: O0 V/ I! h
3 r  D$ b. G/ J& h; K4 ^  j    if [ -d %{_localstatedir}/log/nginx ]; then
- a0 d3 ?% z( F        if [ ! -e %{_localstatedir}/log/nginx/access.log ]; then, f) j% d0 J2 p: {
            touch %{_localstatedir}/log/nginx/access.log" W3 O9 r; g( u+ [! ^
            %{__chmod} 640 %{_localstatedir}/log/nginx/access.log
9 F) g5 D& Z2 |  X            %{__chown} nginx:%{nginx_loggroup} %{_localstatedir}/log/nginx/access.log3 m0 [( Z! [: n9 W$ A: f5 v
        fi
8 P3 H4 g( W; k2 b; t% h- Q1 M
$ T# E% x! w) I9 q. Z8 }        if [ ! -e %{_localstatedir}/log/nginx/error.log ]; then5 i. s5 v6 ~$ h5 h! |2 A+ z0 \
            touch %{_localstatedir}/log/nginx/error.log  Z4 q4 }  h& j( z
            %{__chmod} 640 %{_localstatedir}/log/nginx/error.log
0 e# c: U% j; }" C* P8 w" d0 f- A            %{__chown} nginx:%{nginx_loggroup} %{_localstatedir}/log/nginx/error.log
+ H2 d4 Q; n4 N( d7 q) L  A        fi1 a, R  o6 O7 ]* A7 W9 s& n
    fi
. w# S8 Q1 O$ }3 R6 Jfi
6 i9 C" \9 X: b$ T+ c. S
/ ?+ n& }; }, X8 H%preun, s2 s. _% n" X3 K/ W4 e' g
if [ $1 -eq 0 ]; then
  B* I/ a$ w3 e8 E+ v+ X%if %use_systemd
; m/ i9 Y, @. w2 Z    /usr/bin/systemctl --no-reload disable nginx.service >/dev/null 2>&1 ||:
: v; y& e6 A' @* a    /usr/bin/systemctl stop nginx.service >/dev/null 2>&1 ||:" \* f/ U1 s3 L7 I" @- p4 ]
%else
! g2 u! G* |" C/ e; \( ~    /sbin/service nginx stop > /dev/null 2>&1( a4 c$ U6 p  D# s" G1 p7 Q
    /sbin/chkconfig --del nginx+ W' ~; u  ?- }" i7 U8 J
    /sbin/chkconfig --del nginx-debug
! n# |; N3 m" U9 \' U- t2 W/ U7 x%endif3 q9 Q. s+ D5 ^6 t: L+ A
fi
% c  g; L% D! R9 W; T
7 o+ l+ O( X6 J6 r1 C: A" {& P%postun
! R4 n+ K$ C9 s7 s' u%if %use_systemd
# A5 e9 g& C: M3 l. b; B/usr/bin/systemctl daemon-reload >/dev/null 2>&1 ||:
( U& c$ `" j# N, h%endif
7 G" S( q/ X% w  `5 H! Aif [ $1 -ge 1 ]; then( B. `; t% r4 `3 J
    /sbin/service nginx status  >/dev/null 2>&1 || exit 0
+ r$ S7 {# l) i8 ?& I! T" `: X    /sbin/service nginx upgrade >/dev/null 2>&1 || echo \
  q4 m8 }4 w  K. q4 k$ A- v        "Binary upgrade failed, please check nginx's error.log"6 j' c6 O1 M$ r8 K; V
fi
7 E+ z, [0 q/ W' h1 {8 @" [# D% A( \9 H7 ?: }2 M+ [
%changelog, g, `+ S1 E. r
* Tue Sep 30 2019 fangdm <8@8994.cn>3 C8 J0 A# I+ S+ m1 J
- Add modules nginx-http-concat and ngx_cache_purge9 G" t! C- U4 f) i
, }3 M+ u7 O6 G5 [- `
* Tue Aug 13 2019 Andrei Belov <defan@nginx.com>+ s9 r. f0 m, k
- 1.16.1) u/ ?* S. B5 ~* [4 Z0 \! P- D" h
编译完成之后,查看changelog,是成功了。4 x# P# M6 a8 w7 [" g( O! d, h

  N4 ^  r' r* L4 {) a+ r[root@localhost SPECS]# rpm --changelog -qp /root/rpmbuild/RPMS/x86_64/nginx-1.16.1-1.el7.ngx.x86_64.rpm
) }5 b/ r  O. t- w; X4 \+ ~* Mon Sep 30 2019 fangdm <8@8994.cn>' c: G: u0 {2 b3 J7 m1 @7 t' A) [1 C
- Add modules nginx-http-concat and ngx_cache_purge8 n% T. g$ x+ u: q

- @5 B. j; ~6 w4 }( r+ m* Tue Aug 13 2019 Andrei Belov <defan@nginx.com>' G( }# M9 `) x1 H# M$ k7 l) W
- 1.16.13 n  s# O" d) D1 b2 R# M
fpm打包方法* n. F: F0 s( A; Z' A3 ?: l
使用fpm这个方式也是可以将tar打包为rpm包,其打包流程大致是这样的:7 Z+ @, c! J, h' R: I& j6 V

0 j: \0 R( n4 Y) s7 h  O编译安装被打包软件,指定安装的临时目录,如指定--prefix=/fpmbulid
! Q* [4 M( M! g/ N0 o创建安装脚本、卸载脚本( E' v2 r0 S2 C( i: q7 \
安装FPM工具2 `  K( u7 F6 i+ t6 J
使用fpm打包3 P3 l& F5 Z* d6 q
% h5 u5 g, ^8 c7 Z8 r# z

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2022-10-20 15:00:06 | 显示全部楼层
gcc相关知识
先编写一个C文件,其第一行表示包含文件在/usr/include/stdio.h下,如果没有申明,则需要使用参数-I /usr/include指定。
复制
1
) M+ D. ?9 G; Q' k; Z' v2
) f; u: I' D9 t3 G+ J# @% V: s' h3! D9 ]$ I0 V4 C' H2 O/ |" H
4
: a2 o4 N% `" m0 G56 X* n- E" h1 r9 j3 F' f
6+ Y6 G0 j' N! N9 y& x
7
1 F# ~/ g! H) I/ J8
; s8 X+ d) ]+ G" h9( u. h3 p. i; _) Q0 g
10
; `6 N# `  D5 y: i4 J, b( g* E11- @3 [2 D/ P* N3 B
12
* W3 w7 {# r; W3 V13
( b4 Z6 E  J9 y+ a; x* j# B14
' w; M/ P* O7 A15
' s. v( y! ?) F16
9 H- T0 y" Z, h2 X4 [& t9 M17
9 C; J, B! y3 C- W! d18
! ]  \3 v& c; U7 K# r19
, E: _2 d( D0 b! q. B  ~& Y) X20
' R; c* O$ ]7 y4 M8 ?
[root@home ~]#cat sin.c
; `0 G( c2 [& s$ K#include <stdio.h>7 b# N+ l  P$ S7 o& ^% T5 m8 A
int main(void)
0 \0 @( j9 g9 y; ?{. h( k5 ^# t6 w
        float value;
! e/ j' e1 g. r% m0 u        value=sin(3.14/2);
( [: T/ d; r$ P6 i) }        printf("%.2f\n",value);
. m( n/ |6 `, r( z1 a7 S; W}
* v) J, R0 p5 }: o- k1 x
/ W: _4 w; n/ H& h/ O[root@localhost src]# gcc -c sin.c
: F* ]9 t  y/ \; N4 n; Qsina.c: In function ‘main’:$ ~/ h7 A- w/ V% h9 u  v! i
sina.c:5:8: warning: incompatible implicit declaration of built-in function ‘sin’ [enabled by default]
) C0 A, l6 `$ ?8 I; z1 G" A5 y  p  value=sin(3.14/2);3 g& \$ K4 [0 e+ G1 t  h( ]
        ^; r" T( h. m6 O4 h  `. n
[root@7ftbv7mdz7cdpc ~]# gcc -c sin.c -lm -L /lib/64 -L /usr/lib64
( Z3 w" ^$ j0 y0 v; osin.c: In function ‘main’:
; ^% z5 i* q1 {8 ^' K$ ^) e6 r* W# ysin.c:5: warning: incompatible implicit declaration of built-in function ‘sin’. I8 C/ m- X1 Z' C2 l
[root@localhost src]# gcc -o sin sina.o
/ ?' b- f3 C. B  L* l[root@localhost src]# ./sin6 H: d, k7 i4 [) i: j! w; R
1.003 v+ [* i! B4 X

% a& j$ b/ u  Z$ A: }- ]# T" T/ Q* m1 ?

* r$ _& s0 z. Y" P+ T" _' V
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 里面搜寻
    " r4 G) z. d* C7 E6 }1 g
总结:
6 |( Q0 E3 V  k% f
复制
1( U; C- b% g$ ^1 M5 \
2$ L& {" H5 g. C3 c, ^6 Y
3
/ O  L) t) W4 M* j; P  J! k1 y48 G7 Q' [  W- g* u) g( ?, B
5- A6 x$ V' s+ W2 h( _3 g7 n& C
6
7 h& ]) K, t+ S& z7 \7
( ]( N, P9 Y* I( T$ F- H) J8, s* i: Z* Q8 M8 a
9
+ K1 |, A0 b/ K# R. W& L+ R10
7 p# {& r1 D- K: P. ~2 P1 W2 L11$ k9 L( M; X+ t; f, n
12; r$ Z8 G; e/ K/ x
13
7 b0 |: V$ d3 u2 b3 t( J  a) t14% W2 c) A" I, y- K' F
15* |7 g0 ?2 ~! ~4 ~- d* D
16) `, d6 H4 R5 C- [9 o0 @' G
17
% p0 Q' A- [/ D3 v' Q' j18/ S" u$ z: n, {* Q. B2 N
19
/ a2 o5 j0 e$ F# Q9 k9 ?, x! ]20+ W) ~' ?  E( N0 v& I
21- v3 g0 }, }; Y4 A
22  r9 g1 i+ @. B2 c+ }, k
23
4 L+ [: j+ k8 l
# 仅将原始码编译成为目标档,并不制作连结等功能:6 k* F: E4 {1 b9 Y
[root@www ~]# gcc -c hello.c
* {- h, d+ }3 r& ~- f5 }# ]7 ^9 K# 会自动的产生 hello.o 这个文件,但是并不会产生 binary 运行档。
! `: c2 C/ \& s4 O1 `& ]5 {, R+ ^. I& M
# 在编译的时候,依据作业环境给予最佳化运行速度
8 s; a" |/ ~' r# _+ c6 N' T[root@www ~]# gcc -O hello.c -c2 ^+ Y3 y( Z$ b& I
# 会自动的产生 hello.o 这个文件,并且进行最佳化喔!: p+ p1 ?0 D# i  b1 w/ Y" u

0 t5 f0 i. S$ b+ h( [% B5 T# 在进行 binary file 制作时,将连结的函式库与相关的路径填入# y  g2 y0 [0 i  g$ Z
[root@www ~]# gcc sin.c -lm -L/usr/lib -I /usr/include/ v) l* d+ h6 v/ e, D* m0 D
# 这个命令较常下达在最终连结成 binary file 的时候,6 R5 |1 p- V/ t& Y3 j
# -lm 指的是 libm.so 或 libm.a 这个函式库文件;. J1 c0 E$ b, N. m
# -L 后面接的路径是刚刚上面那个函式库的搜寻目录;0 n1 p6 v% [4 S# e7 A
# -I 后面接的是原始码内的 include 文件之所在目录。
" l+ X" @! }7 E8 h1 D. n" S9 _- @4 z
# 将编译的结果输出成某个特定档名  ~% m% u+ |9 f! m* m- ~! e" m
[root@www ~]# gcc -o hello hello.c
" O8 y) E. ^' X# -o 后面接的是要输出的 binary file 档名
6 }3 [2 B0 G' M* \; n: N$ {( V5 C/ k0 M. X
# 在编译的时候,输出较多的信息说明
2 j( y9 R& |9 o5 f' T[root@www ~]# gcc -o hello hello.c -Wall
2 C2 h# }7 I/ P0 k  H0 g- W1 P5 C7 [# 加入 -Wall 之后,程序的编译会变的较为严谨一点,& h7 c: I/ Z; [& n
# 所以警告信息也会显示出来!
# B9 S- j/ }% J% R3 |" Q9 u1 A

/ u  o5 I  ?8 E
7 V, R0 g$ z+ N1 r( D# t

8 Q5 g: \2 Y: Y3 ]另外,我们通常称 -Wall 或者 -O 这些非必要的参数为旗标 (FLAGS),因为我们使用的是 C 程序语言,所以有时候也会简称这些旗标为 CFLAGS。
" e: P: h* F/ M+ V& v$ y
- a' y  _3 s# @
makefile介绍实例
首先,下载wget http://linux.vbird.org/linux_basic/0520source/main.tgz然后开始编译:
复制
1
& f. E8 H) ^2 g% L6 _6 a, R2- i' I, J5 O& a' N6 j
32 G& @, [7 x6 m7 l3 Q5 o# {1 p$ F
4# w: Z* {8 G4 b# Z; Q2 ?; R
5
. P; q4 |0 L8 }% F  u5 |* r6
- `9 ]( o, Z5 _: r4 }/ O4 |! V7
6 K# F1 s% f# C8 s6 a. r8
5 ?) J8 T+ f7 D: h( V9, t; g+ Z7 N. h
10/ H; y/ \2 Z7 }0 P! A4 B; M$ k& \
117 \+ v0 @8 x1 d* z& |5 M
12
: N* b$ P: N9 V' `+ c4 \134 @3 q+ U. W3 Z- ~7 Q. M. g
14
; i( R" z3 s& `# ?: x4 w159 F- I& v. X. L4 d" U; {) @3 _
16
* z: s4 g; `( c& T) S6 C17
- U7 b9 \9 L1 C6 B* _, m4 \186 L( h4 R/ }9 h: P# r
19% v8 J8 D5 Y6 f$ K* f
20
! E6 h: x! s9 f7 r; H$ P7 L6 j  n6 T  m9 c21
" H. ~) q; t) a8 ]4 s! L: z; H22
# o$ q: R6 I9 K. s
[root@localhost main]# cat makefile
6 R6 b6 C4 ^6 L" j# Nmain: main.o haha.o sin_value.o cos_value.o
  X. H+ n0 x/ A0 e2 r: T+ {        gcc -o main main.o haha.o sin_value.o cos_value.o -lm
) ]. P  `# x+ o/ x0 y1 Bclean:
$ F6 S/ C, G0 k/ V; F; ~        rm -f main main.o haha.o sin_value.o cos_value.o' S" q0 G! `7 e( K  H9 a
       
+ l% D/ b+ k: A3 C4 V; }" q) t[root@localhost main]# make1 }+ b: v, U" E, ^$ R) |& m# T
cc    -c -o main.o main.c9 Y2 c( Q# \  @* V3 X
cc    -c -o haha.o haha.c. I5 D7 x0 h/ d) A
cc    -c -o sin_value.o sin_value.c& P: \0 ^! G! l' J9 _3 i
cc    -c -o cos_value.o cos_value.c
! e! X- d5 w, s  `. k& w. l' e1 Z" ^gcc -o main main.o haha.o sin_value.o cos_value.o -lm' f5 O% h( q% f* X* V

( G3 l% n2 H( \- L[root@localhost main]# ./main4 k! O: E9 M$ }# n" ^) @/ j
Please input your name: fdm" Y* y7 E) [  O: Y! H) g1 P" s
Please enter the degree angle (ex> 90): 33
8 S/ D- s) C8 C% b# T6 H3 @; RHi, Dear fdm, nice to meet you.
" k( J7 a- [& @7 v% F& rThe Sin is:  0.54
& [! ]2 Y" |4 P$ Y1 _The Cos is:  0.84
1 I$ e8 f& k) F$ W) R' b. _3 d  H9 n) }7 v) a* h% L
[root@localhost main]# make clean
" j! H& F& I4 Q4 W; p3 v$ Lrm -f main main.o haha.o sin_value.o cos_value.o6 W) d' i/ Y! _4 {* U4 h

- G& k; S% h) w5 G$ o* |

5 n( T) X4 e( g! m+ i8 d8 Fmakefile 的基本语法与变量
make 会主动的去判断每个目标档相关的原始码文件,并直接予以编译,最后再直接进行连结的动作。
  • 在 makefile 当中的 # 代表注解;( L7 C1 Q5 w' |
    • 需要在命令行 (例如 gcc 这个编译器命令) 的第一个字节;
    • 标的 (target) 与相依文件(就是目标档)之间需以『:』隔开。就是可执行程序的文件名。复制
      1- K+ d7 K  t0 @! {' e+ g
      2, {. j, Z; B* c$ l2 Q3 f9 G' q0 U
      标的(target): 目标档1 目标档2; v# b" v- E! h0 {7 v- K# k
              gcc -o 欲创建的运行档 目标档1 目标档2
      # `5 @6 s" g$ `3 B8 \! R9 h
      3 Y1 d9 o3 E1 E
      3 v* D2 D2 ?/ _, [! f

      . `9 N% {( V7 ^5 d% K7 X8 a
如下,makefile 里面就具有至少两个标的,分别是 main 与 clean ,如果我们想要创建 main 的话,输入『make main』,如果想要清除有的没的,输入『make clean』即可!而如果想要先清除目标档再编译 main 这个程序的话,就可以这样输入:『make clean main』
还可以进行简化,使用变量来减少程序的修改量。$@:代表目前的标的(target);gcc 在进行编译的行为时,会主动的去读取 CFLAGS 这个环境变量,可以写到makefile' \5 I; \- B3 _! V: z$ o
复制
1
) a/ u7 x9 O% A6 K/ F2
, b9 l6 C' Q% L4 G* B) u; k3
2 B. [- V3 \! k6 |$ B- O4
# R% b2 Z, j1 \2 b$ ^( e& k50 E7 N4 F) f& Z
6; ^% ?0 Q9 F7 h5 T& R: o% O: _, c+ H
7
* O% i4 A" `4 y0 R! Z80 ~, r7 \+ i& I5 g: V8 r: r
[root@www ~]# cat makefile( b/ U8 x' X1 L" ^. K0 X
LIBS = -lm
  u0 B) I  f& `3 c' R  TOBJS = main.o haha.o sin_value.o cos_value.o! I6 b% A* y" [9 L/ i
CFLAGS = -Wall0 W5 L! [3 O8 b3 K3 T, g! z
main: ${OBJS}
/ ?5 {/ R6 V5 [' o3 d# h        gcc -o $@ ${OBJS} ${LIBS}
. g3 X" W: }& aclean:  `, T- x* ^! r9 M3 a* f
        rm -f $@ ${OBJS}
# n: `9 c* R* p# p' _

+ z( `: ?  {# [, Y/ `

, c9 H0 h+ J9 U* i+ m/ ~7 M( s8 O/ p; M/ P
由於 gcc 在进行编译的行为时,会主动的去读取 CFLAGS 这个环境变量,所以,你可以直接在 shell 定义出这个环境变量,也可以在 makefile 文件里面去定义:7 ]# j) e8 P7 ~& T
复制
1
' A4 @" N5 K6 n2
( r& e+ T: b7 Y/ w: K' B8 u+ G
[root@www ~]# CFLAGS="-Wall" make clean main+ F5 l8 |0 u' m3 w: C+ D8 ]1 f: x% Q$ f
# 这个动作在上 make 进行编译时,会去取用 CFLAGS 的变量内容!! K, O, ^- z( U. r

+ W( V  E5 K1 u' W8 c

) s: G0 A! A$ T+ K, V
' R1 J2 K/ u% k6 E, [4 lmake与Dockerfile相接合
此小节内容来源于 high-iowait-process
如有下列Makefile文件内容:
复制
1( m2 ]' }4 h9 S3 L
29 K+ K( U0 U' h; V7 |& z4 p: |: k7 _
3
% V& v+ R1 Q9 I% T) u: [# v45 T& ~% P' Y* T! X$ b0 ~/ z
5. l. ?' E% K: w2 ~2 L
6
# k# o: ]2 W4 ~7 p: S7
' w3 t7 G" P/ [& x8
$ x8 n# Z* I  e9
0 s& X% z) L3 f6 E10
0 g2 Z7 `8 i3 b2 `& O11
- U- f( e) h/ i: J4 A127 N! N. p& I2 g6 _
13
/ f/ m8 l* n- q) b% L8 t3 t146 ^, \2 Y0 V5 C# k3 A
15
; \% T4 S8 B6 b1 D# Q+ @  m16
7 O# g8 ]9 O* z; m" A17: r7 \, s/ k+ ~' j, r
18
  r3 o; {7 }9 o9 l9 N- L19
; h, R: D" A4 V8 {3 U20: p7 C  N: _8 y/ z2 g) `
21
1 W2 B; g: s4 U& x- b0 I22) x& N3 N0 A' U1 H" {% {0 j% D; ?
23
3 r3 W/ I5 P' e8 ~3 P24
4 r% D7 h+ Z1 q# x2 v# a25
: e, z/ |; [" t5 o( j4 C! O. G26$ ]% O  N. \( Q- c  A
27
0 t" G7 j/ o, w28
8 _: S( Y* H0 s; t3 n5 v$ N29
+ n' d. y% Z# m+ @30
5 e4 Y0 D7 ^9 ]; t- x7 m9 c5 ]31* _, W$ I" \+ J- I% A
.PHONY: build+ N2 }" U1 P% l! N; o- y
build:( P! r: F. e8 K1 u- W
        gcc -o app app.c8 L1 [' o, _0 t: Z; Q
        docker build -t feisky/app:iowait -f Dockerfile .
) u+ C$ m: G' l0 _- U        gcc -o app app-fix1.c2 t4 N% i7 I8 e4 a" z+ {4 b7 _7 v
        docker build -t feisky/app:iowait-fix1 -f Dockerfile .  F* Y. @1 r8 V0 M# n
        gcc -o app app-fix2.c$ I  p7 b2 H* f1 S: E7 w* F
        docker build -t feisky/app:iowait-fix2 -f Dockerfile .) Q( O' }$ L3 B- @/ W
0 @5 N+ w3 V% D: d6 x! R# n
.PHONY: push% _1 o2 n; g& W6 q! e
push:
3 s' K- I) h$ M! k" D7 O        docker push feisky/app:iowait
9 t4 E2 c- c' T$ Q: I1 k! |        docker push feisky/app:iowait-fix1
7 E( M- \5 C1 A: ^& K        docker push feisky/app:iowait-fix24 S& x* m( p2 O" l, \

- p: \9 n* B: z( t6 m.PHONY: run
6 Y; m' J1 N$ u2 t- T4 E: |, Frun:
! v8 T+ B# G; i5 |        docker run --privileged --name=app -itd feisky/app:iowait
! f5 T2 \6 ^) [7 X, G
$ x; v* I2 `8 _0 ]- A.PHONY: run-fix1/ A  r! P) s* C
run-fix1:
8 i) `0 _& W4 E( x1 a        docker run --privileged --name=app -itd feisky/app:iowait-fix16 y# j$ |" C9 z. M- _+ l

4 N* j$ @, I) K8 A0 J.PHONY: run-fix2. }3 l0 \3 m" z) q
run-fix2:" X. W+ K9 t1 J2 K: m) ]
        docker run --privileged --name=app -itd feisky/app:iowait-fix2( Y2 d  Q- r3 _: G
& _1 P! @' ]  Z, }0 |7 m" i6 @. O( S/ I; C
.PHONY: clean& }8 J& R0 M8 a7 E# f! O
clean:
+ k5 V  q$ x9 f* i; O$ Z" _% p        rm -f app
) ~" c4 F8 y  T$ S* Y5 Z( ]+ n        docker rm -f app || echo "Container app already deleted."; p& }8 V4 K* u3 N+ a/ t

$ V( a( n9 ]* X- A
' t/ b1 O7 r# \# E9 q0 V# V' ?
这样写好之后,就可以使用 make bulid 来生成镜像,使用 make run 来运行镜像,使用 make clean 来删除镜像。所以这看上去就有点像脚本的函数一样了。
变量的基本语法
  • 变量与变量内容以『=』隔开,同时两边可以具有空格;
  • 变量左边不可以有 ,例如上面范例的第一行 LIBS 左边不可以是 ;
  • 变量与变量内容在『=』两边不能具有『:』;
  • 在习惯上,变量最好是以『大写字母』为主;
  • 运用变量时,以 ${变量} 或 $(变量) 使用;
  • 在该 shell 的环境变量是可以被套用的,例如提到的 CFLAGS 这个变量!
  • 在命令列模式也可以给予变量。5 o- W. v: c9 }+ [4 G: `
yum安装相关环境
  • 如果是要安装 gcc 等软件发展工具,请使用『 yum groupinstall “Development Tools” 』
  • 若待安装的软件需要图形介面支持,一般还需要『 yum groupinstall “X Software Development” 』
  • 若安装的软件较旧,可能需要『 yum groupinstall “Legacy Software Development” 』1 K8 S6 D/ e& w3 |
编译软件步骤
  • ./configure 创建Makefile文件
  • make clean 会读取 Makefile 中关於 clean 的工作,可有可无
  • make make 会依据 Makefile 当中的默认工作进行编译的行为
  • make install2 d& u- Y  r3 S  ~8 ]5 W' [2 f
如果未指定安装路径,则编译安装的目录是放在/usr/local/etc、/usr/local/bin、/usr/local/lib、/usr/local/man下。
rpm知识
此内容与编译无关。可以跳过,同时此内容也来自于鸟哥私房菜,是一本好本啊~
RPM 安装 (install)复制
1
' f3 S/ i0 U  L& Y; v( |& F* t: w2% t4 M! }: f2 f# Z8 p& k, q
38 l* R% |" q; X/ G5 m9 g$ X
4% \5 O1 v6 d# {% b+ y7 T
5) I4 S% d) Q' J. W% q8 c
6
5 G, f& B5 T9 r" B" t7
* W* b* N4 D; X6 F2 v( t* [+ s. `8" m9 d: c3 Q8 N, \# N! i2 g
9
  B2 V  A8 z0 O4 Y10
, @' i) g/ `# W9 q4 E1 w
[root@www ~]# rpm -ivh package_name* d4 z) P7 M# f5 n/ c
选项与参数:
) d: G" W4 |3 p9 |9 [+ Y* S-i :install 的意思& O5 V/ |, w, p/ w+ W7 q. ]( W
-v :察看更细部的安装资讯画面
( s7 C1 w9 g! Y-h :以安装资讯列显示安装进度4 N4 G  S% @3 y+ }4 v) ?3 M

. c0 ]0 W5 ~8 ~% }. x3 B6 D# V" [. v-Uvh        后面接的软件即使没有安装过,则系统将予以直接安装; 若后面接的软件有安装过旧版,则系统自动升级至新版;3 O7 ?, F1 S# r: Y+ ]: c& ~
-Fvh        如果后面接的软件并未安装到你的 Linux 系统上,则该软件不会被安装;亦即只有已安装至你 Linux 系统内的软件会被『升级』
" ~! s# k& N% g! [0 T0 ]$ `& l* R2 P+ t) o0 r
[root@www ~]# rpm --rebuilddb   <==重建数据库
3 E9 w- N$ ^; e
0 g. A- `4 v; n: A( N9 n# B

' ]6 x; [7 ?  M
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 使用时机:不想让该软件在安装过程中自行运行某些系统命令。
    * W; l6 t( j' y5 j
RPM 查询 (query)
RPM 在查询的时候,其实查询的地方是在 /var/lib/rpm/ 这个目录下的数据库文件。
8 n3 G2 }6 y* f1 d
复制
1
; W0 N' z. i' b+ s/ _& X; [$ |2
' G4 U0 [& |3 P) C5 n7 B- R) ~3
5 P( k$ E7 b& q9 |& ~+ o! w4, t2 Q! ?) C+ Y
[root@www ~]# rpm -qa                           <==已安装软件0 G( w3 c0 q2 [+ m8 Q6 B
[root@www ~]# rpm -q[licdR] 已安装的软件名称       <==已安装软件
  A( F* g0 k8 Q) }( N: `. }[root@www ~]# rpm -qf 存在於系统上面的某个档名      <==已安装软件
& A: y9 L0 m; W& L9 n[root@www ~]# rpm -qp[licdR] 未安装的某个文件名称  <==查阅RPM文件, U, {9 e. _  A6 \% E/ ?

& X8 @& [' F$ ?
2 D/ w  t: u' U& _" ]" _2 P, G
5 ~& t2 P! W3 t; M/ `& b/ @& s1 `
  • -q :仅查询,后面接的软件名称是否有安装
  • -qa :列出所有的,已经安装在本机 Linux 系统上面的所有软件名称;
  • -qi :列出该软件的详细资讯 (information),包含开发商、版本与说明等;
  • -ql :列出该软件所有的文件与目录所在完整档名 (list);
  • -qc :列出该软件的所有配置档 (找出在 /etc/ 底下的档名而已)
  • -qd :列出该软件的所有说明档 (找出与 man 有关的文件而已)
  • -qR :列出与该软件有关的相依软件所含的文件 (Required 的意思)
  • -qf :由后面接的文件名称,找出该文件属於哪一个已安装的软件
  • -qp[icdlR]:注意 -qp 后面接的所有参数以上面的说明一致。但用途仅在於找出某个 RPM 文件内的资讯,即未安装的名称
    . q& \- P1 G: f. r
RPM 验证与数码签章验证
验证 (Verify) 的功能主要在於提供系统管理员一个有用的管理机制!作用的方式是『使用 /var/lib/rpm 底下的数据库内容来比对目前 Linux 系统的环境下的所有软件文件 』也就是说,当你有数据不小心遗失, 或者是因为你误杀了某个软件的文件,或者是不小心不知道修改到某一个软件的文件内容
复制
1! Q$ G3 [  z6 V, K2 o9 C% z
25 a6 V$ V2 A2 [& r. R" n5 A
3& P/ G/ y& ^- e% c: e
4
( Q( e* y+ n, w5 V, y( N# p5
+ f7 n* J; w; d1 D' Z- J6
, t  R; T2 W1 o6 o9 I, ^/ B1 l72 N5 u4 C1 Q- L9 }
84 T0 t- E, l4 e. p5 x4 H6 M
9! x, F# L" ^. r% |+ {
10- X1 j* y& _$ _) k5 P7 w& k$ g
11# L: }* h/ J5 w. j6 M, [
12, e  Q5 v# S4 I5 \1 }( p% `* h
13) Y0 ?5 Z! Y( ~% f4 ]" r
[root@www ~]# rpm -Va
+ M' G* O  w' X1 g- ]; I[root@www ~]# rpm -V  已安装的软件名称/ Z" y+ k$ H$ a
[root@www ~]# rpm -Vp 某个 RPM 文件的档名: d; Q4 r1 y( }( c
[root@www ~]# rpm -Vf 在系统上面的某个文件
9 c& c& F) @) v5 I+ R, Q& _" j3 E* `! u& Y
选项与参数:" q4 X  W- j8 x- h
-V  :后面加的是软件名称,若该软件所含的文件被更动过,才会列出来;9 P  s. e; m' ~& A  z
-Va :列出目前系统上面所有可能被更动过的文件;2 j4 ]" p0 g! R0 s: x
-Vp :后面加的是文件名称,列出该软件内可能被更动过的文件;7 O  G6 c/ H$ b! @5 `
-Vf :列出某个文件是否被更动过~6 V* @" m- u9 v! \  x' }3 T% m
. c/ x; q8 A' a& J+ }7 m2 A% Q
[root@www ~]# rpm -V logrotate
) }6 m2 N6 p8 _( l7 g8 V3 E..5....T  c /etc/logrotate.conf
" y$ O7 Y9 ^+ a
. g/ h, G8 y) O' v

2 @' h( V' @7 ^- _; V
第一列的含义有以下几种:
) z. g1 S. X" @7 ?; o4 y
复制
1
1 m5 h: Y: y1 M! m! w) \2% O, W; |% q5 ?$ s$ K& w. o
3
  c* Z; p) V/ U5 }- ]/ h" U  s6 [- ~4
% \4 l  a! y) M+ C# x50 l% o9 q. F4 R% r* n3 m
6
$ i& {, z7 _7 Z3 ?2 J* L, A7: R7 h6 T7 S& @/ m: U! P( }
8
- M+ L1 v, F5 Q; c, b! |, u9 n
S :(file Size differs) 文件的容量大小是否被改变
3 R4 l) O9 g& q. P0 G# Q! vM :(Mode differs) 文件的类型或文件的属性 (rwx) 是否被改变?如是否可运行等参数已被改变8 f6 L/ i- P1 R7 U: c/ b
5 :(MD5 sum differs) MD5 这一种指纹码的内容已经不同
8 X5 ^. O+ j, ^D :(Device major/minor number mis-match) 装置的主/次代码已经改变
$ ^/ h; d# _' I9 AL :(readLink(2) path mis-match) Link 路径已被改变5 D0 \3 ]2 d5 B
U :(User ownership differs) 文件的所属人已被改变
0 Y8 y7 c! [4 |9 C9 \# w3 y6 ^2 CG :(Group ownership differs) 文件的所属群组已被改变
* m$ G6 @8 s$ }) UT :(mTime differs) 文件的创建时间已被改变3 l* R% V4 t+ \( k

# f* C" f% u0 q8 F( \
/ v" l( h! c; H5 t. F1 Q

& x& ~* W% E7 M! C  S# x' H) I
第二列的含义有以下几种:
复制
1
( v6 M( X: E+ Z7 Y1 j4 A2
! n1 o# x( _: d; F5 O- N, O" T3
' J) X* C" Z* {% `48 S6 j+ g- F3 O  }, b0 v* b
5
' K8 O8 I; }- q! V, M$ @5 m
c :配置档 (config file). A# [' d) p& o, w4 U( p% H7 x
d :文件数据档 (documentation)- F4 y, ~. {  J( B4 a0 j7 |
g :鬼文件~通常是该文件不被某个软件所包含,较少发生!(ghost file)
6 Z* @* M5 Q* A; s8 R: Ll :授权文件 (license file)
2 I% A6 w4 A( G! `1 ~1 Cr :读我文件 (read me)
+ v3 m/ n" ?, [% g- {( w. H
- g9 S' s  V$ ~5 Y0 b, `. X0 ^  a
, N+ [% E8 @' d
数码签章
软件开发厂商可以数码签章系统产生一个专属於该软件的签章,并将该签章的公钥 (public key) 释出。 当你要安装一个 RPM 文件时:
首先你必须要先安装原厂释出的公钥文件;实际安装原厂的 RPM 软件时, rpm 命令会去读取 RPM 文件的签章资讯,与本机系统内的签章资讯比对,若签章相同则予以安装,若找不到相关的签章资讯时,则给予警告并且停止安装喔。
复制
12 N- q! J1 D; a! w9 I% }1 v
2. R) T- u% L8 d$ }& z! ?, v; L! H
3. p$ {' B0 H! h0 g. ^! O1 w
4
$ f$ a0 u1 f1 w! H1 w6 d57 r; \( j% e0 K9 T
6) y4 J# O3 `  z! Y. b% U
7
/ u6 Q; j# W* q8 B0 }; j8, x& c9 J, y# E
[root@localhost ~]# ll /etc/pki/rpm-gpg/RPM-GPG-KEY-*
" l5 b, A0 n$ p$ _-rw-r--r--. 1 root root 1690 Nov 23 08:16 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-77 t* h: n$ Z/ l' `. N0 g
-rw-r--r--. 1 root root 1004 Nov 23 08:16 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Debug-7
. v9 J! j7 H) ]1 A7 K: B' @-rw-r--r--. 1 root root 1690 Nov 23 08:16 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Testing-7
( H/ M2 f. |- F( D1 q-rw-r--r--. 1 root root 1662 Oct  2  2017 /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
$ f4 o4 T3 @! o0 b-rw-r--r--. 1 root root 1340 Mar 23  2017 /etc/pki/rpm-gpg/RPM-GPG-KEY-remi
+ G' |1 R" u( c-rw-r--r--. 1 root root 3100 Mar 23  2017 /etc/pki/rpm-gpg/RPM-GPG-KEY-remi2017
; E2 U1 T) a4 L-rw-r--r--. 1 root root 3143 Jan 16  2018 /etc/pki/rpm-gpg/RPM-GPG-KEY-remi2018
- r0 B$ _' ]% J% n6 h# R
$ `9 T5 f# \% t$ N  G' |/ M

/ H' p0 c3 p! O" nSRPM相关知识
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 不但进行编译跟打包,还同时进行『安装』了3 R" U8 ~" q/ A, A2 O* W4 H
示例:
复制
1
$ x6 X1 z2 ~4 O8 u8 z- N2. h- F- }! `! y0 G6 S+ n+ o4 S7 g3 x
3. b! e2 e5 m# S& z; \) `/ o
4
) R% _$ M$ ~0 z: a7 y* n5
( C% A3 A, I8 o6# q: T: h$ j# W. ~  B- H7 T: u8 p# b
7
2 s2 }% E' c. K- q. h8 S* Y1 E8: D) t9 w% y' a5 [, ]  ^
9* x% m. [$ _% f9 S+ f! H, F' w
10! L, P0 x& F, f) H  t" q8 {
先下载软体:
) W; o) i1 i# Fwget http://vault.centos.org/7.1.1503 ... l7.centos.1.src.rpm
1 z; `$ a. Y7 v% R再尝试直接编译看看:
# [3 P" W0 X: @% B" e! _rpmbuild --rebuild ntp-4.2.6p5-19.el7.centos.1.src.rpm5 ^* ~* [; F* w" Z9 x5 v, K
上面的动作会告诉我还有一堆相依软体没有安装~所以我得要安装起来才行:
* w' _" y$ E: v, p# tyum install libcap-devel openssl-devel libedit-devel pps-tools-devel autogen autogen-libopts-devel4 s" c: `7 X% s. X
再次尝试编译的行为:+ H* \2 s6 h" d+ G( l
rpmbuild --rebuild ntp-4.2.6p5-19.el7.centos.1.src.rpm
4 f8 d: o8 i9 w2 s; F最终的软体就会被放置到:
/ S( s6 P2 e1 {, p) P; j/root/rpmbuild/RPMS/x86_64/ntp-4.2.6p5-19.el7.centos.1.x86_64.rpm6 j& c$ B. G0 u* R3 D7 c4 k
: w3 J+ w. [$ K& g4 U5 o4 L4 [
  l3 m$ N9 F# S
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}来创建。具体的各目录的含义如下:
默认位置
宏代码
名称
用途
( _- X  G. o& g1 J+ @' h
~/rpmbuild/SPECS
%_specdir
Spec 文件目录
保存 RPM 包配置(.spec)文件

6 t' W- Q7 D. P% H# S  ^
~/rpmbuild/SOURCES
%_sourcedir
源代码目录
保存源码包(如 .tar 包)和所有 patch 补丁
& D- Q2 K5 H$ L' X
~/rpmbuild/BUILD
%_builddir
构建目录
源码包被解压至此,并在该目录的子目录完成编译
9 H- m+ J/ f- p' K2 w$ d5 h, U
~/rpmbuild/BUILDROOT
%_buildrootdir
最终安装目录
保存 %install 阶段安装的文件

' E8 s8 ^1 o7 P( W& h
~/rpmbuild/RPMS
%_rpmdir
标准 RPM 包目录
生成/保存二进制 RPM 包
$ }3 c( g8 T& {- H! Q; A- k; `
~/rpmbuild/SRPMS
%_srcrpmdir
源代码 RPM 包目录
生成/保存源码 RPM 包(SRPM)

7 i8 x- z) a+ X7 E3 c
. |4 B" y- r+ ]) [% s
使用rpm -ivh来安装srpm包时,会生成很多文件在/root/rpmbuild下:
# s: g% [# @4 g2 e: v. p) k
复制
1
# }0 C8 {+ v* F1 x27 Z4 ^6 @9 M1 b! ?5 z
3! W6 b( V' L4 y; R! j) r
4
6 ~5 n% T1 N7 T3 J4 @9 g5' b* B2 y! S* U) t. N
6; |) C! B/ ?0 a- a9 M+ w2 P
75 G; U+ h3 n% T% S3 y/ N
8
( S# l$ v# l' U' M' |1 e9" D+ y6 J6 `, O3 N6 O7 `( j
10
: H0 v! x1 ?( d' }( y, g- D11
5 }7 `; n" X/ P) S- T# a4 y" ]12. b: z: Z# d5 \# c
13
& C1 K& |* @2 H143 g1 r8 [5 j, O. Z. ^
15
, V6 ]9 l7 D* k$ I7 X: m16
3 l+ P2 @; g+ o- v% H
[root@localhost ~]# rpm -ivh ntp-4.2.6p5-19.el7.centos.1.src.rpm4 M6 E$ ~; l; q2 J! ?; J8 p0 Y6 e6 g
Updating / installing...2 x8 t* m7 M: v" T) g6 `  L
   1:ntp-4.2.6p5-19.el7.centos.1      ################################# [100%]$ s* U/ W4 L& C
[root@localhost ~]# tree /root/rpmbuild/% W! |% v: I3 f5 Y) _6 h( L9 {/ r
/root/rpmbuild/
) g% }8 ~2 f8 A( L) x( H) {├── BUILD
$ O$ V+ N* V+ b2 h- o# w1 }' Y% w├── BUILDROOT4 p; H5 Y) ~2 m; o6 J% P
├── RPMS# Y2 }' ~- W# O8 B# t
├── SOURCES) b( y7 f5 u' e- M+ H
│   ├── ntp-4.2.4p7-getprecision.patch
' R1 G* c  i+ j6 l0 }7 H8 D│   ├── ntp-4.2.6p1-cmsgalign.patch
, D5 k1 Q. n. n5 Q! \! K$ d- }。。。/ D* C4 |9 K% z( b/ y- M/ e
│   └── sntp.sysconfig
5 o& M+ |( P# c) k$ @. h9 f( |0 Q├── SPECS% U/ K! R( L8 V3 X9 i
│   └── ntp.spec
/ X  A5 v: N; p9 g" }└── SRPMS' W8 ?" P) y" h) v* O! t9 \

& f0 {& Z: n5 G, T( y$ y- b
8 B/ E3 Q% B$ S4 _( c

$ a/ C6 H$ D, {$ e' Z9 y
解压完成之后,srpm本身就提供了spec文件,可以直接通过以下方式直接安装:
复制
1
& d& H3 P# o5 s% s8 s* h2; V) g/ I' X! D& B0 k1 ?, X7 Q
[root@study ~]# rpmbuild -ba ntp.spec   <==编译并同时产生RPM与SRPM档案 ) M5 G* u5 c/ {% z
[root@study ~]# rpmbuild -bb ntp.spec   <==仅编译成RPM档案
3 n+ v; P7 t! C+ _; V! Z# n

! t) ?* k* Q7 n) V# m. q. e! k

0 N3 A0 B- U) j9 R+ `spec打包流程
SPECS下是RPM包的配置文件,是RPM打包的“图纸”,这个文件会告诉rpmbuild命令如何去打包。“宏代码”这一列就可以在SPEC文件中用来代指所对应的目录,类似于编程语言中的宏或全局变量。当然~/rpmbuild这个文件夹也是有宏代码的,叫做%_topdir。
打包的过程有点像是流水线,分好几个工序:
  • 首先,需要把源代码放到%_sourcedir中;
  • 然后,进行编译,编译的过程是在%_builddir(~/rpmbuild/BUILD)中完成的,所以需要先把源代码复制到这个目录下边,一般情况下,源代码是压缩包格式,那么就解压过来即可;
  • 第三步,进行“安装”,这里有点类似于预先组装软件包,把软件包应该包含的内容(比如二进制文件、配置文件、man文档等)复制到%_buildrootdir(~/rpmbuild/BUILDROOT)中,并按照实际安装后的目录结构组装,比如二进制命令可能会放在/usr/bin下,那么就在%_buildrootdir下也按照同样的目录结构放置;
  • 然后,需要配置一些必要的工作,比如在实际安装前的准备啦,安装后的清理啦,以及在卸载前后要做的工作啦等等,这样也都是通过配置在SPEC文件中来告诉rpmbuild命令;
  • 还有一步可选操作,那就是检查软件是否正常运行;
  • 最后,生成的RPM包放置到%_rpmdir,源码包放置到%_srpmdir下。
      P9 M. G, [0 ]) H0 p# \5 E( f
spec文件内容
使用vim a.spec之后,会自动生成spec的结构体,内容如下:
复制
1. t7 s" I6 a: e
2+ T0 P" m3 t5 l/ D' p  R
3
  k% [: G$ a% H3 m4 k* }( N- k44 z  u- Y% M/ Z8 `$ X! c) z
5
/ X5 ~1 y' z0 J  H6
2 W* `  _! |6 {* ~2 w; o7" g: T/ z+ p" ~6 D6 d) r5 T- J7 E
8
! ^0 m7 i4 c( `! T  {3 a/ M9
0 `5 |- ?+ t: C2 f; g4 D1 ^10) L# S: [7 u# k. m; b
11& ?# E2 P( s! ^: c
12; \- f# [% b( o; l
13
# @. `" s6 p8 t; z4 P14
5 I- }5 s4 o$ R2 d9 N4 o- v2 n159 H, U( e# a7 K4 Z+ s( ?0 }5 v
16, y3 }; i0 P% r* S4 b& I
17- @5 ]4 ]: n, p; o$ R  Y
185 O7 p3 ?- f6 e; E7 L
19
8 {9 F6 i& _" G+ j: O3 S! L* h20" y. l- s( F( Q, M; a
217 T0 d& M0 x% p8 q3 S$ }5 [
22
# X: m# v0 c7 s7 o. c- l23' D* K# n2 f) s
242 q! R  `8 v# \, f+ `  {, ]/ D, r
25+ G- t+ f; p* }+ s6 t
26
+ z5 ~* Y6 y$ j1 @( F27
# g4 J. z7 @9 y5 a" y  u0 o; D286 P% J  J: a+ P
29
* z8 f1 {! l3 c( v" L$ s
Name:                                                                ==>软件包的名字,后续可以用%{name}来引用8 f; d) \# [( D5 p# P
Version:                                                        ==>软件版本: l$ Q* C, @# ~% s0 {6 c6 _8 w
Release:        1%{?dist}                                ==>发布的序号
; Y8 A3 |9 w  S6 X' m, {Summary:                                                        ==>软件包的摘要信息
  H+ \. G) m$ U2 @
$ V  u! }2 u  B4 E3 t6 s+ lGroup:                                                                ==>软件包的安装分类,参见/usr/share/doc/rpm-4.x.x/GROUPS这个文件: J* P( R* T* J' A4 i
License:                                                        ==>GPLv2,授权方式! |! @6 m5 m1 T! x
URL:                                                                ==>这里本来写源码包的下载路径或者自己的博客地址或者公司网址之类,无实际用处
; X% x; V8 q4 ~( ]( `/ ^( L, QSource0:                                                        ==>%{name}-%{version}.tar.gz源代码包的名称,这里的name和version就是前两行定义的值。如果有其他配置或脚本则依次用Source1、Source2等等往后增加即可。0 d2 ^( I  F7 j2 q
- H4 N, I& t6 U8 V2 B4 m9 y1 c
BuildRequires:                                                ==>在本机编译rpm包时需要的辅助工具,以逗号分隔。假如,要求gcc的版本至少为4.4.2,则可以写成gcc >=4.2.2。- g1 O. Z7 }1 N2 g- B
Requires:                                                        ==>编译好的rpm软件在其他机器上安装时,需要依赖的其他软件包,也以逗号分隔,有版本需求的可以
9 `6 R6 p7 O* ~! O2 o; I+ X$ w, ~2 Q2 X
%description                                                ==>软件包的详细说明信息,但最多只能有80个英文字符。
0 A0 i: s0 Q) U
6 i6 K  f% z; }' a* c) ~%prep                                                                ==>读取位于 %_sourcedir 目录的源代码和 patch 。之后,解压源代码至 %_builddir 的子目录并应用所有 patch。
# R* C! r6 X5 ?- E0 E%setup -q                                                        ==>使用这个语句实现%prep功能,仅能解压Source 或 patch 定义好的文件+ I( O' T6 |1 }5 [  U; u; W9 W7 S
3 b5 T$ B& Z8 P: ]( E6 J* _2 C* J
%build                                                                ==>编译位于 %_builddir 构建目录下的文件。通过执行类似 ./configure && make 的命令实现。
9 ^9 H6 t+ h6 f" }; C* `' f+ e# j%configure. }: T1 I* Y! K3 y* K4 |
make %{?_smp_mflags}, _+ i4 P6 F1 Q" F

/ B* i9 J9 e3 v7 a; E%install                                                        ==>读取位于 %_builddir 构建目录下的文件并将其安装至 %_buildrootdir 目录。这些文件就是用户安装 RPM 后,最终得到的文件。注意一个奇怪的地方: 最终安装目录 不是 构建目录。通过执行类似 make install 的命令实现。# l. l3 _9 k+ s, U0 t1 X
make install DESTDIR=%{buildroot}% \0 L6 b1 g3 C$ d2 x! E

6 y- E& I: `+ }( ~  |9 B* r%files                                                                ==>软件文件和目录, v! ~0 @5 ^3 [$ M: t
%doc                                                                ==>软件说明文件# z( y- T5 Y$ B. V/ n; s! i( r
0 F3 o* R# L3 _* e3 C/ Y
%changelog                                                        ==>更新说明,星号(*) 后面应该要以时间,修改者, email 与软体版本来作为说明, 减号(-) 后面则是你要作的详细说明啰
& Q/ e, }6 d: o1 @7 g! A) [2 c

' E- |$ Z( `9 f' R# {: F/ \) c
# `; p" j$ Q9 U
除了以上这些,还是以下阶段:
  • %pre 在目标系统上安装软件包之前执行的Scriptlet。注意跟%prep的区别。
  • %post 在目标系统上安装软件包完成之后执行的Scriptlet。
  • %preun 在从目标系统卸载软件包之前执行的Scriptlet。
  • %postun 从目标系统卸载软件包完成之后执行的Scriptlet。+ i5 p4 N9 {9 e  b- M
以下介绍一下比较重要的阶段。
%prep阶段
这个阶段里主要完成对源代码包的解压和打补丁(如果有的话),而解压时最常见到的就是一句指令:%setup -q。这句指令可以成功执行的前提是你位于SOURCES目录下的源码包必须是name-version.tar.gz的格式才行,它还会完成后续阶段目录的切换和设置。如果在这个阶段你不用这条指令,那么后面每个阶段都要自己手动去改变相应的目录。
如果在%prep阶段,只使用了%setup这个宏变量,代表了会运行以下操作(假设Source为cdplayer-1.0.tgz):
复制
1
1 R6 Q+ H$ q4 r7 ]$ R, @0 H8 n4 O$ O2, ]2 U: A" s0 y* Y
3
" S, [' @7 U3 b4: j  @* j) p& `' c% z
56 {# N+ T7 W9 {5 M
6/ M  f) q# E- `0 C+ F
7" _3 J; O4 C5 O/ N
8
8 B0 R2 Y, r+ b9 g9
5 G$ k' L. F, S" i; w10
6 t" W  \9 `3 P
cd /usr/src/redhat/BUILD
5 {# W' {1 I9 j! n" i2 I4 c  brm -rf cdplayer-1.0
. G* k2 Y* R& q( ^2 ^3 ?+ Zgzip -dc /usr/src/redhat/SOURCES/cdplayer-1.0.tgz | tar -xvvf -
; j/ A0 T4 f. `8 w/ ?- n( Uif [ $? -ne 0 ]; then) F1 e  p& X5 R
  exit $?
9 ]) R( L' }' P) O& x3 o6 C& R# e; q0 zfi
4 O/ U% B3 b# ~: u9 _7 _: [! Hcd cdplayer-1.0
5 Y/ \! ]7 d/ `- Fcd /usr/src/redhat/BUILD/cdplayer-1.0
, i  A% ?0 h& T3 \+ s; bchown -R root.root .7 O& e- a" G/ C# ^
chmod -R a+rX,g-w,o-w .6 C" `8 u; i6 ]2 s- |2 D
3 k9 `* f& t6 E" |" S+ Z3 K  t7 s
) Z" }3 |* _: d& w$ H- X
可以看到,默认操作为先进入BUILD目录,然后再删除%{name}-%{version},再解压,最后再修改权限、属主等。参数-q是指不输出运行的过程,还有其他参数如下:
复制
1; V/ Q5 k2 Q, }/ H6 `; w
2! k) |+ v. X1 o2 j% V9 {, l7 @! h
3  k, h3 l& X# v/ ]
4
( L. B$ E4 c. }; M* F5. U" Y9 z4 z) N
6
5 I# F8 m% f6 ^, {* H1 ~; o  x7
% X0 |) ?4 _2 M; q4 N- E) h3 l86 P5 W+ X( d2 y$ j
97 P7 Y9 e. h/ k+ Y
10& [; {" T$ x% b4 e
11
+ m) z( c  a& w7 R+ E5 v12
2 v) Y, J$ j! v/ Q13
9 W; Q; u  F% u14) [# L  a$ `4 k0 k
15  S2 X+ u8 c9 ^1 Z. V
16) p3 g- _. _' F( ~3 G
17
! F3 Y* h$ n2 Q) [18: p  t8 t9 B% J) ]- M4 r
19
! p6 q0 J' D  Y+ |" e9 |4 `. e+ Y204 v( Q* j' s5 L/ G
%setup -n newdir 先删除/usr/src/redhat/BUILD/newdir目录,然后将软件包解压在newdir目录;再进行这个目录进行权限设置* R, K2 [* j2 \
%setup -c 先创建目录,进入这个目录后再解压。与不加参数的%setup比较,仅仅是多了mkdir 以及 cd 这2个命令
4 n$ H: E9 G9 g" Y! r' J+ r8 ^%setup -D 解压缩时,不会去删除目录。与不加参数的%setup比较,少了rm -rf操作
/ w! F6 f8 x; U9 A%setup -T 不进行解压的操作。与不加参数的%setup比较,少了gzip以及if判断语句
2 q; n' S, t( {7 i: x
5 b6 F+ I( `  U! X%setup -b num 将第num个source文件解压缩。如果是 %setup -b 0,就会解压2次,可以使用 %setup -T -b 0,这样就只会解压一次了。但只效果跟 %setup 不加参数的效果是一样的。8 l* V4 L- S' w: O. s" l* `
%setup -T -a num 先进入目录再解压第num个source文件. c' N( d* [2 ^  ]# \1 K* g

7 c6 T  v3 S/ {$ k0 R, K
7 ~" ?- Y8 @' w% A! c%patch 最简单的补丁方式,自动指定patch level。& t: Y* {/ `$ |2 B$ p9 h4 R4 L
%patch 0 使用第0个补丁文件,相当于%patch ?p 0。
7 a6 [6 _# F0 n7 h! u%patch -s 不显示打补丁时的信息。
, ]8 {' ]' _8 r$ j%patch -T 将所有打补丁时产生的输出文件删除。: \) M# y; c- y3 Q% }# u$ t% v. E
*************************************/
. m, u5 H9 l% n%setup -q -n %{name}-%{version}
! q2 m6 |* |" H! D, ?$ i$ p4 Z# o/ o( Z; }
/* 如果原来只有一个“Patch:”,您增加“Patch1:”,则在SPEC文件%setup行后面的
* A; }, A$ ?" ~" Q4 R' n   %patch -p1后面新增一行: %patch1 -p1 依此类推.: K7 C7 C$ \. e
*/
( P( A" I' |/ |* C7 m7 j4 x( s%patch0 -p1
. ^6 f7 y+ m% C. _' z

  _* u$ I- J/ P

+ A, i- b# A+ R
实例,如果%prep的内容如下:
复制
1
# s! T+ @$ J/ T2" K& W7 m  Y# A
30 a/ Q! V$ t4 b' @% D3 @' b
4
0 e9 D. d& z! R  ]) J: l
%prep5 s* y# F. @. n% q; o: v
%setup
8 t" Y3 z! T% U; k%setup -T -D -a 14
7 F) o$ ]. b: j' u%setup -T -D -a 159 r& }) a- L. p; Y5 O$ [3 N" j
' R# R, m/ V) O; E! ^) O

$ ~# S' G2 }) P
其运行的过程如下:
复制
1( u, \2 J  V, ^+ ~; l9 A' \2 f, [. G
2
" _, i! J8 P* p9 o# ?3
( L8 m! `3 \, G% K5 C( n# e44 T. k0 b, U0 x8 p9 Z: Z# h: e/ N5 w
5, J7 u8 i! Q8 V( c$ _% I5 U; J7 M2 D
6
8 h& i" T7 a7 U* a7. V5 L/ f! v, h: m8 S) R& u
8
  ~8 X- H2 v" [1 w; C97 a) q( Y6 Y" c  x2 u
10& P7 X$ @/ S  o: y7 S
11
- w# m+ I! \' e9 w6 Q. h12- D0 U4 L# t1 T7 O2 b
13- g3 Q$ f1 X  N" D% ]
14
& `0 Z7 D5 n. M% B( e# |1 @15
3 ]* P) F8 Y% F; s4 M6 M& Q; D16* Y4 f: Z, s+ g/ ~5 _/ }: g4 ?
17
- @3 X0 E" V: x188 |- W0 @- D. l# y( p) v$ B* R, e0 j
19, D1 t- l- s/ Z$ v" p
20
* O8 U: E0 J, r" m: J21
* j5 G+ Y! o: E6 H. g# x22
/ l% C4 L1 w) k23
+ j7 P$ m4 R7 U6 Y24
) M( s5 J0 }. [% h2 ^* P25# e. J8 |! {+ ]3 J5 i
26
$ y/ V8 {' I$ l" @9 q8 a( `  {
[root@localhost SPECS]# rpmbuild -bb nginx.spec4 ~) K3 f1 t' R
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.N1Tdpo
5 F9 t' ^, e7 u2 E+ umask 0227 r: n& j" p* w! u! d4 e2 C3 M
+ cd /root/rpmbuild/BUILD' ?/ W' B1 i  F# e
+ cd /root/rpmbuild/BUILD" n* T- |& |. U& M* e0 I6 _
+ rm -rf nginx-1.16.1
( w3 r3 y+ n0 D+ /usr/bin/tar -xvvf -& k2 v! P/ Q: }- r9 t4 e) A2 y
+ /usr/bin/gzip -dc /root/rpmbuild/SOURCES/nginx-1.16.1.tar.gz' `% `5 n, `1 _3 {# z
...4 E% B8 r9 n- B0 B5 a4 K0 K
+ STATUS=0
. V; O8 C$ \- a+ }8 U& Y8 H& m3 v% O+ '[' 0 -ne 0 ']'
  A+ ^9 z+ a- n) f+ cd nginx-1.16.1
$ \, J4 ^) J" {) P9 r. |& C+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .  C  U  k% u5 n/ w0 {' J
+ cd /root/rpmbuild/BUILD5 S4 x* U8 v. W  J. Q3 x5 |
+ cd nginx-1.16.1+ k3 j' @& _9 g' f5 h
+ /usr/bin/tar -xvvf -
1 a' b& w* d* ~  g" m: \+ /usr/bin/gzip -dc /root/rpmbuild/SOURCES/nginx-http-concat.tar.gz
# C2 {. v4 N; d0 Y+ a4 o...
: s" A1 K& j8 F) p3 @+ STATUS=0
0 d6 `  k' s" J# i( z2 C  }$ M+ '[' 0 -ne 0 ']'& @7 E5 F7 c: \/ n
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .; E9 X; _* W, m& D$ v
+ cd /root/rpmbuild/BUILD
& C' d3 n* ~3 d+ cd nginx-1.16.1
$ V+ a* `5 N9 o/ I* g+ /usr/bin/tar -xvvf -6 M! b) n/ w1 ?" K
+ /usr/bin/gzip -dc /root/rpmbuild/SOURCES/ngx_cache_purge.tar.gz
! z% ~2 p" H  m- l...
7 k% c* e& r/ g0 X

. H( q/ W# w, K$ t
) L+ ~0 \5 V6 k# j
需要注意的是,%setup -q 是指解压不输出任何提示消息,只会解压source0的文件,即第0个source文件。%setup -T -a num 先进入目录再解压第num个source文件,进入目录的意思是进入%{name}-%{version}这个目录,即spec前面定义好的Name以及Version。
, e/ ^4 R+ D& ~. C" Q" n
" j$ r2 i- C1 `% R# n$ B
%build阶段
这个阶段就是执行常见的configure和make操作,如果有些软件需要最先执行bootstrap之类的,可以放在configure之前来做。这个阶段我们最常见只有两条指令:
复制
1
% |$ U( N, W/ T2
0 x% l2 r' n& U0 V7 y6 X
%configure
* g4 |/ ~9 f' I& W1 |8 jmake %{?_smp_mflags}
$ \, V. w, O! L; u

+ s- A! m& V7 c1 E' n
, G. U1 O" Z% O
这里的%configure是个宏常量,会自动将prefix设置成/usr。另外,这个宏还可以接受额外的参数,如果某些软件有某些高级特性需要开启,可以通过给%configure宏传参数来开启。如果不用 %configure这个宏的话,就需要完全手动指定configure时的配置参数了。同样地,我们也可以给make传递额外的参数,例如: make %{?_smp_mflags} CFLAGS="" …
%install阶段
这个阶段就是执行make install操作。这个阶段会在%_buildrootdir目录里建好目录结构,然后将需要打包到rpm软件包里的文件从%_builddir里拷贝到%_buildrootdir里对应的目录里。这个阶段最常见的两条指令是:
复制
1; y- h: E. g. g- U$ J
2
  C2 I/ K/ z9 T' }0 F* j7 |  c  h, i
rm -rf $RPM_BUILD_ROOT
* w; m9 u5 b4 m8 `8 r' l% }' Amake install DESTDIR=$RPM_BUILD_ROOT- A0 _) A8 R( g, k& g; B! M: W
& D. \) s. I" ^, U, W2 f
1 I9 `% o. ]5 T. W
其中$RPM_BUILD_ROOT也可以换成我们前面定义的BuildRoot变量,不过要写成%{buildroot}才可以,必须全部用小写,不然要报错。
如果软件有配置文件或者额外的启动脚本之类,就要手动用copy命令或者install命令你给将它也拷贝到%{buildroot}相应的目录里。用copy命令时如果目录不存在要手动建立,不然也会报错,所以推荐用install命令。
制作rpm软件包的阶段
这个阶段必须引出下面一个叫做%files的阶段。它主要用来说明会将%{buildroot}目录下的哪些文件和目录最终打包到rpm包里。
复制
1
" _) R1 U& b* `7 v! \2
9 k4 a1 e9 h# l) w& V8 O3
; d! m# V8 I- J5 {" [
%files! f2 Y3 Q5 o2 W% p) ^8 i
%defattr(-,root,root,-)
& i% `% a6 B: L" v- d2 O" p! r' e%doc
/ m! M: G4 K8 P/ X

) }/ d) y% W  h8 T! L. _3 S
$ r+ o( l+ ~4 O0 A
%defattr 表示的意思是: %defattr(文件权限,用户名,组名,目录权限) ,如果不牵扯到文件、目录权限的改变则一般用%defattr(-,root,root,-)这条指令来为其设置缺省权限。
关于%files阶段有两个特性要牢记:
  • %{buildroot}里的所有文件都要明确被指定是否要被打包到rpm里。什么意思呢?假如,%{buildroot}目录下有4个目录a、b、c和d,在%files里仅指定a和b要打包到rpm里,如果不把c和d用exclude声明是要报错的;
  • 如果声明了%{buildroot}里不存在的文件或者目录也会报错。
      I$ w. b! i2 ~* x2 m
代表路径的宏列表
如果您看到一个不熟悉的宏,您可以使用rpm --showrc 或者 rpm --eval %{_bindir}以下方法对其进行查看:8 K, a+ D% J; s9 N0 e
复制
1
" ?8 i" u# J5 K  e2
6 Q  n+ F& o; @: b7 [* a31 M, R3 }1 f3 N! X0 I
4
% h4 b1 b' ]# R! k6 ]5
/ y& m/ j+ m1 W5 b6 P4 l6
0 b6 U! y6 j: p- ?6 \
$ rpm --eval %{_bindir}. y- p6 w) h6 C- g3 n4 ?: n
/usr/bin& t! g( f$ t: @2 {1 q- h
& v$ ~. B9 ^- C9 Z
[root@localhost noarch]# rpm --showrc |grep buildrootdir
- G) A( e' R' y1 t3 F4 ]. \9 T-14: _buildrootdir        %{_topdir}/BUILDROOT
) S% N- t6 C9 [6 `  p6 R  v1 Y$ \-14: buildroot        %{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch}
7 P2 k9 o% h: P# R9 m
6 Z1 H- \2 @" i
8 ?' c/ C* `3 |; h5 s: ~6 @% H9 @+ e% [

# n) C( U; D- ]# C& o
也可以直接查看/usr/lib/rpm/macros文件,以下是常见的宏:
复制
1
# J& S9 q' z" n4 C9 ?8 B) X5 f2 |2
+ U: ^) M. U# C+ M3' V4 P7 \  E/ I0 k
4
4 }/ o) L+ F4 X# y5
" c: p1 D6 o: H6
1 _/ U# L- F0 m- @! O% }5 b( i# o7
' v8 t7 q: _- k9 D8" ]5 U& S. @5 z+ I& j& B
9
" @9 U9 W% S; O/ W: m108 Y9 L: _" ]. G1 `. U; H& `' ^
11. Z! A2 i% }1 L& A; I3 N' K
12
( h6 ^& d% z* O/ q& l5 M# C9 y13: q: R" l; D# e7 D& T$ L
14
* d, P+ m; v3 ]4 }15
( u/ g3 k! g7 R. h161 k7 A9 f; O$ j- u
17
( T1 G  W1 e8 I18
) b5 V! h9 N2 {5 P. A; f% [( T19. U1 V- i2 v9 R1 A$ K. E1 S$ N! a! G
20
$ u  }7 @& \6 \& X0 Z219 F( v7 ?( c* v" {4 |, R, v
22$ w. F* e& k* g6 w6 H( w8 \
23
$ X% D6 y* s, F2 Q; a
%{_sysconfdir}        /etc) P3 W: x, ~' F
%{_prefix}            /usr
' P6 X( ^" J6 R, Q/ o%{_exec_prefix}       %{_prefix}; b7 {; ^, O, y% }; z6 p, t  L, e  ^
%{_bindir}            %{_exec_prefix}/bin
, z0 H" {0 k( l7 i1 o%{_libdir}            %{_exec_prefix}/%{_lib}4 q* J: E7 u3 f
%{_libexecdir}        %{_exec_prefix}/libexec
- L& x3 G, B9 k# U! c/ Q3 u%{_sbindir}           %{_exec_prefix}/sbin5 |6 |0 n  \" F5 l6 ]9 I- D: Y
%{_sharedstatedir}    /var/lib* X6 H  H. y3 I' T% ?
%{_datarootdir}       %{_prefix}/share
4 M0 C; \( y% Z& x( d%{_datadir}           %{_datarootdir}
6 I$ p; Z. u' j% v9 A! H, ^%{_includedir}        %{_prefix}/include1 ]* e" i  [3 [+ ?8 G
%{_infodir}           /usr/share/info0 G6 Z% Q- e* F3 ~( Q9 I0 J
%{_mandir}            /usr/share/man! ?' @5 V. S: p; x2 E( s! p# D( [
%{_localstatedir}     /var4 C; n9 x5 E/ ]1 s
%{_initddir}          %{_sysconfdir}/rc.d/init.d2 T6 C! L6 S/ A; A) z
%{_var}               /var3 ?1 V, {$ P4 P7 y7 ?* [# l( W" t
%{_tmppath}           %{_var}/tmp9 D( p, D% T, B2 S
%{_usr}               /usr" T1 X9 Z0 ^% `; d+ z0 I1 a
%{_usrsrc}            %{_usr}/src1 [7 D/ j9 N4 O9 V0 p
%{_lib}               lib (lib64 on 64bit multilib systems); _: t0 b3 n  A( @5 D$ f
%{_docdir}            %{_datadir}/doc
! ^( K1 P4 Z/ x. |; o* q  O$ `%{buildroot}          %{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch}3 }) a# K0 l- R$ P. K/ k1 C! Q
$RPM_BUILD_ROOT       %{buildroot}. p9 M. r$ f2 }7 H" G0 ~
. v& o1 v# q# {9 h* C( L2 p, Z
8 L# j, M2 f7 K* j. ]+ l  p
要注意的是%{buildroot} 跟%{_buildrootdir}不同。%{_buildrootdir}对应的目录是~/rpmbuild/BUILDROOT;而%{buildroot}是%{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch},有关其他内容可以参考 https://fedoraproject.org/wiki/Packaging:RPMMacros?rd=Packaging/RPMMacros#RPM_directory_macros2 t/ K% l0 J% X  W- Q/ Z
, u7 ^6 F. i$ g, [5 Q' d9 f8 Z
实例1:打包shell
可以把一个平时写的一个脚本打包成一个rpm包,spec文件如下:
复制
1
8 ]7 q% ]1 Z8 D" ^7 T2
6 H- H$ q$ ~: F1 {# }3
0 v# y7 j; o) ]( V- {, y* Y" V48 ]+ d7 d2 u' H' G( M
5
7 E. I8 N4 z" B# ?2 O) l2 \: B& B- o6
( T4 r& ?# A( N& t  m7
4 J) I% ?% U. p" O8% o. N8 H! l& J: M% W
9) K# X- F# O% O" ?1 g
10
: C/ }, g5 n8 [8 j& w) [  _" c11
  N9 z- x2 a% G' D12
9 L) f' N" z; K! \+ n13, M+ L3 o! g$ C" _0 z
14
& C# p8 j# U* f/ L8 h150 w4 p$ {, P- }7 A! i  U
16
7 A3 F# Y. i  C" ^: ?9 R& F0 k17
6 G6 t0 F; w7 u% r7 x$ Z) n18
+ ^5 |( _  R1 p0 k# `1 V8 U19* I+ q$ K: @6 M1 k; l3 ]
20
- M7 r8 [5 x: D# [21
" w8 [7 u- j' b! z8 \7 ~225 M. g) m0 c; G9 ]/ B/ U3 q9 w
23# ?7 X' E4 k0 D  h! ?
24
0 m) B& h; \8 l- |+ X/ g5 ?, b256 W6 n* i6 Q$ a; b0 w  ~2 @
26$ T# A% P1 ^. U7 R4 N3 `
277 m8 {$ w8 @2 i
28+ p6 A$ ^8 |* E6 M& h* a" O6 n
29$ `! {! e" W8 F
[root@localhost SPECS]# cat disk.spec
' V* @2 r5 i; d( XName:                showdiskinfo: U. d0 m( ]0 Y, t
Version:        1.0! l7 |+ S9 B- }
Release:        1%{?dist}& ~8 K9 H3 O$ l
Summary:        Show Raid and Disk info: L- z. N3 J# C$ ~3 h, l2 |1 [
License:        GPL
& |6 ]; |4 r# E+ e5 EURL:                http://www.wumingx.cn4 e7 y7 a8 t; ^# c+ j
Source0:        showdiskinfo.sh
3 D/ ?/ v" u. q& N5 B3 b* P0 Q) y, R  z5 g- H& R% a# \% _7 G9 l
#BuildRequires:
4 ?  j+ \5 ?& b& `+ V4 T. [1 o7 lRequires:       bash
  d, _' c$ }2 P2 @
) R. E3 X8 ~  s7 v4 e$ K%description
7 f; ~8 Y0 J7 _4 j/ Eshowdiskinfo shell script.3 g9 c6 b9 J1 o# V& }6 ?

4 J: h6 r/ q9 ]# Y# Z%prep
; j6 p- R5 r4 K! A- S) C7 `3 p#%setup -q: D+ [) F% {( s  t

( y! t, I7 E% q9 F! h' L%build1 T, _& i3 y/ {; L" T5 q
cp %_sourcedir/showdiskinfo.sh %_builddir/showdiskinfo; Z- q; [8 P( ]; L
6 Y! S: U8 \# W' b, B5 c; S% s
%install* e  T. a6 G- \% {% E, @' p' B
mkdir -p %{buildroot}/usr/local/bin
$ d9 ?% q) r$ Einstall -m 755 showdiskinfo %{buildroot}/usr/local/bin
, \7 Q, n: `1 N* V/ P. O  V7 j" e9 i  Z; ^# P
%files4 N  I$ e- f( w! u% t
/usr/local/bin/showdiskinfo! S9 y: W( \! V* t
%doc
/ _  [/ Y$ Z* y%changelog
8 x* k0 R4 d& ]9 |3 ~( ^

! [' p) H3 v7 Q- R; i5 B$ z

# z. k; ~  S# N5 d# P
开始编译:
复制
1& d: [( V2 `5 t4 u
24 x' P- {) V: ~8 j2 B
3
* j; r) L, l( O! L' J6 v4
0 L# p; Z; u0 K5+ `4 G1 V+ F+ ~" s
65 I: Y# ~' }: V( T7 r' l1 r
7
0 B6 n2 }$ v3 \% ~' v8
- h, z" o# q4 H& \9
6 r& }1 J3 x* N4 s& N10
" N! e& d2 X& m3 q) C6 u& U/ ~6 l113 s% D( p/ |" p' V  `: ~* d
122 s4 b. q, z# G' [  S3 k
13! T( E5 B* Y! F4 y! g
14
: P0 B  `5 R' l6 K; t- g' m( {( g152 F6 Y6 L4 ~! r' Q
16
2 a7 d& e& E  I! D17; U% S( Y: l* K4 a1 w6 W1 O6 j
18+ \! w0 }2 g- j0 [3 O1 Z
19# s% X' x1 i6 p3 l
20
9 J8 F5 r2 U! E: `" x  Q7 ^8 Q% L21
$ i" F) `8 f. h6 V$ K0 i' S22
2 [& j/ h1 j7 u5 M( o) y238 U0 j( C+ n7 q- D- A
24) e6 A) K/ \& }* [% F
25& E5 f% J! |- k6 _# o, d' f
26
: r2 e" |2 [% n% k+ i27
- S& P- C$ n- z5 S28! d( I# |! j7 ]  X9 w3 M
29, [' G; q* J  [/ R# n4 P, Y
30
8 ~+ Z$ F& t* B/ k31
7 V" T% [  x8 ~9 G% w32
# k  q& {* I; H& C33; z( c  e& q0 }7 g
34
' j' Q# K8 e" [4 W1 i. h" M35- S+ {1 ]- N4 s" I* y( N2 I
36
4 `' l% q$ v* f" x37
4 t  |9 W3 n3 ~, d4 V5 _# r& s386 \9 Q: S: q4 x: s
39+ i( z6 P% ]+ m! P3 c' k
[root@localhost SPECS]# rpmbuild -bb disk.spec
* u2 G1 ?5 \$ x5 i  k& B8 V# RExecuting(%prep): /bin/sh -e /var/tmp/rpm-tmp.agda2b
2 `5 `; b/ o) p+ umask 022( i* ?  v& ^7 g$ p. M: b6 ]! J
+ cd /root/rpmbuild/BUILD
. h0 `* s$ w6 Y+ q( J$ }7 p+ exit 0
7 {% P2 o0 z' K" q6 Y$ p5 L1 MExecuting(%build): /bin/sh -e /var/tmp/rpm-tmp.spexQx. ~( `' E# i6 h0 O
+ umask 022
. v( f+ \9 v8 r& S4 }+ cd /root/rpmbuild/BUILD- m' @# M" d' ]" L
+ cp /root/rpmbuild/SOURCES/showdiskinfo.sh /root/rpmbuild/BUILD/showdiskinfo
; N* y* D7 U' O7 |1 @+ exit 09 P& m( Y/ L; q* O( |& B
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.grcfHT
5 n7 `7 {* m3 u, |" H/ Q; }+ umask 0228 @/ w+ ^( n( C. H5 w
+ cd /root/rpmbuild/BUILD
% {) F. r% {0 c1 b0 H+ '[' /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64 '!=' / ']') r# b! {: Y) I* F4 b8 s+ `- o9 l$ b
+ rm -rf /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64* o% Y, b( m+ S' F/ _, X
++ dirname /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64! R5 M$ l3 k0 ]# X. b
+ mkdir -p /root/rpmbuild/BUILDROOT7 a' L% s! y! g# R
+ mkdir /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64- u" u( A8 C/ s
+ mkdir -p /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64/usr/local/bin
$ P' A1 b+ K+ z8 Q+ install -m 755 showdiskinfo /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64/usr/local/bin
/ d' O5 f( `# l/ L0 `. u3 ?+ /usr/lib/rpm/check-buildroot
; n% N8 r# z/ Q# {+ /usr/lib/rpm/redhat/brp-compress
9 ~5 u5 I- A6 n2 U4 Y& P# I+ /usr/lib/rpm/redhat/brp-strip /usr/bin/strip
7 A( Q: W4 ?3 P; L2 N9 \+ c0 y' W+ /usr/lib/rpm/redhat/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump, |- c1 t$ D3 p+ b+ G
+ /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip
" [; ^/ w+ _' F5 @0 i7 m# Y- G, w+ /usr/lib/rpm/brp-python-bytecompile /usr/bin/python 1
- n. {2 e' T8 L: E+ /usr/lib/rpm/redhat/brp-python-hardlink$ L# _- H: A! j* d. S0 c+ W0 f
+ /usr/lib/rpm/redhat/brp-java-repack-jars* s4 r. g6 o. {$ @( U0 r6 Z  A9 d
Processing files: showdiskinfo-1.0-1.el7.x86_64; x( ]8 H7 R0 }+ `& E
Provides: showdiskinfo = 1.0-1.el7 showdiskinfo(x86-64) = 1.0-1.el7  x& l) _2 s; ]( J2 Z
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1& _( P# v0 D. ~& h9 b* K" n
Requires: /bin/bash8 A4 g7 K4 `4 D* M1 R  ?" _4 X  r
Checking for unpackaged file(s): /usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64
- t, \  e% ^" `$ t9 mWrote: /root/rpmbuild/RPMS/x86_64/showdiskinfo-1.0-1.el7.x86_64.rpm: I# z6 e9 m5 r4 z9 o' K
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.4uHq3D1 i) V  ]& f, y+ g$ ~0 f( y
+ umask 022) g2 a! O/ G6 {6 x1 \- X% c
+ cd /root/rpmbuild/BUILD9 |+ H$ T% O; v' [+ h
+ /usr/bin/rm -rf /root/rpmbuild/BUILDROOT/showdiskinfo-1.0-1.el7.x86_64- |( q7 h9 Y( U9 y8 I: n
+ exit 0
2 [0 f  y$ B( d$ f. n: e

' @& l( W! v3 g+ U* i2 |6 Q5 [+ F- l

/ \- b/ `# b- c7 I4 V) y% t/ ^5 p
可以看到编译成功了,文件保存在Wrote: /root/rpmbuild/RPMS/x86_64/showdiskinfo-1.0-1.el7.x86_64.rpm下,开始查看:
复制
1; Y- W4 n+ m7 K+ x, N
2
$ h* C) P3 h! ]9 r3
& c+ f6 \* V: y/ @5 d1 ~- z4
5 k0 _2 p" O% T2 P; L5
0 c' i4 z/ y3 r- r, L6
# f# g) u( F7 ?# n. m2 ?7
: _, E4 N" R4 y6 O. m6 }86 M1 X7 b1 o, m4 q
9
, B5 T& Y! {4 Q' T$ k! N) ^10) j7 _3 f, I! l7 B. ~) k
11
9 @7 \" ?$ Y) i. q9 i$ @12
" S$ Y5 s( |5 J6 b7 i6 l* D. w139 ^& E# j: h# s$ P7 U# S
14
3 a5 {( q+ |: Y$ G150 k6 ]3 q9 }1 [9 v2 _
16: L1 e' Z/ l5 M' ]8 J
17
' B* v4 o! A% _; ]8 J18
. \: [* m  }8 s8 m! ]& F19
4 |9 C+ ~( p. u! P1 n4 q20; c2 y/ b( O2 V. b. y1 `% d8 c
210 O) L6 s7 n* f/ P, |" T- c
22
4 d# N1 ~, p0 a7 u236 T5 y8 U5 P# l7 s% \! v
24$ _# a8 a4 _, U9 L5 U6 Z
259 Y% `: P0 O+ {% P
26
8 _& u6 ~. b" c/ v" z0 X" F. F273 Y1 y2 v; V. L( o" l
28
! w  v$ H- V3 v" [29
7 l5 w5 _/ a% {/ Z$ [302 R* N' I* s# ?7 m) d% l8 Z3 Q
314 }$ M3 j( t1 H5 D" G9 g
[root@localhost SPECS]# cd ../RPMS/x86_64/
/ B' @* J4 [- b) F- V: `7 a" V9 s[root@localhost x86_64]# rpm -qpi showdiskinfo-1.0-1.el7.x86_64.rpm
/ @, D" J0 y1 MName        : showdiskinfo) K% R, K: ~+ ^  z8 w1 X  t
Version     : 1.0& ]1 b& B; ?8 U1 N7 [" c
Release     : 1.el7' w0 f) i: `7 F
Architecture: x86_64
& @' W7 W8 F( D: t1 W# UInstall Date: (not installed)" z9 b7 Z: F* f2 }- {
Group       : Unspecified: I8 ]% X! }, K
Size        : 383903 M( j  x- T  X4 I' Z( A+ z
License     : GPL" L0 _& ?5 ?4 \% t( F3 X3 J
Signature   : (none)9 l( |, }; ~  r# q2 Y2 k9 u' S
Source RPM  : showdiskinfo-1.0-1.el7.src.rpm; {: `# V' M: Z" w
Build Date  : Fri 08 Mar 2019 06:41:42 PM EST
. M0 O8 X& }! b5 `- `8 v, @Build Host  : localhost
9 N- m1 M+ }2 X, a1 w6 [5 P" {6 YRelocations : (not relocatable)
9 a) p2 \! w. AURL         : http://www.wumingx.cn- \8 P" L3 q* s7 T- b8 d. }
Summary     : Show Raid and Disk info
. V# M/ u- [3 t5 y( vDescription :" `# {6 j3 n- i8 E. ~' s0 |! M
showdiskinfo shell script.
; j3 f7 Z" _" D% x[root@localhost x86_64]# rpm -qpl showdiskinfo-1.0-1.el7.x86_64.rpm" q8 K1 s! J' `% u; W( y6 H  ]
/usr/local/bin/showdiskinfo
# k" q2 ?' y* Z( K' P% n5 ^* G#开始安装
; l" u- j- b6 g; M6 r( J) T[root@localhost x86_64]# rpm -ivh showdiskinfo-1.0-1.el7.x86_64.rpm) K8 J- \& E5 i3 B$ p, |
Preparing...                          ################################# [100%]
( G) a/ F' S4 D! U! P  _; zUpdating / installing...  j2 A. z! L; ?9 @0 [6 B
   1:showdiskinfo-1.0-1.el7           ################################# [100%]' x, F; k/ L( b2 B" a
[root@localhost x86_64]# ll /usr/local/bin/
" ^( b5 ]) t" Y  l0 [  ototal 40* v' O* }8 n- {& C! y9 C+ B
-rwxr-xr-x. 1 root root 38390 Mar  8 18:41 showdiskinfo
/ h# q# o4 K+ \4 Q[root@localhost x86_64]# showdiskinfo1 }+ v, N9 S% J  Y' v  d! H( p- V, [
no raid$ g* L7 c# K9 d: v
6 q; u  R3 U- U- J! t, [& I8 x3 \

  f% F! Z" Y- d+ M5 e6 z
此内容参考了 https://rpm-packaging-guide.github.io/#hello-world ,可以阅读原版。
实例2:打包main
此代码来源鸟哥私房菜,先来处理原始码的部份:
复制
1+ w  O1 ?0 B: \! \9 h
2
* j5 P8 [! F3 t( K+ b3$ _2 p' U) i, O
4
1 C7 A0 D) O5 ?) ~, {7 G5
& K+ Q5 c% ~+ W: f0 _0 R6 K5 C60 Z5 g0 g# d2 W7 `& O" @& B0 u" X
[root@study ~]# cd /root/rpmbuild/SOURCES
& ?! O- i+ ?( v& V8 e[root@study SOURCES]# wget http://linux.vbird.org/linux_basic/0520source/main-0.1.tgz ; o7 s% O, A9 b( Z3 U% `  z
[root@study SOURCES]# wget http ://linux.vbird.org/linux_basic/0520source/main_0.1_to_0.2.patch - l8 _( k% e9 k
[root@study SOURCES]# ll main*) J0 N( g: b6 j# t, v1 e
-rw-r--r--. 1 root root 703 Sep 4 14:47 main-0.1.tgz% I6 [8 l( U; P0 A1 S; s& q# C
-rw-r--r--. 1 root root 1538 Sep 4 14:51 main_0.1_to_0.2.patch% ~( ?0 X4 L6 b  P; o* K

9 y; v# m) L: H2 j$ h2 g

7 r* H! ^' E+ c; a/ f1 o
到SPECS目录下创建main.spec文件,建议使用vim创建,会自动生成格式。也可以用rpmdev-newspec -o Name-version.spec命令来生成SPEC文件的模板
复制
1
* |3 f. p1 O& w1 |4 `% D' a( j2
" Q9 ^* h) f5 y9 [" e3) C1 H+ G  {  a1 a; {
4
1 G: o, K* p# v! ?' @5' a1 W6 E& d+ m( {; |9 ~# l" `
6
  l! l: L1 R& K8 l# m73 n& \+ P! d7 U( _
8
2 ?; ~' l: ^6 P9
% I. O6 ^3 N% C" h# g" w' [10
+ A/ H- B9 ^. x3 S3 _11* ~. Z# ?. x/ j9 M. D7 x( K5 E0 a) l
12, w! v9 r! |% e
132 ~4 r) C, X: l$ @. {; n. H) v, u
14
5 C/ c9 m1 H3 \1 k: E8 R+ n$ {15
3 g- A1 T9 [  ]# \* b16  i/ q" C9 w2 N  i1 k$ y( q
17+ y+ ]1 l: }! ^& U. h. i0 O$ G' q
18% p7 E1 B6 z8 B4 e8 \
192 w, G# e( [2 Q# S
20
5 t) G7 \5 X& Z7 o21
+ z( }' \% A, W% n22
2 v8 `5 w% D% u% b3 \* `23
* F% l- i6 b' q6 A2 G0 E/ f/ ]242 C: p; Z% p3 V
25
; _, L: K2 _* _" Y26
; E! w; Y  N+ J& {8 U2 K27
7 P# Q7 M. \) e28
$ i! u2 _$ [7 P' N2 a7 U3 D1 @29
" ^( l3 h2 [! k- F3 L: j9 _4 P" Z* z30
: k$ ]+ Y9 C) u, H" y5 A; u# J6 `31
# u4 |0 Q  r3 X" A. a328 p- e9 {0 K1 i' B, D
33
1 j3 [- {* [* Q4 m& N# v34
4 e3 i  ]5 n0 l5 ?, G9 y  B  I358 u7 X, |: I1 X1 u+ p
367 b6 q) ^- Y. w/ ~4 y" L$ H' v
[root@localhost SPECS]# cat main.spec0 {- I: J& J) k
Name:                main
% h7 C$ A$ P( ]- |% f$ q7 J+ ?Version:        0.1
" I% v' F9 {" \9 q8 zRelease:        1%{?dist}2 X, M" v1 R9 W6 F% `0 x
Summary:        Shows sin and cos value2 I1 x( K! j) p, y+ V
8 k0 n. D3 w' }1 O( v4 `9 t- J
Group:                Scientific Support: W) |( E; E+ v
License:        GPLv2/ k. e3 N8 C/ Z3 m1 g  @
URL:                http://www.fangdm.com/
' g1 u( e! J, g& p: `Source0:        main-0.1.tgz
: N) A1 O) c) V. v# xPatch0:                main_0.1_to_0.2.patch4 u, z, `2 H0 @# Z0 _: z4 s8 L' _
# c& o5 U& d2 h7 n6 w. w' W0 C
#BuildRequires:' Y6 P* S) [6 h7 I7 B/ }! z9 _) V
#Requires:
" H: D: E4 ?" y3 k" p1 x+ k& _4 l% K' k/ U( x1 m
%description
! Q3 t0 Z) h6 M  C) m4 F6 CThis package will let you input your name and calculate sin cos value.  I# U$ o; M; z

: t. W' y+ i5 a/ |$ S. ]' l5 {# i%prep
0 ]) Z* m7 a0 f3 a% ~) K5 s4 z+ {%setup -q4 h( X- i; q1 i- v% i- o2 e; U
%patch0 -p1% m2 j5 X- N. G2 E# F( q
$ G% ^4 U( b$ Y7 M9 S8 O, C0 X
%build
! e9 Y6 M8 j8 D& S7 j  jmake clean main' Y/ ], T$ k( J2 t3 e: m

7 T7 K: S2 }9 W. g9 I# d%install+ j- Y& _, i5 _- Q) ]2 y
mkdir -p %{buildroot}/usr/local/bin
6 W6 z4 ?8 s0 b5 i/ [install -m 755 main %{buildroot}/usr/local/bin; ~/ ?* A6 v) M+ A
. E% _8 U; V, T3 V4 I3 ]7 [
%files
9 [' o' ?3 W7 x$ A/usr/local/bin/main' C1 x  ~/ S4 k( p  D
%doc" s5 i& B( ^% o# K
& O0 A$ c! C3 n+ ?
%changelog
) p3 ]4 J7 w8 C* Wed Sep 09 2015 VBird Tsai <vbird@mail.vbird.idv.tw> 0.22 ], X' ?, V/ d) D1 N6 Q# U
- build the program
/ n3 {8 ~9 Y3 t% z9 C) ^4 X- ~% ]

  A/ G& g" b0 O& b

; Q, @% {* B6 U. e2 \) ~5 {
然后就直接编译rpmbuild -ba main.spec,再安装rpm -ivh main-0.1-1.el7.x86_64.rpm
复制
1
$ _; Y# C1 m6 ^20 B4 R4 f- u7 ~$ i# f( t
3  c5 W4 P) R1 L% G
4
: v1 D& B0 b0 d: a7 Q* l$ M5$ q) O- `6 J, r9 W
6
% S: q% Y. k; i9 P4 N& j* a7$ Z7 {8 |. \- V, v) J* M7 d
88 t3 G$ Y. Y, d* q9 P6 U% W
97 H' A- P, \+ q
10/ m4 i& f8 r' [1 ?0 r
11
# ]$ y$ e, P1 U9 M$ k6 ]$ e12
0 s/ _) B/ }: L+ Y139 V/ [% k9 ^2 l) v1 i; Y
14
* V& V5 Q! F; T, f' x' q  j15
3 ?/ c! I5 y: V: z" Q& a16
1 `8 a' G# ^( O1 e- ]17( B& o3 b' r* Y* H
189 }! u6 D6 r# _* p; m/ \
[root@localhost x86_64]# rpm -qi main3 q6 n! @0 m5 w6 b  j' S
Name        : main
8 ^; F8 t/ \/ c: H* GVersion     : 0.1
1 }( E* r; ]3 p4 ~9 ]6 l' B9 N( iRelease     : 1.el7! B7 k+ U) j4 g1 A
Architecture: x86_64  [$ p4 P% d- G0 z, p
Install Date: Thu 07 Mar 2019 05:42:50 PM EST
# P2 M/ P% ?6 fGroup       : Scientific Support) |4 B1 J5 E* m3 K# x9 ~
Size        : 7272$ D7 Z. L  ?* ^9 s4 x; t/ s! g
License     : GPLv2
: l5 t' L0 L6 |# r" }! ySignature   : (none)) g, a" \( C  V7 T9 {0 b! V  U
Source RPM  : main-0.1-1.el7.src.rpm
5 T% [9 _, n. Q. B9 B+ T) G# m- jBuild Date  : Thu 07 Mar 2019 05:42:07 PM EST( b0 O" V2 q$ o7 q- d% @8 S
Build Host  : localhost9 V6 C- m/ _5 _& N8 k
Relocations : (not relocatable)7 b. `* Q! p  _7 p( Y3 H
URL         : http://www.fangdm.com/2 g( h& f5 h) [8 y: D" D4 H
Summary     : Shows sin and cos value
8 |$ G$ S$ F* bDescription :5 a" t1 w: z/ q$ X) v5 t$ P
This package will let you input your name and calculate sin cos value." m9 B/ a) p- B
! H$ N  b. m: W1 n* o- v

- T1 b/ P4 B+ j6 Z7 S3 F( u3 Y实例3:打包hello
使用区域语言(Locale)文件的程序应遵循 处理 i18n 文件的建议方法:
  • 在 %install 步骤中找出文件名: %find_lang ${name}
  • 添加必要的编译依赖: BuildRequires: gettext
  • 使用找到的文件名: %files -f ${name}.lang9 R- N, I$ N7 T2 S4 L
%find_lang此宏将找到属于您的包的所有语言环境文件(按名称),并将此列表放在一个文件中。然后,您可以使用该文件包含所有语言环境。5 X/ {8 l$ \% J; l: H3 l
复制
1% c) ?3 d, `$ J8 y- }' G. r* ^
2
/ k1 X! w7 \' \2 [0 \) b1 W  M3 a3
) p" g; X. ^+ b8 {8 a! E4 H6 H& ?4* T. D9 O* M2 G9 R" m' t( g2 F# {  [
[root@localhost SPECS]# rpm --eval %find_lang# J- Y% m, B/ z$ U6 `3 B
/usr/lib/rpm/find-lang.sh /root/rpmbuild/BUILDROOT/%{name}-%{version}-%{release}.x86_646 O) K1 |. R, S
[root@localhost SPECS]# rpm --eval %make_install
- x  G! c/ h- L" Y" {1 b/usr/bin/make install DESTDIR=/root/rpmbuild/BUILDROOT/%{name}-%{version}-%{release}.x86_64
+ V+ Z; G- ]3 I0 |2 _/ t: e% q- ~

( `/ B2 k3 V9 `3 O; [) J; A
  p7 t0 A  _& @' w% y# K
6 e1 N+ U9 l8 O& M! a- J& ^0 k9 O5 e
%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}。
复制
17 o5 Y/ `1 I0 h  H
2
! B) a+ y9 p6 H& z3! O5 k& Z6 o- c$ P
4
9 K4 W2 f  h0 u5 t: C52 i5 u! _- c( l! L7 L( [2 Z) X; ?# W
6: a3 I2 w6 [7 m$ J# g
75 S8 K7 m( w1 p9 N2 c1 D
8
2 f" _6 ^% p( [! t* I2 w92 \& l0 b8 g  j
10
& |  y7 a7 S3 D2 {! z3 j11
7 S; c$ q  B% G# i: i4 [) |12' g5 L! k$ }" y! e- p
13
* v' Q  `% {  k: K; q3 x5 c# f143 q6 M5 s# f, x7 D" F! t: |) Y9 @
15( C) }$ p% {/ z% o
16+ A9 g' [7 G& o+ h0 l
17! c; e- ^/ j1 \9 X+ q
18
; I5 o9 U- `; }: l* b, J; C199 |9 k0 y" H1 p. d7 K) L" p  r
20
6 b5 P; i; Y6 @; C1 a21
5 D# l; m) e3 l* g( f  |' y' W22
4 s. N9 {+ l! K23" i+ d6 B: V! Y
24: ~, P# A8 S' F- m9 H( K
25
3 ?, \5 A  W3 E  b7 h. Y$ c26
; _7 Z% k4 N/ ~- N27
' N" E! @) W% P28/ _4 D0 H! r4 `1 n. Q+ l3 Z5 s
29; X+ P$ i# {! Z$ a0 l& g
30
: p+ ~7 Y% q% v; g/ U0 M4 c; x( r' Y$ k31
" z5 O. T& b- F5 e* N/ r; a32
) O6 ~8 h+ a: m3 g. m% m1 |$ `33
, W$ i9 u/ o) [6 h346 }/ g4 Z0 W( n6 z, A5 F; S# E/ C7 I
35* L  e% }- g3 v$ u, }# |
36  g3 Q5 K$ O) x' s: b. ^$ h0 D
37. d2 e. ~1 x- R6 Z% w" k
38
# R) Y! f" S1 r0 M- H39
0 M% Y  l) a" n1 E8 f7 W40; H5 q+ S8 m! ~+ V5 R! @' F6 G& l
41" Y  L! F! Q. o/ D) y! `
42+ h7 k, y0 J# R1 k8 n3 g
43) D! O0 b, B3 u
44- {" i) |$ a) a8 |! h
45$ }, q# N( F& X3 a: A" h
46
, s! k/ ]" ]4 Y
[root@localhost SPECS]# cat hello.spec& V$ ^4 Z/ P1 L+ ]2 h
Name:           hello1 f. v& L5 C/ A- l
Version:        2.105 z3 \$ F' B+ i5 Q3 `4 v; j  V" o4 ~
Release:        1%{?dist}
9 I' m( P0 ]( ~; ^Summary:        The "Hello World" program from GNU! {' x% V; e; a. S- B0 L

% M6 G2 @' W4 J5 a  N1 I3 g) WLicense:        GPLv3
" m- Q) [0 _& I$ W) _; cURL:            http://ftp.gnu.org/gnu/hello// x$ M' Z4 i: X8 i) V
Source0:        hello-2.10.tar.gz& Y3 }2 y- M! A4 [4 o8 I
5 D) g  J) _+ [& z/ l: ^
BuildRequires: gettext
8 r% y" }  d8 p- q#Requires:
, ?3 L4 r$ `  ~0 `' b* R' s3 t: ?
%description1 ~9 l/ H2 W1 A9 F, z  r) N
The "Hello World" program, done with all bells and whistles of a proper FOSS
! n, Y: c, `6 W9 L; Tproject, including configuration, build, internationalization, help files, etc." m- r) {' t7 X+ Z1 s/ y  O7 u2 ?, v

3 J" s+ ?' @7 [* V' V0 g. Y%prep
& y5 G4 ?2 j, R0 R6 W%setup -q
# \( a; a0 t3 A$ [! V) e+ m9 d
3 q7 i4 V; X5 J) h$ M7 C: B% _8 A1 g& C4 ?- \4 `' C* m3 J6 n
%build5 d( V/ @- M& {
%configure
& g% z1 L, J: [) W  f: Nmake %{?_smp_mflags}7 J. \/ F# H% e0 b2 s" S3 R) ^
! k4 S* U) `* J5 c6 a) |
%install
" s( f9 L) a4 |  h%make_install) y3 R( S5 A& a/ {8 `
%find_lang %{name}1 |3 G" R0 _; P3 b" N. X
rm -f %{buildroot}/%{_infodir}/dir
- K( P3 M3 c3 h0 Y* T% i4 ^
0 C$ x# S' l3 X- H+ K! F. i7 O7 N7 X%post
5 ^  C; Q: w; R8 D0 l; y/sbin/install-info %{_infodir}/%{name}.info %{_infodir}/dir || :
6 {& F' }/ M# f: J  {* C& e1 K( i! p& @$ s: }
%preun
" M( y+ ?/ \) D) wif [ $1 = 0 ] ; then" X* x- @, Q' \6 i
/sbin/install-info --delete %{_infodir}/%{name}.info %{_infodir}/dir || :
+ F7 V4 A; @3 g+ q/ [8 Dfi/ j5 |8 U& D6 R' l
' L6 I0 ]8 F3 U( ^' N% o. y
%files -f %{name}.lang
  D" |6 J" }4 ]9 C# J! I$ g%{_bindir}/%{name}
7 E# q. r9 ~( ]5 F! |' P& p
* g  A  O" z5 p1 ]%doc
$ \  u, b. u  M' @%{_infodir}/%{name}.info.*
- C" S+ y- i  _7 z) r%{_mandir}/man1/%{name}.1.*
) l# W" b7 o$ v3 M& d# M/ l7 S
! Z( s$ ^- ?1 N; ?0 ^%changelog
, g$ R3 r+ Z* ?! w/ a4 b
: q+ J% F( ]( n( Y% ?! y3 `+ }
7 r7 {$ R2 x  i: B8 d
然后直接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
& f% l# R) Y; m* W# Z2
) V( b& [8 Z" ]7 r3+ n* D7 o3 a; ?% U/ a" L7 s
4
. W" I8 i. M/ F* G) M/ L, }5+ a  s& K3 K' c  D: ^$ P
6" l8 W& }- B2 X' i; R0 n& g
76 w9 F% W: S1 s1 J, l. k
8
4 n, ~' K: w. s3 s  l9
+ `" h% f/ ?6 [5 [/ O  v10
( t3 j2 ]5 R! J! d6 V" P11# L  p9 p$ L! X, |6 z, F
12
; a; [, H; Q3 e7 N13
0 S. x. Y/ a- G# _* z2 }, [" `14
: x" Q6 O, s% U- d8 {. l4 `- V15
4 `7 N- V: @; X: H3 f16( q# l, V& h' r7 ?; S9 M3 u4 v& R
172 ~, w& c  W3 i
187 J$ n$ T$ e1 g% Y' V9 ], v5 M  k
196 p; }( R9 \; \$ X1 V0 q+ E
20- v+ _! Y8 s2 i! D
21
2 G0 q/ @  k- A# R9 H* U22
. p0 r2 ^6 x: D+ V23  O1 G& d) N3 q; }4 F! v
24
3 v7 e) `4 e7 ?" J25
3 q2 f, T- a# p' b6 T26! L% d* c, M% {6 H: W1 @7 `: v
27
) v' ^) r6 a. S' q9 D28
, `! v  X# Q: X0 ]: J* ?( y298 @) ^0 ^% E. e: q$ M' F; |% ]8 z1 H
30
+ N: A6 ~  Y* t% i8 i$ a0 n311 i; R4 r# R# \
32
9 \  z9 u/ H# @0 `' b) M2 N3 m338 \4 C( L- N5 v, Q, e. q
34
1 Y+ o% N, B$ o( D2 Z0 P& M7 W, p35
" y( b+ O% Y! D& A3 W2 z36" X8 w  T* R  z* A, O* w
37; n1 @5 y; ]/ ?* {# P
38( e* ]; X7 ], [& m+ [* `* @
39/ u9 V' [, V7 _$ Y5 M
401 Q: r( n4 l% M: d( a: @: t% e
41: G& k% P" J1 X) _) J  j6 w
42' A5 ~5 O+ P% e6 J* l  e9 M
438 D  p4 n0 E8 ^' j2 B6 O4 {
44
$ v- M2 P3 q+ ?4 C45
" m9 l* h: Z7 m( X/ {! b% z/ x! L: O46
& ?2 f6 j- i8 l! @1 q47
+ p* w7 H8 i' g: x6 p48
5 _& K0 p- [* U9 [: n, O' z49
: P- c0 f+ Q; j6 n$ ]' U4 M50
, {/ j' p5 u7 p2 F( R8 `! u51
) I' H- V' U' ]9 F% k52
6 c. I+ [- ^8 P2 H4 a* f53
! Z7 P! \& N6 d# ~9 d$ {54
  h! @  i4 m7 w4 D( h6 D557 {& o% G- a& {. b0 s/ d6 J# [% N
560 g1 [2 I8 W- z
57
1 y8 V5 E3 l' ?58
8 M- x7 m$ Z2 ^9 L0 D+ X. R# I59
5 R% ]6 s1 P" Q$ A1 l" Y) J3 M1 L60
. o! \7 p; W3 P- N6 I) {61
6 O. s- ~# m* G& d' t62
5 B, n- |7 h% |0 \+ T+ q" N63
& a' r1 d! _$ {/ _+ j! n64) j! S  g+ V3 u0 K6 q% Y  t( R
65& g" E8 X, L% w" [( M3 F, f' h
66+ C) k1 b5 U1 Y; T/ z7 c( B) x$ W
672 M3 H0 x3 a3 w# {. P1 H
68; p& U9 L, S# d0 v' h+ \
69
4 `3 |% ^  g  @70
& \  y; ]! s, G# S. r) Z1 I/ L. p71% n) X, ]4 Z& x, L  I
72
: ]; \" q4 ~0 z* u# a6 x) c% l" F739 a( q7 Q# w/ e" N" h' h5 Z
74
1 E* t# O/ f4 |9 {750 C; ?8 x; G3 D* K
76+ Z0 J7 f3 R- B7 R
77
# I  b- q3 D0 l8 d9 e78
; g7 i3 d% w4 j) ]- m79
7 a9 U$ J6 g2 j9 s2 M" r0 }80
  w6 ~; k, R4 ], T2 U. S; J81
- I. H5 P, k/ N- I& @' H/ }( \6 e82
7 U  A) w+ T' o5 r; Q& l83" Z- b, |  u# Q; e
84
, e, F/ f& N+ W) M85
9 [  Z$ T* k, I0 |860 L3 `- c  O9 e5 R4 u' @7 P5 }
874 |. o) l  h) e7 f& A5 R7 p
880 x' a3 R4 Y2 q3 F* l
89
) ]4 m, H0 D8 B; ~' h903 i( i+ C! T* z; c9 ~
91( |8 v- ~: u7 D6 p
92
0 J- l6 o+ g% w" A4 y. u93
  \, m1 T$ b/ S5 E9 Y* T# e. |94
2 V3 R3 X. _/ f8 w3 [" m: }4 i95
# H3 P: {1 g0 w0 S966 }2 }6 z& h3 ]# s  e; K/ P, m
97) A! L- E2 A! o8 l7 p. j; c
98
; F* X3 M6 T! s$ |) q2 S; b, E2 f* o
[root@7ftbv7mdz7cdpc ~]# cat smartmontools.spec
: K* |6 n& J, f5 _Summary:        Tools for monitoring SMART capable hard disks
% h; S7 _4 N; s* V$ z4 M6 h/ t! L% m* TName:                smartmontools
6 ?+ v# D  w3 d5 _6 u: z' bVersion:        7.0
+ H, O  b4 q4 ARelease:        3%{?dist}# W+ s, J0 n  F& D
Epoch:                11 d5 A! a, N4 t( }1 C
License:        GPLv2+: s5 i% D  u) K. b% G5 X
URL:                http://smartmontools.sourceforge.net/; C) u" U5 s% P! L# V( \( y3 q/ V+ W. Q
#Source0:   http://downloads.sourceforge.net/%{name}/%{name}-%{version}.tar.gz
9 x: @/ ^( c" W" K- j- lSource0:        %{name}-%{version}.tar.gz9 L4 J" q( F( R9 f
Source1:        smartd.initd
9 N* J: e- q! _2 j+ @6 H( u! ~' ySource2:        smartmontools.sysconf8 u7 f$ N- M% O4 M& F. z. q! _3 A
Source4:        smartdnotify7 H, I( O) b+ G
#semi-automatic update of drivedb.h. |( f* _6 w# b( Y- N: S) e5 c
%global                UrlSource5        https://sourceforge.net/p/smartm ... rivedb.h?format=raw. a$ s( G. n" a" b( J( a5 f
Source5:        drivedb.h
1 w6 B- y+ A' y# c0 r! l/ O4 ~( F$ l  Q2 C/ I1 f+ q
#fedora/rhel specific5 i# F9 W* ~/ ]; F' H- Z
Patch1:                smartmontools-5.38-defaultconf.patch- [8 D5 g. L8 G' `
2 t9 u: O! x$ t7 L4 n
#BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
. \+ Y' x* J- b+ D* p3 D# w' FRequires:        fileutils chkconfig initscripts0 J- P" i* X1 ], T0 j
BuildRequires:        readline-devel ncurses-devel automake util-linux groff gettext- @. u* q! O7 p) e
BuildRequires:        libselinux-devel libcap-ng-devel
5 u$ U* s3 O3 G: R$ |$ Z- i5 g2 ~( |( G" x! {
%description# q# K0 f& B4 e2 R9 R8 O
The smartmontools package contains two utility programs (smartctl
$ O+ q& |! {9 iand smartd) to control and monitor storage systems using the Self-/ @* w" C4 T. r+ M/ y8 p) c
Monitoring, Analysis and Reporting Technology System (SMART) built* h( K/ `3 T2 B; \; i7 G+ l; O
into most modern ATA and SCSI hard disks. In many cases, these5 n2 A9 m  Z5 D8 v* K
utilities will provide advanced warning of disk degradation and% K" D9 r5 e0 X7 D9 @8 f; Z( a
failure.
) h( P) N' P4 v; n, B
+ [$ f! ^( g3 i, ]%prep
% P& W! D; p6 ?( R+ [. B5 H5 C%setup -q' [, z. @. e; n" n  z+ D
%patch1 -p1 -b .defaultconf2 j8 H  G7 r4 u8 e
( o! ^5 }! G) E* [# Z+ x. o) A
# update SOURCE5 on maintainer's machine prior commiting, there's no internet connection on builders
, g8 l& ^: c; P#curl %{UrlSource5} -o %{SOURCE5} ||:- |! F$ K2 {) p8 d) Y; B, X" Q
cp %{SOURCE5} .* N% J2 n) A) S2 k: u
  J4 E1 e# k7 g
%build
* h. `* g; ~6 q# {autoreconf -i; c" b0 b* u, P8 w
%configure --with-selinux --with-libcap-ng=yes --with-systemdsystemunitdir=no --with-cxx11-option=no
! y7 n3 s0 V/ p0 u%ifarch sparc64
0 U$ f4 d2 N/ w# f* ?1 L  T& nmake CXXFLAGS="$RPM_OPT_FLAGS -fPIE -fno-strict-aliasing" LDFLAGS="-pie -Wl,-z,relro,-z,now"
6 f* d6 m" ~  y- P/ Z+ q%else
9 |, d9 [9 A, d8 l9 W( ]! rmake CXXFLAGS="$RPM_OPT_FLAGS -fpie -fno-strict-aliasing" LDFLAGS="-pie -Wl,-z,relro,-z,now", J6 Z. }0 ?" E/ w9 o! P
%endif
2 y1 R% t6 D' U0 M+ t. v. r. L; H, X8 ]8 d4 r+ m
%install- d+ K+ I1 T& }' t& @# g  c
rm -rf $RPM_BUILD_ROOT
. {- _' P. h/ S& v8 X4 [make DESTDIR=$RPM_BUILD_ROOT install* }, U- d3 {! X3 R# I  S

2 m( H2 C- c8 N; x( n# lrm -f examplescripts/Makefile*
* Q6 M; s% o: i0 i; E' G- l8 O/ u" ?chmod a-x -R examplescripts/*: U6 h# Y, A) w+ A( |+ p4 K, W( N7 W
mkdir -p $RPM_BUILD_ROOT/%{_sysconfdir}/%{name}/smartd_warning.d
( G3 p1 m# v/ H) E* x* vinstall -D -p -m 755 %{SOURCE1} $RPM_BUILD_ROOT%{_sysconfdir}/rc.d/init.d/smartd
+ j9 q# G+ y. L$ Pinstall -D -p -m 644 %{SOURCE2} $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/smartmontools3 {' ?9 R& z: K. L" O3 x
install -D -p -m 755 %{SOURCE4} $RPM_BUILD_ROOT%{_sysconfdir}/%{name}/smartd_warning.d/smartdnotify
3 Z3 m; i  ^0 p8 |rm -rf $RPM_BUILD_ROOT%{_docdir}/%{name}
8 a( d6 }- Z* V& n, Hmkdir -p $RPM_BUILD_ROOT%{_sharedstatedir}/%{name}6 Q5 Y3 K' F% k5 z
. y# D# _$ \9 U" ]# g
%clean8 a0 q9 [% f; H$ r& h
rm -rf $RPM_BUILD_ROOT
. y+ U4 ^7 N2 Q$ r% \. o) v3 k
%preun
5 U: b2 Q4 m# z; v% iif [ "$1" = "0" ] ; then' p; Y8 X, E3 R& o( i7 J+ N
/sbin/service smartd stop >/dev/null 2>&1
- w" l" V* y' H8 z /sbin/chkconfig --del smartd
3 w/ N+ t) r0 d) \fi
6 L- ]. ~7 L5 }" S+ }0 O
- y3 K" Z! b/ K+ Q% [: O* \% R$ d6 _%post
/ K' P" @( q6 o0 R* s/sbin/chkconfig --add smartd
; @) c" D+ l4 \7 g, q& p# |( {% E: }
" E4 L' _, J" Z5 d
%files
1 g! ?" j* \' l8 ~+ Y* q4 m%defattr(-,root,root,-)' L$ i: L" L. @2 z* v! q( F9 `. }( J
%doc AUTHORS ChangeLog COPYING INSTALL NEWS README
# H3 B  R/ |4 C9 @- ^& Z%doc TODO examplescripts smartd.conf
; u$ v- r' u' f9 D' `* ^$ H%{_sbindir}/smartd
* c, M3 w7 x' ^+ a: Y1 @%{_sbindir}/update-smart-drivedb% N0 Z  X: h: v: _4 S, Q3 }+ c
%{_sbindir}/smartctl1 v( H/ H+ f/ J5 I: D' R9 S' X$ \
%{_initddir}/smartd
, P0 c0 j! O$ W% R# T- m: E5 B%{_mandir}/man?/smart*.*
3 v" g" _1 m- n  i% c* n%{_mandir}/man?/update-smart*.*; D% R$ f6 U* {; M5 o; c
%{_datadir}/%{name}) p, Y; A7 A6 N
%{_sharedstatedir}/%{name}
, x4 N% r# u" {3 w. T& Z: Z%dir %{_sysconfdir}/%name+ x: \' Z1 t) {$ ^. x
%dir %{_sysconfdir}/%name/smartd_warning.d
. @6 T# y  V2 u+ V, R% m* _' f%config(noreplace) %{_sysconfdir}/smartd.conf& C9 p4 u' L' G0 _2 Z+ I* G- A$ X; R3 R* I
%config(noreplace) %{_sysconfdir}/smartd_warning.sh
$ W4 k0 u' Z% |2 c; s/ n$ L0 Q%config(noreplace) %{_sysconfdir}/%{name}/smartd_warning.d/smartdnotify+ m4 K6 p  E) P
%config(noreplace) %{_sysconfdir}/sysconfig/smartmontools
6 s( t+ |5 V# T! R/ Q
5 V, o; t3 q" F  U4 [; E%changelog
( J* h; [$ O2 l+ K1 S* Thu Sep 26 2019 fangdm <8@8994.cn> - 1:7.0-3
1 p0 c9 l; P5 _6 x) h8 _( b: Y% {- create smartmontools 7.0 base on centos 6
8 J4 r+ u% i1 p& Z* F; T: h: Q
- G2 C% k+ l, m0 Q$ ]+ J4 N

7 b0 B- M$ A% }
注意,Source这几个文件一定要存在,从上可以得知,加入了启动脚本、配置文件等,准备好了之后就可以使用rpmbuild -bb smartmontools.spec来编译,经过多次失败后,根据报错信息进行调整之后,终于编译成功了。
复制
17 c: A! D) ~$ ~; Q4 T; `
2! v! d  L3 Q/ E6 F+ s
3
2 H9 a& p& G5 P! R; d4
9 J% l% s" T5 T54 }8 a1 @9 H- d/ o! R4 d8 p7 O9 _
6
& }3 `! G* y  {  q3 @' v7
* _  k# i6 J# d6 k8
; ?+ j# e  c0 ^# [# _2 P9% G/ }5 g3 ]9 V8 [& e* |4 Z
107 v: ~& @# }: H# Y
115 n5 h3 C; u2 R* q( f, v% l
12
7 {! S5 R: ~8 a" P: b# @13& B* D0 b2 N7 Q+ B1 \" L
14
0 W9 P- W- Q& h, z157 e2 u+ K( s8 B& n& {" c- I; L" W
16
7 {" C2 @! e: ?6 c- ~17
" Q6 K. K- H8 u2 k, P18+ U* Z" ]7 H# d1 a( E
19
. `" J3 X3 Q0 J: T20( N' R3 T, {8 i# V  y7 _
21/ ]% G4 W7 H. k# r/ @( Q0 W- J
[root@7ftbv7mdz7cdpc SPECS]# rpm -qp --changelog /root/rpmbuild/RPMS/x86_64/smartmontools-7.0-3.el6.x86_64.rpm+ x2 _( T9 H7 P
* Thu Sep 26 2019 fangdm <8@8994.cn> - 1:7.0-34 |9 p$ I" n* p! H
- create smartmontools 7.0 base on centos 6
( F% n8 g# r, G, \0 p+ X. e  h; n' M$ v$ W$ Q" Z
[root@7ftbv7mdz7cdpc SPECS]# rpm -qpi /root/rpmbuild/RPMS/x86_64/smartmontools-7.0-3.el6.x86_64.rpm& F- H! W1 Q! D
Name        : smartmontools                Relocations: (not relocatable), w3 S( x0 U$ W
Version     : 7.0                               Vendor: (none)
$ Z* U( j1 ~7 O& n- B* |- pRelease     : 3.el6                         Build Date: Thu 26 Sep 2019 10:53:19 PM CST
$ j" U' L) d- W  O; l) tInstall Date: (not installed)               Build Host: 7ftbv7mdz7cdpc
5 E. S9 a/ l' aGroup       : System Environment/Base       Source RPM: smartmontools-7.0-3.el6.src.rpm
3 X. T6 Y7 t2 l3 c4 w3 d/ S0 v: iSize        : 2081911                          License: GPLv2+, l( t* e) u1 U$ e3 O8 T
Signature   : (none)
6 \+ `7 o3 ?! c& `; n9 Y- g8 S/ H; yURL         : http://smartmontools.sourceforge.net/( a9 U2 ]3 Y/ G" n" R. w
Summary     : Tools for monitoring SMART capable hard disks
+ p3 K' F4 G$ \. z6 M; ADescription :, ^  X: F" u2 H- [) a  w; _7 V
The smartmontools package contains two utility programs (smartctl
6 ?9 S" B  u& @) F/ G! x4 Nand smartd) to control and monitor storage systems using the Self-
; V' i) N) h+ z  m+ V6 t/ d, aMonitoring, Analysis and Reporting Technology System (SMART) built
! M) ~7 Z% P& S/ z  cinto most modern ATA and SCSI hard disks. In many cases, these, I% t- G$ u4 _6 n) d
utilities will provide advanced warning of disk degradation and
) A  T/ D/ g7 w: Nfailure.+ I1 w  W! k+ l4 Y
  m3 Z- y( {, F* p0 I

; B2 G3 d; ~$ v& U) I
另外,在%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
7 ~8 i$ ?5 }: Y2
  P* @* L% N7 E; T. V  \+ V0 N3
/ L; i5 J# e5 Z& O( ]4
7 [. }1 p% t; x* j8 }) q5
+ ^. i! P) W1 S7 G: I" A6+ q( p9 U7 p7 @' q( X
7
1 q% {" s$ f- y0 c, Y* p' ^5 s4 c86 b3 v  f4 g  p5 \5 Y. ?( f
9  B$ [; e0 c, {' @( p  d& O
10, G1 K/ ]4 U0 u8 A- k
11
  _) i  N, s5 J  _& F121 l  E' M; F5 F9 S- E" r, b
13% }$ \" f/ u5 J+ P8 C
14
: U+ E) |+ V0 j7 c, A8 s15
- V! T8 k% H1 F, x+ C! U16
7 U3 ~; P+ d; n: ]17
; v/ Y6 \/ t8 b0 o18
7 d/ n4 E/ D& m! ~) ^6 ^19
6 ]) \% k# M1 `209 l) r% Z& m3 ^8 p
21+ o0 B. @/ x7 e5 `8 v% [
22  @/ I+ V6 ~: x8 y0 c4 _( T
[root@localhost rpmbuild]# tree+ @8 \1 _6 M+ i
.! h3 T, f* x, G6 L4 z% J
|-- BUILD" l' F0 c# `7 \2 C! f& G
|-- BUILDROOT
: h) u' N5 j0 d$ i& z( Z|-- RPMS
4 w9 m$ u; E- U. \2 [2 I! }2 e|-- SOURCES
8 M& u) }) i) K1 i. Y|   |-- COPYRIGHT( B# t+ \; @9 h/ _0 ^
|   |-- logrotate
' P5 w1 Y3 k- ~: |8 J|   |-- nginx-1.16.1.tar.gz4 ^/ v( _' }8 P# ]" z* o
|   |-- nginx-debug.service
6 m( m; r/ g& Y' ]+ ]|   |-- nginx-debug.sysconf
% ^* s2 A' P. M' p  T4 D+ E|   |-- nginx.check-reload.sh
3 K9 r8 F: \  P5 X; [|   |-- nginx.conf3 C) X, o: s( c5 k4 X0 e  l
|   |-- nginx.init.in
6 r' R5 W. O2 i: ~|   |-- nginx.service
+ F- |; s+ S, u0 s, g|   |-- nginx.suse.logrotate
( n7 }2 g; f+ N$ T|   |-- nginx.sysconf
, H0 K: u9 c& j  z$ ^4 `' K|   |-- nginx.upgrade.sh
# N4 ]3 `6 G$ e3 F4 T4 d|   `-- nginx.vh.default.conf
! p3 E* }7 V0 h|-- SPECS
4 n6 K6 }* h& J|   `-- nginx.spec
. W3 R+ x0 k8 S* ?& u; T`-- SRPMS
0 Y( k4 r& C5 A8 j0 H4 j1 n

: @3 B8 T7 ?$ B  u
0 ^9 J) w5 S1 }; D( k0 [8 i
主要是SPECS以及SOURCES这些文件。查看nginx.spec之后,大部分都有写好了,并且都兼容了centos 6/7。添加了gperftools GeoIP-devel ngx_cache_purge nginx-http-concat这四个模块,修改如下:
复制
10 e9 U" t: j# a% F) V7 b4 v6 t
2$ l& O) [! ~3 d4 V8 K( Z; s$ p
3
( X8 F1 t/ L8 f8 E& x4- k7 a; v2 T& Z9 w
5* q$ V' ~8 Y3 }3 m) o' `
6! p+ g7 [5 ^( f* N4 g; {
7) ^' ^* k' @; V' L
8  B- Q9 q1 G! z9 W$ u6 ^/ X) H
9
& q9 O& d9 B" B7 P, J/ m8 a105 T6 J6 h  m  W. f3 _& w( b
11  E) S+ K$ c  g
12
; R2 }, Y! F5 O! j( E  b13: t! ?' f' \2 d, u( p5 `( D
14! K( x& m+ c+ h# @; u
15, q5 V- g2 }$ b
16
& B! L) P0 G8 m. y17
" x% L0 a0 Y  }, e2 B, t, P183 q* `3 |3 e# I' `) D8 y" n8 a, j
19  m* `' {% Y, m+ a# `
20# B' P) \& E% h
21
5 s4 ?$ h! |9 a* p1 V; A& y' y22
2 d( M8 o) B8 I23  {# l$ X  M5 p  p* |7 c  B9 B; E. ~
24$ z9 P  s; u2 t- X
25$ o! M3 U: I  b
26
8 M6 l$ Q1 O8 {27
# ]  [& o6 R, l2 S3 s28
/ B* Q, H% z! B. K  w5 O29
- J) z, H" @; i: \/ u30
: Q  q! m9 m' \# B31
2 b6 e$ g+ w% Z! C/ i32
* c& }% b( J0 K$ P33& C. ]* b) _. R
34) z$ I( j) T5 L' B7 Z0 h' P7 u3 g
35
1 {  U% L2 ]! y9 H! i36. j& ^- M6 E' r+ {5 j! O9 e" c# L: z
373 Z5 [1 C9 c, T* v, w/ Y9 @
38
/ l+ ^7 R8 e) ~39$ \. f1 F7 S8 E  `! j; l7 s! Q. ~9 N
407 @, H/ I% s" |, C- i& A; f8 a
411 n9 C$ n+ V$ A& h
42: o. E; Z; ?4 K" U
43
( N7 P6 [$ u0 |8 k) M442 Z, l  [& L7 h
45
. T. n) b1 M9 }3 j! @46
2 u( `+ x6 m, U4 S47, i& c5 i- o% }- D/ M
48
9 p' z, E4 k+ m4 A! @; s8 s49
( H& Y$ V; X! r0 F* z  }50& p& T" U. L' q* T/ M+ l. A3 \
51, F2 Q' ]' b! o2 E- X- ?
52* l( a; V3 E+ C( p- m5 ~' v1 D) b
53
: g$ p, {: V5 w2 G( A54' w2 u6 A* A- u  ^- x. [
55
/ g$ ]% U+ m( Z$ C+ J9 _' U4 U56
4 c0 `9 n+ a5 A4 \570 _% d6 h# t+ ^! i
58
0 H2 T( |. E" A- ~; ~4 Q2 k3 e591 }3 e  s  r( t- n1 v$ S
60
. o4 i6 ]8 R" V  b9 M! I0 B61, D. Z) @6 X; g# D/ Q
62
, C2 i# J) Q0 q( U+ z1 J63" p3 l( z  [& m" I) E- ^% F
64* I( E( l+ p& U0 q
65# ]2 K& X3 }5 C# H" Z
660 |8 j& Z# g* _4 f6 f. \
67
3 H: S. h9 l  D, R0 X0 N68& m. m, D. u5 }5 t1 n
692 x' H( i. w7 B: P2 n
70
( _8 g$ N) ^- f& H1 P711 P7 }& P" C% O- ]7 x
72) Y5 g5 E" G* e1 i2 F9 d2 O/ F! X; x: T
73+ Y  ^5 Q9 n  r6 O* U+ ~
74+ [" n) z, \: z2 ~* r3 ~
75
. }1 }6 F  x- R76
. j( S* i4 l' p: T# w779 S2 h+ V/ J* |, h0 m5 A) p, b
78
. Y. ?! T3 m# ?' [! g9 o) b' z) u! V79! ?8 K# N0 }. e& J( H6 x$ K
806 Y1 y: V, n0 a1 S, P3 e
81
+ W: ]$ d5 [  J! c6 w5 e" `, K% w! @82- O& T* r) P2 m( e
83
5 |  o" _1 Z4 P7 u84
4 `% s' `: e2 Y85$ u* @) q; @' I7 m' u
86: [3 ?9 @! c6 q0 |" J3 i
87
; r0 w  L7 L( P+ t, w883 }$ k; s2 {* f4 |
897 a% n! _. p9 D5 K, k
90
7 o7 o5 T' E- G% h91
' T' Z6 o, L, r2 `3 x/ |92
4 M" @; _7 f( A' w# }/ C! B93& j2 R- r8 L, G/ L% p
94: m  _" m+ D7 |. o: k( b: o
950 c- u& v6 v  @- C2 A
96
& f% W6 Q, B, C- I8 ?- f+ M977 ?5 T' H9 C& W% I5 v
98
1 ^* U& F  b. y9 a99
4 \2 `) s0 j4 f: }0 b100/ `& |4 M. ~/ P! S& f  S
101
, _$ e$ `( z, h) C102+ e" Z' W2 I) W( @& ^
103
! G' U2 B9 y( A+ [' d104' r$ |! [" ]4 X" R% E$ x& P
1057 E8 B/ N; }- {
106
& m: F9 q% v2 x: w$ G107
2 |; f* M6 S2 _7 k5 l! c+ F108# {. c7 K& O* c! Z4 }- E% [
109* S4 B: S7 H5 }# o, o
110
9 b( X+ Y5 {' t; G111
$ a" V6 ^( J4 |5 B2 t& j" [( E1126 r  {9 \3 @, K# G! Z5 s( N
1135 G5 |: X# L4 J& Y3 r% r% V$ T
114
( x# d4 c3 g/ i4 q; n5 J& s' B' o115# u) }3 N* h. e' e: V& y
116
- l; K& ?/ _& X" P9 z9 i117% |0 k- n% Y+ J
118
2 H. I$ F4 T3 h& L( g1 y119: j) y& {3 p1 I% p+ T
120
" `/ j% e6 R* Y" J9 z121
3 I! I5 i, s. W' D! u4 A' ?$ V122/ Q1 r$ o+ ?9 [9 g  a& L7 @9 j
123
7 V( }& y+ l( D  g" G2 s& @124
4 [; h+ @% d+ c. g' x2 S125
- m2 n( L# p% t126
& L+ m1 g) `9 _# M0 R127
. g. |( i4 M# O+ G! z; T2 L+ h0 o128  P" z6 A* ~+ V( \
129
* P+ ^+ H) s2 D' w; |5 O7 x2 h130, z  r9 H' \0 ~  t5 O
131
" K0 j6 w4 c+ f- r  C' a132% J) E: U: M7 S# |
133+ ~- x. A" d# b4 C. D
134
! s9 p5 Y% ]% e135
5 d* a- D, e+ a7 M$ b136; v5 }* ^( L) t4 o) d, o
137& |6 s+ D/ T8 {; Z) v9 J3 s
138! k0 }8 `% i8 ?& m* p% X+ v
139' ~4 x7 a7 ?( @$ [% a
140* k- q6 e4 _* O7 f$ @  S0 j# `$ m7 z$ ?
1416 d' [! s6 A* g
142
6 `! v+ o7 M! C" {) }6 S* D4 X143
. `/ U  M. v/ Z$ X1 s' P144, x% Y/ i: c  `( u1 q/ g! q3 N' i
145
7 @: F' \; Z# F: a+ f146% H. N$ [* L7 f6 w. R6 T. U$ r
147
0 o! h) R! w% E3 S148
# Q  E$ s4 g. i$ P: [149
/ i* l7 Q% q8 m: k& ]) E2 z# C7 D150
" q+ t6 W* [5 W7 V) S8 q" n151
) g8 u; Q/ i2 B" j# @+ [152
# e9 S' w0 r$ O5 D/ O& \153' h( P" j5 o  V0 v5 g
1547 _4 O  Q% c( b8 ]- w+ H" ?& z
155
5 y: V# d% f0 w, {) p5 f& S156
4 _$ K* v7 j# }( o0 s- f157
4 d+ C" }2 z1 h1584 [7 G  \# }" O; {, Q% K
159
0 h/ u, w; s% ^0 t/ r160! B# p8 x4 H' O. z7 I8 ?' [3 }: K$ k
1617 M' p, q* w1 _. m5 v
162
4 p, `, v4 B, P* J; g163- c! W- J: s! Q4 q
164( h- I8 L! Y' \# N
165% O. W$ C' y: a3 p
1669 C7 l. {/ W: a  m/ N
167, y: y/ j+ N& G# C1 X5 y
168
: |3 @5 p4 f9 Q6 S) x" ]0 A$ k; d4 M1696 }/ N/ a3 {! M& ~& W' S( n3 \8 `
1700 L; m# U; ~' F
171- S% q5 s- y# b% g
172
( ^4 p7 [- U8 w0 u, p% m  b173) ?) J. H# e+ g: Y0 L
174
; x& G7 Y8 N" G* H# e175: ^8 _4 l4 F$ w/ N5 W! g
176
2 ?9 ~3 C! a2 x' H0 {177
! h' G$ M, H( {1 Q7 P178* D3 R3 G5 C6 z. M; p+ B. K  O$ c
179" i& s+ k$ R9 q# I
180
% z/ _: X( O; n6 c9 v181
" d9 m7 @; R3 H' f182* q4 k  p0 C; o' m) ]7 V8 ?% |/ c9 _
183. v5 V# {, K) \/ }1 Z; [3 N( L
184
- S  a  U' K" v1 \185
- u) W. K" j6 ?186
# \0 k; y' t, v; l9 _! n187
/ F/ Z. ]$ a+ I( k7 ^4 E6 C3 ]: q1884 E/ O  @: ^5 L$ a2 ^' E
189
7 y" f8 i( \- m- {% `190
* D# W' v  V2 _- L1 s+ p191
% ^2 m- b: B3 E! E192, A* o% ^4 `' {6 A+ }8 g4 C
193& _" g1 t  {5 H" K9 n: V% \; Z2 t( _
194% q- F( ^6 @6 \+ g  Z6 j
195+ x. ^  r" k/ g, }6 y
1966 N& a. T6 M* `% y
197$ P/ r; g0 P$ {6 }, }+ y" T
198# T0 |. a! e- h+ X- ?% n
199
; N5 x% V  n8 x* ?$ J5 w/ R! a( q200
* [8 y1 p5 h5 y- I( `: F+ V201, j* c; r/ y$ ^2 }& I: \
202
! {: O" ^0 M4 y1 M203
% v( W: F. Q$ S9 R+ v% s: Q2 d204
  x" ]3 T9 f$ z* p0 Y- F205
+ K  F6 A: E% i; k) L206# O* Z1 n0 k- J7 ~1 t5 A
207
" a. |; |9 t% y+ }% ]1 i/ J: h208
1 j+ f7 h; Z& K  h4 O209, ?) a) e* C5 {' G
210( \" P# G% n7 i" o& j
211/ O- c5 D& R4 _3 \7 o
212
9 w: Y+ `) U) N( L! e1 `213
* k% e) [8 }$ ^7 h- L( J0 W214
8 P3 B0 u. G5 x# R9 I4 x8 }+ N215
# M. K2 A& |, I0 {0 N% q( P216
, ^5 t" K- D' y217& L9 N- z) u, n% Q; |/ T/ k
2184 B0 k! y) Y) Q* z! W
219& r! c" H, Z, P% h  a0 {6 f$ O7 u! l
2201 W" t1 A1 _0 ~' O
221
# [; O2 \. R1 ?, \' e222. q  M$ [$ c5 X
223' C1 S4 P5 }5 l% B+ B& s5 j
224* Z$ H9 g  m1 ~: _8 {$ j2 ?" j
225* W6 x9 h3 r- R, s
2267 b7 A  `/ T% g+ }
227) c  c' K# [3 G2 P, w, `4 c0 o4 l3 `  ^) A
228
) x: m& h4 t2 x& E8 f( b229
4 L5 z7 L7 X9 N2 _% G230  {/ ?& {3 U$ V) J! Y! w
231! @* I* q& }) w. Q$ V
232
* |! ]8 X8 R2 M5 Y2331 B6 c: T, I9 g2 c" Q
2344 j( M* V7 I$ [: s  q4 v% p
235
, C9 [  E4 F4 q3 p9 e2 [236) v0 l9 k6 @5 s' p
2374 f1 D; [; @& Z: Q: E) ?
238
' ^# }% B$ M8 }! n' R( u239
, O6 a  }+ [! H$ z4 v% e240
1 M$ P) k( q" q9 o+ Z241
  z  O7 `+ F1 x1 n242
5 U2 m/ m: O& b2437 n% L) P5 r9 O2 Z0 x. M
244/ L4 S. u- g. m- z# \" }
245
- ~2 |  m# @" ]/ B" z246
2 k9 N- M4 k3 l247' x% e# a- s9 ~8 e/ j
2488 e4 a1 b3 p$ T$ [2 K4 P& d
249. \% V- }. M+ |$ D
250
4 p7 |7 Q9 e6 C' i, b8 z251
; i3 ?$ W! G. U2 j* x0 X252. D: t+ l6 E: H  Y- d
253  c, H2 S' h. f( e- ?1 F2 F# W
254( ?4 u' C6 [  R" X4 V
255
& u- L/ P8 @1 Y( x$ p7 M256' w+ O1 ]7 L: }% \- ]
257, |4 m) U2 b! z
258+ w; W% q- k1 J. U. S1 x2 p
259
9 o) }6 W6 R4 [" [5 ^7 Q& Q260! M4 a' A( I7 u0 b; E
261
7 p  `  E( \: C' Q. K1 }" Q0 F- n262
  M0 z  p3 t! s/ \& U. N6 S2632 n+ G1 v8 Z, J2 M
2646 w. {! g$ ?. d& W( g  s
265
3 ~' _4 W* ?4 A% k6 Y. ^266
+ s3 M) n& y, Z* p9 z2 c! W- k& Z* A267/ v5 P, S  ?/ U
268
& H7 T0 g2 \1 I; Y+ H1 x: v269
: Q" |# o8 S$ `' F+ e2709 x' W: W8 ?7 R) u& r
271; h3 L" e+ R" b- M- a
272
- F/ }5 U- s, }5 A: ^" x+ |/ ?2731 J+ f  Z3 ~. m  Y/ M3 X/ u3 t- J
274
3 j$ U& l7 J! b4 X0 H2 X275- K. C" J* N. f+ J
276
0 W/ Q! J) o' b8 h277
: l9 ^) n1 h# \  w278
3 w$ F" W6 z( W% \- V2798 h3 O1 \* t' t7 ]! u! P" [# f
280
) g0 Y, ?! V1 C; x281
& y$ ]$ B* ^, Z* x8 y  p4 ~* h/ E+ |282
' W; k; ]) S9 p. ^283
: P- M+ D, d/ o8 J284
: D  M# i4 g( V) ?' \% v285
  K8 C/ a# P* l! ^3 o5 t- ?286& Q6 K0 Q' F( w" C/ v
287/ b2 C( X* Q- i5 Q2 ~1 d+ r
288
+ ]8 [5 R( ^4 e) U289
+ A# w6 R. e& O# S* A) U290
. {1 g* O0 Q) E2 [) c291
! ^" S! e" F% Q  }% F292; N. Q$ q2 N: Q1 R
293* \( k. o8 i- A. M
294
4 C% n8 Y$ a: a. h! z5 a295% p& L: f' D9 q
296/ w! S, t5 Z& b  `/ w2 J: t
297* j3 a& @' e7 k. v" ?1 `( k
298
8 G) R1 j! q4 G; ?7 T" ?299" F2 u/ v2 \0 `; Z+ a
300( ^( [8 g& u" ~/ B  C& V
301
9 y$ ]6 x( c3 W+ @302
0 u% s& s# m" S3035 z0 b# O' K" ~; C# q
304
5 S9 s. z6 |8 \3 V6 ^* m& X6 [( d305
5 N6 X( R9 o! U' Z7 |. x' k/ H306
- y* i+ p5 q( Z6 X, d307- @5 I  z* e  _; [" e, f
308
! u! d  E# y7 p& q9 d) c309) ]# U# y* m0 n
310
6 f4 H8 a6 b9 C9 o3114 {' I+ @: C( Q2 i" B
312
# k* F9 ?# ~8 L# d- i; S4 w3136 v9 ^" o3 V; p& m' k* X
314
' y" R0 g6 @6 q! ~) S! O% N315. ~% t8 K8 w; |. `0 ~8 a! M4 Y
316
5 q" y3 F$ y1 `3 {( E317
% M; d+ A+ P* l$ z1 i8 @3180 x* @) E7 G) j' \- [! K0 U% h
319/ h6 A2 H& A: Z+ j8 R
320$ F# i+ m+ ~2 ^9 g
321
/ ~) ?. e7 M$ c( b322
1 c5 I1 e9 d: i; x+ a$ _323+ G1 H$ H2 i4 ~6 p5 {% ^1 W
3249 S' U! p$ T/ d% {2 z
3256 K+ ]# v7 a6 d( c" T8 W( n
3262 [1 D, i0 P7 g6 }7 G% I
3275 Z2 R2 M& m% H6 ~* a
328& d) Q) l: w6 O) j' X) J
3291 {+ C! I" n4 ]9 |! H
330
2 ?5 _4 H, @9 {5 W% r331
7 C- S% F$ ?1 V: ?332/ p5 C1 t( U# `; B
333
+ o9 ~0 ?9 u" ]* O/ p334
4 [  ^; T3 M" \2 Y" b- R+ D335
- x* w0 k' o. R336  I# X0 ^, c4 q2 ~
337
9 m) y) M6 W) `2 h338
$ n& G/ w5 d! P2 Y1 \5 R- `: p3396 B5 ^4 s2 n, _# J
340: O6 G  _/ @- f; b/ x" N- x
341
( |" R. m: C7 ?% t: i, m342
8 F( ?" f' \; _+ y/ j343
1 F2 g9 @" L" j4 f: E1 p( f) V# t344
) h3 E: N, m+ o. \0 y. h345* p0 p8 W. T& `+ a
[root@localhost SPECS]# cat nginx.spec
; _1 q6 |" x6 c* p) {" S7 P#+ R- Q' r( A7 \. f( P
%define nginx_home %{_localstatedir}/cache/nginx& j( u2 u) X7 O( R6 i
%define nginx_user nginx, A) V. v6 F2 v
%define nginx_group nginx
' d$ K- T; E+ N/ B2 v%define nginx_loggroup adm' f8 e8 {9 Q* q

$ _1 Y. z' P5 O8 N/ u1 M  R# distribution specific definitions, T) s$ x8 [! p2 U% i
%define use_systemd (0%{?rhel} >= 7 || 0%{?fedora} >= 19 || 0%{?suse_version} >= 1315 || 0%{?amzn} >= 2)
' F3 F5 Q3 x9 A$ R$ r! B" Z
, f8 I3 a) Q+ z6 S; q3 U  o%if %{use_systemd}
$ x7 }2 W7 Z1 y  J" PBuildRequires: systemd. N2 g* `3 V# L. B! [2 a& F
Requires(post): systemd% D4 \8 U/ |! }# L5 j) N, p0 [! I% k
Requires(preun): systemd# }" q% _9 c4 G$ y5 z* [/ J" e7 e
Requires(postun): systemd
8 R. M* g4 }1 G, o  T5 A# I$ A! D%endif( K! f! d& k7 G: A

/ L9 i; U4 U: y- U# e* \%if 0%{?rhel}; F6 ^9 M5 h7 C, p7 ^/ P' b0 n
%define _group System Environment/Daemons$ X5 I4 R5 Z: i
%endif9 d% u/ G; o7 V) ]7 D$ V/ Y3 J  I7 b
2 }% v7 m7 g. v+ N
%if 0%{?rhel} == 6. }3 ?# r) F* v
Requires(pre): shadow-utils
! `2 s9 B% a( J# |/ N4 v* E+ {: t( TRequires: initscripts >= 8.36+ g. `, {. u& W' {- Y4 L. R
Requires(post): chkconfig
" z: L& ~$ W9 R" W. V9 GRequires: openssl >= 1.0.16 A: M+ w, a: h% ^2 G9 k. H
BuildRequires: openssl-devel >= 1.0.1/ X, i4 U2 @+ d3 p3 R# H4 r
%endif
$ k' V$ a+ E. g4 M& t% y& r* E
%if 0%{?rhel} == 7
+ E# L" {  I2 w* U+ ?4 C# e: e0 z%define epoch 1
, j8 `5 K+ ?4 v# eEpoch: %{epoch}
! P' J+ j+ T9 \" mRequires(pre): shadow-utils gperftools GeoIP-devel
) O  `/ @4 ^0 L+ Y$ @1 DRequires: openssl >= 1.0.2
% b# [9 T& Y5 _) _  \BuildRequires: openssl-devel >= 1.0.2/ q5 y! D6 G; \1 z  n; b
BuildRequires: GeoIP-devel gperftools
6 q) Q$ A7 o6 {; z1 p) s4 T: B+ q%define dist .el7
0 a" q$ ~! r( e8 u& \%endif0 S7 j6 p8 e4 h( w' q

- r2 O+ J1 h5 C3 G7 ?%if 0%{?rhel} == 8
  y3 w" c* T$ y# v. m4 k) j1 L' e' V%define epoch 17 ]3 d2 }: E" x) S- f7 ?
Epoch: %{epoch}
# K6 Q8 Y5 \; ORequires(pre): shadow-utils6 Q. z1 c- M; M& Q+ A
BuildRequires: openssl-devel >= 1.1.1
" d- W9 }- I8 c7 t%define _debugsource_template %{nil}
( q# N; F2 s5 S$ s%endif+ E( Y; G! a9 G3 [
) V. P4 G  d+ E
%if 0%{?suse_version} >= 1315/ `9 W' T4 {2 P: U2 }' E
%define _group Productivity/Networking/Web/Servers
7 k5 o+ o/ y! o9 U7 [%define nginx_loggroup trusted: C9 }6 n7 K& b9 E) z
Requires(pre): shadow/ C9 e4 T. f0 U8 _
BuildRequires: libopenssl-devel
, h+ T6 r! |9 ~& p7 L7 _% x%define _debugsource_template %{nil}0 U& `4 M" c$ _
%endif. L" y# t( o8 q( X* n

; w) l$ ]' ^# D/ G% m& [% o# end of distribution specific definitions, _8 P) g5 }) W( }

; E0 S2 ?1 c5 I%define main_version 1.16.1
1 ^- _% ^; V( F%define main_release 1%{?dist}.ngx5 T7 a5 s. t; _4 O$ V+ |" d) f
& Z$ i- B& ]1 r4 Y6 U3 {& d" Q3 a/ P% @
%define bdir %{_builddir}/%{name}-%{main_version}
" I; U/ o# m# A; c  }9 t7 ?& g4 [2 \" j3 n2 |" c) n. v
%define WITH_CC_OPT $(echo %{optflags} $(pcre-config --cflags)) -fPIC" M8 G( x" \# w- ]  t* I- m+ z( Y0 J. D
%define WITH_LD_OPT -Wl,-z,relro -Wl,-z,now -pie1 ~+ w) g6 R% u+ o+ o

$ }) O4 y1 |0 W7 D  k$ l%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")
! i1 x; e8 N7 y) e. V* H  d! G, `" y6 o  s# v1 z$ y
Summary: High performance web server- X4 t- ^7 Q: Z- d" j! A. p# H
Name: nginx
" S/ E( D8 {7 D/ YVersion: %{main_version}4 o7 d. n3 [1 Q4 O" y
Release: %{main_release}  A( F; a* c# m& F) O/ f
Vendor: Nginx, Inc.
* W& E4 ~& B8 P2 `1 S3 K9 F% YURL: http://nginx.org/2 Y5 m6 E5 |" Q# m$ }
Group: %{_group}
: N2 R7 F# |4 X7 S; W
0 Z9 E/ r( L$ GSource0: http://nginx.org/download/%{name}-%{version}.tar.gz5 ]/ W. @% R, C% x4 o* v* W3 t) ?
Source1: logrotate
4 R& H" l9 y" a% }4 F% W& E* E3 NSource2: nginx.init.in8 u  Y- \! V3 H$ s: [$ B
Source3: nginx.sysconf
( |7 Y% n  }' l" `0 b! p2 D9 J" NSource4: nginx.conf' V1 x3 a# I2 {! f. S- ]: S  @
Source5: nginx.vh.default.conf
6 x" V7 ~/ G) BSource7: nginx-debug.sysconf
; S4 E7 D0 I/ u- y( R' wSource8: nginx.service
& Q+ ?5 p2 h! Z" JSource9: nginx.upgrade.sh6 N& Y/ t: K2 ?3 n4 J
Source10: nginx.suse.logrotate1 E2 a0 |5 u: e  B  {( ^
Source11: nginx-debug.service
9 m7 c' q  Z- m" O: Y, J8 B1 u7 r0 @# jSource12: COPYRIGHT7 [; v4 z& B5 ]. P- @
Source13: nginx.check-reload.sh
; D3 m. s( X. w3 ]' K5 ZSource14: nginx-http-concat.tar.gz
6 g) o, P8 V6 U" \  z, W6 {Source15: ngx_cache_purge.tar.gz6 K0 |* s  z  g' u: ~6 {( \0 x
; W* [4 i( l8 K" E- d2 U) ?6 N
License: 2-clause BSD-like license
$ V4 X: @6 M* z; M1 h: s% m6 `8 u- d/ G& L. N
BuildRoot: %{_tmppath}/%{name}-%{main_version}-%{main_release}-root& T$ ]5 r. ~, p$ l& D. o/ K8 {
BuildRequires: zlib-devel) f; t! h/ q# h/ V5 Y$ e% J. A
BuildRequires: pcre-devel! Z' C1 E; I. [& S2 b6 \
) d  w. z1 f( @$ n( k1 X+ _5 [1 A4 f
Provides: webserver' Z- p8 d9 @, [' W/ J( y9 T4 Q

; r# S% ], L9 e& D( L* M- w%description! E( A; r& h0 c. p( y
nginx [engine x] is an HTTP and reverse proxy server, as well as
5 F5 P, \, p7 x8 X, pa mail proxy server.
2 n0 g: v2 B; w  ]
  P( S2 F$ d  Y7 ^) Y1 c% ^%if 0%{?suse_version} >= 1315
/ a+ g+ y& H$ `%debug_package
! H9 `2 E, b4 Q" k# j' e- n9 w%endif' ]) M, i. T2 V

7 s" h$ s/ F. o' R2 {%prep
, e% s7 c* J* S%setup/ g+ Q6 g6 I8 N
%setup -T -D -a 14- K7 ~9 x5 O# s) C
%setup -T -D -a 15
+ f2 j/ o. F! f! \cp %{SOURCE2} .6 T, \  `8 X7 |2 f2 M8 V
sed -e 's|%%DEFAULTSTART%%|2 3 4 5|g' -e 's|%%DEFAULTSTOP%%|0 1 6|g' \
* K/ o, b0 Q: I" [( `, C    -e 's|%%PROVIDES%%|nginx|g' < %{SOURCE2} > nginx.init) ~% ]& G. S% X2 w& q6 J% M% \+ k
sed -e 's|%%DEFAULTSTART%%||g' -e 's|%%DEFAULTSTOP%%|0 1 2 3 4 5 6|g' \
% ]4 Z, m0 P0 t9 e8 R" K4 @7 n! w    -e 's|%%PROVIDES%%|nginx-debug|g' < %{SOURCE2} > nginx-debug.init* g2 e( q6 d) F

6 Q% @) e- `0 E6 t2 K6 _; s%build4 ]6 r1 n' u5 j, N/ u5 U
./configure %{BASE_CONFIGURE_ARGS} \
. ]+ d: ~0 _7 o/ D  d    --with-cc-opt="%{WITH_CC_OPT}" \
% x9 g5 n* r, {" X6 h    --with-ld-opt="%{WITH_LD_OPT}" \) i+ \; o4 n% T' Y( M
    --with-debug \
2 _0 m& u. K/ w2 s        --with-google_perftools_module \
* u2 d, y4 j/ O1 s8 B4 a        --add-module=ngx_cache_purge \
! P  r* e" A/ }6 ^3 p6 a, D0 a# k        --add-module=nginx-http-concat \
2 q; Z5 ]5 g1 l' N3 v" n        --with-http_geoip_module
2 a# w- k' v$ W3 n8 x  ~2 k) i5 I3 A! r! d& ^
make %{?_smp_mflags}1 m# j$ r, T; N& z: W2 g
%{__mv} %{bdir}/objs/nginx \
2 Q' I' p: o) s    %{bdir}/objs/nginx-debug
7 `' U9 q( c8 Y./configure %{BASE_CONFIGURE_ARGS} \
+ m+ v2 F, P' m1 Q! P    --with-cc-opt="%{WITH_CC_OPT}" \
& L1 Q( H' P# Z& u) B    --with-ld-opt="%{WITH_LD_OPT}"" F3 G8 M8 d3 `5 j5 L  c+ ]+ X
make %{?_smp_mflags}8 M# Z( W+ U8 J: e6 V/ ]/ o6 R

# C* s  x; C: }8 }: I/ Z%install6 ]% `5 H5 Z4 G0 p& X
%{__rm} -rf $RPM_BUILD_ROOT! @4 a8 k( ~2 _9 s+ R9 c
%{__make} DESTDIR=$RPM_BUILD_ROOT INSTALLDIRS=vendor install5 i1 {; u1 X5 h9 C8 ]: V7 `3 S
4 W) }7 C8 \0 ?  A  Z
%{__mkdir} -p $RPM_BUILD_ROOT%{_datadir}/nginx
# X8 O* X# f% m# V! Q. Y) s9 x%{__mv} $RPM_BUILD_ROOT%{_sysconfdir}/nginx/html $RPM_BUILD_ROOT%{_datadir}/nginx/5 x6 g% x: ]$ r  N; f  B
  r1 O7 \- k  [4 k3 |1 X
%{__rm} -f $RPM_BUILD_ROOT%{_sysconfdir}/nginx/*.default  M( j; M! I. z
%{__rm} -f $RPM_BUILD_ROOT%{_sysconfdir}/nginx/fastcgi.conf
1 g" t6 s* V! c1 e0 P3 W5 h& i( V3 C1 @+ f0 j: R6 l% T0 Y) M  A
%{__mkdir} -p $RPM_BUILD_ROOT%{_localstatedir}/log/nginx
. }1 C/ C! f: d! {# G# |$ B%{__mkdir} -p $RPM_BUILD_ROOT%{_localstatedir}/run/nginx! F+ Y: |  \8 i' V7 ^
%{__mkdir} -p $RPM_BUILD_ROOT%{_localstatedir}/cache/nginx
+ h4 P* _% s& O$ A, R3 U% \2 L% D* L0 H" s
%{__mkdir} -p $RPM_BUILD_ROOT%{_libdir}/nginx/modules
# |" P, [4 J( X! @% [cd $RPM_BUILD_ROOT%{_sysconfdir}/nginx && \
: P2 n8 M: e/ g" h2 P9 Z! @* K; X    %{__ln_s} ../..%{_libdir}/nginx/modules modules && cd -
1 m! `- o, ~* F$ S) ~& _1 k& i
$ E( |7 J3 y1 X8 a3 R%{__mkdir} -p $RPM_BUILD_ROOT%{_datadir}/doc/%{name}-%{main_version}
; ~  {0 n, i4 d- B  k! N% M%{__install} -m 644 -p %{SOURCE12} \
, P/ _5 S$ A6 ]! j2 c: _    $RPM_BUILD_ROOT%{_datadir}/doc/%{name}-%{main_version}/& a1 h- ^1 e5 R/ y0 R/ t
, S* G, y* u. V; V
%{__mkdir} -p $RPM_BUILD_ROOT%{_sysconfdir}/nginx/conf.d" C9 Z! u# [$ y7 P& R2 A  L) y- o
%{__rm} $RPM_BUILD_ROOT%{_sysconfdir}/nginx/nginx.conf" m+ e$ r! d' x2 w5 G
%{__install} -m 644 -p %{SOURCE4} \
8 }* I" ^) O; ]: X; ^5 `( U- w$ x) O    $RPM_BUILD_ROOT%{_sysconfdir}/nginx/nginx.conf
( u  ?. b, M, m; j5 r3 }%{__install} -m 644 -p %{SOURCE5} \
$ D5 n; {* S# y+ Z( [) Y    $RPM_BUILD_ROOT%{_sysconfdir}/nginx/conf.d/default.conf1 Y1 Y- p) L# Z# g, B" X6 O

6 T! `6 @" p0 p& h3 ?0 D%{__mkdir} -p $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig
; F, n& g" m3 L; I. d" Z2 k%{__install} -m 644 -p %{SOURCE3} \- u0 C; c7 v  S  T. V& S. K# }
    $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/nginx' L: d' g8 n0 R) y8 F* h! w! [
%{__install} -m 644 -p %{SOURCE7} \1 e) O8 H, T5 v: x8 h) N
    $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/nginx-debug
$ H& c% ]  O" n7 s4 G( s- @1 ?8 D: @" P  ~6 s% _1 S! H
%{__install} -p -D -m 0644 %{bdir}/objs/nginx.8 \/ S4 d! Q5 f6 N/ L. M. P; t
    $RPM_BUILD_ROOT%{_mandir}/man8/nginx.8
  r) L$ o* F, ~" {7 O0 H  E. X  L: ~4 q, G) g
%if %{use_systemd}
- Q% x$ A* r! U( f! U2 e# install systemd-specific files
2 }6 ]8 _  G# d; q, Q7 w%{__mkdir} -p $RPM_BUILD_ROOT%{_unitdir}% k5 h* ~8 k; r7 N* ~
%{__install} -m644 %SOURCE8 \8 ]% U% H4 ~) s6 `' q  r8 b
    $RPM_BUILD_ROOT%{_unitdir}/nginx.service
1 j* \/ H- p. X%{__install} -m644 %SOURCE11 \9 |% u1 l$ f5 L2 B+ \% h: Q) c
    $RPM_BUILD_ROOT%{_unitdir}/nginx-debug.service  Z1 Q  o7 e/ ]$ R# V
%{__mkdir} -p $RPM_BUILD_ROOT%{_libexecdir}/initscripts/legacy-actions/nginx
1 e/ e5 i# W9 D. b4 r1 X" a. t  K%{__install} -m755 %SOURCE9 \
6 p% j8 Z, C- M, S! i1 @) p' T    $RPM_BUILD_ROOT%{_libexecdir}/initscripts/legacy-actions/nginx/upgrade+ Q3 R' u! A1 `1 q: W
%{__install} -m755 %SOURCE13 \( H  H" b" ?2 k
    $RPM_BUILD_ROOT%{_libexecdir}/initscripts/legacy-actions/nginx/check-reload  L# O0 [# C- _8 n
%else
3 @4 v( n9 J& R6 {3 C* V$ b" N- g# install SYSV init stuff
4 S% Q$ Y3 ^2 F8 R%{__mkdir} -p $RPM_BUILD_ROOT%{_initrddir}
6 \: i# x2 B: q7 f%{__install} -m755 nginx.init $RPM_BUILD_ROOT%{_initrddir}/nginx
3 e2 B8 Y' g8 ?: z( z9 F6 l%{__install} -m755 nginx-debug.init $RPM_BUILD_ROOT%{_initrddir}/nginx-debug0 F- k1 O, }  y  L# m
%endif
) X7 \% L) s: A( _1 v
% F' V0 Z# c5 y# d# install log rotation stuff: }) k& g* y" N
%{__mkdir} -p $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d
7 H8 C! d$ e7 I" L%if 0%{?suse_version}/ p- s. ]0 g. p! b& w
%{__install} -m 644 -p %{SOURCE10} \
6 V* o( R4 @% S& h. S    $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/nginx
  u( ]' |+ P8 E2 ?& [8 O%else
& |  N" E6 v9 R/ C% V: D%{__install} -m 644 -p %{SOURCE1} \2 v. c" j0 k! x/ s- i
    $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/nginx9 {" J( Z- w* F% O: W2 {
%endif
, d9 \1 B+ y' Q. H  Q5 o! j0 V: L9 c  o6 @7 D
%{__install} -m755 %{bdir}/objs/nginx-debug \
3 C& L9 F& I& U& _    $RPM_BUILD_ROOT%{_sbindir}/nginx-debug% L8 B1 [) B( G0 S8 O: b4 y
! b+ _, K4 h" M1 j! {
%check: M6 B) t# T% Z! T; M
%{__rm} -rf $RPM_BUILD_ROOT/usr/src$ `9 Q  w, x# h. `
cd %{bdir}' X6 U' l7 u1 T$ O5 d
grep -v 'usr/src' debugfiles.list > debugfiles.list.new && mv debugfiles.list.new debugfiles.list- R" o- ^5 P9 T0 {5 B! X% n9 E2 _
cat /dev/null > debugsources.list
$ @( A: Z2 g4 W4 n$ k, ]%if 0%{?suse_version} >= 1500
/ V, D, d! n" r+ @" Jcat /dev/null > debugsourcefiles.list
# ]/ Z) W$ |# Q% n%endif6 Q' t( ?+ L& j. K0 K

8 Q! r# ~8 l" [- N+ f5 S) \. d%clean7 e. S8 L+ t  g3 D. O; W' J. f
%{__rm} -rf $RPM_BUILD_ROOT0 M5 ?& Q7 x! i7 T+ b

6 q% G9 N0 b1 t6 z0 c8 Y4 D%files
( c3 `  N7 O4 e2 ~+ w, H, r%defattr(-,root,root)2 d( m  ]: l' q1 j5 c; |

  ]. X8 U9 _2 ~7 D9 i3 @%{_sbindir}/nginx" ]# |) [- C: B% a- f
%{_sbindir}/nginx-debug
3 m) h3 a$ @3 L/ u6 [0 ?  P0 t6 x1 {! I3 |& m3 ~9 o6 H
%dir %{_sysconfdir}/nginx
: a0 \8 V# I' ]. P7 O7 K3 P%dir %{_sysconfdir}/nginx/conf.d4 z  x+ e* \4 U. J) r% e
%{_sysconfdir}/nginx/modules& u& _' R$ q+ w4 J/ w1 n7 ]
4 i& E( {1 W  \
%config(noreplace) %{_sysconfdir}/nginx/nginx.conf" v3 C- ^% M. h7 D0 `
%config(noreplace) %{_sysconfdir}/nginx/conf.d/default.conf7 F+ r0 g, G  w# v# k
%config(noreplace) %{_sysconfdir}/nginx/mime.types
) G- }# d) ^) ~9 z%config(noreplace) %{_sysconfdir}/nginx/fastcgi_params
& ?& n) k. k9 Y5 x( q%config(noreplace) %{_sysconfdir}/nginx/scgi_params
4 ~7 g* r  @9 {% a7 S: c%config(noreplace) %{_sysconfdir}/nginx/uwsgi_params. z: b( C8 L3 z& Y/ l; h' b
%config(noreplace) %{_sysconfdir}/nginx/koi-utf* ~7 z6 D) q# _- v. l, s5 k
%config(noreplace) %{_sysconfdir}/nginx/koi-win
$ n( ?! c1 A7 T4 H7 L2 G+ }%config(noreplace) %{_sysconfdir}/nginx/win-utf" `* \/ r: m8 y- P( H5 }  J
' r. r; }" R7 i4 o& H6 M: M9 E
%config(noreplace) %{_sysconfdir}/logrotate.d/nginx! Y4 A6 {0 h! ]9 T8 w. |  G2 ]- C
%config(noreplace) %{_sysconfdir}/sysconfig/nginx
! {) x1 n2 P3 X( k%config(noreplace) %{_sysconfdir}/sysconfig/nginx-debug% P* J7 O& g/ i8 Z7 S
%if %{use_systemd}
/ t4 @+ g. N* F%{_unitdir}/nginx.service- F( C/ t/ \4 \% }; t) t6 q
%{_unitdir}/nginx-debug.service
, v2 l5 G$ v$ K+ J2 ~& {9 z2 h%dir %{_libexecdir}/initscripts/legacy-actions/nginx, C/ p- G  D/ y. Y6 z: {4 U
%{_libexecdir}/initscripts/legacy-actions/nginx/*% @5 M$ Q' v* q7 Q. S" A: f4 C
%else
: s/ ~) |( `2 v5 a  e%{_initrddir}/nginx; [& O' S4 R1 ?+ o
%{_initrddir}/nginx-debug. g5 o2 s3 L5 \% Z. C; v
%endif
5 A) {6 S; T7 \9 w3 S* e
: x' J$ |# X( `4 T/ C9 z8 v! i* z: n%attr(0755,root,root) %dir %{_libdir}/nginx. d4 j$ S. G9 v. b5 J5 e
%attr(0755,root,root) %dir %{_libdir}/nginx/modules
% y2 B! O" A% i9 a%dir %{_datadir}/nginx
, m) l  _5 _6 `% Z( ]3 X%dir %{_datadir}/nginx/html' p5 p' Y2 }* o4 \9 a
%{_datadir}/nginx/html/*" L" `" r: q+ z4 D

1 Y/ R6 F2 k1 ~: K/ d4 }' _%attr(0755,root,root) %dir %{_localstatedir}/cache/nginx
- m1 R4 r5 N: l' x" _  y# d: F) v%attr(0755,root,root) %dir %{_localstatedir}/log/nginx
0 n: N% M. b7 V, Z7 M
2 h1 b3 C% @, ?, x; A6 F2 \) _%dir %{_datadir}/doc/%{name}-%{main_version}
- o! d! \2 |4 P%doc %{_datadir}/doc/%{name}-%{main_version}/COPYRIGHT" q$ o% I& z! d/ |+ ^
%{_mandir}/man8/nginx.8*
1 J1 q' w/ z5 o+ T) T3 O7 _! O4 }8 d4 ]& D2 |2 E2 l7 j9 z
%pre
8 v& X* D0 H/ z1 ]9 w* X8 ^# Add the "nginx" user
+ V7 G3 y, D+ D: i( Wgetent group %{nginx_group} >/dev/null || groupadd -r %{nginx_group}
# s) M' z0 h$ N. [; U" `  bgetent passwd %{nginx_user} >/dev/null || \
/ z" k  T6 Y* x# {( {8 l    useradd -r -g %{nginx_group} -s /sbin/nologin \+ W7 H2 b! |* @5 b# D3 |( m
    -d %{nginx_home} -c "nginx user"  %{nginx_user}9 Q' [: f: K& B% }: g$ D4 v
exit 0
9 c% o+ K6 k8 X' ~9 H: c; E
, b5 C- {6 b5 S# c$ t3 G9 J, I, z%post- h  D# @9 a; e2 J0 g
# Register the nginx service
, G* k7 \) j+ Fif [ $1 -eq 1 ]; then% m, J% B4 D8 n9 B
%if %{use_systemd}7 w# w/ z# |, T1 b3 J" n9 g
    /usr/bin/systemctl preset nginx.service >/dev/null 2>&1 ||:( P3 i" K; Y6 m' L
    /usr/bin/systemctl preset nginx-debug.service >/dev/null 2>&1 ||:4 ^9 W2 c  y, n7 q, D
%else
- |7 t0 F, X  `! A6 v    /sbin/chkconfig --add nginx/ h5 V+ ?# H! d  P) {2 [
    /sbin/chkconfig --add nginx-debug7 s  W* \) V' y2 z& `- t. N
%endif* {7 j+ `" h) D$ b# y
    # print site info
) N+ {" D7 ^5 E* M9 r: x0 F& m    cat <<BANNER
# [, B, Y  h+ S2 h  v2 m----------------------------------------------------------------------4 o, [' X- u6 s5 W% v
7 A, g$ T# h5 g( p( D# G
Thanks for using nginx!4 M2 i  t2 ]/ @* H1 D
8 `; t  H) P3 N/ Q) C3 @
Please find the official documentation for nginx here:  S' y' a$ S2 i. q
* http://nginx.org/en/docs/
4 B2 d  k0 d/ s% f$ L* c
" v- H; ~3 y5 ?8 h9 m0 M3 B$ H- W: k$ dPlease subscribe to nginx-announce mailing list to get8 O* o0 I- N. O+ g4 P
the most important news about nginx:
& ]  S: m, }4 U7 s* http://nginx.org/en/support.html
2 z" _' b! `7 `" G) J- {
4 ^' B5 C/ I$ M6 UCommercial subscriptions for nginx are available on:9 W; M; b8 B" T( K# K
* http://nginx.com/products/" G2 n9 O/ k# ^1 U& S8 S! x

9 x& L; k6 K( j5 `' F' k----------------------------------------------------------------------
5 t6 z2 E7 F: D7 A  sBANNER1 t% Z8 _# c# J" o

# A4 D9 I; o& U' L; e  H    # Touch and set permisions on default log files on installation
( _) G6 A, j* R
5 o# Z7 R* Y' {  ^" v% B( a    if [ -d %{_localstatedir}/log/nginx ]; then
" x+ L3 o! N& F! K        if [ ! -e %{_localstatedir}/log/nginx/access.log ]; then
  ?% R6 ^0 b3 y) G            touch %{_localstatedir}/log/nginx/access.log
8 y7 t+ L3 N. }  E! }/ v! p            %{__chmod} 640 %{_localstatedir}/log/nginx/access.log+ O/ X) ^. M4 k0 K/ G! W+ P
            %{__chown} nginx:%{nginx_loggroup} %{_localstatedir}/log/nginx/access.log
/ B* Z  n. y& Z+ T) ~& @) p7 T        fi
4 t9 q2 d" r4 o9 h+ [" ?/ Y# {2 S, [. `, l, k9 a
        if [ ! -e %{_localstatedir}/log/nginx/error.log ]; then
, I* q( }) [' s" W, S: O5 u& e5 E            touch %{_localstatedir}/log/nginx/error.log, H4 Z! e5 _3 [, B/ p' H  o
            %{__chmod} 640 %{_localstatedir}/log/nginx/error.log7 d0 D, O2 u5 b, k# s1 t6 Y
            %{__chown} nginx:%{nginx_loggroup} %{_localstatedir}/log/nginx/error.log
: u) I2 u! a$ o$ x& @0 N0 l9 j        fi
) x: e1 c* k! j" h5 D: X    fi
7 ~% B/ d$ |0 X' [% _# R' K0 X3 Kfi
$ W' j" w& Z1 v7 }& u  D, @# y! r
5 Q  v& `/ v; o%preun
7 g0 D0 g- K9 G! W: ]9 Zif [ $1 -eq 0 ]; then- }; z& Q6 Z" w0 [
%if %use_systemd6 |4 d$ r8 o0 q% e
    /usr/bin/systemctl --no-reload disable nginx.service >/dev/null 2>&1 ||:
  b& T6 s  @: Q9 Y+ _    /usr/bin/systemctl stop nginx.service >/dev/null 2>&1 ||:
+ F' B! p2 W+ s1 l# j$ |) o4 g* R%else
3 `6 o5 C5 {) S    /sbin/service nginx stop > /dev/null 2>&1: ]% x) X9 ^' {5 O, C
    /sbin/chkconfig --del nginx
% s" F' H; Y2 Y. z" F8 b1 {    /sbin/chkconfig --del nginx-debug1 s9 _. g2 Q3 q) ~8 K
%endif; z1 o8 D  B, Z8 [% p/ P
fi
4 G- B' O( g; P. v' r* Z& T* S, T; N
%postun- g5 A* M, l- }1 a4 R
%if %use_systemd, y3 o3 d+ W. d/ G' G- S  U9 {
/usr/bin/systemctl daemon-reload >/dev/null 2>&1 ||:3 u1 b) _: v% S; C/ R1 D" w
%endif- G/ H: k8 `! `" z" i# h5 r
if [ $1 -ge 1 ]; then1 o" i9 o7 r; O: j. x; ^) T- d. @
    /sbin/service nginx status  >/dev/null 2>&1 || exit 0
' I# W$ G9 k8 b# _3 S/ ?    /sbin/service nginx upgrade >/dev/null 2>&1 || echo \0 a% O  L) V0 H
        "Binary upgrade failed, please check nginx's error.log"
# u: G# H+ J& M6 afi+ \4 y! {  p* ?

1 o' T2 `5 K7 c( y* L' ?%changelog
" i5 e9 |* W+ U* d% Z6 m/ s1 E# V* Tue Sep 30 2019 fangdm <8@8994.cn>1 G3 U$ C5 g3 g' w- n( I
- Add modules nginx-http-concat and ngx_cache_purge
) R- `! b( Q* s
* y6 E& W) w- p3 z# X# G$ M* Tue Aug 13 2019 Andrei Belov <defan@nginx.com>9 a4 s# |5 q" P$ {# N' `
- 1.16.1
7 x' J" Y7 ], s- d
$ B# [9 y3 X) \! l0 ?$ h" }5 g( y

& c0 `5 z& o) E' `+ P
编译完成之后,查看changelog,是成功了。
复制
1" ^$ g1 J1 e4 ^6 Y
2
. y$ b5 A# u3 T' R5 b) ~3
! V: @1 m$ P8 Q% s& o$ J  p4: p! @) A( ^" z  K5 ]
55 I; G: j8 |# g9 J  C; p8 b7 @6 `
6
4 ^1 G0 K4 L7 \. W2 ^0 i% U3 Q
[root@localhost SPECS]# rpm --changelog -qp /root/rpmbuild/RPMS/x86_64/nginx-1.16.1-1.el7.ngx.x86_64.rpm
2 y  `1 T6 H8 S+ ^) g8 }' E7 t* Mon Sep 30 2019 fangdm <8@8994.cn>* F! i( K0 s! p: h0 \8 A7 E6 u
- Add modules nginx-http-concat and ngx_cache_purge4 c7 A/ n3 Y) @9 D2 w$ [
6 o, y  V: v  D0 Z$ M) C5 f
* Tue Aug 13 2019 Andrei Belov <defan@nginx.com>1 t& O+ E1 }8 d1 }
- 1.16.1
/ O( [* h9 C4 M! b/ g$ R, U. S
0 u: W9 q, K7 R) ]4 x9 v" ?
3 ?6 R/ t' T8 P* |7 K
fpm打包方法
使用fpm这个方式也是可以将tar打包为rpm包,其打包流程大致是这样的:
  • 编译安装被打包软件,指定安装的临时目录,如指定--prefix=/fpmbulid
  • 创建安装脚本、卸载脚本
  • 安装FPM工具
  • 使用fpm打包
    , W8 T0 m3 e( }. N4 C

; U0 E, r- A, V2 z' T
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-12 02:01 , Processed in 0.025520 second(s), 22 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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