典型案例分析:spec 文件制作错误解读
新手。错误多。别骂我。我一直在往着ML的要求努力────────────────────────────────────
Summary:PPPD
Name:ppp
Version:2.4.2
Release:1mgc
Copyright:GPL
URL:ftp://linuxcare.com.au/pub/ppp/
Group:Applications/Multimedia
Source:%{name}-%{version}.tar.gz
BuildRoot:%{_tmppath}/%{name}-%{release}-root
Vendor:MGC Group
Distribution:Magic Linux
prefix:%{_sysconfdir}
Packager:loveKDE<[email protected]>
%description
This is a PPP for Linux
%prep
%setup -q -n %{name}-%{version}-%{subver}
%build
./configure --prefix=%{_sysconfdir}
make
%install
rm -fr $RPM_BUILD_ROOT
make DESTDIR=$RPM_BUILD_ROOT install
%clean
["RPM_BUILD_ROOT"!="/"] && rm -rf "RPM_BULID_ROOT"
rm -rf $RPM_BUILD_DIR/%{name}
%post
%files
%defattr(-,root,root)
%{_bindir}
%{_libdir}
%{_datadir}
%exclude %{_libdir}/debug
%changelog
* Fri Dec 7 2005 loveKDE <[email protected]>
-updata to
* Sun Dec 19 2001 loveKDE <[email protected]>
- updata to 错误如下:
/var/tmp/rpm-tmp.85305: line 34: cd: ppp-2.4.2-%{subver}: No such file or directory
error: Bad exit status from /var/tmp/rpm-tmp.85305 (%prep)
RPM build errors:
Bad exit status from /var/tmp/rpm-tmp.85305 (%prep) 改正了34行的错误line 34: cd: ppp-2.4.2-%{subver
又出现这个问题:
make: *** Error 1
make: Leaving directory `/usr/src/mBuild/BUILD/ppp-2.4.2/pppd/plugins/radius/radiusclient'
make: *** Error 2
make: Leaving directory `/usr/src/mBuild/BUILD/ppp-2.4.2/pppd/plugins/radius'
make: *** Error 2
make: Leaving directory `/usr/src/mBuild/BUILD/ppp-2.4.2/pppd/plugins'
make: *** Error 2
error: Bad exit status from /var/tmp/rpm-tmp.60698 (%build)
RPM build errors:
Bad exit status from /var/tmp/rpm-tmp.60698 (%build) %setup -q -n %{name}-%{version}-%{subver}
-n参数是指定源码包解压出的目录名,如果如软件名和版本相同的话可不写。
按照你写的这个,目录名应该是%{name}-%{version},亦可不写。
prefix:%{_sysconfdir} 这个没必要定义。因为你的spec中并没用到%{prefix}变量。
./configure --prefix=%{_sysconfdir}
在ML中%{_sysconfdir} 是指/etc目录,若有必要一般是将软件的配置文件放到此处,而不是将安装目录放在这里。
你可以用--prefix=/usr来配置,或直接用预定义的%configure。 一. Group:Applications/Multimedia 这应该是一个系统包,这样分组不妥;
二. "构建根"最标准的写法:
BuildRoot:%{_tmppath}/%{name}-%{version}-%{release}-buildroot
三. 标准宏
%{_bindir}
%{_libdir}
%{_datadir}
%{_sysconfdir}
通常的含义是:
/usr/bin
/usr/lib
/usr/share
/etc
也就是说:
1. 你的大部分文件都将放在 /usr 下,而 ./configure --prefix=%{_sysconfdir} 代表所有文件将被默认放在 /etc 下,这显然是错误的,你应该用 ./configure --prefix=%{_prefix},因为 %{_prefix} 表示 /usr,我们推荐使用标准宏 %configure。
2. spec 文件头部 Prefix:%{_sysconfdir} 表示将来用户可以在 rpm 安装阶段修改原本放在 /etc 里的文件的存放位置,注意字母 P 要大写;
3. 你还应该增加 Prefix:%{_prefix} 以便用户可以在 rpm 安装阶段修改 /usr 为其他位置,例如 /opt 。
4. 如果企图定义一个叫 prefix 的宏,你应该这么写 %define prefix %{_sysconfdir},今后可以这么引用 %{prefix},它展开后就是 %{_sysconfdir} 宏的实际内容,这里是 /etc。kanker 把 prefix:%{_sysconfdir} 理解成定义一个宏的操作是错误的。
四. 字段 %setup -q -n %{name}-%{version}
这里的 -n 指定的参数是 spec 文件头部 Source: 行指定的包 %{name}-%{version}.tar.gz 解压缩后得到的目录名,通常是 %{name}-%{version},一般可以省略 -n %{name}-%{version} 参数。如果 Source: 行指定的包解压缩后不是 %{name}-%{version},你才需要在 %setup 字段使用 -n 参数指明。
例如 abc-1.15.tar.bz2 如果展开后是 abc 目录,而不是 abc-1.15 目录,你需要写:
%setup -q -n %{name},即没有版本号。
又如 blobwars-1.04-1.tar.gz,展开后是 blobwars-1.04 目录,你需要写:
Summary:blobwars game
Name:blobwars
Version:1.0.4
%define: subver 1
Release:1mgc
Copyright:GPL
Group:Amusement/Game
Source:%{name}-%{version}-%{subver}.tar.gz
......(此处省略)
%setup -q -n %{name}-%{version}
即没有子版本号 %{subver}。你在前面没有定义“子版本号”%{subver} ,如何在 %setup -n 里使用?
五. %files 字段丢失 %{_sysconfdir},这就意味着你在 %{_tmppath}/%{name}-%{version}-%{release}-buildroot/etc 下安装的文件将不会被打进 rpm 包里!而你在前面 configuer 阶段恰恰指定所有文件都安装在那里,所以即便你打包结束,你制作的 rpm 也将是一个什么文件都不包含的空包。而且运行到 %{_bindir} 处系统发现并没有一个 %{_tmppath}/%{name}-%{version}-%{release}-buildroot/usr/bin 目录而报错退出!
六.%clean 字段也有错误
rm -rf $RPM_BULID_ROOT
rm -rf $RPM_BUILD_DIR/%{name}
后一行应该是
rm -rf $RPM_BUILD_DIR/%{name}-%{version}
因为 /usr/src/mBuild/Build 目录下并没有 %{name} 目录,而是 %{name}-%{version},也就是 setup 字段使用 -n 参数指明的那个目录。
七. 编译阶段出错,原因很复杂,你帖的错误报告不全。 修订后的 spec 帖在这里,具体能否正确建包还要实地检测:
————————————————————————————————————
Summary: PPPD
Name: ppp
Version: 2.4.2
Release: 1mgc
Copyright: GPL
URL: ftp://linuxcare.com.au/pub/ppp/
Group: System Environment/Base
Source0: %{name}-%{version}.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot
Vendor: MGC Group
Distribution: Magic Linux
Prefix: %{_prefix}
Prefix: %{_sysconfdir}
Packager: loveKDE <[email protected]>
%description
This is PPP for Linux.
%prep
%setup -q
%build
%configure
make
%install
rm -rf $RPM_BUILD_ROOT
%makeinstall
%clean
rm -rf $RPM_BULID_ROOT
rm -rf $RPM_BUILD_DIR/%{name}-%{version}
%files
%defattr(-,root,root)
%{_bindir}
%{_libdir}
%{_datadir}
%{_sysconfdir}
%exclude %{_libdir}/debug
%changelog
* Fri Dec 7 2005 loveKDE <[email protected]> - 2.4.2-1mgc
- update to 2.4.2 十分感谢。我马上试试。 你试的结果如何? 我已经发布了apache+mysql的包了...还修改了些....发到技术支持区的...谢谢KDE PPPD这个我测试了...可行..但是我看到官方的对比了一下....有心得...谢谢
页:
[1]