- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在构建一个 RPM,它本质上只是打包一组供应商提供的 .so 二进制文件,以便它们可用于我们的内部应用程序,该应用程序也是通过 RPM 安装的。
其中一个库带有多个版本 - libexample_base.so 和 libexample_debug.so(以及其他)。我目前正在尝试打包这些,以便它们都包含在 RPM 中(以便开发人员可以在需要时在它们之间切换),但是通过在 %install 期间创建符号链接(symbolic link)来选择 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,尽管符号链接(symbolic link)在 %files 中并且安装正确。不幸的是,供应商库不提供 SONAME 条目,并且由于它们是二进制 blob,我无法轻松添加它们,因此 RPM 取决于实际文件名。所有下游 RPM 都需要 libexample.so,并且由于此 RPM 未将其列为要求,因此它们由于缺少依赖项而拒绝安装,即使确实有效(ldconfig 可以毫无问题地找到 libexample.so)。
关于如何提示 rpmbuild 将符号链接(symbolic link)解析为提供的任何想法?
最佳答案
经过一些进一步的研究,我确定我正在尝试做的事情是不可能的,以及为什么。核心问题归结为 rpmbuild 的行为,该行为旨在处理正确生成的带有 SONAME 条目的共享对象。它明确地没有列出指向以 .so 结尾的共享对象的符号链接(symbolic link),因为在正常行为下,这些符号链接(symbolic link)指向版本化共享对象 (.so.#.#),并且您的应用程序应该依赖于这些版本化对象 -符号链接(symbolic link)旨在包含在开发包中,只是为了让您的链接器找到最新的链接。
我遇到了第二种情况,当事情没有正确完成时用作备份 - 对于 RPM 和 GCC,当不存在 SONAME 时,它使用文件名。当我运行 GCC 时,文件名为 libexample.so(指向真实文件的符号链接(symbolic link)),并且它没有 SONAME,因此它只是将自身配置为链接到 libexample.so; rpmbuild 看到这一点并将其设置为应用程序 RPM 的要求。然而,由于 rpmbuild 明确地从库 rpm 中排除了那个名称,因为它看起来像一个开发链接,所以没有办法协调这两个 rpm。
解决方案?现在,我正在使用我的解决方法,只是制作文件的副本 - 当存在具有该名称的物理文件时,它就可以工作。正确的方法是修复共享对象,尽管我需要联系上游供应商来完成。
关于linux - rpmbuild 不包括符号链接(symbolic link)共享对象作为提供,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40306694/
是否可以将参数传递给 rpmbuild 以填充在规范文件中调用的用户定义变量? 例子: 在 .spec 文件(但为空)中调用的用户定义变量 %{foobar} 应填充执行 rpmbuild 命令时传递
我正在从单一来源构建一系列 rpm,并且只想构建子包;即我不想创建一个空的主包,只想创建子包。 我该怎么做呢?它是 rpmbuild 开关还是我放入规范文件的东西? 谢谢 最佳答案 通常,您通过没有
我正在尝试构建我的第一个 RPM,但出现错误。我的 .rpmmarcos 文件如下所示: %packager Your Name %_topdir /home/snort/test %_tmppa
我正在尝试从 source-1.4.3-linux.tgz(已下载,因此我无法控制名称)构建 rpm,并将文件解压到目录 source-1.4.3-linux 中。在我的 source.spec 文件
我正在尝试制定 RPM 的构建流程。 当我生成源 RPM 时,它在文件名中包含 %{dist}。我希望它只对二进制 RPM 执行此操作,因为源 RPM 不是特定于发行版的。 dist 宏在 /etc/
我正在尝试创建一个仅更新系统上文件的包,但运行 rpmbuild 时不断出现错误。该错误表明文件丢失。 我已在 CentOS 5 和 6 上尝试过此操作,结果相同。 我使用rpmdev-setuptr
寻找某人在仅放置文件时澄清 %install 宏。我创建了一个没有错误的 RPM,它应该只是从 buildroot 中获取文件并将它们 cp 到/usr/lib。我在 %install 的 SPEC
我正在尝试构建一个 RPM(rpmbuild -bb 规范文件)。安装 rpm 时,一些可执行的 tcl 文件已损坏,并且所有文件的大小都相同。 最佳答案 在规范文件中声明“%global __os_
我想构建 RPM 文件,我希望它们被普遍使用,并且不依赖于安装的发行版。现在我发现了一个在 RHEL 和 SLES 上名称不同的需求。我发现这是可能的解决方案: %if 0%{?suse_versio
我在构建日志中收到以下信息: Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.CgE2Qn + umask 022 + cd /export/home/s
rpmbuild 可以通过查找包中包含的二进制文件所需的共享库来自动检测依赖关系,虽然这几乎每次都是一个很好的想法,但有时它是不可取的,但仅限于某些特定的库。我指的是某些二进制文件需要的库不是通过 r
我是 rpm 打包的初学者,据我所知,由于 cpio 限制,rpm-build 存在文件大小>4GB 的问题。因此,我将包中的大文件与 gnu 拆分为 512MB 的文件 [这是作为 rpmbuild
我正在使用 rpmbuild在AWS Lambda其存储限制为 512MB,磁盘空间即将用完。 我想删除原始文件/ Assets 以释放文件 /tmp/rpm-tmp.XXXX 之后的空间已创建且在最
我在/opt/MyApp 中有一个应用程序,我需要使用 FPM 将其打包到 RPM 包中如下: fpm -e -s dir -t rpm --name 'MyApp' --version '1.0'
我正在尝试为我制作的应用程序构建 rpm。我已经编写了spec文件并制作了一个额外的bash脚本来自动将所有必需的文件复制到rpmbuild目录结构中,即{BUILD,BUILDROOT,RPMS,S
我只是在学习为一些从源代码编译的自定义构建的软件制作 rpm 包(一些遗留的东西需要这个,所以我正在努力学习,因为一些包不能使用最新版本),但是遇到错误(我在 Vagrant 中以 root 身份执行
在过去的 6 个月里,我一直在努力弄清楚如何构建一个 rpm,但我仍在努力理解我在构建过程中遗漏了什么。我的目标是让我的 rpm 安装一个 tar.gz 文件。 这是我的 .rpmmacros 文件
在我正在处理的项目中,我需要使用私钥从我的输出可执行文件 (elf) 之一生成签名(签名形成 rpm 中的文件之一,私钥永远不会执行此操作离开构建机器)。目前,这是在我的 makefile 中完成的,
rpmbuild 在哪个目录下生成RPM? 我检查了 RPMS 目录:- [root@tom adil]# ls /usr/src/redhat/ BUILD RPMS SOURCES SPEC
假设我为 myprog1 和 myprog2 构建的包要安装在/usr/lib/mysystem/myprog1/和/usr/lib/mysystem/myprog2/中 根据一些发行版的文档,例如
我是一名优秀的程序员,十分优秀!