loveKDE 发表于 2005-6-10 16:17:12

典型案例分析: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

loveKDE 发表于 2005-6-10 16:19:58

错误如下:
/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)

loveKDE 发表于 2005-6-10 16:23:42

改正了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)

KanKer 发表于 2005-6-10 19:22:59

%setup -q -n %{name}-%{version}-%{subver}
-n参数是指定源码包解压出的目录名,如果如软件名和版本相同的话可不写。
按照你写的这个,目录名应该是%{name}-%{version},亦可不写。

prefix:%{_sysconfdir}   这个没必要定义。因为你的spec中并没用到%{prefix}变量。

./configure --prefix=%{_sysconfdir}
在ML中%{_sysconfdir} 是指/etc目录,若有必要一般是将软件的配置文件放到此处,而不是将安装目录放在这里。
你可以用--prefix=/usr来配置,或直接用预定义的%configure。

KDE 发表于 2005-6-10 20:15:54

一. 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 参数指明的那个目录。

七. 编译阶段出错,原因很复杂,你帖的错误报告不全。

KDE 发表于 2005-6-10 21:01:15

修订后的 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

loveKDE 发表于 2005-6-10 21:44:50

十分感谢。我马上试试。

KDE 发表于 2005-6-18 20:11:18

你试的结果如何?

loveKDE 发表于 2005-6-18 23:02:24

我已经发布了apache+mysql的包了...还修改了些....发到技术支持区的...谢谢KDE

loveKDE 发表于 2005-6-18 23:03:48

PPPD这个我测试了...可行..但是我看到官方的对比了一下....有心得...谢谢
页: [1]
查看完整版本: 典型案例分析:spec 文件制作错误解读