因为我必须在通过kickstart进程构建的多个Oracle Linux服务器上安装多个版本的Python,所以我想为yum存储库构建一个python rpm.我能够使用'make altinstall'手动构建Python,它不会安装在你的默认系统Python安装上,所以我认为这是要走的路.
经过多次试验和错误,我设法用.bz2 python 2.7软件包开始构建rpm - 但是现在当我尝试安装它时,我收到一个错误:
error: Failed dependencies:
/usr/local/bin/python is needed by Python-2.7.2-1.i386
Run Code Online (Sandbox Code Playgroud)
什么...... ??? Python是我正在尝试安装的!系统默认的Python(2.4)在/ usr/bin/python中!我的python目录的原型位置是/tmp/python2.7(可执行文件是/tmp/python2.7/bin/python2.7).那为什么要查看/ usr/local/bin?
这是我的RPM SPEC的核心:
%prep
%setup -q
%build
./configure --prefix=/tmp/python2.7
make
%install
make altinstall
Run Code Online (Sandbox Code Playgroud)
我仔细看看rpm构建日志,我看到:
Requires: /bin/sh /tmp/python2.7/bin/python2.7 /usr/bin/env /usr/local/bin/python libc.so.6 libc.so.6(GLIBC_2.0)...[a lot more...]
Run Code Online (Sandbox Code Playgroud)
好的,所以有/ usr/local/bin进来的地方......现在,问题是,它是如何确定这些要求的呢?我说错了吗?我需要覆盖一些东西吗?
像许多rpm新手一样,我得到了构建部分,但我并没有真正"理解"在rpmbuild结束时发生的事情以及实际放入rpm文件的内容(除了你在%files中指定的文件)然后是什么实际上在你进行rpm安装时会发生.
任何人都可以建议为什么我的安装失败或我可能会读到什么来理解为什么我的rpm构建需要我正在尝试构建的东西?
我有一个.spec依赖于一个名为的变量的文件_topdir.
现在当您从git签出SRPM源代码时,您必须更改_topdir指向的位置rpmbuild才能正常运行.
# We need the following line so that RPM can find the BUILD and SOURCES and RPMS dirs.
%define _topdir /root/projects/my-project/my-project-srpm/
Run Code Online (Sandbox Code Playgroud)
如何指定_topdir应该相对于.spec文件的位置,以便_topdir不进行硬编码?
我注意到rpmbuild(-bb和--buildroot选项)根据你使用的操作系统在不同的位置创建.rpm:
那么如何手动设置所有操作系统的目标文件夹?
我需要为包中的一个主要目录指定公共属性,并为其中一些子目录指定特殊权限.例如
%files
%attr(-, myuser, mygroup) /opt/myapp
%attr(750, myuser, mygroup) /opt/myapp/bin # no exec permission to other
/etc # this is the reason I can't use %defattr(-, myuser, mygroup)
Run Code Online (Sandbox Code Playgroud)
我自然地在/ opt/myapp/bin下的每个文件上收到"文件列出两次"警告.我的问题是,它究竟意味着什么?rpmbuild用它做什么?我无法在任何地方找到答案.我可以忽略它吗?什么优先,第一次或最后一次?
我不想myapp明确列出所有内容来解决这个问题.还有其他方法吗?谢谢
我有一个RPM规范文件,在rhel7上使用rpmbuild构建,我想用脚本定义Version.
我在这里阅读http://www.techrepublic.com/article/rpmproc-spec-file/,我可以这样做:
%define version 1.2
Version: %{version}
Run Code Online (Sandbox Code Playgroud)
在这里RPM spec文件 - 是否可以动态填充spec文件变量,我可以用脚本定义:
%define whoami %(cmd)
Run Code Online (Sandbox Code Playgroud)
所以我试着在我的规范文件中这样做:
%define version %(echo "$(sed -n 's|^[ ]*appVersion = "\(.*\)"|\1|p' /fullfilepath/values.txt | sed 's/^\(.*\)-.*$/\1/')")
Version: %{version} **Line 23**
Run Code Online (Sandbox Code Playgroud)
但我得到了一个
error: line 23: Empty tag: Version:
Run Code Online (Sandbox Code Playgroud)
到目前为止我测试的东西:
%define version %(echo "12") --basic script works ok, version becomes 12
//As a command straight in terminal
$ echo "$(sed -n 's|^[ ]*appVersion = "\(.*\)"|\1|p' /fullfilepath/values.txt | sed 's/^\(.*\)-.*$/\1/')"
//returns 1.2
Run Code Online (Sandbox Code Playgroud)
这些工作得很好,所以我不知道是什么导致它失败.当我在spec文件中的define标签中调用相同的东西时,有什么想法可能会让它失败?
更新
我尝试用实际值替换文件名,所以它看起来像这样
echo "$(sed …Run Code Online (Sandbox Code Playgroud) 我有两个盒子用于构建源rpm.其中一个运行:
/usr/lib/rpm/find-debuginfo.sh /usr/src/redhat/BUILD/name-of-package
Run Code Online (Sandbox Code Playgroud)
它将三个name.debug文件添加到RPM_BUID_ROOT.
另一个构建框不运行find-debuginfo.sh并且不生成这些文件.
find-debuginfo.sh办?是否有可能使rpmbuild在包装上保留符号链接?
目前的行为是创建文件的副本,我想避免.
如果我在%文件中有这一行:
%attr(0555, myuser, myuser) /opt/myapp/lib/my.jar
Run Code Online (Sandbox Code Playgroud)
然后my.jar将myuser作为所有者,但目录/ opt/myapp/lib将由root用户拥有.我不想写
%attr(0555, myuser, myuser) /opt/myapp/lib/
Run Code Online (Sandbox Code Playgroud)
因为我不希望包含/ opt/myapp/lib /中的所有文件.
如何为/ opt/myapp/lib /目录设置所有者?
谢谢.
我必须为某些驱动程序构建 rpm 包。我需要从 .tar.gz 存档构建 rpm。tar 球还包含 .spec 文件。我已经按照此处所述设置了 rpmbuild 环境: http: //wiki.centos.org/HowTos/SetupRpmBuildEnvironment
我的目录结构是这样的:
/home/rpmbuild
/home/rpmbuild/BUILD
/home/rpmbuild/RPMS
/home/rpmbuild/SOURCES
/home/rpmbuild/SPECS
/home/rpmbuild/SRPMS
Run Code Online (Sandbox Code Playgroud)
.tar.gz 文件包含 spec 文件并放置在 /home/rpmbuild/SOURCES 中
如果我随后导航到该目录并运行以下命令,则 rpm 包会正确构建,但会放置在 /root/rpmbuild/RPMS 中,而不是 /home/rpmbuild/RPMS (我期望的位置)。
sudo rpmbuild -ta driver.tar.gz
Run Code Online (Sandbox Code Playgroud)
我认为这是因为我使用 sudo 运行 rpmbuild。我的想法正确吗?有没有办法让它在 /home/rpmbuild 中构建?
我知道以 root 身份使用 rpmbuild 是不好的做法,但如果我不以 root 身份运行它,我会遇到许多错误(没有权限访问 root 拥有的目录 - 例如 /tmp/orbit-root)。似乎更改每个目录的权限比将其更改回来要困难得多。
这是解决这个问题的正确方法吗?我非常感谢您的帮助。