Michal Marek e2501c
#!/bin/bash
Michal Marek 95ddf7
Michal Marek 95ddf7
#############################################################################
Michal Marek 95ddf7
# Copyright (c) 2003-2009 Novell, Inc.
Michal Marek 95ddf7
# All Rights Reserved.
Michal Marek 95ddf7
#
Michal Marek 95ddf7
# This program is free software; you can redistribute it and/or
Michal Marek 95ddf7
# modify it under the terms of version 2 of the GNU General Public License as
Michal Marek 95ddf7
# published by the Free Software Foundation.
Michal Marek 95ddf7
#
Michal Marek 95ddf7
# This program is distributed in the hope that it will be useful,
Michal Marek 95ddf7
# but WITHOUT ANY WARRANTY; without even the implied warranty of
Michal Marek 95ddf7
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.   See the
Michal Marek 95ddf7
# GNU General Public License for more details.
Michal Marek 95ddf7
#
Michal Marek 95ddf7
# You should have received a copy of the GNU General Public License
Michal Marek 95ddf7
# along with this program; if not, contact Novell, Inc.
Michal Marek 95ddf7
#
Michal Marek 95ddf7
# To contact Novell about this file by physical or electronic mail,
Michal Marek 95ddf7
# you may find current contact information at www.novell.com
Michal Marek 95ddf7
#############################################################################
Michal Marek 95ddf7
Michal Marek 95ddf7
# generate a kernel-source rpm package
Michal Marek 95ddf7
Michal Marek 95ddf7
. ${0%/*}/wd-functions.sh
Michal Marek 95ddf7
Michal Marek 26b24c
sort()
Michal Marek 26b24c
{
Michal Marek 26b24c
	LC_ALL=C command sort "$@"
Michal Marek 26b24c
}
Michal Marek 95ddf7
Michal Marek 95ddf7
rpm_release_timestamp=
Michal Marek 95ddf7
rpm_release_string=
Michal Marek 95ddf7
source_timestamp=
Michal Marek 95ddf7
tolerate_unknown_new_config_options=0
Michal Marek 95ddf7
ignore_kabi=
Michal Marek 95ddf7
ignore_unsupported_deps=
Michal Marek f49222
source rpm/config.sh
Michal Marek 95ddf7
until [ "$#" = "0" ] ; do
Michal Marek 95ddf7
  case "$1" in
Michal Marek 95ddf7
    --dir=*)
Michal Marek 95ddf7
      build_dir=${1#*=}
Michal Marek 95ddf7
      shift
Michal Marek 95ddf7
      ;;
Michal Marek 95ddf7
    -d|--dir)
Michal Marek 95ddf7
      build_dir=$2
Michal Marek 95ddf7
      shift 2
Michal Marek 95ddf7
      ;;
Michal Marek 95ddf7
    --embargo)
Michal Marek 95ddf7
      embargo_filter=1
Michal Marek 95ddf7
      shift
Michal Marek 95ddf7
      ;;
Michal Marek 95ddf7
    -nf|--tolerate-unknown-new-config-options)
Michal Marek 95ddf7
      tolerate_unknown_new_config_options=1
Michal Marek 95ddf7
      shift
Michal Marek 95ddf7
      ;;
Michal Marek 95ddf7
    -i|--ignore-kabi)
Michal Marek 95ddf7
      ignore_kabi=1
Michal Marek 95ddf7
      shift
Michal Marek 95ddf7
      ;;
Michal Marek 95ddf7
    -iu|--ignore-unsupported-deps)
Michal Marek 95ddf7
      ignore_unsupported_deps=1
Michal Marek 95ddf7
      shift
Michal Marek 95ddf7
      ;;
Michal Marek 95ddf7
    -rs|--release-string)
Michal Marek 95ddf7
      case "$2" in
Michal Marek 95ddf7
      *[' '-]*)
Michal Marek 95ddf7
        echo "$1 option argument must not contain dashes or spaces" >&2
Michal Marek 95ddf7
	exit 1
Michal Marek 95ddf7
	;;
Michal Marek 95ddf7
      esac
Michal Marek 95ddf7
      rpm_release_string="$2"
Michal Marek 95ddf7
      shift 2
Michal Marek 95ddf7
      ;;
Michal Marek 95ddf7
    -ts|--timestamp)
Michal Marek 95ddf7
      rpm_release_timestamp=yes
Michal Marek 95ddf7
      shift
Michal Marek 95ddf7
      ;;
Michal Marek 95ddf7
    -k|--kbuild|--source-timestamp)
Michal Marek 95ddf7
      source_timestamp=1
Michal Marek 95ddf7
      shift
Michal Marek 95ddf7
      ;;
Michal Marek 95ddf7
    -h|--help|-v|--version)
Michal Marek 95ddf7
	cat <
Michal Marek 95ddf7
Michal Marek 95ddf7
${0##*/} perpares a 'kernel-source' package for submission into autobuild
Michal Marek 95ddf7
Michal Marek 95ddf7
these options are recognized:
Michal Marek 95ddf7
    -rs <string>       to append specified string to rpm release number
Michal Marek 95ddf7
    -ts                to use the current date as rpm release number
Michal Marek 95ddf7
    -nf                to proceed if a new unknown .config option is found during make oldconfig
Michal Marek 95ddf7
    -i                 ignore kabi failures
Michal Marek 95ddf7
    --source-timestamp to autogenerate a release number based on branch and timestamp (overrides -rs/-ts)
Michal Marek fc1894
    -d, --dir=DIR      create package in DIR instead of default kernel-source$VARIANT
Michal Marek 95ddf7
Michal Marek 95ddf7
EOF
Michal Marek 95ddf7
	exit 1
Michal Marek 95ddf7
	;;
Michal Marek 95ddf7
    *)
Michal Marek 95ddf7
      echo "unknown option '$1'" >&2
Michal Marek 95ddf7
      exit 1
Michal Marek 95ddf7
      ;;
Michal Marek 95ddf7
  esac
Michal Marek 95ddf7
done
Michal Marek 95ddf7
export LANG=POSIX
Michal Marek 892b7b
if test -e scripts/compute-PATCHVERSION.sh; then
Michal Marek 892b7b
    PATCHVERSION=$($(dirname $0)/compute-PATCHVERSION.sh)
Michal Marek 892b7b
Michal Marek 892b7b
    case "$PATCHVERSION" in
Michal Marek 892b7b
    *-*)
Michal Marek 892b7b
        RPMVERSION=${PATCHVERSION%%-*}
Michal Marek 892b7b
        RELEASE_PREFIX=${PATCHVERSION#*-}.
Michal Marek 892b7b
        RELEASE_PREFIX=${RELEASE_PREFIX//-/.}
Michal Marek 892b7b
        ;;
Michal Marek 892b7b
    *)
Michal Marek 892b7b
        RPMVERSION=$PATCHVERSION
Michal Marek 892b7b
        RELEASE_PREFIX=
Michal Marek 892b7b
        ;;
Michal Marek 892b7b
    esac
Michal Marek 892b7b
fi
Michal Marek 95ddf7
Michal Marek 95ddf7
if [ -n "$rpm_release_timestamp" ]; then
Michal Marek 95ddf7
    if test $(( ${#RPMVERSION} + 10 + 2 + 8 + ${#rpm_release_string})) -gt 64
Michal Marek 95ddf7
    then
Michal Marek 95ddf7
    	echo "${RPMVERSION}-${rpm_release_string}-\${flavour} exceeds the 64 byte 'uname -r' limit. Use a shorter string."
Michal Marek 95ddf7
	exit 1
Michal Marek 95ddf7
    fi
Michal Marek 95ddf7
    rpm_release_string="\`env -i - TZ=GMT date +%Y%m%d\`${rpm_release_string:+_$rpm_release_string}"
Michal Marek 95ddf7
fi
Michal Marek 95ddf7
Michal Marek 8f65b2
case "$build_dir" in
Michal Marek 8f65b2
"")
Michal Marek 8f65b2
	build_dir=kernel-source$VARIANT
Michal Marek 8f65b2
	;;
Michal Marek 8f65b2
/* | ./*) ;;
Michal Marek 8f65b2
*)
Michal Marek 8f65b2
	build_dir=./$build_dir
Michal Marek 8f65b2
esac
Michal Marek 95ddf7
Michal Marek 95ddf7
check_for_merge_conflicts() {
Michal Marek 95ddf7
    set -- $(grep -lP '^<{7}(?!<)|^>{7}(?!>)' "$@" 2> /dev/null)
Michal Marek 95ddf7
    if [ $# -gt 0 ]; then
Michal Marek 95ddf7
	printf "Merge conflicts in %s\n" "$@" >&2
Michal Marek 95ddf7
	return 1
Michal Marek 95ddf7
    fi
Michal Marek 95ddf7
}
Michal Marek 95ddf7
Michal Marek e6728e
# Dot files are skipped by intention, in order not to break osc working
Michal Marek e6728e
# copies. The linux tarball is not deleted if it is already there
Michal Marek e6728e
for f in "$build_dir"/*; do
Michal Marek e6728e
	case "$f" in
Michal Marek e56f67
	"$build_dir/linux-$SRCVERSION.tar.bz2")
Michal Marek e6728e
		continue
Michal Marek e56f67
		;;
Michal Suchanek cb2465
	"$build_dir/linux-$SRCVERSION.tar.sign")
Michal Suchanek cb2465
		continue
Michal Suchanek cb2465
		;;
Michal Marek e56f67
	"$build_dir"/patches.*)
Michal Marek e56f67
		rm -rf "$f"
Michal Marek e6728e
	esac
Michal Marek e6728e
	rm -f "$f"
Michal Marek e6728e
done
Michal Marek e6728e
mkdir -p "$build_dir"
Michal Marek 73a373
echo "linux-$SRCVERSION.tar.bz2"
Michal Marek 73a373
get_tarball "$SRCVERSION" "tar.bz2" "$build_dir"
Michal Marek 95ddf7
Michal Marek a2559d
# list of patches to include.
Michal Marek a2559d
install -m 644 series.conf $build_dir/
Michal Marek 95ddf7
Michal Marek 95ddf7
# All config files and patches used
Michal Marek 95ddf7
referenced_files="$( {
Michal Marek 95ddf7
	$(dirname $0)/guards --list < $build_dir/series.conf
Michal Marek 95ddf7
	$(dirname $0)/guards --prefix=config --list < config.conf
Michal Marek 95ddf7
    } | sort -u )"
Michal Marek 95ddf7
Michal Marek 03d141
for file in $referenced_files; do
Michal Marek 03d141
	case $file in
Michal Marek 03d141
	config/* | patches.*/*)
Michal Marek 03d141
		;;
Michal Marek 03d141
	*)
Michal Marek 03d141
		echo "Error: Patches must be placed in the patches.*/ subdirectories: $file" >&2
Michal Marek 03d141
		exit 1
Michal Marek 03d141
	esac
Michal Marek 03d141
done
Michal Marek 95ddf7
inconsistent=false
Michal Marek 95ddf7
check_for_merge_conflicts $referenced_files kernel-source.changes{,.old} || \
Michal Marek 95ddf7
	inconsistent=true
Michal Marek 95ddf7
scripts/check-conf || inconsistent=true
Michal Marek 95ddf7
scripts/check-cvs-add --committed || inconsistent=true
Michal Marek 03d141
# FIXME: someone should clean up the mess and make this check fatal
Michal Marek 95ddf7
if $inconsistent; then
Michal Marek 95ddf7
    echo "Inconsistencies found."
Michal Marek 95ddf7
    echo "Please clean up series.conf and/or the patches directories!"
Michal Marek 95ddf7
    echo
Michal Marek 95ddf7
fi
Michal Marek 95ddf7
Michal Marek a2559d
tsfile=build-source-timestamp
Michal Marek a2559d
if ! scripts/cvs-wd-timestamp > $build_dir/$tsfile; then
Michal Marek 95ddf7
    exit 1
Michal Marek 95ddf7
fi
Michal Marek 95ddf7
Michal Marek 95ddf7
if $using_git; then
Michal Marek 95ddf7
    # Always include the git revision
Michal Marek a2559d
    echo "GIT Revision: $(git rev-parse HEAD)" >> $build_dir/$tsfile
Michal Marek 95ddf7
    tag=$(get_branch_name)
Michal Marek 95ddf7
    if test -n "$tag"; then
Michal Marek a2559d
	echo "GIT Branch: $tag" >>$build_dir/$tsfile
Michal Marek 95ddf7
    fi
Michal Marek 95ddf7
fi
Michal Marek 95ddf7
Michal Marek 95ddf7
Michal Marek 95ddf7
# List all used configurations
Michal Marek 95ddf7
config_files="$(
Michal Marek 95ddf7
    for arch in $(scripts/arch-symbols --list) ; do
Michal Marek 95ddf7
	scripts/guards $(scripts/arch-symbols $arch) < config.conf \
Michal Marek 95ddf7
	| sed -e "s,^,$arch ,"
Michal Marek 95ddf7
    done)"
Michal Marek 95ddf7
flavors="$(echo "$config_files" | sed -e 's,.*/,,' | sort -u)"
Michal Marek 95ddf7
Michal Marek 95ddf7
for flavor in $flavors ; do
Michal Marek 95ddf7
    echo "kernel-$flavor.spec"
Michal Marek 95ddf7
Michal Marek e2501c
    extra_needs=
Michal Marek e2501c
    case $flavor in
Michal Marek e2501c
	um)
Michal Marek e2501c
	    extra_needs="BuildRequires:  libpcap xorg-x11-devel" ;;
Michal Marek e2501c
    esac
Michal Marek e2501c
Michal Marek 95ddf7
    # Find all architectures for this spec file
Michal Marek 95ddf7
    set -- $(
Michal Marek 95ddf7
	echo "$config_files" \
Michal Marek 892b7b
	| sed -e "/\/$flavor\$/!d" \
Michal Marek 95ddf7
	      -e "s, .*,,g" \
Michal Marek 95ddf7
	| sort -u)
Michal Marek 95ddf7
    archs="$*"
Michal Marek 95ddf7
    
Michal Marek 95ddf7
    # Compute @PROVIDES_OBSOLETES@ expansion
Michal Marek 95ddf7
    head="" ; tail=""
Michal Marek 95ddf7
    for arch in $archs ; do
Michal Marek 95ddf7
	p=( $(scripts/guards $(scripts/arch-symbols $arch) $flavor p \
Michal Marek 95ddf7
		< rpm/old-packages.conf) )
Michal Marek 95ddf7
	o=( $(scripts/guards $(scripts/arch-symbols $arch) $flavor o \
Michal Marek 95ddf7
		< rpm/old-packages.conf) )
Michal Marek 95ddf7
Michal Marek 95ddf7
	# Do we have an override config file or an additional patch?
Michal Marek 95ddf7
	if [ -e $arch-$flavor.conf ]; then
Michal Marek 95ddf7
	    echo "Override config: $arch-$flavor.conf"
Michal Marek 95ddf7
	    cp $arch-$flavor.conf $build_dir/
Michal Marek 95ddf7
	fi
Michal Marek 95ddf7
	if [ -e $arch-$flavor.diff ]; then
Michal Marek 95ddf7
	    echo "Extra patch: $arch-$flavor.diff"
Michal Marek 95ddf7
	    cp $arch-$flavor.diff $build_dir/
Michal Marek 95ddf7
	fi
Michal Marek 95ddf7
Michal Marek 95ddf7
	[ $arch = i386 ] && arch="%ix86"
Michal Marek 95ddf7
	nl=$'\n'
Michal Marek 95ddf7
	if [ ${#p[@]} -o ${#p[@]} ]; then
Michal Marek 95ddf7
	    [ -n "$head" ] && head="${head}%else$nl"
Michal Marek 95ddf7
	    head="${head}%ifarch $arch$nl"
Michal Marek 95ddf7
	    [ -n "$p" ] && head="${head}Provides:     ${p[@]}$nl"
Michal Marek 95ddf7
	    [ -n "$o" ] && head="${head}Obsoletes:    ${o[@]}$nl"
Michal Marek 95ddf7
	    tail="%endif$nl$tail"
Michal Marek 95ddf7
	fi
Michal Marek 95ddf7
    done
Michal Marek 95ddf7
    prov_obs="$head${tail%$'\n'}"
Michal Marek 95ddf7
Michal Marek 95ddf7
    # If we build this spec file for only one architecture,  the
Michal Marek 95ddf7
    # enclosing if is not needed
Michal Marek 95ddf7
    if [ $(set -- $archs ; echo $#) -eq 1 ]; then
Michal Marek 95ddf7
	prov_obs="$(echo "$prov_obs" | grep -v '%ifarch\|%endif')"
Michal Marek 95ddf7
    fi
Michal Marek 95ddf7
Michal Marek 892b7b
    # Special km modules for this kernel (SLES9)
Michal Marek 892b7b
    if test -e rpm/km.conf; then
Michal Marek 892b7b
        set -- $(scripts/guards $(
Michal Marek 892b7b
                    for arch in $archs; do
Michal Marek 892b7b
                        scripts/arch-symbols $arch
Michal Marek 892b7b
                    done
Michal Marek 892b7b
                    ) $flavor < rpm/km.conf)
Michal Marek 892b7b
        extra_kms=$*
Michal Marek 892b7b
    else
Michal Marek 892b7b
        extra_kms=
Michal Marek 892b7b
    fi
Michal Marek 892b7b
Michal Marek 95ddf7
    # In ExclusiveArch in the spec file, we must specify %ix86 instead
Michal Marek 95ddf7
    # of i386.
Michal Marek 95ddf7
    archs="$(echo $archs | sed -e 's,i386,%ix86,g')"
Michal Marek 95ddf7
Michal Marek d21cbe
    # Summary and description
Michal Marek d21cbe
    if test -e rpm/package-descriptions; then
Michal Marek d21cbe
	description=$(sed "1,/^=== kernel-$flavor ===/d; /^===/,\$ d" rpm/package-descriptions)
Michal Marek d21cbe
	if test -z "$description"; then
Michal Marek d21cbe
	    echo "warning: no description for kernel-$flavor found" >&2
Michal Marek d21cbe
	    summary="The Linux Kernel"
Michal Marek d21cbe
	    description="The Linux Kernel."
Michal Marek d21cbe
	else
Michal Marek d21cbe
	    summary=$(echo "$description"  | head -n 1)
Michal Marek d21cbe
	    # escape newlines for the sed 's' command
Michal Marek d21cbe
	    description=$(echo "$description" | tail -n +3 | \
Michal Marek d21cbe
		sed 's/$/\\/; $ s/\\$//')
Michal Marek d21cbe
	fi
Michal Marek d21cbe
    else
Michal Marek d21cbe
	summary="The Linux Kernel"
Michal Marek d21cbe
	description="The Linux Kernel."
Michal Marek d21cbe
    fi
Michal Marek d21cbe
Michal Marek 95ddf7
    # Generate spec file
Michal Marek 892b7b
    sed -r -e "s,@NAME@,kernel-$flavor,g" \
Michal Marek d21cbe
	-e "s,@SUMMARY@,$summary,g" \
Michal Marek d21cbe
	-e "s~@DESCRIPTION@~$description~g" \
Michal Marek 892b7b
	-e "s,@(FLAVOR|CFGNAME)@,$flavor,g" \
Michal Marek 95ddf7
	-e "s,@VARIANT@,$VARIANT,g" \
Michal Marek 892b7b
	-e "s,@(SRC)?VERSION@,$SRCVERSION,g" \
Michal Marek 95ddf7
	-e "s,@PATCHVERSION@,$PATCHVERSION,g" \
Michal Marek 95ddf7
	-e "s,@RPMVERSION@,$RPMVERSION,g" \
Michal Marek e2501c
	-e "s,@PRECONF@,1,g" \
Michal Marek 892b7b
	-e "s,@NO_DEBUG@,,g" \
Michal Marek 892b7b
	-e "s,@KERNEL_MODULE_PACKAGES@,kernel-module-packages,g" \
Michal Marek 892b7b
	-e "s,@EXTRA_KMS@,$extra_kms,g" \
Michal Marek 95ddf7
	-e "s,@ARCHS@,$archs,g" \
Michal Marek 95ddf7
	-e "s,@PROVIDES_OBSOLETES@,${prov_obs//$'\n'/\\n},g" \
Michal Marek e2501c
	-e "s,@EXTRA_NEEDS@,$extra_needs,g" \
Michal Marek 95ddf7
	-e "s,@TOLERATE_UNKNOWN_NEW_CONFIG_OPTIONS@,$tolerate_unknown_new_config_options,g" \
Michal Marek 95ddf7
	-e "s,@RELEASE_PREFIX@,$RELEASE_PREFIX,g" \
Michal Marek 95ddf7
      < rpm/kernel-binary.spec.in \
Michal Marek 95ddf7
    > $build_dir/kernel-$flavor.spec
Michal Marek 95ddf7
done
Michal Marek 95ddf7
Michal Marek 95ddf7
install_changes() {
Michal Marek 95ddf7
    local changes=$1
Michal Marek e2501c
    cat kernel-source.changes > "$changes"
Michal Marek e2501c
    if test -e kernel-source.changes.old; then
Michal Marek e2501c
        cat "$_" >>"$changes"
Michal Marek e2501c
    fi
Michal Marek 95ddf7
    chmod 644 $changes
Michal Marek 95ddf7
}
Michal Marek 95ddf7
Michal Marek 95ddf7
for flavor in $flavors ; do
Michal Marek 95ddf7
    install_changes $build_dir/kernel-$flavor.changes
Michal Marek 95ddf7
done
Michal Marek 95ddf7
Michal Marek 95ddf7
binary_spec_files=$(
Michal Marek 95ddf7
    n=50
Michal Marek 95ddf7
    for flavor in syms $flavors ; do
Michal Marek 95ddf7
	printf "%-14s%s\n" "Source$n:" "kernel-$flavor.spec"
Michal Marek 95ddf7
	n=$[$n+1]
Michal Marek 95ddf7
    done
Michal Marek 95ddf7
)
Michal Marek 95ddf7
binary_spec_files=${binary_spec_files//$'\n'/\\n}
Michal Marek 95ddf7
binary_spec_files_list=$(
Michal Marek 95ddf7
    for flavor in syms $flavors; do
Michal Marek 95ddf7
        echo -n "kernel-$flavor.spec "
Michal Marek 95ddf7
    done
Michal Marek 95ddf7
)
Michal Marek 95ddf7
Michal Marek 95ddf7
CLEANFILES=()
Michal Marek 95ddf7
trap 'if test -n "$CLEANFILES"; then rm -rf "${CLEANFILES[@]}"; fi' EXIT
Michal Marek 95ddf7
tmpdir=$(mktemp -dt ${0##*/}.XXXXXX)
Michal Marek 95ddf7
CLEANFILES=("${CLEANFILES[@]}" "$tmpdir")
Michal Marek 95ddf7
Michal Marek 95ddf7
EXTRA_SYMBOLS=$([ -e extra-symbols ] && cat extra-symbols)
Michal Marek 95ddf7
Michal Marek 95ddf7
# Compute @BUILD_REQUIRES@ expansion
Michal Marek 95ddf7
prepare_source_and_syms() {
Michal Marek 95ddf7
    local name=$1
Michal Marek 95ddf7
    local head="" tail="" nl ARCH_SYMBOLS packages flavor av arch build_req
Michal Marek 95ddf7
Michal Marek 95ddf7
    archs=
Michal Marek 95ddf7
    build_requires=
Michal Marek 95ddf7
Michal Marek 95ddf7
    for arch in $(scripts/arch-symbols --list); do
Michal Marek 95ddf7
	ARCH_SYMBOLS=$(scripts/arch-symbols $arch)
Michal Marek 95ddf7
Michal Marek 95ddf7
	# Exclude flavors that have a different set of patches: we assume that
Michal Marek 95ddf7
	# the user won't change series.conf so much that two flavors that differ
Michal Marek 95ddf7
	# at tar-up.sh time will become identical later.
Michal Marek 95ddf7
Michal Marek 95ddf7
	set -- $ARCH_SYMBOLS $EXTRA_SYMBOLS
Michal Marek 95ddf7
	case $name in
Michal Marek 95ddf7
	(*-rt)
Michal Marek 95ddf7
	    set -- RT "$@"
Michal Marek 95ddf7
	    ;;
Michal Marek 95ddf7
	esac
Michal Marek 95ddf7
	scripts/guards "$@" < series.conf > $tmpdir/$name.patches
Michal Marek 95ddf7
Michal Marek 95ddf7
	packages=
Michal Marek e2501c
	for arch_flavor in $(scripts/guards $ARCH_SYMBOLS $EXTRA_SYMBOLS syms \
Michal Marek 95ddf7
				< config.conf); do
Michal Marek 95ddf7
	    flavor=${arch_flavor#*/}
Michal Marek 95ddf7
	    av=${arch_flavor//\//_}
Michal Marek 95ddf7
	    set -- kernel-$flavor $flavor \
Michal Marek 95ddf7
		   $(case $flavor in (rt|rt_*) echo RT ;; esac)
Michal Marek 95ddf7
Michal Marek 95ddf7
	    # The patch selection for kernel-vanilla is a hack.
Michal Marek 95ddf7
	    [ $flavor = vanilla ] && continue
Michal Marek 95ddf7
Michal Marek 95ddf7
	    scripts/guards $* $ARCH_SYMBOLS $EXTRA_SYMBOLS < series.conf \
Michal Marek 95ddf7
		> $tmpdir/kernel-$av.patches
Michal Marek 95ddf7
	    diff -q $tmpdir/{$name,kernel-$av}.patches > /dev/null \
Michal Marek 95ddf7
		|| continue
Michal Marek 95ddf7
	    packages="$packages kernel-$flavor"
Michal Marek 95ddf7
	done
Michal Marek 95ddf7
Michal Marek 95ddf7
	set -- $packages
Michal Marek 95ddf7
	if [ $# -gt 0 ]; then
Michal Marek 95ddf7
	    [ $arch = i386 ] && arch="%ix86"
Michal Marek 95ddf7
	    nl=$'\n'
Michal Marek 95ddf7
	    [ -n "$head" ] && head="${head}%else$nl"
Michal Marek 95ddf7
	    head="${head}%ifarch $arch$nl"
Michal Marek 95ddf7
	    head="${head}BuildRequires: $*$nl"
Michal Marek 95ddf7
	    tail="%endif$nl$tail"
Michal Marek 95ddf7
	    archs="$archs $arch"
Michal Marek 95ddf7
	fi
Michal Marek 95ddf7
    done
Michal Marek 95ddf7
    build_requires="$head${tail%$'\n'}"
Michal Marek 95ddf7
    build_requires="${build_requires//$'\n'/\\n}"
Michal Marek 95ddf7
    archs=${archs# }
Michal Marek 95ddf7
}
Michal Marek 95ddf7
Michal Marek e2501c
echo "kernel-source.spec"
Michal Marek e2501c
prepare_source_and_syms kernel-syms # compute archs and build_requires
Michal Marek 892b7b
sed -r -e "s,@NAME@,kernel-source,g" \
Michal Marek 892b7b
    -e "s,@(SRC)?VERSION@,$SRCVERSION,g" \
Michal Marek e2501c
    -e "s,@PATCHVERSION@,$PATCHVERSION,g" \
Michal Marek e2501c
    -e "s,@RPMVERSION@,$RPMVERSION,g" \
Michal Marek e2501c
    -e "s,@PRECONF@,1,g" \
Michal Marek e2501c
    -e "s,@ARCHS@,$archs,g" \
Michal Marek e2501c
    -e "s,@BINARY_SPEC_FILES@,$binary_spec_files,g" \
Michal Marek e2501c
    -e "s,@BINARY_SPEC_FILES_LIST@,$binary_spec_files_list,g" \
Michal Marek e2501c
    -e "s,@TOLERATE_UNKNOWN_NEW_CONFIG_OPTIONS@,$tolerate_unknown_new_config_options," \
Michal Marek e2501c
    -e "s,@RELEASE_PREFIX@,$RELEASE_PREFIX,g" \
Michal Marek e2501c
  < rpm/kernel-source.spec.in \
Michal Marek e2501c
> $build_dir/kernel-source.spec
Michal Marek e2501c
install_changes $build_dir/kernel-source.changes
Michal Marek e2501c
Michal Marek e2501c
echo "kernel-syms.spec"
Michal Marek 892b7b
sed -r -e "s,@NAME@,kernel-syms,g" \
Michal Marek e2501c
    -e "s,@VARIANT@,,g" \
Michal Marek 892b7b
    -e "s,@(SRC)?VERSION@,$SRCVERSION,g" \
Michal Marek e2501c
    -e "s,@PATCHVERSION@,$PATCHVERSION,g" \
Michal Marek e2501c
    -e "s,@RPMVERSION@,$RPMVERSION,g" \
Michal Marek e2501c
    -e "s,@PRECONF@,1,g" \
Michal Marek e2501c
    -e "s,@ARCHS@,$archs,g" \
Michal Marek e2501c
    -e "s,@BUILD_REQUIRES@,$build_requires,g" \
Michal Marek e2501c
    -e "s,@RELEASE_PREFIX@,$RELEASE_PREFIX,g" \
Michal Marek e2501c
  < rpm/kernel-syms.spec.in \
Michal Marek e2501c
> $build_dir/kernel-syms.spec
Michal Marek e2501c
install_changes $build_dir/kernel-syms.changes
Michal Marek e2501c
Michal Marek e2501c
echo "kernel-dummy.spec"
Michal Marek 892b7b
sed -r -e "s,@NAME@,kernel-dummy,g" \
Michal Marek 892b7b
    -e "s,@(SRC)?VERSION@,$SRCVERSION,g" \
Michal Marek e2501c
    -e "s,@PATCHVERSION@,$PATCHVERSION,g" \
Michal Marek e2501c
    -e "s,@RPMVERSION@,$RPMVERSION,g" \
Michal Marek e2501c
    -e "s,@RELEASE_PREFIX@,$RELEASE_PREFIX,g" \
Michal Marek e2501c
  < rpm/kernel-dummy.spec.in \
Michal Marek e2501c
> $build_dir/kernel-dummy.spec
Michal Marek e2501c
install_changes $build_dir/kernel-dummy.changes
Michal Marek 95ddf7
Michal Marek 95ddf7
echo "Copying various files..."
Michal Marek e2501c
cp -a                       \
Michal Marek e2501c
    config.conf             \
Michal Marek e2501c
    supported.conf          \
Michal Marek e2501c
    rpm/*                   \
Michal Marek e2501c
    scripts/guards          \
Michal Marek e2501c
    scripts/arch-symbols    \
Michal Marek e2501c
    doc/README.SUSE         \
Michal Marek e2501c
    $build_dir
Michal Marek e2501c
rm -f "$build_dir"/*spec.in "$build_dir"/get_release_number.sh.in \
Michal Marek e77f0d
    "$build_dir"/old-packages.conf "$build_dir"/km.conf \
Michal Marek e77f0d
    "$build_dir"/package-descriptions
Michal Marek 892b7b
# Not all files are in all branches
Michal Marek 892b7b
for f in misc/extract-modaliases scripts/kabi-checks; do
Michal Marek 892b7b
    if test -e "$f"; then
Michal Marek 892b7b
        cp -a "$f" "$build_dir"
Michal Marek 892b7b
    fi
Michal Marek 892b7b
done
Brandon Philips 644fec
if grep -q '^Source.*:[[:space:]]*log\.sh[[:space:]]*$' rpm/kernel-source.spec.in; then
Brandon Philips 644fec
	cp -p scripts/rpm-log.sh "$build_dir"/log.sh
Brandon Philips 644fec
fi
Michal Marek e2501c
Michal Marek e2501c
if [ -e extra-symbols ]; then
Michal Marek e2501c
	install -m 755					\
Michal Marek e2501c
		extra-symbols				\
Michal Marek e2501c
		$build_dir
Michal Marek e2501c
fi
Michal Marek 95ddf7
Michal Marek 95ddf7
Michal Marek 95ddf7
if [ -x /work/src/bin/tools/convert_changes_to_rpm_changelog ]; then
Michal Marek e2501c
    /work/src/bin/tools/convert_changes_to_rpm_changelog \
Michal Marek e2501c
	"$build_dir"/kernel-source*.changes >"$build_dir"/rpm_changelog
Michal Marek 95ddf7
    for spec in "$build_dir"/*.spec; do
Michal Marek 95ddf7
        (echo "%changelog"; cat "$build_dir"/rpm_changelog) >>"$spec"
Michal Marek 95ddf7
    done
Michal Marek 95ddf7
    rm -f "$build_dir"/rpm_changelog
Michal Marek 95ddf7
fi
Michal Marek 95ddf7
Michal Marek 95ddf7
Michal Marek 95ddf7
if [ -n "$source_timestamp" ]; then
Michal Marek a2559d
	ts="$(head -n 1 $build_dir/$tsfile)"
Michal Marek 95ddf7
	branch=$(sed -nre 's/^(CVS|GIT) Branch: //p' \
Michal Marek a2559d
		 $build_dir/$tsfile)
Michal Marek 95ddf7
	rpm_release_string=${branch:-HEAD}_$(date --utc '+%Y%m%d%H%M%S' -d "$ts")
Michal Marek 95ddf7
fi
Michal Marek 95ddf7
Michal Marek 19bc12
sed -e "s:@RELEASE_PREFIX@:$RELEASE_PREFIX:"		\
Michal Marek 19bc12
    -e "s:@RELEASE_SUFFIX@:$rpm_release_string:"	\
Michal Marek 19bc12
    rpm/get_release_number.sh.in			\
Michal Marek 19bc12
    > $build_dir/get_release_number.sh
Michal Marek 19bc12
chmod 755 $build_dir/get_release_number.sh
Michal Marek 95ddf7
Michal Marek 95ddf7
# Usage:
Michal Marek 95ddf7
# stable_tar [-t <timestamp>] [-C <dir>] [--exclude=...] <tarball> <files> ...
Michal Marek 95ddf7
# if -t is not given, files must be within a git repository
Michal Marek 95ddf7
stable_tar() {
Michal Marek c56654
    local tarball mtime chdir="." tar_opts=()
Michal Marek 95ddf7
Michal Marek 95ddf7
    while test $# -gt 2; do
Michal Marek 95ddf7
        case "$1" in
Michal Marek 95ddf7
        -t)
Michal Marek c56654
            mtime=$2
Michal Marek 95ddf7
            shift 2
Michal Marek 95ddf7
            ;;
Michal Marek 95ddf7
        -C)
Michal Marek 95ddf7
            chdir=$2
Michal Marek c56654
	    tar_opts=("${tar_opts[@]}" -C "$2")
Michal Marek 95ddf7
            shift 2
Michal Marek 95ddf7
            ;;
Michal Marek 95ddf7
        --exclude=*)
Michal Marek 95ddf7
            tar_opts=("${tar_opts[@]}" "$1")
Michal Marek 95ddf7
            shift
Michal Marek 95ddf7
            ;;
Michal Marek 95ddf7
        --exclude)
Michal Marek 95ddf7
            tar_opts=("${tar_opts[@]}" "$1" "$2")
Michal Marek 95ddf7
            shift 2
Michal Marek 95ddf7
            ;;
Michal Marek 95ddf7
        *)
Michal Marek 95ddf7
            break
Michal Marek 95ddf7
        esac
Michal Marek 95ddf7
    done
Michal Marek 95ddf7
    tarball=$1
Michal Marek 95ddf7
    shift
Michal Marek 95ddf7
Michal Marek c56654
    if test -z "$mtime" && $using_git; then
Michal Marek c82a3b
	local dirs=$(printf '%s\n' "$@" | sed 's:/.*::' | sort -u)
Michal Marek c56654
        mtime="$(cd "$chdir"
Michal Marek c82a3b
            echo "${dirs[@]}" | xargs git log -1 --pretty=tformat:%ct -- | sort -n | \
Michal Marek ba50b2
            tail -n 1)"
Michal Marek 95ddf7
    fi
Michal Marek 28e83c
    if test -n "$mtime"; then
Michal Marek 28e83c
        tar_opts=("${tar_opts[@]}" --mtime "$mtime")
Michal Marek 28e83c
    fi
Michal Marek f49222
    case "$IBS_PROJECT" in
Michal Marek f49222
    SUSE:SLE-9*)
Michal Marek df842b
        tar_opts=("${tar_opts[@]}" --no-paxheaders)
Michal Marek df842b
    esac
Michal Marek 8cb5b4
    printf '%s\n' "$@" | \
Michal Marek 4cdfd1
	    scripts/stable-tar.pl "${tar_opts[@]}" -T - | bzip2 -9 >"$tarball"
Michal Marek 4cdfd1
    case "${PIPESTATUS[*]}" in
Michal Marek 4cdfd1
    *[1-9]*)
Michal Marek 4cdfd1
        exit 1
Michal Marek 4cdfd1
    esac
Michal Marek 95ddf7
}
Michal Marek 95ddf7
Michal Marek 7016bd
# create the *.tar.bz2 files in parallel: Spawn a job for each cpu
Michal Marek 7016bd
# present; wait for all of them to finish; submit a new set of jobs.
Michal Marek 7016bd
# This is not a very efficient algorithm and it can result in anomalies
Michal Marek 7016bd
# where adding a cpu slows the script down, so improvements are welcome.
Michal Marek 7016bd
slots=$(getconf _NPROCESSORS_ONLN)
Michal Marek 7016bd
if test 0$slots -lt 1; then
Michal Marek 7016bd
	slots=1
Michal Marek 7016bd
fi
Michal Marek 7016bd
used=0
Michal Marek 7016bd
wait_archives()
Michal Marek 7016bd
{
Michal Marek 7016bd
	if test $used -gt 0; then
Michal Marek 7016bd
		wait
Michal Marek 7016bd
		if grep -q '[^0]' "$tmpdir"/result-*; then
Michal Marek 7016bd
			exit 1
Michal Marek 7016bd
		fi
Michal Marek 7016bd
		used=0
Michal Marek 7016bd
		rm -f "$tmpdir"/result-*
Michal Marek 7016bd
	fi
Michal Marek 7016bd
}
Michal Marek 7016bd
do_archive()
Michal Marek 7016bd
{
Michal Marek 7016bd
	if test $slots -eq 1; then
Michal Marek 7016bd
		stable_tar "$@"
Michal Marek 7016bd
		return
Michal Marek 7016bd
	fi
Michal Marek 7016bd
	if test $used -eq $slots; then
Michal Marek 7016bd
		wait_archives
Michal Marek 7016bd
	fi
Michal Marek 7016bd
	(stable_tar "$@"; echo $? >"$tmpdir/result-$used") &
Michal Marek 7016bd
	let used++
Michal Marek 7016bd
}
Michal Marek 7016bd
Michal Marek 95ddf7
# The first directory level determines the archive name
Michal Marek 95ddf7
all_archives="$(
Michal Marek 95ddf7
    echo "$referenced_files" \
Michal Marek 95ddf7
    | sed -e 's,/.*,,' \
Michal Marek 95ddf7
    | uniq )"
Michal Marek 95ddf7
for archive in $all_archives; do
Michal Marek 95ddf7
    echo "$archive.tar.bz2"
Michal Marek 95ddf7
Michal Marek 6d5c47
    files="$(echo "$referenced_files" | sed -ne "\:^${archive//./\\.}/:p")"
Michal Marek 95ddf7
    if [ -n "$files" ]; then
Michal Marek 7016bd
	do_archive $build_dir/$archive.tar.bz2 $files
Michal Marek 95ddf7
    fi
Michal Marek 95ddf7
done
Michal Marek 95ddf7
Michal Marek 83a948
if test -d kabi; then
Michal Marek 83a948
    echo "kabi.tar.bz2"
Michal Marek 7016bd
    do_archive $build_dir/kabi.tar.bz2 kabi
Michal Marek 83a948
fi
Michal Marek 95ddf7
Michal Marek 892b7b
for kmp in  novell-kmp hello; do
Michal Marek 892b7b
    if test ! -d "doc/$kmp"; then
Michal Marek 892b7b
        continue
Michal Marek 892b7b
    fi
Michal Marek 892b7b
    echo "$kmp.tar.bz2"
Michal Marek 7016bd
    do_archive -C doc --exclude='*.o' --exclude='*.ko' --exclude='*.*.cmd' \
Michal Marek 892b7b
        "$build_dir/$kmp.tar.bz2" "$kmp"
Michal Marek 892b7b
done
Michal Marek 7016bd
wait_archives
Michal Marek e2501c
Michal Marek 95ddf7
# Create empty dummys for any *.tar.bz2 archive mentioned in the spec file
Michal Marek 95ddf7
# not already created: patches.addon is empty by intention; others currently
Michal Marek 95ddf7
# may contain no patches.
Michal Marek 95ddf7
archives=$(sed -ne 's,^Source[0-9]*:.*[ \t/]\([^/]*\)\.tar\.bz2$,\1,p' \
Michal Marek 95ddf7
           $build_dir/*.spec | sort -u)
Michal Marek 95ddf7
for archive in $archives; do
Michal Marek 892b7b
    case "$archive" in
Michal Marek 892b7b
    *%*)
Michal Marek a2559d
        # skip archive names with macros
Michal Marek 892b7b
        continue
Michal Marek 892b7b
    esac
Michal Marek 892b7b
    if test -e "$build_dir/$archive.tar.bz2"; then
Michal Marek 892b7b
        continue
Michal Marek 95ddf7
    fi
Michal Marek 892b7b
    echo "$archive.tar.bz2 (empty)"
Michal Marek 892b7b
    tmpdir2=$(mktemp -dt ${0##*/}.XXXXXX)
Michal Marek 892b7b
    CLEANFILES=("${CLEANFILES[@]}" "$tmpdir2")
Michal Marek 892b7b
    mkdir -p $tmpdir2/$archive
Michal Marek c56654
    stable_tar -C $tmpdir2 -t 1234567890 $build_dir/$archive.tar.bz2 $archive
Michal Marek 95ddf7
done
Michal Marek 95ddf7
Michal Marek 95ddf7
# Force mbuild to choose build hosts with enough memory available:
Michal Marek 95ddf7
echo $((1024*1024)) > $build_dir/minmem
Michal Marek 95ddf7
# Force mbuild to choose build hosts with enough disk space available:
Michal Marek 95ddf7
echo $((6*1024)) > $build_dir/needed_space_in_mb
Michal Marek 95ddf7
if [ -n "$ignore_kabi" ]; then
Michal Marek a2559d
    echo > $build_dir/IGNORE-KABI-BADNESS
Michal Marek 95ddf7
fi
Michal Marek 95ddf7
if [ -n "$ignore_unsupported_deps" ]; then
Michal Marek a2559d
    echo > $build_dir/IGNORE-UNSUPPORTED-DEPS
Michal Marek 95ddf7
fi