Definitely doable. Probably lots more %if'age in the spec, but
hey,
there's already a ton...
Nope, pretty much just the same ones I added.
Absolutely, shoot me whatcha got. I still have your prior changes in
patch form (as well as a good portion merged into a working copy),
extracting the diffs is no prob.
Index: Makefile
===================================================================
RCS file: /cvs/dist/rpms/kernel/devel/Makefile,v
retrieving revision 1.45
diff -B -p -u -r1.45 Makefile
--- Makefile 19 Mar 2007 21:32:30 -0000 1.45
+++ Makefile 3 Apr 2007 21:02:40 -0000
@@ -68,3 +68,120 @@ reconfig:
# since i386 isn't a target...
compile compile-short: DIST_DEFINES += --target $(shell uname -m)
+
+#
+# Hacks for building vanilla (unpatched) kernel rpms.
+# Use "make vanilla-TARGET" like "make TARGET" (make
vanilla-scratch-build).
+#
+vanilla-%: $(SPECFILE:.spec=-vanilla.spec)
+ @$(MAKE) $* SPECFILE=$<
+
+$(SPECFILE:.spec=-vanilla.spec): $(SPECFILE)
+ @rm -f $@
+ (echo %define nopatches 1; cat $<) > $@
+
+scratch-build: test-srpm
+ $(BUILD_CLIENT) $(BUILD_FLAGS) --scratch $(COLLECTION) \
+ $(SRCRPMDIR)/$(NAME)-$(VERSION)-$(RELEASE).src.rpm
+
+# Dismal kludge for building via brew from cvs after "make vanilla-tag".
+ifdef BEEHIVE_SRPM_BUILD
+export CHECKOUT_TAG ?= $(shell sed s/^.// CVS/Tag)
+tag-pattern = $(TAG_NAME)-$(TAG_VERSION)-0_%_$(TAG_RELEASE)
+ifeq (,$(filter-out $(tag-pattern),$(CHECKOUT_TAG)))
+variant := $(patsubst $(tag-pattern),%,$(CHECKOUT_TAG))
+srpm: SPECFILE := $(wildcard $(SPECFILE:.spec=-$(variant).spec) \
+ $(SPECFILE:.spec=-t.$(variant).spec))
+srpm beehive-sprm: RELEASE := 0.$(variant).$(RELEASE)
+endif
+endif
+
+
+#
+# Hacks for building kernel rpms from upstream code plus local GIT branches.
+# Use "make git/BRANCH/TARGET" like "make TARGET".
+# Use "make git/BRANCH-fedora/TARGET" to include Fedora patches on top.
+#
+ifndef GIT_SPEC
+git/%:
+ @$(MAKE) GIT_SPEC=$(subst /,-,$(*D)) git-$(*F)
+else
+git-%: $(SPECFILE:.spec=-t.$(GIT_SPEC).spec)
+ @$(MAKE) GIT_SPEC= $* SPECFILE=$<
+endif
+
+#
+# Your git-branches.mk file can define GIT_DIR, e.g.:
+# GIT_DIR = ${HOME}/kernel/.git
+# Make sure GIT_AUTHOR_NAME and GIT_AUTHOR_EMAIL are also set
+# or your rpm changelogs will look like crap.
+#
+# For each branch it can define a variable branch-BRANCH or tag-BRANCH
+# giving the parent of BRANCH to diff against in a separate patch. If
+# the parent is unknown, it will use $(branch-upstream) defaulting to
+# "upstream".
+#
+# Defining tag-BRANCH means the tag corresponds to an upstream patch in
+# the sources file, so that is used instead of generating a patch with
+# git. If there is no tag-upstream defined, it will figure out a vNNN
+# tag or vNNN-gitN pseudo-tag from the last patch in the sources file.
+# For example:
+# tag-some-hacks = v2.6.21-rc5
+# branch-more-hacks = first-hacks
+# Leads to patches:
+# git diff v2.6.21-rc5..more-hacks > linux-2.6.21-rc5-some-hacks.patch
+# git diff some-hacks..more-hacks > linux-2.6.21-rc5-more-hacks.patch
+# Whereas having no git-branches.mk at all but doing
+# "make GIT_DIR=... git/mybranch/test-srpm" does:
+# id=`cat patch-2.6.21-rc5-git4.id` # auto-fetched via upstream file
+# git diff $id..upstream > linux-2.6.21-rc5-git4-upstream.patch
+# git diff upstream..mybranch > linux-2.6.21-rc5-git4-mybranch.patch
+# If the upstream patch (or any branch patch) is empty it's left out.
+#
+git-branches.mk:;
+-include git-branches.mk
+
+branch-upstream ?= upstream
+
+ifdef GIT_DIR
+export GIT_DIR
+export GIT_AUTHOR_NAME
+export GIT_AUTHOR_EMAIL
+gen-patches ?= gen-patches
+
+ifndef havespec
+$(SPECFILE:.spec=-t.%-fedora.spec): $(SPECFILE) $(gen-patches) FORCE
+ ./$(gen-patches) --fedora < $< > $@ $(gen-patches-args)
+$(SPECFILE:.spec=-t.%.spec): $(SPECFILE) $(gen-patches) FORCE
+ ./$(gen-patches) < $< > $@ $(gen-patches-args)
+.PRECIOUS: $(SPECFILE:.spec=-t.%.spec) $(SPECFILE:.spec=-t.%-fedora.spec)
+endif
+
+spec-%: $(SPECFILE:.spec=-t.%.spec) ;
+$(SPECFILE):;
+FORCE:;
+
+branch-of-* = $(firstword $(head-$*) $*)
+gen-patches-args = --name $* v$(VERSION) $(call heads,$(branch-of-*))
+define heads
+$(if $(tag-$1),$(filter-out v$(VERSION),$(tag-$1)),\
+ $(call heads,$(firstword $(branch-$1) $(branch-upstream)))) $1
+endef
+
+files-%-fedora:
+ @echo $(SPECFILE:.spec=-t.$*-fedora.spec)
+ @$(call list-patches,$(branch-of-*))
+files-%:
+ @echo $(SPECFILE:.spec=-t.$*.spec)
+ @$(call list-patches,$(branch-of-*))
+define list-patches
+$(if $(tag-$1),version=$(patsubst v%,%,$(tag-$1)),\
+ $(call list-patches,$(firstword $(branch-$1) $(branch-upstream)))); \
+echo linux-$${version}-$1.patch
+endef
+
+ifndef tag-$(branch-upstream)
+tag-$(branch-upstream) := $(shell \
+ sed -n 's/^.* *//;s/\.bz2$$//;s/patch-/v/p' sources)
+endif
+endif
Index: kernel-2.6.spec
===================================================================
RCS file: /cvs/dist/rpms/kernel/devel/kernel-2.6.spec,v
retrieving revision 1.3040
diff -B -p -u -r1.3040 kernel-2.6.spec
--- kernel-2.6.spec 2 Apr 2007 19:39:38 -0000 1.3040
+++ kernel-2.6.spec 3 Apr 2007 21:02:40 -0000
@@ -60,7 +60,8 @@ Summary: The Linux kernel (the core of t
%define sublevel 20
%define kversion 2.6.%{sublevel}
%define rpmversion 2.6.%{sublevel}
-%define release %(R="$Revision: 1.3040 $"; RR="${R##: }"; echo
${RR%%?})%{?dist}%{?buildid}
+%define specrelease %(R="$Revision: 1.3040 $"; RR="${R##: }"; echo
${RR%%?})%{?dist}%{?buildid}
+%define release %{specrelease}
%define make_target bzImage
%define kernel_image x86
@@ -73,6 +74,24 @@ Summary: The Linux kernel (the core of t
%define KVERREL %{PACKAGE_VERSION}-%{PACKAGE_RELEASE}
%define hdrarch %_target_cpu
+%if 0%{!?nopatches:1}
+%define nopatches 0
+%endif
+
+%if %{nopatches}
+%define includexen 0
+%define variant -vanilla
+%else
+%define variant_fedora -fedora
+%endif
+
+%define using_upstream_branch 0
+%if 0%{?upstream_branch:1}
+%define using_upstream_branch 1
+%define variant -%{upstream_branch}%{?variant_fedora}
+%define release %{upstream_branch_release}.%{specrelease}
+%endif
+
# if requested, only build base kernel
%if %{with_baseonly}
%define with_smp 0
@@ -237,6 +256,15 @@ Summary: The Linux kernel (the core of t
%define xen_image vmlinux.gz
%endif
+%if %{nopatches}
+%define signmodules 0
+# Ignore unknown options in our config-* files.
+# Some options go with patches we're not applying.
+%define oldconfig_target loose_nonint_oldconfig
+%else
+%define oldconfig_target nonint_oldconfig
+%endif
+
# To temporarily exclude an architecture from being built, add it to
# %nobuildarches. Do _NOT_ use the ExclusiveArch: line, because if we
# don't build kernel-headers then the new build system will no longer let
@@ -285,7 +313,7 @@ Summary: The Linux kernel (the core of t
#
%define kernel_prereq fileutils, module-init-tools, initscripts >= 8.11.1-1, mkinitrd
>= 6.0.4-1
-Name: kernel
+Name: kernel%{?variant}
Group: System Environment/Kernel
License: GPLv2
Version: %{rpmversion}
@@ -373,8 +401,16 @@ Source82: config-olpc-generic
#
# Patches 0 through 100 are meant for core subsystem upgrades
#
+
+%if %{using_upstream_branch}
+### BRANCH PATCH ###
+%else
+# Here should be only the patches up to the upstream canonical Linus tree.
Patch1: patch-2.6.21-rc5.bz2
Patch2: patch-2.6.21-rc5-git9.bz2
+%endif
+
+%if !%{nopatches}
Patch3: git-geode.patch
# Patches 10 through 99 are for things that are going upstream really soon.
@@ -448,7 +484,9 @@ Patch366: linux-2.6-ps3av-export-header.
# Patches 800 through 899 are reserved for bugfixes to the core system
# and patches related to how RPMs are build
#
-Patch800: linux-2.6-build-nonintconfig.patch
+%endif
+Patch800: linux-2.6.17-nonintconfig.patch
+%if !%{nopatches}
# Exec-shield.
Patch810: linux-2.6-execshield.patch
@@ -582,6 +620,7 @@ Patch20001: xen-11668-hvm_disable_fix.pa
Patch20002: xen-dom0-reboot.patch
# END OF PATCH DEFINITIONS
+%endif
BuildRoot: %{_tmppath}/kernel-%{KVERREL}-root-%{_target_cpu}
@@ -959,10 +998,17 @@ cp -rl vanilla linux-%{kversion}.%{_targ
cd linux-%{kversion}.%{_target_cpu}
+%if %{using_upstream_branch}
+### BRANCH APPLY ###
+%else
+
# Update to latest upstream.
%patch1 -p1
%patch2 -p1
+%endif
+%if !%{nopatches}
+
# Patches 10 through 100 are meant for core subsystem upgrades
# Roland's utrace ptrace replacement.
@@ -1056,13 +1102,14 @@ cd linux-%{kversion}.%{_target_cpu}
# Patches 800 through 899 are reserved for bugfixes to the core system
# and patches related to how RPMs are build
#
-
+%endif
# This patch adds a "make nonint_oldconfig" which is non-interactive and
# also gives a list of missing options at the end. Useful for automated
# builds (as used in the buildsystem).
%patch800 -p1
+%if !%{nopatches}
# Exec shield
%patch810 -p1
@@ -1280,6 +1327,7 @@ mv drivers/xen/blktap/blktap.c drivers/x
%patch10001 -p1
# END OF PATCH APPLICATIONS
+%endif
cp %{SOURCE10} Documentation/
@@ -1310,7 +1358,7 @@ for i in *.config
do
mv $i .config
Arch=`head -1 .config | cut -b 3-`
- make ARCH=$Arch nonint_oldconfig > /dev/null
+ make ARCH=$Arch %{oldconfig_target} > /dev/null
echo "# $Arch" > configs/$i
cat .config >> configs/$i
done
@@ -1404,7 +1452,7 @@ BuildKernel() {
KernelImage=arch/$Arch/boot/bzImage
fi
- make -s ARCH=$Arch nonint_oldconfig > /dev/null
+ make -s ARCH=$Arch %{oldconfig_target} > /dev/null
make -s ARCH=$Arch %{?_smp_mflags} $MakeTarget %{?sparse_mflags}
make -s ARCH=$Arch %{?_smp_mflags} modules %{?sparse_mflags} || exit 1
#!/bin/sh
nopatches=1
if [ "x$1" = "x--fedora" ]; then
nopatches=0
shift
patchcomment="plus Fedora patches"
else
patchcomment="no Fedora patches"
fi
name=
if [ "x$1" = "x--name" ]; then
shift
name="$1"
shift
fi
if [ $# -lt 2 ]; then
echo >&2 "Usage: GIT_DIR=REPO $0 [--fedora] [--name NAME]\
TARBALL-TAG [PATCH-TAG...] BRANCH..."
exit 2
fi
base=$1
shift
nextpatch=1
usepatch()
{
patches[$nextpatch]=$1
nextpatch=$(($nextpatch + 1))
}
loglines="- Experimental build from git sources ($patchcomment)\\
"
log()
{
logrev=$1
logtext="$(printf %-12s "git $2:")$3"
loglines="${loglines}- $(printf %-35s "$logtext") ${logrev}\\
"
}
patch_headers()
{
p=1
while [ $p -lt $nextpatch ]; do
echo "Patch$p: ${patches[$p]}\\"
p=$(($p + 1))
done
}
patch_apply()
{
p=1
while [ $p -lt $nextpatch ]; do
echo "%patch$p -p1\\"
p=$(($p + 1))
done
}
base_rev()
{
local base=$1
if [ -r "$GIT_DIR/refs/tags/$base" ]; then
tag_rev=`git-rev-parse $base` || {
echo >&2 "Cannot find tag $base"
exit 2
}
return 0
fi
case "$1" in
v*-git*)
local id=patch-${1#v}.id
if [ ! -r $id ]; then
make download UPSTREAM_FILES=$id UPSTREAM_CHECKS=-- 2> /dev/null 2>&1
fi
[ -r $id ] && tag_rev=`cat $id` && return 0
;;
esac
return 1
}
while base_rev $1; do
base=$1
base_rev=$tag_rev
shift
usepatch patch-${base#v}.bz2
log $tag_rev tag $base
done
version=${base#v}
now="`date +'%Y-%m-%d %H:%M %Z'`"
for branch; do
merge_base=`git-merge-base $base_rev $branch` || {
echo >&2 "No common ancestor for $base and $branch"
exit 2
}
branch_rev=`git-rev-parse $branch`
file=linux-${version}-${branch}.patch
git diff -p -r "${merge_base}" -r "${branch_rev}" > $file ||
exit
if [ ! -s $file ]; then
rm -f $file
continue
fi
usepatch $file
log $branch_rev branch $branch
base="$branch"
base_rev="$base"
done
name=`echo ${name:-${branch}} | sed s/-/_/g`
#upstream_branch=`date -u -d "$now" +${branch}.%Y%m%dT%H%M | sed s/-/_/g`
upstream_branch=$name
branch_rev=`git describe $base_rev | sed 's/-g[0-9a-f]*$//;s/-/./g;s/^v//'`
logdate=`date -d "$now" +'%a %b %d %Y'`
sed "/%define nopatches/c\\
%define nopatches ${nopatches}\\
%define upstream_branch ${name}\\
%define upstream_branch_release ${branch_rev}
/^### BRANCH PATCH/a\\
`patch_headers`
###
/^### BRANCH APPLY/a\\
`patch_apply`
###
/^%changelog/a\\
* ${logdate} ${GIT_AUTHOR_NAME} <${GIT_AUTHOR_EMAIL}>\\
$loglines
"