【rpm编程】%setup

%setup

%setup 主要用于解压源代码包并可选地设置解压目录,比较灵活,你可以指定是否应用补丁、是否定义补丁的级别等。

-n <directory>:指定解压目录。

-a <n>:处理多个源包。

-p <num>:指定补丁的级别。

 

示例对比:

假设你有如下源代码包和补丁文件:

spec
Source0: mypackage-1.0.tar.gz Patch0: mypatch-1.0.patch Patch1: mypatch-1.1.patch

使用 %setup

spec
%prep %setup -q %patch0 -p1 %patch1 -p1

这里,%setup 只解压源代码包,你需要手动应用每个补丁。

使用 %autosetup

spec
%prep %autosetup -q

这里,%autosetup 会自动解压源代码包,并自动应用所有的补丁(包括 mypatch-1.0.patchmypatch-1.1.patch)。

总结:

  • %setup:更灵活,可以用来解压源代码包并应用补丁,但需要手动指定补丁。
  • %autosetup:简化了构建过程,自动解压并应用所有补丁,适合常规使用。

如果你希望简化构建过程且只需要默认行为(解压并自动应用补丁),使用 %autosetup 更为方便。如果需要更多的控制,或者想在特定阶段手动应用补丁,则使用 %setup

 

在 RPM spec 文件中,%setup 宏有一个非常有用的选项 -T,它用于 禁用自动创建临时目录。通常,%setup 会在解压源代码包之前,自动创建一个临时目录来解压源代码,这样可以避免污染当前工作目录。

%setup -T 的作用:-T 选项告诉 %setup 不创建临时目录,而是直接解压到当前工作目录下。这通常在你想手动控制解压过程,或者不希望解压到临时目录时使用。

详细解释:

  • 默认行为%setup 默认会创建一个临时目录,解压源代码包到该目录中,然后你可以在该目录下进行后续操作。临时目录的名称通常是由源代码包的名称和版本号决定的。例如,如果你的源代码包是 mypackage-1.0.tar.gz,那么解压后的目录名可能会是 mypackage-1.0

  • 使用 -T 选项:当你使用 -T 选项时,%setup 不创建临时目录,而是直接将源代码包解压到当前目录。这样,解压后的文件和目录将直接位于当前构建目录中。

 

示例:假设你的 RPM spec 文件中定义了源代码包:

Source0: mypackage-1.0.tar.gz

如果你使用:

%setup -T -q

这个命令的行为是:1. 直接解压 mypackage-1.0.tar.gz 到当前目录,而不是创建临时目录。2. -q 表示安静模式,减少输出。

 

假设你有一个源代码包 mypackage-1.0.tar.gz,并且想要将其解压到当前目录,而不是临时目录:

%prep
%setup -T -q

这样,mypackage-1.0.tar.gz 将会被直接解压到当前构建目录下,文件会直接出现在当前目录,而不会被放到一个临时的 mypackage-1.0 目录中。

总结:

  • -T 选项使 %setup 不创建临时目录,而是直接解压源代码包到当前工作目录。
  • 默认情况下,%setup 会创建一个临时目录,解压源代码包到该目录中。
  • -T 适用于希望直接在当前目录下操作的场景,或是手动控制解压目录结构的需求。

 

 

%setup -c 是 RPM spec 文件中的一个选项,用于控制 %setup 宏的行为,尤其是在解压源代码包时,它会确保 清除目标目录 中的任何旧文件或目录,确保源代码包能够干净地解压。

作用:

  • -c 选项的作用是 清空目标目录,即在解压源代码包之前,它会删除目标目录中已经存在的任何文件或子目录。这样可以避免由于先前构建残留的文件导致解压源代码包时出现冲突或错误。

典型用法:

%setup -c -q
  • -c:清空目标目录(通常是当前工作目录或者临时目录)。
  • -q:安静模式,不输出过多的信息。

详细行为:

  • 清空目标目录:当你使用 -c 选项时,RPM 在解压源代码包之前会检查目标目录(通常是 BUILD 目录或临时目录),如果该目录中已经存在文件或子目录,它会首先删除这些内容,然后再解压源代码包。这样做的目的是避免由于目标目录中已有文件导致的冲突。
  • 避免残留文件:如果先前构建过程中有残留文件或目录,使用 -c 可以确保这些旧文件不会干扰当前的构建过程。

 

假设你有如下的 RPM spec 文件:

Source0: mypackage-1.0.tar.g
 

并在 %prep 阶段使用:

%prep %setup -c -q
这个命令的作用是:
  1. 清空目标目录,确保任何之前的构建残留都被清除。
  2. 解压 mypackage-1.0.tar.gz 到当前目录(如果没有指定 -n 参数的话)。
  3. -q 表示安静模式,不输出详细的解压信息。

适用场景:

  • 避免构建污染:如果你担心构建过程中有文件残留(例如先前的构建结果),使用 -c 可以确保每次构建都从干净的目录开始。
  • 确保目录清洁:在复杂的构建过程中,可能会有多个文件或源代码包在同一个目录下操作,使用 -c 可以确保解压后的内容不会与现有的文件冲突。

注意事项:使用 -c 时,它会删除目标目录中的所有文件和子目录,因此你需要确保目标目录中的文件不会丢失重要数据,通常目标目录是构建过程中使用的临时目录(如 BUILD 目录),所以在大多数情况下,这样的操作是安全的。

 

%setup -a 是 RPM spec 文件中的一个选项,用于处理多个源代码包(Source RPMs)。它允许你在构建过程中指定并解压多个源代码包,通常在你有附加源代码包需要与主源代码包一起解压时使用。

作用:

  • -a 选项指定要附加的源代码包的数量,允许解压多个源代码包。
  • 默认情况下,%setup 只处理一个源代码包,但使用 -a 后,可以让它处理多个源包,且这些源包通常都是以 Source1, Source2, … 等形式在 spec 文件中定义的。
%setup -a N

N 是附加的源代码包的数量。-a 1 表示解压一个附加的源代码包,-a 2 表示解压两个源代码包,依此类推。

 

用法说明:

假设你有多个源代码包,可能是一个主源包和一些附加的源包。你可以通过 Source1, Source2, 等宏在 spec 文件中指定附加源代码包。

示例:假设你的 spec 文件中有以下定义:

Source0: mypackage-1.0.tar.gz
Source1: additional-files.tar.gz
Source2: another-patch.tar.gz

然后在 %prep 阶段使用:

%prep
%setup -a 2 -q

解释:

  • Source0 是主源代码包,通常是你的应用或库的源码。
  • Source1Source2 是附加的源代码包(可能是一些额外的文件或补丁),这些源代码包会在 %setup 阶段一并解压。
  • -a 2 表示解压 Source0Source1Source2(共 3 个源代码包)。
  • -q 表示安静模式,不显示详细的解压信息。

解压顺序:

%setup -a N 会按顺序解压每个源代码包,首先是 Source0(主源包),然后是 Source1,接着是 Source2,以此类推。

多个源代码包的使用场景:

  • 附加文件:如果你有一些额外的文件或数据包需要与主源代码包一起构建,可以将它们作为附加源代码包。
  • 补丁包:在某些情况下,你可能会将补丁文件作为附加源代码包,通过 -a 来解压并在后续步骤中应用补丁

 

posted @ 2022-05-19 20:50  苏格拉底的落泪  阅读(19)  评论(0编辑  收藏  举报