X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=build.common;h=a21d7093458da253e5788991ef4254b859ab65bc;hb=dfd41359fadd03a0a4dee6aebbfa7c91f23f9b09;hp=9295f2d16a7826e9ec1c5b89d1e2624c62cf755c;hpb=9547e592eec9a4ef66875449849331f98e6b1654;p=build.git diff --git a/build.common b/build.common index 9295f2d1..a21d7093 100644 --- a/build.common +++ b/build.common @@ -1,15 +1,13 @@ # -*-Shell-script-*- # -# $Id$ -# $URL$ -# # Common functions for build scripts used by various packages -# incorporated (e.g., build, myplc, myplc-devel, vserver-reference) +# incorporated (e.g., build, bootcd, nodeimage, sliceimage) # # Marc E. Fiuczynski # Copyright (C) 2007 The Trustees of Princeton University +# Thierry Parmentelat INRIA # -# supported distros f8, f10, f12, centos5 +# supported distros f8, f10, f12, f14, f16, centos5, sl6 # # for locating pkgs.py export PATH=.:$PATH @@ -18,7 +16,7 @@ export PATH=.:$PATH function pl_getDistro() { if [ -f "/etc/redhat-release" ] ; then distro=$(awk ' { print $1 } ' /etc/redhat-release) - case $distro in Red*) distro="Redhat" ; esac + case $distro in Scientific*) distro="SL" ; esac else echo "build.common.pl_getDistro-unknown" exit 1 @@ -30,7 +28,7 @@ function pl_getDistro() { # returns something like 8, 10, or 5.3 function pl_getRelease() { if [ -f "/etc/redhat-release" ] ; then - release=$(awk ' { if ($1=="Fedora" && $2=="Core") print $4 ; if (($1=="Fedora" && $2!="Core")||$1=="CentOS") print $3 ; if ($1=="Red") print $6 } ' /etc/redhat-release) + release=$(awk ' { if ($1=="Fedora" && $2=="Core") print $4 ; if (($1=="Fedora" && $2!="Core")||$1=="CentOS") print $3 ; if ($1=="Scientific") print $4 } ' /etc/redhat-release) else echo "build.common.pl_getRelease-unknown" exit 1 @@ -40,7 +38,7 @@ function pl_getRelease() { return 0 } -# returns stuff for vserver, i.e. something like 'f8' or 'centos5' +# returns distro shortname, something like 'f8' or 'centos5' function pl_getReleaseName () { distro=$1; shift release=$1; shift @@ -48,9 +46,6 @@ function pl_getReleaseName () { [Ff]edora*) releasename=f$release ;; - [Re]edhat*) - releasename=rhel6 - ;; [Cc]entOS*) old_IFS="$IFS" IFS="." @@ -58,6 +53,9 @@ function pl_getReleaseName () { IFS="$old_IFS" releasename=centos$1 ;; + [Ss]L*) + releasename=sl$release + ;; *) releasename="unknown-name-for-${pl_DISTRO}-please-edit-build.common" echo 1>&2 "build.common: WARNING - releasename not set for distro=$distro" @@ -68,35 +66,44 @@ function pl_getReleaseName () { return 0 } -# on fedora 8 or above, we use libnl from the stock repos -# on centos5 we build it locally -function pl_getKexcludes () { - distroname=$1; shift - case $distroname in - f*) - echo 'kernel kernel-PAE kernel-vserver kernel-devel kernel-headers kernel-debuginfo util-vserver* iptables iptables-ipv6 iproute drupal' ;; - centos5) - echo 'kernel kernel-vserver kernel-devel kernel-headers kernel-debuginfo util-vserver* iptables iproute drupal inotify-tools* libnl' ;; - *) - echo "pl_DISTRO_NAME=$pl_DISTRO_NAME not supported in getexcludes.sh" ; exit 1 ;; - esac +# yum exclusions are now defined in yumexclude.pkgs +# so they can now depend both on the linux distro and the pl distro +function pl_yumexclude () { + keyword=$1; shift + fcdistro=$1; shift + pldistro=$1; shift + builddir=$1; shift + # search for file "yumexclude.pkgs" + yumexclude_file=$(pl_locateDistroFile $builddir $pldistro "yumexclude.pkgs") + # + # check if pkgs.py is in PATH + type -p pkgs.py >& /dev/null || export PATH=$builddir:$PATH + + # parse it + pl_parsePkgs $keyword $fcdistro $pldistro $yumexclude_file || \ + { echo pl_yumexclude failed with fcdistro=$fcdistro and pldistro=$pldistro; return 1 ; } } +# <> fcdistro pldistro builddir +# node side : use the 'nodeyumexclude' keywork in yumexclude.pkgs +function pl_nodeyumexclude () { pl_yumexclude 'nodeyumexclude' "$@" ; } +# server side : use the 'plcyumexclude' keywork in yumexclude.pkgs +function pl_plcyumexclude () { pl_yumexclude 'plcyumexclude' "$@" ; } + + # figure out which redhat distro we are using (fedora, centos, redhat) pl_DISTRO=$(pl_getDistro) # select basearch of the host devel environment - protected for macos for local tests -pl_DISTRO_ARCH=$(uname -i 2>/dev/null|| echo unknownarch) +# try arch for testing stuff on a mac +pl_DISTRO_ARCH=$(uname -i 2>/dev/null || arch 2> /dev/null || echo unknownarch) # the release number (plain number) pl_DISTRO_RELEASE=$(pl_getRelease) -# the release name - for vserver build ... +# the release name - something like 'f8' or 'sl6' pl_DISTRO_NAME=$(pl_getReleaseName $pl_DISTRO $pl_DISTRO_RELEASE) -# the packages to exclude -pl_KEXCLUDES=$(pl_getKexcludes $pl_DISTRO_NAME) - # get path to appropriate yumgroups.xml file # Thierry: quick & dirty improvement # this file is updated by the toplevel build, from the .pkgs files @@ -165,8 +172,6 @@ function pl_root_makedevs() { # For pseudo ttys mkdir -p $vroot/dev/pts - # (Might have to remove the following for vserver-reference.) - # for tmpfs mount mkdir -p $vroot/dev/shm @@ -175,7 +180,7 @@ function pl_root_makedevs() { mknod -m 600 $vroot/dev/net/tun c 10 200 # For mkinitrd (in case a kernel is being installed) - # As well for loop back mounting within a vserver. + # As well as for loop back mounting within a vm. for i in $(seq 0 255) ; do mknod -m 640 $vroot/dev/loop$i b 7 $i done @@ -187,7 +192,7 @@ function mkfedora_usage() { echo " Defaults are searched in .mirrors" echo " -v Be verbose" echo " -h This message" - echo " target selection (defaults based on current build vserver)" + echo " target selection (defaults based on current build VM context)" echo " -r release Fedora release number (default: $releasever)" echo " -a arch Fedora architecture (default: $basearch)" exit 1 @@ -205,7 +210,7 @@ function pl_root_mkfedora () { # Verbosity verbose=0 -# Release and architecture to install : defaults to current vserver's settings or previously parsed fedora_options +# Release and architecture to install : defaults to current vm settings or previously parsed fedora_options releasever=$pl_DISTRO_RELEASE basearch=$pl_DISTRO_ARCH @@ -236,15 +241,18 @@ function pl_root_mkfedora () { pkgs_precious=$(pl_parsePkgs precious $fcdistro $pldistro $pkgsfile) # formerly related to mkfedora -k : packages to take from our own build # and thus need be excluded frem the stock repos - pkgs_kexcludes=$(pl_parsePkgs kexclude $fcdistro $pldistro $pkgsfile | sed -e s,@KEXCLUDE@,"$pl_KEXCLUDES",) + # locate builddir by looking for pkgs.py + builddir=$(dirname $(type -p pkgs.py)) + SUBST_NODEYUMEXCLUDE=$(pl_nodeyumexclude $fcdistro $pldistro $builddir) + pkgs_yumexclude=$(pl_parsePkgs yumexclude $fcdistro $pldistro $pkgsfile | sed -e s,@NODEYUMEXCLUDE@,"$SUBST_NODEYUMEXCLUDE",) # get mirrors if not specified with -l if [ -z "$mirrors" ] ; then mirrorsfile=$(pl_locateDistroFile ../build/ $pldistro "$pldistro.mirrors") mirrors=$(pl_parsePkgs mirror $fcdistro $pldistro $mirrorsfile) fi - kexclude_line="" - [ -n "$pkgs_kexcludes" ] && kexclude_line="exclude=$pkgs_kexcludes" + yumexclude_line="" + [ -n "$pkgs_yumexclude" ] && yumexclude_line="exclude=$pkgs_yumexclude" echo "$0: candidate mirrors" for mirror in $mirrors ; do @@ -253,7 +261,7 @@ function pl_root_mkfedora () { # the repo part of the final yum.conf yum_conf_repos=$vroot/xxxmkfedora-repos.confxxx - if ! yumconf_mirrors $yum_conf_repos ../build/ $fcdistro "$kexclude_line" $mirrors ; then + if ! yumconf_mirrors $yum_conf_repos ../build/ $fcdistro "$yumexclude_line" $mirrors ; then echo xxx -- error ; return 1 fi @@ -325,6 +333,7 @@ cachedir=/var/cache/yum debuglevel=2 logfile=/var/log/yum.log pkgpolicy=newest +multilib_policy=best distroverpkg=redhat-release tolerant=1 exactarch=1 @@ -376,6 +385,7 @@ fi if [ -n "$pkgs_packages" ] ; then echo "* Installing optional packages" $pkgs_packages # ignore yum's return code that is basically undefined + echo "* Install options" $vroot $yum_options yum $yum_options install $pkgs_packages || : if ! rpm --root $vroot -q $pkgs_packages >/dev/null ; then echo "* Warning: Missing packages" @@ -408,6 +418,23 @@ fi # Clean yum cache echo "* Cleaning up" + + # NOTE: this hack is for Fedora >= 12. + # if kernel-debug is installed, clean it up + # we link to our version of kernel/initrd and clean up + # kernel-debug manually + if rpm --root $vroot --quiet -q kernel-debug ; then + echo "* Cleaning up kernel-debug - (workaround for f12)" + pushd $vroot/boot/ + rm -rf kernel-boot kernel-bootsmp initrd-boot initrd-bootsmp + ln -s vmlinuz-*${pldistro}* kernel-boot + ln -s vmlinuz-*${pldistro}* kernel-bootsmp + ln -s initrd-*${pldistro}* initrd-boot + ln -s initrd-*${pldistro}* initrd-bootsmp + rpm --root $vroot --nodeps -e kernel-debug || : + popd + fi + # ignore yum's return code that is basically undefined yum $yum_options clean all || : @@ -524,6 +551,7 @@ function pl_parsePkgs () { fcdistro=$1; shift pldistro=$1; shift + echo 1>&2 "pl_parsePkgs: using -a $target_arch -f $fcdistro -d $pldistro $keyword $@" pkgs.py -a $target_arch -f $fcdistro -d $pldistro $keyword "$@" } # usage: pl_getPackages [-a arch] fcdistro pldistro pkg-file[..s] @@ -541,7 +569,7 @@ function pl_getGroups() { pl_parsePkgs group "$@" ; } # # values can contain @arch@, @fcdistro@ or @pldistro@ that are replaced with the current values # -# the reason for the -a option is for when we build the build vserver itself; in this case +# the reason for the -a option is for when we build the build vm itself; in this case # pl_DISTRO_ARCH is the one we obtain from the root context, and that's wrong # specify -sa arch AFTER keyword, so as to keep pl_getPackages and pl_getGroups simple # @@ -666,7 +694,7 @@ function yumconf_mirrors () { dest_yumconf=$1; shift builddir=$1; shift fcdistro=$1; shift - kexclude_line="$1" ; shift + yumexclude_line="$1" ; shift mirrors="$@" template=$builddir/mirroring/$fcdistro/yum.repos.d/building.repo.in @@ -678,7 +706,7 @@ function yumconf_mirrors () { fi for mirror in $mirrors; do - if yumconf_mirror $dest_yumconf $template "$kexclude_line" $mirror; then + if yumconf_mirror $dest_yumconf $template "$yumexclude_line" $mirror; then return 0 fi done @@ -692,12 +720,12 @@ function yumconf_mirrors () { function yumconf_mirror () { dest_yumconf=$1; shift template=$1; shift - kexclude_line="$1" ; shift + yumexclude_line="$1" ; shift mirror=$1; shift sed -e "s,@MIRRORURL@,$mirror,g" \ -e "/baseurl=/i\\ -$kexclude_line" $template > $dest_yumconf +$yumexclude_line" $template > $dest_yumconf # capture all lines defining baseurl baseurl_defs=$(grep '^baseurl=' $dest_yumconf) @@ -721,23 +749,21 @@ $kexclude_line" $template > $dest_yumconf return 0 } -# from a yum.conf as generated above, computes the (first) gpgkey url +# from a yum.conf as generated above, computes the gpgkey urls function yumconf_gpgkey () { dest_yumconf=$1; shift - first_line=$(grep '^gpgkey=' $dest_yumconf | head -1) - values=$(echo $first_line | sed -e s,gpgkey=,,) - value=$(echo $values | awk '{print $1;}' | sed -e 's,$basearch,'"$pl_DISTRO_ARCH",g) - [ -n "$value" ] || return 1 - echo $value + values=$(grep -h '^gpgkey=' $dest_yumconf | sed -e s,gpgkey=,, | sed -e 's,$basearch,'"$pl_DISTRO_ARCH",g | sed -e 's, ,\n,g' | sort | uniq | xargs) + [ -n "$values" ] || return 1 + echo $values return 0 } # patches a yum conf to insert an exclude line in each declared repo function yumconf_exclude () { repo=$1; shift - kexclude_line="$1" ; shift + yumexclude_line="$1" ; shift sed -i -e "/#baseurl=.*$/i\\ -$kexclude_line" $repo +$yumexclude_line" $repo }