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
"