Java 打包文件权限问题

按照维基上的 spec 文件指南 ,%install 部分。不是说不要在这里设置文件权限吗?应该在 %files 部分进行设置。但是我看 Java 打包指南 里的例子却直接在 %install 部分用 install -m0755 或者 chmod 0755 之类的命令直接设置权限?具体应该怎么做才合适?略有疑问。。。

你明白 %install 的作用吗?

它是用来运行 %make_install 的地方。

所有的 specfile 均基于这个假设。

教程的意思是「不要为了设置权限而设置权限」,这就存在两种情况:
1. 上游安装时会修改权限,比如源代码包里全是 0644,安装可执行包肯定要 0755,上游安装脚本做完了也做对了,你再在 %install 里 chmod 一遍没有意义。
2. 上游做错了,又有几种情况:
1. 这个文件是编译产生的,在 %make_install 后已经直接灌到 %{buildroot} 目录而不是 BUILD 目录了。这时你不应该在 %install 部分去 chmod +x %{buildroot}%{_bindir}/xxx,直接在 %files 部分用 attr(0755,root,root) %{_bindir}/xxx 就能直接改过来。
2. 这个文件是原始目录里就有的文件比如 glib.h,或者 python 这样的 noarch 文件,那应该做权限修复,应该在 %prep 里,%setup -q 解压完压缩包直接就做。没有必要到了 %install 在 %make_install 之前做。
3. 权限错误的情况太多了,可能需要批量修复。那你写 attr(0755,root,root) 就比较累了,可以直接在 %install 里用脚本比如

pushd %{buildroot}%{_bindir}
for i in 1 2 3 4 5 ; do
    chmod +x ${i};
done
popd

你偏拿出来一个没有 Makefile 的来作弄自己:

install -m 0755 bin/xxx %{buildroot}%{_bindir}/xxx

这种叫手动安装,你没看到 %{buildroot} 下面连 bin 目录都是自己创建的吗,那一点权限没有你不设置怎么行。严格意义上说这匹配上面的 2.3 节。

是我没说清楚。这次打包的跟前面的那个帖子说的无关。这里打包的是 briss,pdf 文件切边用的,用 java 写的。tarball 直接给了编译好的 jar 文件。注意到 Java 打包指南说打包第三方 jar 是邪恶的。诶诶诶,那我就偷偷打个包自用算了。有空再去源码 svn 仓库检出来看看怎么编译。

我在 /usr/lib/rpm/macros 里发现一个直接用来安装 Java 软件包 的 startscript 的宏 %jpackage_script
根据 rpm --eval %jpackage_script 展开得到的是:

install -d -m 755 $RPM_BUILD_ROOT/usr/bin
cat > $RPM_BUILD_ROOT/usr/bin/%5 << EOF 
#!/bin/sh
#
# %{name} script
# JPackage Project <http://www.jpackage.org/>

# Source functions library
_prefer_jre=""
. /usr/share/java-utils/java-functions

# Source system prefs
if  -f /etc/java/%{name}.conf ] ; then
  . /etc/java/%{name}.conf
fi

# Source user prefs
if  -f \$HOME/.%{name}rc ] ; then
  . \$HOME/.%{name}rc
fi

# Configuration
MAIN_CLASS=%1
BASE_FLAGS=%2
BASE_OPTIONS=%3
BASE_JARS="%4"

# Set parameters
set_jvm
set_classpath \$BASE_JARS
set_flags \$BASE_FLAGS
set_options \$BASE_OPTIONS

# Let's start
run "\$@"
EOF

但是我在本地用的时候去发现他创建了个文件 %5。。cat > $RPM_BUILD_ROOT/usr/bin/%5 << EOF 。。。这里写的 %5 是怎么回事?

你这回复跟你一楼的帖子一点边都不沾。

Sent from my iPhone 5s using Tapatalk

我只是想说,我都不应该打包这个包的。的确是跑题了

有 %1 ~ %4, 你不知道 %5 什么意思。

那是个宏,你要给参数的,%5 应该就是你喂给这个宏的默认参数,比如包名,脚本名。%1 ~%4 你也可以定义的。

你直接输出这个宏,不给参数,它就认为 %5 本身是参数了,而它又有文件操作(cat),于是就给你输出了个名为 %5 的脚本,不信你用 vim 打开看。

再看了一下,原来这个宏是带参数的。。。那使用这个宏的时候,需要

%jpackage_script arg1 arg2 arg3 arg4 arg5 arg5

加入要省略中间参数,比如 arg2,要怎么做?%jpackage_script arg1 “” arg3 arg4 arg5 arg6 行不行?

自己实验了不行再问。我觉得除了参数五其它都可以直接不写

Sent from my iPhone 5s using Tapatalk