# $Id$
#
+### xxx thierry : looks like we should bump this to fedora 8
+### however, rather than the actual default,
+### this looks more like the bottom of what we're able to build
+### so I leave it with fc4
function pl_getDefaultDistro() {
# FC4 is currently the default release
echo "Fedora"
return 0
}
+### xxx thierry : when running in a centOS box, this issues a warning message
+### because 5.2 is not an integer and bash cannot compare that
+### seems harmless though
function pl_getRelease() {
defaultRelease=$(pl_getDefaultRelease)
if [ -f "/etc/redhat-release" ] ; then
releasename=f$release
fi ;;
[Cc]entOS*)
- if [ "$release" = "4.5" ] ; then
- # centos 4.5 is just centos4 + enhancements
- releasename=centos4
- else
- releasename=centos$release
- fi ;;
+ old_IFS="$IFS"
+ IFS="."
+ set -- $release
+ IFS="$old_IFS"
+ releasename=centos$1
+ ;;
*)
releasename="unknown-name-for-${pl_DISTRO}-please-edit-build.common"
echo 1>&2 "build.common: WARNING - releasename not set for distro=$distro"
basearch=$pl_DISTRO_ARCH
# Get options
- mirrors=""
- while getopts "l:r:a:vh" opt ; do
+### mirrors=""
+### while getopts "l:r:a:vh" opt ; do
+ while getopts "vh" opt ; do
case $opt in
- l)
- mirrors="$mirrors $OPTARG"
- ;;
- r)
- releasever=$OPTARG
- ;;
- a)
- basearch=$OPTARG
- ;;
- v)
- verbose=1
- set -x
- ;;
- h|*)
- mkfedora_usage
- ;;
+### l) mirrors="$mirrors $OPTARG" ;;
+### r) releasever=$OPTARG ;;
+### a) basearch=$OPTARG ;;
+ v) verbose=1; set -x ;;
+ h|*) mkfedora_usage ;;
esac
done
mirrors=$(pl_parsePkgs mirror $fcdistro $pldistro $mirrorsfile)
fi
- exclude_kernel=""
- [ -n "$pkgs_kexcludes" ] && exclude_kernel="exclude=$pkgs_kexcludes"
-
- function mkfedora_fetch ()
- {
- curl --fail --silent --max-time 60 "$1"
- }
-
- # set list of attempted locations according to releasever
- if [ $releasever -ge 7 ] ; then
- attempts="
-linux/releases/$releasever/Everything/$basearch/os
-$releasever/Everything/$basearch/os
-core/$releasever/Everything/$basearch/os
-linux/core/$releasever/$basearch/os
-"
- else
- attempts="
- linux/core/$releasever/$basearch/os
- core/$releasever/$basearch/os
- $releasever/$basearch/os
- "
+ exclude_line=""
+ # add them manually as the output of pl_parsePkgs is line-separated
+ if [ -n "$pkgs_kexcludes" ] ; then
+ exclude_line="exclude="
+ for kexclude in $pkgs_kexcludes ; do
+ exclude_line="$exclude_line $kexclude"
+ done
fi
echo "$0: candidate mirrors"
for mirror in $mirrors ; do
echo "* candidate mirror $mirror"
done
- baseurl=""
- for mirror in $mirrors ; do
- for attempt in $attempts; do
- attempturl=$mirror/$attempt
- if mkfedora_fetch $attempturl/repodata/repomd.xml >/dev/null ; then
- baseurl=$attempturl
- break 2
- fi
- done
- done
- if [ -z "$baseurl" ] ; then
- echo "Error: $releasever/$basearch/os/repodata/repomd.xml"
- echo " could not be found in any of the following locations:"
- echo
- for mirror in $mirrors ; do
- for attempt in $attempts ; do
- echo $mirror/$attempt
- done
- done
- echo
- mkfedora_usage
- else
- echo "* selecting mirror with baseurl=$baseurl"
+ # the repo part of the final yum.conf
+ yum_conf_repos=$vroot/xxxmkfedora-repos.confxxx
+ if ! yumconf_mirrors $yum_conf_repos ../build/ $fcdistro "$exclude_line" $mirrors ; then
+ echo xxx -- error ; return 1
fi
+
+ public_gpg_key=$(yumconf_gpgkey $yum_conf_repos)
# Do not tolerate errors
set -e
# Initialize RPM database in reference image
mkdir -p $vroot/var/lib/rpm
rpm --root $vroot --initdb
- rpm --root $vroot --import $baseurl/RPM-GPG-KEY-fedora
+ rpm --root $vroot --import $public_gpg_key
# Initialize yum in reference image
mkdir -p $vroot/var/cache/yum $vroot/var/log
- if [ $releasever -lt 7 ] ; then
- corename="Core "
- else
- corename=""
- fi
- cat >$vroot/etc/yum.conf <<EOF
+# yum.conf is for building only - store in different location than /etc/yum.conf
+ yum_conf=$vroot/etc/mkfedora-yum.conf
+ cat > $yum_conf <<EOF
[main]
cachedir=/var/cache/yum
debuglevel=2
# Prevent yum-2.4 from loading additional repository definitions
# (e.g., from /etc/yum.repos.d/)
reposdir=/dev/null
-
-[base]
-name=Fedora ${corename}${releasever} - $basearch - base
-baseurl=$baseurl/
-$exclude_kernel
-EOF
-
- for optional in updates extras ; do
- for optionalurl in \
- $mirror/linux/core/$optional/$releasever/$basearch \
- $mirror/core/$optional/$releasever/$basearch \
- $mirror/linux/$optional/$releasever/$basearch \
- $mirror/$optional/$releasever/$basearch ; do
- if mkfedora_fetch $optionalurl/repodata/repomd.xml ; then
- cat >>$vroot/etc/yum.conf <<EOF
-
-[$(basename $optional)]
-name=Fedora ${corename}${releasever} - $basearch - $(basename $optional)
-baseurl=$optionalurl/
-$exclude_kernel
EOF
- break
- fi
- done
- done
+
+ cat $yum_conf_repos >> $yum_conf
# If we are being built as part of an automated RPM build, solve the
# bootstrap problem by including any just built packages in the yum
if [ -n "$SUDO_USER" ] ; then
chown -R $SUDO_USER $RPM_RPMS_DIR
fi
- cat >>$vroot/etc/yum.conf <<EOF
+ cat >> $yum_conf <<EOF
[bootstrap]
name=Bootstrap - $basearch - $RPM_RPMS_DIR/
EOF
fi
+ echo "========== Dumping $yum_conf"
+ cat $yum_conf
+ echo "========== EndDump $yum_conf"
+
+ yum_options=""
+ yum --help | grep verbose &> /dev/null && yum_options="$yum_options --verbose"
+ yum_options="$yum_options -y"
+ yum_options="$yum_options -c $yum_conf"
+ yum_options="$yum_options --installroot=$vroot"
+
exclude_arg=""
for exclude in $pkgs_excludes; do
exclude_arg="$exclude_arg --exclude $exclude"
# glibc must be specified explicitly for the correct arch to be
# chosen.
echo "* Installing glibc"
- yum -c $vroot/etc/yum.conf --installroot=$vroot -y $exclude_arg install glibc
+ yum $yum_options $exclude_arg install glibc
# Go, baby, go
if [ -n "$pkgs_packages" ] ; then
echo "* Installing optional packages" $pkgs_packages
- yum -c $vroot/etc/yum.conf --installroot=$vroot -y $exclude_arg \
- install $pkgs_packages
+ yum $yum_options $exclude_arg install $pkgs_packages
if ! rpm --root $vroot -q $pkgs_packages >/dev/null ; then
echo "* Warning: Missing packages"
rpm --root $vroot -q $pkgs_packages | grep "not installed"
## call yum sequentially to get finer-grained info on dependencies
for grp in $pkgs_groups ; do
echo "* Installing optional group $grp"
- yum -c $vroot/etc/yum.conf --installroot=$vroot -y $exclude_arg \
- groupinstall "$grp"
+ yum $yum_options $exclude_arg groupinstall "$grp"
done
fi
# Clean yum cache
echo "* Cleaning up"
- yum -c $vroot/etc/yum.conf --installroot=$vroot -y clean all
+ yum $yum_options clean all
# Clean RPM state
rm -f $vroot/var/lib/rpm/__db*
ln -s /usr/share/zoneinfo/UTC $vroot/etc/localtime
fi
+ echo "Dumping current list of rpms in /etc/mkfedora-rpms.txt"
+ chroot $vroot rpm -aq | sort > $vroot/etc/mkfedora-rpms.txt
+
# remove trap handler, as we are about to call it directly.
trap - ERR INT
function pl_getPkgsAttribute () {
keyword=$1; shift
file=$1; shift
- grep -v '^#' $file | grep --regexp="^${keyword}:" | sed -e "s,${keyword}:,,"
+ # remove any initial white spaces from the result
+ grep -v '^#' $file | grep --regexp="^${keyword}:" | sed -e "s,${keyword}:,," -e "s,^[[:space:]][[:space:]]*,,"
}
# for a given keyword like 'package' :
fi
}
-# experimental
function yumgroups_from_pkgs () {
builddir=$1; shift
pldistro=$1; shift
fcdistro=$1; shift
pkgsnames=$@
-sedargs="-e s,@FCDISTRO@,$fcdistro,g"
+ sedargs="-e s,@FCDISTRO@,$fcdistro,g"
cat <<__header
<?xml version="1.0"?>
<group>
<id>$(echo $groupname|tr A-Z a-z)</id>
<name>$groupname</name>
- <default>true</default>
<description>$groupdesc</description>
- <uservisible>false</uservisible>
+ <uservisible>true</uservisible>
<packagelist>
__group_header
for package in $packages; do
</comps>
__footer
}
+
+
+function build_fetch () {
+ curl --fail --silent --max-time 60 --output /dev/null "$1"
+}
+
+# tries to compute a valid yum.conf for that pldistro from the template in mirroring/
+# returns 0 and writes <dest_yumconf> on success
+# returns 1 on failure, in which case <dest_yumconf> is deleted
+function yumconf_mirrors () {
+ dest_yumconf=$1; shift
+ builddir=$1; shift
+ fcdistro=$1; shift
+ exclude_line="$1" ; shift
+ mirrors="$@"
+
+ template=$builddir/mirroring/$fcdistro/yum.repos.d/building.repo.in
+
+ if [ ! -f $template ] ; then
+ echo "yumconf_mirrors: cannot locate template $template"
+ rm -f $dest_yumconf
+ return 1
+ fi
+
+ for mirror in $mirrors; do
+ if yumconf_mirror $dest_yumconf $template "$exclude_line" $mirror; then
+ return 0
+ fi
+ done
+ rm -f $dest_yumconf
+ return 1
+}
+
+# computes a yum.conf from the template, and checks that all baseurl defined in there are valid repos
+# returns 0 on success and 1 on failure
+function yumconf_mirror () {
+ dest_yumconf=$1; shift
+ template=$1; shift
+ exclude_line="$1" ; shift
+ mirror=$1; shift
+
+ sed -e "s,@MIRRORURL@,$mirror,g" \
+ -e "/baseurl=/i\\
+$exclude_line" $template > $dest_yumconf
+
+ # capture all lines defining baseurl
+ baseurl_defs=$(grep '^baseurl=' $dest_yumconf)
+ if [ -z "$baseurl_defs" ] ; then
+ return 1
+ fi
+
+ for baseurl_def in $baseurl_defs; do
+ baseurl=$(echo $baseurl_def | sed \
+ -e s,baseurl=,, \
+ -e 's,$basearch,'"$pl_DISTRO_ARCH",g)
+ repomd=$baseurl/repodata/repomd.xml
+
+ echo "* Trying to fetch $repomd"
+ if ! build_fetch $repomd ; then
+ echo "* Failed to fetch $repomd"
+ return 1
+ fi
+ done
+ echo "* Selected mirror $mirror"
+ return 0
+}
+
+# from a yum.conf as generated above, computes the (first) gpgkey url
+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
+ return 0
+}