【问题标题】:How do I get rpmbuild to download all of the sources for a particular .spec?如何让 rpmbuild 下载特定 .spec 的所有源?
【发布时间】:2016-01-15 14:50:03
【问题描述】:

我正在通过 URL 向现有 rpm .spec 文件添加一些源,但尚未下载它们。有没有办法让rpmbuild 下载源代码而不是手动下载?

【问题讨论】:

    标签: rpm rpmbuild rpm-spec


    【解决方案1】:

    rpmdevtools 包中的 spectool 实用程序可以做到这一点。只需安装rpmdevtools 并将spectools 指向.spec,如下所示:

    spectool -g -R SPECS/nginx.spec
    

    它将所有丢失的源下载到 rpm 的%{_sourcedir}(通常是SOURCES)目录中。

    【讨论】:

    • 我在 SUSE 中找不到哪个 rpm 包含 spectool。
    • 我想知道标志的含义:“-g, --gf, --get-files 获取与 URL 一起列出的源/补丁;-R, --sourcedir 下载进入 rpm 的 %{_sourcedir}"
    • @aleung 试试 yum whatprovides "*bin/spectool"
    • 正如@Richlv 指出的那样,spectool 将文件下载到%{_sourcedir} 目录中。如果您想知道它在您自己的系统上的位置,您可以使用rpm --eval "%{_sourcedir}" 对其进行评估。我最近碰巧将它用于各种事情,并发现它非常有用。
    【解决方案2】:

    对于后代,还有另一种方法可以做到这一点,不需要任何额外的工具或下载:

    rpmbuild --undefine=_disable_source_fetch -ba /path/to/your.spec
    

    默认情况下禁止自动下载源代码,因为 RPM 缺少源存档的内置完整性检查。必须信任网络,并检查任何校验和和签名。这个限制对包维护者来说是有意义的,因为他们负责传送受信任的代码。

    但是,当您知道自己在做什么并了解风险时,您可能会强行解除限制。

    【讨论】:

    • rpmbuild --undefine=_disable_source_fetch --define '_sourcedir .' -ba *.spec 最后。
    【解决方案3】:

    在规范文件中,您可以将%undefine _disable_source_fetch 放在源 URL 之前的任何位置。

    出于安全考虑,您还应该指定 sha256sum,并在设置之前在%prep 部分中检查它。

    这是一个工作示例:

    Name:       monit
    Version:    5.25.1
    Release:    1%{?dist}
    Summary:    Monitoring utility for unix systems
    
    Group:      Applications/System
    License:    GNU AFFERO GENERAL PUBLIC LICENSE version 3
    URL:        https://mmonit.com/monit/
    %undefine _disable_source_fetch
    Source0:    https://mmonit.com/monit/dist/%name-%version.tar.gz
    %define     SHA256SUM0 4b5c25ceb10825f1e5404f1d8a7b21507716b82bc20c3586f86603691c3b81bc
    
    %define debug_package %nil
    
    BuildRequires:  coreutils
    
    %description
    Monit is a small Open Source utility for managing and monitoring Unix systems. Monit conducts automatic maintenance
    and repair and can execute meaningful causal actions in error situations.
    
    %prep
    echo "%SHA256SUM0  %SOURCE0" | sha256sum -c -
    %setup -q
    
    ...
    

    学分

    @YaroslavFedevych 取消定义 _disable_source_fetch。

    【讨论】:

    • 我尝试了所有这些,但我仍然没有让 RPM 从 url 下载 tarball。相反,它会尝试使用 /usr/src/packages/SOURCES/%name-%version.tar.gz 文件。仅供参考,我使用的是 4.4.2.3 rpmbuild 版本
    • 我刚刚在另一个具有 rpmbuild 4.12.0.1 的环境中进行了测试,并且一切正常(即使没有 %undefine 和 %define 行)。如果它可以帮助其他人,我发现从 url 下载源而不是使用 SOURCES/ 自 4.4.6 redhat.com/archives/rpm-list/2007-December/msg00003.html 开始引入
    • 我发现 4.11.3 不遵守 %undefine _disable_source_fetch 指令。但是,您仍然可以像@Yaroslav 提到的那样在命令行上使用它。但是@Matt 对 SHA 校验和代码表示敬意……即使 tarball 已经在 SOURCES 目录中,这也是个好主意。
    • 请注意验证码有错别字:%SHA256SUM0%SOURCE0之间必须有两个空格,而不是一个空格。
    • @vog 为我工作,但我相信你的话,你就是这种情况。已更新,谢谢。
    【解决方案4】:

    如果您从 (git) 托管服务(github 等)获取资源,则当与 _disable_source_fetch 结合使用时,支持自动检查已经内置的资源...

    https://fedoraproject.org/wiki/Packaging:SourceURL

    例如,对于来自 github 的特定 githash:

    %global commit 40-CHARACTER-HASH-VALUE
    %global shortcommit %(c=%{commit}; echo ${c:0:7})
    Source0:  https://github.com/OWNER/PROJECT/archive/%{commit}/%{name}-%{shortcommit}.tar.gz
    ...
    %prep
    %autosetup -n PROJECT-%{commit}
    

    【讨论】:

      猜你喜欢
      • 2013-01-01
      • 2014-11-11
      • 2022-09-29
      • 1970-01-01
      • 1970-01-01
      • 2015-01-13
      • 1970-01-01
      • 2015-09-11
      • 1970-01-01
      相关资源
      最近更新 更多