1 # vim:ts=4 sw=4 noet ft=spec
2 # Kernel specific macro definitions.
3 # To make use of these macros insert the following line into your spec file:
4 # %{load:%{_usrlibrpm}/macros.d/kernel}
6 %__modinfo /sbin/modinfo
8 # Path to scripts to autogenerate gstreamer package dependencies,
10 # Note: Used iff _use_internal_dependency_generator is non-zero. The
11 # helpers are also used by %{_rpmhome}/rpmdeps {--provides|--requires}.
12 %__kernel_provides %{_rpmhome}/kmod-deps.sh --provides --modinfo %__modinfo
13 #__kernel_requires %{_rpmhome}/kmod-deps.sh --requires --modinfo %__modinfo
15 # Alternative kernel type/version
16 %_alt_kernel %{nil}%{?alt_kernel:-%{?alt_kernel}}
17 %_build_kernels %{nil}%{?build_kernels:%{?build_kernels}}%{!?build_kernels:%{?alt_kernel}}
19 %buildrequires_kernel %(echo %{_build_kernels} | tr , '\\n' | while read n ; do \
20 if [ -z "$n" -o "$n" = "head" ]; then \
21 echo "BuildRequires: kernel-module-build >= 3:2.6.20.2" \
23 echo "BuildRequires: kernel-$n-module-build >= 3:2.6.20.2" \
26 %create_kernel_packages %(echo %{_build_kernels} | tr , '\\n' | while read n ; do \
27 echo %%undefine alt_kernel \
28 [ -z "$n" -o "$n" = "head" ] || echo %%define alt_kernel $n \
32 %build_kernel_packages %(echo %{_build_kernels} | tr , '\\n' | while read n ; do \
33 echo %%undefine alt_kernel \
34 [ -z "$n" -o "$n" = "head" ] || echo %%define alt_kernel $n \
35 echo %%build_kernel_pkg \
38 %install_kernel_packages %(echo %{_build_kernels} | tr , '\\n' | while read n ; do \
39 echo %%undefine alt_kernel \
40 [ -z "$n" -o "$n" = "head" ] || echo %%define alt_kernel $n \
41 echo %%install_kernel_pkg \
44 # The directory holding Linux kernel sources
45 %_kernelsrcdir /usr/src/linux%{_alt_kernel}
47 # rpm -qf on kernel version.h file
48 %__kernel_qf() %(R=$(cd %{_kernelsrcdir} 2>/dev/null && LC_ALL=C rpm -q --qf '%*' -f include/linux/version.h 2>/dev/null | grep -v 'is not'); echo ${R:-ERROR})
50 # kernel %{name} and kernel %{epoch}:%{version}-%{release} macro respecing alt_kernel
51 %kernel_name %(N=%{__kernel_qf %{N}}; echo ${N%%-headers})
52 %kernel_version %{__kernel_qf %|E?{%{E}:}|%{V}-%{R}}
54 # -n drm to generate kernel%{_alt_kernel}-drm dependency
55 %releq_kernel(n:) %{kernel_name}%{?-n:-%{-n*}} = %{kernel_version}
56 %releq_kernel_up(n:) %{kernel_name}-up%{?-n:-%{-n*}} = %{kernel_version}
57 %releq_kernel_smp(n:) %{kernel_name}-smp%{?-n:-%{-n*}} = %{kernel_version}
59 # -s post to generate Requires(post) dependency
60 %requires_releq_kernel(s:n:) Requires%{-s:(%{-s*})}: %releq_kernel
61 %requires_releq_kernel_up(s:n:) Requires%{-s:(%{-s*})}: %releq_kernel_up
62 %requires_releq_kernel_smp(s:n:) Requires%{-s:(%{-s*})}: %releq_kernel_smp
64 # kernel version-release handling
66 Z=$([ -f '%{_kernelsrcdir}/include/generated/utsrelease.h' ] && \\
67 awk -F'"' '/UTS_RELEASE/{print $2}' %{_kernelsrcdir}/include/{linux/version,generated/utsrelease}.h 2>/dev/null || \\
68 awk -F'"' '/UTS_RELEASE/{print $2}' %{_kernelsrcdir}/include/linux/{version,utsrelease}.h 2>/dev/null); \\
69 Z=${Z:-$(awk -F' = ' '/^VERSION/{v=$2} /^PATCHLEVEL/{p=$2} /^SUBLEVEL/{s=$2} /^EXTRAVERSION/{e=$2} END {printf("%d.%d.%d%s", v, p, s, e)}' \\
70 %{_kernelsrcdir}/Makefile 2>/dev/null)}; \\
74 %_kernel_version_code %( \\
75 Z=$(awk '/LINUX_VERSION_CODE/{print $3}' %{_kernelsrcdir}/include/linux/version.h 2>/dev/null); \\
79 %_kernel_version_magic() %(echo $((%{1} * 65536 + %{2} * 256 + %{3})))
81 # `uname -r` used for building/installing kernel modules
82 %_kernel_ver %{!?_without_dist_kernel:%{__kernel_qf %{V}-%{R}}}%{?_without_dist_kernel:%{__kernel_ver}}
83 # package version OR `uname -r` for non-dist kernel to be used in @release field
84 %_kernel_ver_str %(echo %{!?_without_dist_kernel:%{__kernel_qf %{V}-%{R}}}%{?_without_dist_kernel:%{__kernel_ver}} | tr '-' '_')
86 #-----------------------------------------------------------------
87 # Find and gzip all kernel modules
91 #%no_install_post_compress_modules 1
92 %__spec_install_post_compress_modules { \
93 %{!?no_install_post_compress_modules: __spec_install_post_compress_modules() { \
95 if [ -d $RPM_BUILD_ROOT/lib/modules ]; then \
96 q=$(find $RPM_BUILD_ROOT/lib/modules -name '*o' -type f -print); \
98 printf "Compress %d kernel modules..." $(echo "$q" | wc -l); \
99 echo "$q" | xargs -r %{__gzip} -9nf; \
101 find $RPM_BUILD_ROOT/lib/modules -name '*o' -type l -printf "%p %l\n" | \
102 while read a b; do ln -sf $b.gz $a.gz; rm -f $a; done; \
105 }; __spec_install_post_compress_modules } }
107 # Build modules for kernels 2.6
108 # Author: Przemyslaw Iskra <sparky@pld-linux.org>
111 # %build_kernel_modules -m <modules> -C <directory>
113 # remember that proper Makefile is still required
115 # -m <modules> (required) -- comma-separated list of modules to save,
116 # without .ko extension, may be placed in subdirectory
117 # -C <directory> -- change to <directory> before doing anything
118 # -p <arg>, -P <arg> -- arguments passeed to make scripts
119 # -c -- do not execute make clean
120 # <additional arguments> -- all additional arguments will be passed to
123 # Additional patching supported via here document. Try:
124 # %build_kernel_modules -m module <<'EOF'
125 # your patch script here
127 # Don't use it unless patching depends on config options.
129 # Developer note: don't touch it unless you know how to handle '\'.
130 # - \ in script expands to nothing
131 # - \\\ in script expands to \
132 # - \\\ inside definition expands to nothing
133 # - \\\\\\\ inside definition expands to \
134 # - in last line \ has to touch arguments so arguments passing
135 # in new lines (using \) will be supported
137 %build_kernel_modules(p:P:m:C:c) \
138 %{!?-m:%{error:%{0}: Required module name/list missing} exit 1} \
141 %if "%{_target_base_arch}" != "%{_host_base_arch}" \\\
142 %if "%{_host_base_arch}" == "x86_64" && "%{_target_base_arch}" == "i386" \\\
143 CC="%{__cc}" ARCH=%{_target_base_arch} \\\
145 ARCH=%{_target_base_arch} CROSS_COMPILE=%{_target_cpu}-pld-linux- \\\
150 %define MakeOpts HOSTCC="%{__cc}" SYSSRC=%{_kernelsrcdir} SYSOUT=$PWD/o \\\\\\\
151 O=$PWD/o %{?with_verbose:V=1} %{Opts} \
155 local L="<" PATCH_SH; \
156 [[ '%{*}' != *$L$L* ]] || PATCH_SH="set -x -e;$(cat)" \
159 [ -r "%{_kernelsrcdir}/.config" ] || exit 1 \
161 install -d o/include/linux o/include/generated o/arch/x86/include o/arch/powerpc/lib \
162 ln -sf %{_kernelsrcdir}/.config o/.config \
163 ln -sf %{_kernelsrcdir}/Module.symvers o/Module.symvers \
164 if [ -f %{_kernelsrcdir}/include/generated/autoconf.h ]; then \
165 ln -sf %{_kernelsrcdir}/include/generated/autoconf.h o/include/generated/autoconf.h \
166 ln -s ../generated/autoconf.h o/include/linux/autoconf.h \
168 ln -sf %{_kernelsrcdir}/include/linux/autoconf.h o/include/linux/autoconf.h \
170 if [ -d %{_kernelsrcdir}/arch/x86/include/generated ]; then \
171 ln -s %{_kernelsrcdir}/arch/x86/include/generated o/arch/x86/include \
175 [ -z "$PATCH_SH" ] || echo "$PATCH_SH" | %__spec_build_shell \
178 install -d o/include/config \
179 touch o/include/config/MARKER \
180 ln -sf %{_kernelsrcdir}/include/config/auto.conf o/include/config/auto.conf \
181 ln -sf %{_kernelsrcdir}/scripts o/scripts \
183 %{!?-c:%{__make} -C %{_kernelsrcdir} clean \\\
184 RCS_FIND_IGNORE="-name '*.[ks]o' -o" \\\
186 M=$PWD %{MakeOpts}} \
188 %{__make} -C %{_kernelsrcdir} modules \\\
190 M=$PWD CONSTIFY_PLUGIN="" %{MakeOpts} \
196 %build_kernel_modules_compat(p:P:m:C:c) \
197 %{!?-m:%{error:%{0}: Required module name/list missing} exit 1} \
200 %if "%{_target_base_arch}" != "%{_host_base_arch}" \\\
201 %if "%{_host_base_arch}" == "x86_64" && "%{_target_base_arch}" == "i386" \\\
202 CC="%{__cc}" ARCH=%{_target_base_arch} \\\
204 ARCH=%{_target_base_arch} CROSS_COMPILE=%{_target_cpu}-pld-linux- \\\
209 %define MakeOpts HOSTCC="%{__cc}" SYSSRC=%{_kernelsrcdir} SYSOUT=$PWD/o \\\\\\\
210 O=$PWD/o %{?with_verbose:V=1} %{Opts} \
214 local L="<" PATCH_SH; \
215 [[ '%{*}' != *$L$L* ]] || PATCH_SH="set -x -e;$(cat)" \
217 local cfgs='%{?with_dist_kernel:%{?with_smp: smp}%{?with_up: up}}%{!?with_dist_kernel: nondist}' \
219 for cfg in ${cfgs:-dist}; do \
220 [ -r "%{_kernelsrcdir}/config-$cfg" ] || exit 1 \
223 install -d o/include/linux o/include/generated o/arch/powerpc/lib \
224 ln -sf %{_kernelsrcdir}/config-$cfg o/.config \
225 ln -sf %{_kernelsrcdir}/Module.symvers-$cfg o/Module.symvers \
226 if [ -f %{_kernelsrcdir}/include/generated/autoconf-$cfg.h ]; then \
227 ln -sf %{_kernelsrcdir}/include/generated/autoconf-$cfg.h o/include/generated/autoconf.h \
228 ln -s ../generated/autoconf.h o/include/linux/autoconf.h \
230 ln -sf %{_kernelsrcdir}/include/linux/autoconf-$cfg.h o/include/linux/autoconf.h \
234 [ -z "$PATCH_SH" ] || echo "$PATCH_SH" | %__spec_build_shell \
237 %if %{with dist_kernel} || %(test -f %{_kernelsrcdir}/scripts/bin2c ; echo $?) \
238 %{__make} -j1 -C %{_kernelsrcdir} prepare scripts \\\
242 install -d o/include/config \
243 touch o/include/config/MARKER \
244 ln -sf %{_kernelsrcdir}/include/config/auto-$cfg.conf o/include/config/auto.conf \
245 ln -sf %{_kernelsrcdir}/scripts o/scripts \
248 %{!?-c:%{__make} -C %{_kernelsrcdir} clean \\\
249 RCS_FIND_IGNORE="-name '*.[ks]o' -o" \\\
251 M=$PWD %{MakeOpts}} \
253 %{__make} -C %{_kernelsrcdir} modules \\\
255 M=$PWD CONSTIFY_PLUGIN="" %{MakeOpts} \
257 for MODULE in {%{-m*},}; do \
258 [ -z "${MODULE}" ] || mv ${MODULE}{,-$cfg}.ko \
267 # Install kernel modules built by %build_kernel_modules
268 # Author: Przemyslaw Iskra <sparky@pld-linux.org>
271 # %install_kernel_modules -m <modules> -d <directory>
274 # -m <modules> (required) -- comma-separated list of modules to install,
275 # without .ko extension, may be placed in subdirectory
276 # -d <directory> (required) -- in what subdirectory modules should be
277 # installed (eg. misc, kernel/drivers/net)
278 # -s <suffix> -- suffix to use when installing modules, useful when module
279 # with same name exists in kernel already
280 # -n <file> -- name of modprobe config file to use (without .conf extension)
281 # for defining aliases, only useful with -s
282 # -D <directory> -- DESTDIR, base directory for installed files,
283 # defaults to RPM_BUILD_ROOT
285 %install_kernel_modules(m:d:s:n:D:) \
286 %{!?-m:%{error:%{0}: Required module name (-m) missing}exit 1} \
287 %{!?-d:%{error:%{0}: Required module directory missing}exit 1} \
288 %{?-n:%{!?-s:%{error:%{0}: Modprobe .conf file requires module suffix}exit 1}} \
291 [ -n "$INSTALLROOT" ] || INSTALLROOT=$RPM_BUILD_ROOT \
295 for MODULE in {%{-m*},}; do \
296 [ -n "${MODULE}" ] || continue \
297 MNAME=${MODULE##*/} \
298 install -m 644 -D ${MODULE}.ko $INSTALLROOT/lib/modules/%{_kernel_ver}/%{-d*}/${MNAME}%{-s:-%{-s*}}.ko \
299 %{?-s:install -d $INSTALLROOT%{_sysconfdir}/modprobe.d/%{_kernel_ver} \
300 echo "alias ${MNAME} ${MNAME}-%{-s*}" >> $INSTALLROOT%{_sysconfdir}/modprobe.d/%{_kernel_ver}/%{-n*}.conf} \
305 %install_kernel_modules_compat(m:d:s:n:D:) \
306 %{!?-m:%{error:%{0}: Required module name (-m) missing}exit 1} \
307 %{!?-d:%{error:%{0}: Required module directory missing}exit 1} \
308 %{?-n:%{!?-s:%{error:%{0}: Modprobe .conf file requires module suffix}exit 1}} \
311 [ -n "$INSTALLROOT" ] || INSTALLROOT=$RPM_BUILD_ROOT \
314 local cfgs='%{?with_dist_kernel:%{?with_smp: smp}%{?with_up: up}}%{!?with_dist_kernel: nondist}' \
316 for MODULE in {%{-m*},}; do \
317 [ -n "${MODULE}" ] || continue \
318 for cfg in ${cfgs:-dist}; do \
319 [ "$cfg" = smp ] && suf=smp || suf= \
320 MNAME=${MODULE##*/} \
321 install -m 644 -D ${MODULE}-$cfg.ko \\\
322 $INSTALLROOT/lib/modules/%{_kernel_ver}$suf/%{-d*}/${MNAME}%{-s:-%{-s*}}.ko \
323 %{?-s:install -d $INSTALLROOT%{_sysconfdir}/modprobe.d/%{_kernel_ver}$suf \
324 echo "alias ${MNAME} ${MNAME}-%{-s*}" \\\
325 >> $INSTALLROOT%{_sysconfdir}/modprobe.d/%{_kernel_ver} $suf/%{-n*}.conf} \