Rpmbuild使用方法简要
时间:2007-01-20 来源:junglegq
Rpmbuild使用方法简要:
specs文件组成:
%preample
%prep
%setup
%patch
%build
%install
%install/%uninstall
%verify
%clean
%file list
将tgz包拷贝到/usr/src/linpus/SOURCES下:
mv <xxx.tgz> /usr/src/linpus/SOURCES
cd /usr/src/linpus/SPECS
vi <xxx.spec>
1 preample 定义宏,以下为常用的宏:
Summary:
Name:
Version:
Release:
Copyright:
Group:
Source:
Patch:
URL:
Distribution:
Vendor:
Packager:
%description
其他宏:
icon:
dependency:
requires:
conflicts:
patch:
Serial:
AutoReqProv:[yes/no]
ExcludeArch:
ExclusiveArch:
ExcludeOs:
ExclusiveOs:
2 %prep
%setup将会执行:
rm -rf <old>
tar zxf <xxx.tgz>
mv <new> /usr/src/linpus/BUILD
chown
umask
...
3 %build
./configure
make
4 %install
make install
5 %clean
make clean
6 %files
%doc 将文档导入$RPM_DOC_DIR
%dir 导入目录并文件
rpmbuild 命令参数
-bp
-bc
-bi
-bb
-ba
--recompile xxx.src.rpm 根据src.rpm包,编译并安装到系统。Rpm数据库将不会更新
--rebuild xxx.src.rpm 根据src.rpm包,编译为二进制的rpm包
rpm包的命名规范:
<name>-<version>-<release>
附,rpmbuild执行脚本:
#!/bin/sh
RPM_SOURCE_DIR="/usr/src/linpus/SOURCES"
RPM_BUILD_DIR="/usr/src/linpus/BUILD"
RPM_OPT_FLAGS="-O2 -g -pipe -m32 -march=i386 -mtune=pentium4"
RPM_ARCH="i386"
RPM_OS="linux"
export RPM_SOURCE_DIR RPM_BUILD_DIR RPM_OPT_FLAGS RPM_ARCH RPM_OS
RPM_DOC_DIR="/usr/share/doc"
export RPM_DOC_DIR
RPM_PACKAGE_NAME="kernel"
RPM_PACKAGE_VERSION="2.6.12"
RPM_PACKAGE_RELEASE="1lp"
export RPM_PACKAGE_NAME RPM_PACKAGE_VERSION RPM_PACKAGE_RELEASE
RPM_BUILD_ROOT="/var/tmp/kernel-2.6.12-1lp-root"
export RPM_BUILD_ROOT
set -x
umask 022
cd /usr/src/linpus/BUILD
cd kernel-2.6.12
LANG=C
export LANG
unset DISPLAY
#
# Create gpg keys for signing the modules
#
gpg --homedir . --batch --gen-key /usr/src/linpus/SOURCES/genkey
gpg --homedir . --export --keyring ./kernel.pub Red > extract.pub
make linux-2.6.12/scripts/bin2c
linux-2.6.12/scripts/bin2c ksign_def_public_key __initdata < extract.pub > linux-2.6.12/crypto/signature/key.h
cd linux-2.6.12
BuildKernel() {
# Pick the right config file for the kernel we're building
if [ -n "$1" ] ; then
Config=kernel-2.6.12-i386-$1.config
DevelDir=/usr/src/kernels/2.6.12-1lp-$1-i386
DevelLink=/usr/src/kernels/2.6.12-1lp$1-i386
else
Config=kernel-2.6.12-i386.config
DevelDir=/usr/src/kernels/2.6.12-1lp-i386
DevelLink=
fi
KernelVer=2.6.12-1lp$1
echo BUILDING A KERNEL FOR $1 i386...
# make sure EXTRAVERSION says what we want it to say
perl -p -i -e "s/^EXTRAVERSION.*/EXTRAVERSION = -1lp$1/" Makefile
# and now to start the build process
make -s mrproper
cp configs/$Config .config
Arch=`head -1 .config | cut -b 3-`
echo USING ARCH=$Arch
make -s ARCH=$Arch nonint_oldconfig > /dev/null
make -s ARCH=$Arch include/linux/version.h
make -s ARCH=$Arch bzImage
make -s ARCH=$Arch modules || exit 1
make ARCH=$Arch buildcheck
# Start installing the results
mkdir -p $RPM_BUILD_ROOT/usr/lib/debug/boot
mkdir -p $RPM_BUILD_ROOT/boot
install -m 644 .config $RPM_BUILD_ROOT/boot/config-$KernelVer
install -m 644 System.map $RPM_BUILD_ROOT/boot/System.map-$KernelVer
cp arch/$Arch/boot/bzImage $RPM_BUILD_ROOT/boot/vmlinuz-$KernelVer
if [ -f arch/$Arch/boot/zImage.stub ]; then
cp arch/$Arch/boot/zImage.stub $RPM_BUILD_ROOT/boot/zImage.stub-$KernelVer || :
fi
mkdir -p $RPM_BUILD_ROOT/lib/modules/$KernelVer
make -s ARCH=$Arch INSTALL_MOD_PATH=$RPM_BUILD_ROOT modules_install KERNELRELEASE=$KernelVer
# And save the headers/makefiles etc for building modules against
#
# This all looks scary, but the end result is supposed to be:
# * all arch relevant include/ files
# * all Makefile/Kconfig files
# * all script/ files
rm -f $RPM_BUILD_ROOT/lib/modules/$KernelVer/build
rm -f $RPM_BUILD_ROOT/lib/modules/$KernelVer/source
mkdir -p $RPM_BUILD_ROOT/lib/modules/$KernelVer/build
(cd $RPM_BUILD_ROOT/lib/modules/$KernelVer ; ln -s build source)
# dirs for additional modules per module-init-tools, kbuild/modules.txt
mkdir -p $RPM_BUILD_ROOT/lib/modules/$KernelVer/extra
mkdir -p $RPM_BUILD_ROOT/lib/modules/$KernelVer/updates
# first copy everything
cp --parents `find -type f -name "Makefile*" -o -name "Kconfig*"` $RPM_BUILD_ROOT/lib/modules/$KernelVer/build
cp Module.symvers $RPM_BUILD_ROOT/lib/modules/$KernelVer/build
# then drop all but the needed Makefiles/Kconfig files
rm -rf $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/Documentation
rm -rf $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/scripts
rm -rf $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/include
cp arch/i386/kernel/asm-offsets.s $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/arch/i386/kernel || :
cp .config $RPM_BUILD_ROOT/lib/modules/$KernelVer/build
cp -a scripts $RPM_BUILD_ROOT/lib/modules/$KernelVer/build
if [ -d arch/i386/scripts ]; then
cp -a arch/i386/scripts $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/arch/i386 || :
fi
if [ -f arch/i386/*lds ]; then
cp -a arch/i386/*lds $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/arch/i386/ || :
fi
rm -f $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/scripts/*.o
rm -f $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/scripts/*/*.o
mkdir -p $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/include
cd include
cp -a acpi config linux math-emu media net pcmcia rxrpc scsi sound video asm asm-generic $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/include
cp -a `readlink asm` $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/include
if [ "$Arch" = "x86_64" ]; then
cp -a asm-i386 $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/include
fi
# While arch/powerpc/include/asm is still a symlink to the old
# include/asm-ppc{64,} directory, include that in kernel-devel too.
if [ "$Arch" = "powerpc" -a -r ../arch/powerpc/include/asm ]; then
cp -a `readlink ../arch/powerpc/include/asm` $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/include
mkdir -p $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/arch/$Arch/include
pushd $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/arch/$Arch/include
ln -sf ../../../include/asm-ppc* asm
popd
fi
# Make sure the Makefile and version.h have a matching timestamp so that
# external modules can be built
touch -r $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/Makefile $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/include/linux/version.h
touch -r $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/.config $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/include/linux/autoconf.h
cd ..
#
# save the vmlinux file for kernel debugging into the kernel-debuginfo rpm
#
mkdir -p $RPM_BUILD_ROOT/usr/lib/debug/lib/modules/$KernelVer
cp vmlinux $RPM_BUILD_ROOT/usr/lib/debug/lib/modules/$KernelVer
find $RPM_BUILD_ROOT/lib/modules/$KernelVer -name "*.ko" -type f >modnames
# gpg sign the modules
gcc -o scripts/modsign/mod-extract scripts/modsign/mod-extract.c -Wall
KEYFLAGS="--no-default-keyring --homedir .."
KEYFLAGS="$KEYFLAGS --secret-keyring ../kernel.sec"
KEYFLAGS="$KEYFLAGS --keyring ../kernel.pub"
export KEYFLAGS
for i in `cat modnames`
do
sh ./scripts/modsign/modsign.sh $i Red
mv -f $i.signed $i
done
unset KEYFLAGS
# mark modules executable so that strip-to-file can strip them
cat modnames | xargs chmod u+x
# detect missing or incorrect license tags
for i in `cat modnames`
do
echo -n "$i "
/sbin/modinfo -l $i >> modinfo
done
cat modinfo |\
grep -v "^GPL" |
grep -v "^Dual BSD/GPL" |\
grep -v "^Dual MPL/GPL" |\
grep -v "^GPL and additional rights" |\
grep -v "^GPL v2" && exit 1
rm -f modinfo
rm -f modnames
# remove files that will be auto generated by depmod at rpm -i time
rm -f $RPM_BUILD_ROOT/lib/modules/$KernelVer/modules.*
# Move the devel headers out of the root file system
mkdir -p $RPM_BUILD_ROOT/usr/src/kernels
mv $RPM_BUILD_ROOT/lib/modules/$KernelVer/build $RPM_BUILD_ROOT/$DevelDir
ln -sf ../../..$DevelDir $RPM_BUILD_ROOT/lib/modules/$KernelVer/build
[ -z "$DevelLink" ] || ln -sf `basename $DevelDir` $RPM_BUILD_ROOT/$DevelLink
}
###
# DO it...
###
# prepare directories
rm -rf $RPM_BUILD_ROOT
mkdir -p $RPM_BUILD_ROOT/boot
BuildKernel
BuildKernel smp
###
### install
###