+%define version 3
+%define taglevel 1
+
+# when no planetlab kernel is being built, kernel_version is defined but empty
+%define _with_planetlab_kernel %{?kernel_version:1}%{!?kernel_version:0}
+# we need to make sure that this rpm gets upgraded when the kernel release changes
+%if %{_with_planetlab_kernel}
+# with the planetlab kernel
+%define pl_kernel_taglevel %( echo %{kernel_release} | cut -d. -f1 )
+%define ipfw_release %{kernel_version}.%{pl_kernel_taglevel}
+%else
+# with the stock kernel
+# this line below
+#%define ipfw_release %( rpm -q --qf "%{version}" kernel-headers )
+# causes recursive macro definition no matter how much you quote
+%define percent %
+%define braop \{
+%define bracl \}
+%define kernel_version %( rpm -q --qf %{percent}%{braop}version%{bracl} kernel-headers )
+%define kernel_release %( rpm -q --qf %{percent}%{braop}release%{bracl} kernel-headers )
+%define kernel_arch %( rpm -q --qf %{percent}%{braop}arch%{bracl} kernel-headers )
+%define ipfw_release %{kernel_version}.%{kernel_release}
+%endif
+
+%define release %{ipfw_release}.%{taglevel}%{?pldistro:.%{pldistro}}%{?date:.%{date}}
+
+# guess which convention is used; k27 and before used dash, k32 uses dot
+%define kernelpath_dash /usr/src/kernels/%{kernel_version}-%{kernel_release}-%{kernel_arch}
+%define kernelpath_dot /usr/src/kernels/%{kernel_version}-%{kernel_release}.%{kernel_arch}
+%define kernelpath %( [ -d %{kernelpath_dot} ] && echo %{kernelpath_dot} || echo %{kernelpath_dash} )
+
+# the k32 kernel currently builds e.g. /lib/modules/2.6.32-0.onelab.2010.12.07-i686
+# the k27 and before does not have the -i686 part
+%define kernel_id_old %{kernel_version}-%{kernel_release}
+%define kernel_id_new %{kernel_version}-%{kernel_release}.%{kernel_arch}
+%define kernel_id %( [ -d %{kernelpath_dot} ] && echo %{kernel_id_new} || echo %{kernel_id_old} )