2016-10-28 82 views
1

我正在構建一個RPM,它本質上只是打包一組供應商提供的.so二進制文件,以便它們可用於我們的內部應用程序,該應用程序也通過RPM安裝。rpmbuild不包括符號鏈接共享對象作爲提供

其中一個庫帶有多個版本 - libexample_base.so和libexample_debug.so(等等)。我目前正在嘗試打包這些文件,以便它們都包含在RPM中(以便開發人員可以根據需要在它們之間切換),但是通過在%install期間創建符號鏈接來選擇libexample_base.so作爲默認版本,然後將其打包爲RPM中的文件。

%install 
[... Copy the files from the tarball to the buildroot ...] 
pushd %{buildroot}%{_libdir} 
ln -sf libexample_base.so libexample.so 
popd 

這很好,除了一個問題。它使用自動依賴關係生成,雖然它提供了所有具有實際文件的共享對象,但它不提供libexample.so,儘管符號鏈接位於%文件並正確安裝。不幸的是,供應商庫不提供SONAME條目,並且由於它們是二進制blob,我不能隨時添加它們,所以RPM取決於實際的文件名。所有的下游RPM都需要libexample.so,由於這個RPM沒有列出它的要求,所以他們拒絕安裝,因爲缺少依賴關係,即使這樣做確實有效(ldconfig可以找到libexample.so而沒有問題)。

有關如何提示rpmbuild將symlink解析爲提供的任何想法?

+0

我找到了一個駭人的解決方法 - 如果我硬鏈接文件而不是符號鏈接,它的工作原理。儘管如此,我真的寧願不這樣做,因爲它包含了兩次完整的文件,而且它的目標是能夠更改鏈接指向的位置。 – matthock

+0

您應該將/ usr/sbin/ldconfig放在spec文件的%post部分 –

回答

1

經過一些進一步的研究,我已經確定,我想要做什麼是不可能的,以及爲什麼。核心問題歸結爲rpmbuild的行爲,它的構建是爲了處理正確生成的帶有SONAME條目的共享對象。它明確沒有列出以.so結尾的共享對象的符號鏈接,因爲通常情況下,這些對象指向版本化的共享對象(.so。#。#),並且應用程序應該依賴於那些版本化對象 - 符號鏈接是爲了讓您的鏈接器找到最新的鏈接器而包含在devel包中。

我遇到了第二種情況,當事情沒有正確完成時用作備份 - 對於RPM和GCC,當沒有SONAME時,它使用文件名。當我運行GCC時,文件名爲libexample.so(符合實際的符號鏈接),並且沒有SONAME,所以它只是將自身配置爲與libexample.so鏈接; rpmbuild看到了這一點,並將其設置爲應用程序RPM的需求。但是,由於rpmbuild明確地將該名稱從庫rpm中排除,因爲它看起來像devel鏈接,因此無法協調這兩個rpms。

解決方案?現在,我正在使用我的解決方法,只是製作一個文件的副本 - 當有一個具有該名稱的物理文件時,它可以工作。正確的方法是修復共享對象,儘管我需要去上游供應商完成。

+0

中,而不是明確調用'ln -s'。謝謝您回來並給出答案。現在你已經完成了所有的鏈接,你可以在RPM中保留符號鏈接,並在spec文件中添加「'Provide:libexample.so'」嗎? –

+0

這對我有用,但有一個更好的方法... –

相關問題