【问题标题】:How to create symlink in rpm to files provided by external rpms?如何在 rpm 中为外部 rpm 提供的文件创建符号链接?
【发布时间】:2016-09-04 07:52:06
【问题描述】:

我正在尝试将两个符号链接打包到外部 dep1.rpmdep2.rpm 提供的相应 jar 中。这些在my-app-extra.spec 中被声明为依赖项:

Requires: dep1
Requires: dep2

我有我的%install 符号链接他们的罐子(%dep1jar%dep2jar):

%install
%{__install} -d -m 0755 $RPM_BUILD_ROOT%{_javadir}
%{__install} -d -m 0755 $RPM_BUILD_ROOT%{_javadir}/%{my_app}
pushd $RPM_BUILD_ROOT%{_javadir}/%{my_app}
    for jar in %dep1jar %dep2jar
    do
        ln -sf ../"${jar}" "${jar}"
    done
popd

但 rpmbuild 失败:

ERROR: link target doesn't exist (neither in build root nor in installed system):
  /usr/share/java/my-app/dep1.jar -> /usr/share/java/dep1.jar
Add the package providing the target to neededforbuild and Requires
// same error for dep2.jar
error: Bad exit status from /var/tmp/rpm-tmp.31253 (%install)

有没有办法绕过这个 rpmbuild 检查?


背景

我有一个 java 应用程序(可选)需要两个外部库来提供扩展功能。为了安装这些库,我创建了 dep1.rpmdep2.rpm 将 jar 存储在 %_datadir/java 下,另外还有一个 my-app-extra rpm 应该符号链接 %_datadir/java/my-app 下的那些(遵循 linux 下一些明显建立的 java 打包约定) .

但是我没有找到如何强制 rpmbuild 构建这个 rpm 而不将外部库声明为 BuidRequires 并首先安装它们。

我想要什么

这就是我所追求的总结(简化,因为完整的解决方案涉及版本控制):

/usr/share/java/dep1.jar (from dep1.rpm)
/usr/share/java/dep2.jar (from dep2.rpm)

/usr/share/java/my-app/dep1.jar -> ../dep1.jar (from my-app-extended.rpm)
/usr/share/java/my-app/dep2.jar -> ../dep2.jar (from my-app-extended.rpm)

注意:我现在正在探索 rpm 子包的可能性,但我希望这在没有子包的情况下是可能的。

【问题讨论】:

    标签: java rpmbuild rpm-spec


    【解决方案1】:

    我可以让它“接触”目标并将它们从文件中排除。在my-app-extra.spec:

    %install
    %{__install} -d -m 0755 $RPM_BUILD_ROOT%{_javadir}
    %{__install} -d -m 0755 $RPM_BUILD_ROOT%{_javadir}/%{my_app}
    pushd $RPM_BUILD_ROOT%{_javadir}/%{my_app}
        for jar in %{dep1jar} %{dep2jar}
        do
            # touch! rpmbuild aborts the build if symlink targets missing!
            touch ../"${jar}"
            ln -sf ../"${jar}" "${jar}"
        done
    popd
    
    # more stuff ...
    
    %files
    # ...
    # Exclude dummy (touched) files!
    %exclude %{_javadir}/%{dep1jar}
    %exclude %{_javadir}/%{dep2jar}
    %{_javadir}/%{my_app}/%{dep1jar}
    %{_javadir}/%{my_app}/%{dep2jar}
    

    【讨论】:

    • 我认为这是你能做到的最好的。你说它们是可选的,但你Require他们,所以它们不是可选的。我能想到的唯一其他解决方法是在您的%post 中执行符号链接,但我不喜欢这样做,因为它们不在 RPMDB 中作为您的文件。
    • @AaronD.Marasco 感谢您确认我的感受和提醒:这些库实际上是可选的,但我发现我表达得不够清楚。假设我有一个my-app.rpm,现在我正在创建一个my-app-extra.rpm。这个额外的 rpm 是可选的,但它对 dep1.rpmdep2.rpm 有很强的依赖性。我会尽量说清楚。
    猜你喜欢
    • 1970-01-01
    • 2011-06-16
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多