我正在构建一些 rpm 包并使用rpmlint
. 这些软件包特定于我工作场所的系统,它们不会被推到上游。我们的软件包包括各种软件,包括内部软件、存储库中软件的修补版本以及官方存储库中未提供的软件。我们安装本地包的/usr/local
原因有很多:
yum update
破坏本地包bin
,lib
,include
,share
,等)但是,rpmlint
在将文件安装到/usr/local
. 例如,在 GNU Hello World 的自定义构建中,这就是rpmlint -i
必须说的:
hello.x86_64: E: dir-or-file-in-usr-local /usr/local/hello-2.8/bin/hello
A file in the package is located in /usr/local. It's not permitted for
packages to install files in this directory.
Run Code Online (Sandbox Code Playgroud)
我知道文件系统层次结构标准,根据该标准:
'/usr/local' 背后的最初想法是在除了 '/usr' 之外的每台机器上都有一个单独的('local')'/usr' 目录,它可能只是从其他地方以只读方式挂载。它复制“/usr”的结构。现在,'/usr/local' 被广泛认为是保存自编译或第三方程序的好地方。/usr/local 层次结构供系统管理员在本地安装软件时使用。它需要在系统软件更新时不会被覆盖。它可用于可在一组主机之间共享但在 /usr 中找不到的程序和数据。本地安装的软件必须放在 /usr/local 而不是 /usr 中,除非安装它是为了替换或升级 …
前言
构建 RPM 并不是指从源代码编译。我纯粹的意思是将tar
带有源代码或二进制文件的“zip”文件重新打包为 RPM。
我已经从源代码构建 RPM 作为noarch
RPM有一段时间了。最近我不得不构建包含二进制文件的 RPM,这引起了一些担忧:
arch
和noarch
RPM包?特别是在从二进制文件构建 RPM 的情况下。我知道对于没有编译并且仅在安装 RPM 时提取文件的纯源代码,noarch
是可以接受的,但是如上所述,我对打包二进制文件有一些疑问。arch
RPM是否与不同的操作系统版本兼容?(这是在上面前言的上下文中)只是详细说明我可以arch
在 RedHat 6 上构建RPM,然后在 RedHat 5 中安装它,反之亦然?我想在rpm规范文件的%pre和%post部分执行一些通用代码。当我在%pre部分放置一个子程序时,我需要将相同的子程序添加到RPM的%post部分。两次维护相同的子程序很糟糕。下面是一个例子:
RPM规范文件%pre和%post部分:
%pre
log_file=/var/log/myrpminstall.log
#-------------------------------------
# Send text log_file
#-------------------------------------
log_it() {
log_msg=$1
echo -e $log_msg >> $log_file
}
log_it "pre section log information"
%post
log_it "Post section log informations"
Run Code Online (Sandbox Code Playgroud)
目前,当rpm的%post部分在安装过程中执行时,我收到一条错误消息:
/var/tmp/rpm-tmp.36557: line 5: log_it: command not found
Run Code Online (Sandbox Code Playgroud)
那么,有没有办法让RPM 的所有部分(全局函数)都可以访问像log_it这样的子程序?目前,如果我想在%post部分使用它,我必须将log_it函数放在那里。
我正在为 RHEL7 制作一个包。当我尝试安装该软件包时,我得到
# yum localinstall mypackage-0.0-1.el7.rpm
(...)
--> Running transaction check
---> Package webmin-GPI-init.noarch 0:0.0-1.el7 will be installed
--> Processing Dependency: perl(.::guardian-lib.pl) for package: webmin-GPI-init-0.0-1.el7.noarch
--> Processing Dependency: perl(.::hostconfig-lib.pl) for package: webmin-GPI-init-0.0-1.el7.noarch
--> Processing Dependency: perl(.::init-lib.pl) for package: webmin-GPI-init-0.0-1.el7.noarch
Run Code Online (Sandbox Code Playgroud)
我认为愿意为 Perl 模块命名.::init-lib.pl
是不可取的。在代码中,我们可以找到类似的内容
#! /usr/bin/perl
require './init-lib.pl';
require './guardian-lib.pl';
require './hostconfig-lib.pl';
Run Code Online (Sandbox Code Playgroud)
我已设法使用文件win32
中的以下选项删除.spec
:
%{?perl_default_filter}
%global __requires_exclude perl\\(VMS|perl\\(Win32|perl\\(\\.
Run Code Online (Sandbox Code Playgroud)
如何摆脱以点开头的 perl 包的依赖关系?
我浏览了互联网,发现https://fedoraproject.org/wiki/Packaging:AutoProvidesAndRequiresFiltering和其他我不明白的邮件列表。
我正在 Fedora 上从 SRPM 构建一个包:
$ rpmbuild --rebuild *.src.rpm
...
warning: user mockbuild does not exist - using root
warning: group mockbuild does not exist - using root
warning: user mockbuild does not exist - using root
warning: group mockbuild does not exist - using root
...
Run Code Online (Sandbox Code Playgroud)
该包已构建,但有很多这样的mockbuild does not exist
警告。即使我安装了软件包,我的系统上似乎也没有这样的帐户mock
。我还缺少其他任何软件包吗?这是包装上的故障还是我的系统故障?如何消除这些警告?
使用下面提到的命令构建我的自定义 rpm 包时
rpmbuild -v -bb test.specs
Run Code Online (Sandbox Code Playgroud)
我收到以下错误,
+ /usr/lib/rpm/check-rpaths /usr/lib/rpm/check-buildroot
*******************************************************************************
*
* WARNING: 'check-rpaths' detected a broken RPATH and will cause 'rpmbuild'
* to fail. To ignore these errors, you can set the '$QA_RPATHS'
* environment variable which is a bitmask allowing the values
* below. The current value of QA_RPATHS is 0x0000.
*
* 0x0001 ... standard RPATHs (e.g. /usr/lib); such RPATHs are a minor
* issue but are introducing redundant searchpaths without
* providing a benefit. …
Run Code Online (Sandbox Code Playgroud) 我rpm
提交给Copr进行构建的src 之一失败,因为没有 Python 实现;这是因为 src rpm 本身有问题,或者在 copr 机器上根本没有 Python 实现,还是我错过了一些设置?
checking for perl... /usr/bin/perl
checking for python... no
BUILDSTDERR: configure: error: You need 'python' to compile XXX
Run Code Online (Sandbox Code Playgroud) 作为这个问题的后续,如果我对这些调试功能不感兴趣怎么办 - 如何简单地阻止安装这些 build-id 文件(调试信息包?)?最终我不关心(至少在不久的将来)支持客户端调试。另一方面,在同一台机器上安装不同的客户端 Redhat 产品(包)时,我需要克服已知的“build-id 文件夹冲突”。如何才能做到这一点?
我有一台装有 Debian 7 的机器(是的,我知道这个系统很旧,但现在我无法升级到较新的版本)。这个版本的存储库中有 mutt 版本 1.5.21,但我希望 mutt 至少为 2.0.7,因为我很快就需要此版本的 mutt 中引入的 OAuth2 支持(Gmail 正在撤销仅密码登录) IMAP)。
我假设 Debian 7 没有 mutt >= 2.0.7 的预构建向后移植包(至少我还没有找到任何 - 如果存在,请指出)。所以我必须从源代码编译。但我想保留上游源代码中特定于 Debian 的更改。我可以只获取为较新的 Debian 版本准备的源 RPM 并在我的系统上编译它吗?还是这不起作用?
我使用的是 Fedora 13 VM,我需要安装一些旧的 rpm,但只有源 rpm 文件。我知道我可以用它rpmbuild --rebuild
来构建二进制文件,但无论出于何种原因,rpm-build 没有与 yum 一起安装,而且我只能找到 fc13 的 rpm-build 的源 rpm 文件。所以这是一个递归问题。
我需要的特定 rpms 是 libvncserver,显然是 rpm-build,但最好知道如何从通用 SRPM 开始并让它在 Fedora 13 上工作,以满足未来出现的任何需求。
我该如何解决这个问题?我愿意接受任何建议,但我必须使用 Fedora 13。
我已经回顾了几个相关的问题——最接近的是:从 RPM 中提取规范文件——我必须补充一点,我会以同样的方式表达我的问题。但是,似乎 .spec 文件不在 .rpm 文件中(当它是二进制包时)。
所以,我的问题是:如何获取源自规范文件的信息 - 至少尽可能多。
rpm2cpio xxx.rpm | cpio -itv
是一个理想情况下,答案是一个命令 - 但如果它必须是多个命令,那就是 c'est la vie。
ps 我已经检查过rpmbuild --rebuild
(说它需要源 RPM)并且找不到rpmlint
谢谢你。
Internet 上的资源都是关于如何从源代码构建 rpm 文件的。
但我已经编译了软件的二进制 tarball。但我不想直接提取到/
,因为这样很难维护。如何从二进制 tarball 构建 rpm 包。
有一系列著名的软件以 tarball 的形式提供了二进制包,其具有清晰的树形结构,与根目录中的树形结构相同。
等等。
许多软件提供商都发布了通用 tarball 以使软件在不同的 Linux 发行版中通用。
有什么必要的方法吗?
当我使用时rpmbuild
,我得到,没有这样的文件或目录。
# rpmbuild -ba ./SPECS/myFoo.spec
error: File /root/rpmbuild/SOURCES/myFoo.tar.gz: No such file or directory
Run Code Online (Sandbox Code Playgroud)
rpmbuild
尽管从完全不同的用户主目录运行命令,但它似乎正在从我的主目录读取。--root
但是,如果我使用(记录为“使用以所有操作为根的文件系统树DIRECTORY
。”),这不会改变。
# rpmbuild -ba ./SPECS/myFoo.spec --root /home/centos/myFoo/
error: File /root/rpmbuild/SOURCES/myFoo.tar.gz: No such file or directory
Run Code Online (Sandbox Code Playgroud)
有什么解决方案可以让它看起来在正确的位置。