Step6-spec指令解读[一]%prep
spec 文件中的 %prep
阶段,决定了源码包如何被解包、初始化与预处理。
这一节专注还原 rpm 安装日志中 %prep
对应的源码解压动作,配合日志和图片,彻底搞清楚包管理器到底做了什么。
# 1. %prep 阶段可视化
下面这张图可以直观看到 %prep
阶段实际对应的是源码的解压与 BUILD 目录的初始化。
实际上,这一步就是把 SOURCES 目录下的 .tar.gz
包解压出来。
# 2. 构建日志还原
结合实际构建日志,可以看到 rpm-build 在 %prep
阶段做了哪些解压和准备工作:
关键日志:
07:45:49.446 [QUIET] [system.out] Installing /opt/modules/bigtop/output/redis/redis_3_2_0-7.4.0-1.el8.src.rpm
07:45:49.446 [QUIET] [system.out] Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.B8k8DN
07:45:49.447 [ERROR] [system.err] + umask 022
07:45:49.447 [ERROR] [system.err] + cd /opt/modules/bigtop/build/redis/rpm//BUILD
07:45:49.447 [ERROR] [system.err] + cd /opt/modules/bigtop/build/redis/rpm/BUILD
07:45:49.447 [ERROR] [system.err] + rm -rf redis-7.4.0
07:45:49.449 [ERROR] [system.err] + /usr/bin/gzip -dc /opt/modules/bigtop/build/redis/rpm/SOURCES/7.4.0.tar.gz
07:45:49.450 [ERROR] [system.err] + /usr/bin/tar -xvvof -
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
这里已经非常明确:
- 先清空旧的 BUILD 目录
- 再把 SOURCES 目录下的源码 tar 包解压
- 解包后,redis-7.4.0 目录内容完全展开
# 3. 解包结构与文件还原
实际执行过程中,解压出来的内容如下(部分日志截取):
/usr/bin:/sbin:/bin:/opt/modules/gradle-5.6.4/bin:/opt/modules/apache-ant-1.10.12/bin:/opt/modules/apache-ivy-2.5.0/bin:/opt/modules/jdk1.8.0_202/bin, HISTCONTROL=ignoredups
, CONDA_DEFAULT_ENV=base, CONDA_EXE=/opt/enhance_env/miniconda3/bin/conda, HISTSIZE=1000, JAVA_HOME=/opt/modules/jdk1.8.0_202, IMPALA_HOME=/opt/modules/bigtop/build/impala/r
pm/BUILD/impala-4.4.1, BASH_FUNC_which%%=() { ( alias;
eval ${which_declare} ) | /usr/bin/which --tty-only --read-alias --read-functions --show-tilde --show-dot $@
}, CONDA_PYTHON_EXE=/opt/enhance_env/miniconda3/bin/python, TERM=xterm, LANG=C.UTF-8, GRADLE_HOME=/opt/modules/gradle-5.6.4, CONDA_PREFIX=/opt/enhance_env/miniconda3, ANT_HO
ME=/opt/modules/apache-ant-1.10.12, MAVEN_HOME=/opt/modules/apache-maven-3.8.4, MAIL=/var/spool/mail/root, NVM_INC=/root/.nvm/versions/node/v12.13.0/include/node, _CE_M=, wh
ich_declare=declare -f, LOGNAME=root, NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node, PWD=/opt/modules/bigtop, CONDA_SHLVL=1, NVM_CD_FLAGS=, NVM_DIR=/root/.nvm, LE
SSOPEN=||/usr/bin/lesspipe.sh %s, R_HOME=/usr/local/R-4.4.2, OLDPWD=/opt/modules/gradle-5.6.4, USER=root, _CE_CONDA=, HOSTNAME=rocky8, DEBUGINFOD_URLS=https://debuginfod.cen
tos.org/ , CONDA_PROMPT_MODIFIER=(base) , IVY_HOME=/opt/modules/apache-ivy-2.5.0, QA_RPATHS=2, NVM_BIN=/root/.nvm/versions/node/v12.13.0/bin, HOME=/root, SHLVL=1}
07:45:49.418 [DEBUG] [org.gradle.process.internal.DefaultExecHandle] Changing state to: STARTING
07:45:49.418 [DEBUG] [org.gradle.process.internal.DefaultExecHandle] Waiting until process started: command 'rpmbuild'.
07:45:49.422 [DEBUG] [org.gradle.process.internal.DefaultExecHandle] Changing state to: STARTED
07:45:49.422 [INFO] [org.gradle.process.internal.DefaultExecHandle] Successfully started process 'command 'rpmbuild''
07:45:49.422 [DEBUG] [org.gradle.process.internal.ExecHandleRunner] waiting until streams are handled...
07:45:49.446 [QUIET] [system.out] Installing /opt/modules/bigtop/output/redis/redis_3_2_0-7.4.0-1.el8.src.rpm
07:45:49.446 [QUIET] [system.out] Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.B8k8DN
07:45:49.447 [ERROR] [system.err] + umask 022
07:45:49.447 [ERROR] [system.err] + cd /opt/modules/bigtop/build/redis/rpm//BUILD
07:45:49.447 [ERROR] [system.err] + cd /opt/modules/bigtop/build/redis/rpm/BUILD
07:45:49.447 [ERROR] [system.err] + rm -rf redis-7.4.0
07:45:49.449 [ERROR] [system.err] + /usr/bin/gzip -dc /opt/modules/bigtop/build/redis/rpm/SOURCES/7.4.0.tar.gz
07:45:49.450 [ERROR] [system.err] + /usr/bin/tar -xvvof -
07:45:49.451 [QUIET] [system.out] drwxrwxr-x root/root 0 2024-07-29 05:31 redis-7.4.0/
07:45:49.451 [QUIET] [system.out] drwxrwxr-x root/root 0 2024-07-29 05:31 redis-7.4.0/.codespell/
07:45:49.451 [QUIET] [system.out] -rw-rw-r-- root/root 139 2024-07-29 05:31 redis-7.4.0/.codespell/.codespellrc
07:45:49.451 [QUIET] [system.out] -rw-rw-r-- root/root 17 2024-07-29 05:31 redis-7.4.0/.codespell/requirements.txt
07:45:49.451 [QUIET] [system.out] -rw-rw-r-- root/root 111 2024-07-29 05:31 redis-7.4.0/.codespell/wordlist.txt
07:45:49.452 [QUIET] [system.out] -rw-rw-r-- root/root 405 2024-07-29 05:31 redis-7.4.0/.gitattributes
07:45:49.452 [QUIET] [system.out] drwxrwxr-x root/root 0 2024-07-29 05:31 redis-7.4.0/.github/
07:45:49.452 [QUIET] [system.out] drwxrwxr-x root/root 0 2024-07-29 05:31 redis-7.4.0/.github/ISSUE_TEMPLATE/
07:45:49.452 [QUIET] [system.out] -rw-rw-r-- root/root 409 2024-07-29 05:31 redis-7.4.0/.github/ISSUE_TEMPLATE/bug_report.md
07:45:49.452 [QUIET] [system.out] -rw-rw-r-- root/root 580 2024-07-29 05:31 redis-7.4.0/.github/ISSUE_TEMPLATE/crash_report.md
07:45:49.452 [QUIET] [system.out] -rw-rw-r-- root/root 623 2024-07-29 05:31 redis-7.4.0/.github/ISSUE_TEMPLATE/feature_request.md
07:45:49.452 [QUIET] [system.out] -rw-rw-r-- root/root 110 2024-07-29 05:31 redis-7.4.0/.github/ISSUE_TEMPLATE/other_stuff.md
07:45:49.452 [QUIET] [system.out] -rw-rw-r-- root/root 941 2024-07-29 05:31 redis-7.4.0/.github/ISSUE_TEMPLATE/question.md
07:45:49.452 [QUIET] [system.out] -rw-rw-r-- root/root 526 2024-07-29 05:31 redis-7.4.0/.github/dependabot.yml
07:45:49.452 [QUIET] [system.out] drwxrwxr-x root/root 0 2024-07-29 05:31 redis-7.4.0/.github/workflows/
07:45:49.453 [QUIET] [system.out] -rw-rw-r-- root/root 3029 2024-07-29 05:31 redis-7.4.0/.github/workflows/ci.yml
07:45:49.453 [QUIET] [system.out] -rw-rw-r-- root/root 706 2024-07-29 05:31 redis-7.4.0/.github/workflows/codeql-analysis.yml
07:45:49.453 [QUIET] [system.out] -rw-rw-r-- root/root 1322 2024-07-29 05:31 redis-7.4.0/.github/workflows/coverity.yml
07:45:49.453 [QUIET] [system.out] -rw-rw-r-- root/root 56666 2024-07-29 05:31 redis-7.4.0/.github/workflows/daily.yml
07:45:49.453 [QUIET] [system.out] -rw-rw-r-- root/root 2737 2024-07-29 05:31 redis-7.4.0/.github/workflows/external.yml
07:45:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
这些都是源码包的完整目录,%prep 只是把压缩包内容标准化还原到 BUILD 目录下。
# 4. 解压后的目录
如上图,%prep 阶段完成后,源码被完整解压到 rpm 的 BUILD 目录下,目录结构与源码包一致:
- 顶层目录为:
redis-7.4.0/
- 其中包含
README.md
、Makefile
、deps/
、src/
、tests/
等全部源码文件和子目录
实际路径如下:
/opt/modules/bigtop/build/redis/rpm/BUILD/redis-7.4.0/
1
后续所有的构建、补丁、安装等操作都在这个目录内展开。
- 01
- bigtop-select 打包缺 compat 报错修复 deb07-16
- 02
- bigtop-select 打包缺 control 文件报错修复 deb07-16
- 03
- 首次编译-环境初始化 必装07-16