]> git.pld-linux.org Git - packages/rpm-build-macros.git/blame - macros.kernel
Add rename notice
[packages/rpm-build-macros.git] / macros.kernel
CommitLineData
1c834f14
JR
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}
5
6%__modinfo /sbin/modinfo
7
1c834f14
JR
8# Alternative kernel type/version
9%_alt_kernel %{nil}%{?alt_kernel:-%{?alt_kernel}}
10%_build_kernels %{nil}%{?build_kernels:%{?build_kernels}}%{!?build_kernels:%{?alt_kernel}}
11
f1f5d044
JR
12# Macros for building kernel packages for multiple kernels from same spec
13# Usage:
14#
15# %{expand:%buildrequires_kernel kernel%%{_alt_kernel}-module-build >= 3:2.6.20.2}}
16# %{expand:%create_kernel_packages}
17# %{expand:%build_kernel_packages}
18# %{expand:%install_kernel_packages}
19#
20%buildrequires_kernel() %(echo %{_build_kernels} | tr , '\\n' | while read n ; do \
ccab679d 21echo %%undefine alt_kernel \
f1f5d044 22[ -z "$n" -o "$n" = "head" ] || echo %%define alt_kernel $n \
3a27fcef 23echo "BuildRequires: %{*}" \
f1f5d044 24done)
1c834f14
JR
25
26%create_kernel_packages %(echo %{_build_kernels} | tr , '\\n' | while read n ; do \
27echo %%undefine alt_kernel \
28[ -z "$n" -o "$n" = "head" ] || echo %%define alt_kernel $n \
29echo %%kernel_pkg \
30done)
31
32%build_kernel_packages %(echo %{_build_kernels} | tr , '\\n' | while read n ; do \
33echo %%undefine alt_kernel \
34[ -z "$n" -o "$n" = "head" ] || echo %%define alt_kernel $n \
35echo %%build_kernel_pkg \
36done)
37
38%install_kernel_packages %(echo %{_build_kernels} | tr , '\\n' | while read n ; do \
39echo %%undefine alt_kernel \
40[ -z "$n" -o "$n" = "head" ] || echo %%define alt_kernel $n \
41echo %%install_kernel_pkg \
42done)
43
44# The directory holding Linux kernel sources
45%_kernelsrcdir /usr/src/linux%{_alt_kernel}
46
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})
49
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}}
53
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}
58
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
63
e36bf111
JR
64# kernel version-release handling, `uname -r` used for building/installing kernel modules
65%_kernel_ver %( \\
1c834f14
JR
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)}; \\
71 echo ${Z:-ERROR}; \\
72)
e36bf111
JR
73# left for compatibility
74%__kernel_ver %{_kernel_ver}
75
76# package version to be used in @release field
77%_kernel_ver_str %( \\
78 Z=$([ -f '%{_kernelsrcdir}/include/generated/utsrelease.h' ] && \\
79 awk -F'"' '/UTS_RELEASE/{gsub(/-/,"_",$2); print $2}' %{_kernelsrcdir}/include/{linux/version,generated/utsrelease}.h 2>/dev/null || \\
80 awk -F'"' '/UTS_RELEASE/{gsub(/-/,"_",$2); print $2}' %{_kernelsrcdir}/include/linux/{version,utsrelease}.h 2>/dev/null); \\
81 Z=${Z:-$(awk -F' = ' '/^VERSION/{v=$2} /^PATCHLEVEL/{p=$2} /^SUBLEVEL/{s=$2} /^EXTRAVERSION/{e=$2} END {z=sprintf("%d.%d.%d%s", v, p, s, e); gsub(/-/,"_",z); print z}' \\
82 %{_kernelsrcdir}/Makefile 2>/dev/null)}; \\
83 echo ${Z:-ERROR}; \\
84)
1c834f14
JR
85
86%_kernel_version_code %( \\
87 Z=$(awk '/LINUX_VERSION_CODE/{print $3}' %{_kernelsrcdir}/include/linux/version.h 2>/dev/null); \\
88 echo ${Z:-ERROR}; \\
89)
90
91%_kernel_version_magic() %(echo $((%{1} * 65536 + %{2} * 256 + %{3})))
92
d9c557d8
JR
93%_host_base_arch %{expand:%%global _host_base_arch %(echo %{_host_cpu} | sed 's/i.86/i386/;s/athlon/i386/;s/pentium./i386/;s/amd64/x86_64/;s/ia32e/x86_64/;s/x32/x86_64/;s/sparcv./sparc/;s/arm.*/arm/')}%_host_base_arch
94%_target_base_arch %{expand:%%global _target_base_arch %(echo %{_target_cpu} | sed 's/i.86/i386/;s/athlon/i386/;s/pentium./i386/;s/amd64/x86_64/;s/ia32e/x86_64/;s/x32/x86_64/;s/sparcv./sparc/;s/arm.*/arm/')}%_target_base_arch
95
ac67d8e1
ER
96# Compression used for %__spec_install_post_compress_modules
97# Supported values:
98# - "gzip -9nf" (module-init-tools and kmod)
99# - "xz" (kmod)
ffbeb310 100# - "xz -9e" (kmod), however size difference with "xz" default options is very minimal
ac67d8e1
ER
101# @since 1.707
102%kmod_compress_cmd %{__gzip} -9nf
103
1c834f14 104#-----------------------------------------------------------------
ac67d8e1 105# Find and compress all kernel modules
1c834f14
JR
106#
107# Requires: find
ac67d8e1 108# Depends: kmod_compress_cmd
1c834f14
JR
109#
110#%no_install_post_compress_modules 1
111%__spec_install_post_compress_modules { \
112%{!?no_install_post_compress_modules: __spec_install_post_compress_modules() { \
113%{!?debug:set +x;} \
114 if [ -d $RPM_BUILD_ROOT/lib/modules ]; then \
ac67d8e1 115 tool=$(%{kmod_compress_cmd} --version | head -n1); \
0109ecc6 116 case "$tool" in gzip*) ext=gz;; xz*) ext=xz;; esac; \
1c834f14
JR
117 q=$(find $RPM_BUILD_ROOT/lib/modules -name '*o' -type f -print); \
118 if [ "$q" ]; then \
119 printf "Compress %d kernel modules..." $(echo "$q" | wc -l); \
ac67d8e1 120 echo "$q" | xargs -r %{kmod_compress_cmd}; \
1c834f14
JR
121 echo "DONE"; \
122 find $RPM_BUILD_ROOT/lib/modules -name '*o' -type l -printf "%p %l\n" | \
ac67d8e1 123 while read a b; do ln -sf $b.$ext $a.$ext; rm -f $a; done; \
1c834f14
JR
124 fi; \
125 fi; \
126}; __spec_install_post_compress_modules } }
127
128# Build modules for kernels 2.6
129# Author: Przemyslaw Iskra <sparky@pld-linux.org>
130#
131# Usage:
132# %build_kernel_modules -m <modules> -C <directory>
133#
134# remember that proper Makefile is still required
135# Options:
136# -m <modules> (required) -- comma-separated list of modules to save,
137# without .ko extension, may be placed in subdirectory
138# -C <directory> -- change to <directory> before doing anything
139# -p <arg>, -P <arg> -- arguments passeed to make scripts
140# -c -- do not execute make clean
141# <additional arguments> -- all additional arguments will be passed to
142# make modules
143#
144# Additional patching supported via here document. Try:
145# %build_kernel_modules -m module <<'EOF'
146# your patch script here
147# EOF
148# Don't use it unless patching depends on config options.
149
150# Developer note: don't touch it unless you know how to handle '\'.
151# - \ in script expands to nothing
152# - \\\ in script expands to \
153# - \\\ inside definition expands to nothing
154# - \\\\\\\ inside definition expands to \
155# - in last line \ has to touch arguments so arguments passing
156# in new lines (using \) will be supported
157
158%build_kernel_modules(p:P:m:C:c) \
159%{!?-m:%{error:%{0}: Required module name/list missing} exit 1} \
160 \
161%define Opts \\\\\\\
162%if "%{_target_base_arch}" != "%{_host_base_arch}" \\\
163 %if "%{_host_base_arch}" == "x86_64" && "%{_target_base_arch}" == "i386" \\\
164 CC="%{__cc}" ARCH=%{_target_base_arch} \\\
165 %else \\\
166 ARCH=%{_target_base_arch} CROSS_COMPILE=%{_target_cpu}-pld-linux- \\\
167 %endif \\\
168%else \\\
169 CC="%{__cc}" \\\
170%endif \
171%define MakeOpts HOSTCC="%{__cc}" SYSSRC=%{_kernelsrcdir} SYSOUT=$PWD/o \\\\\\\
8389937f 172 %{?with_verbose:V=1} %{Opts} \
1c834f14
JR
173 \
174%{?-C:cd %{-C*}} \
175compile() { \
176 local L="<" PATCH_SH; \
177 [[ '%{*}' != *$L$L* ]] || PATCH_SH="set -x -e;$(cat)" \
178 set -e -x \
179 \
180 [ -r "%{_kernelsrcdir}/.config" ] || exit 1 \
181 rm -rf o \
182 install -d o/include/linux o/include/generated o/arch/x86/include o/arch/powerpc/lib \
183 ln -sf %{_kernelsrcdir}/.config o/.config \
184 ln -sf %{_kernelsrcdir}/Module.symvers o/Module.symvers \
185 if [ -f %{_kernelsrcdir}/include/generated/autoconf.h ]; then \
186 ln -sf %{_kernelsrcdir}/include/generated/autoconf.h o/include/generated/autoconf.h \
187 ln -s ../generated/autoconf.h o/include/linux/autoconf.h \
188 else \
189 ln -sf %{_kernelsrcdir}/include/linux/autoconf.h o/include/linux/autoconf.h \
190 fi \
191 if [ -d %{_kernelsrcdir}/arch/x86/include/generated ]; then \
192 ln -s %{_kernelsrcdir}/arch/x86/include/generated o/arch/x86/include \
193 fi \
194 \
195 set +x \
196 [ -z "$PATCH_SH" ] || echo "$PATCH_SH" | %__spec_build_shell \
197 set -x \
198 \
199 install -d o/include/config \
200 touch o/include/config/MARKER \
201 ln -sf %{_kernelsrcdir}/include/config/auto.conf o/include/config/auto.conf \
202 ln -sf %{_kernelsrcdir}/scripts o/scripts \
203 \
204 %{!?-c:%{__make} -C %{_kernelsrcdir} clean \\\
205 RCS_FIND_IGNORE="-name '*.[ks]o' -o" \\\
206 ${1+"$@"} \\\
207 M=$PWD %{MakeOpts}} \
208 \
209 %{__make} -C %{_kernelsrcdir} modules \\\
210 ${1+"$@"} \\\
211 M=$PWD CONSTIFY_PLUGIN="" %{MakeOpts} \
212%{?-C:cd -} \
213} \
214compile %{*} \
215%{nil}
216
217%build_kernel_modules_compat(p:P:m:C:c) \
218%{!?-m:%{error:%{0}: Required module name/list missing} exit 1} \
219 \
220%define Opts \\\\\\\
221%if "%{_target_base_arch}" != "%{_host_base_arch}" \\\
222 %if "%{_host_base_arch}" == "x86_64" && "%{_target_base_arch}" == "i386" \\\
223 CC="%{__cc}" ARCH=%{_target_base_arch} \\\
224 %else \\\
225 ARCH=%{_target_base_arch} CROSS_COMPILE=%{_target_cpu}-pld-linux- \\\
226 %endif \\\
227%else \\\
228 CC="%{__cc}" \\\
229%endif \
230%define MakeOpts HOSTCC="%{__cc}" SYSSRC=%{_kernelsrcdir} SYSOUT=$PWD/o \\\\\\\
8389937f 231 %{?with_verbose:V=1} %{Opts} \
1c834f14
JR
232 \
233%{?-C:cd %{-C*}} \
234compile() { \
235 local L="<" PATCH_SH; \
236 [[ '%{*}' != *$L$L* ]] || PATCH_SH="set -x -e;$(cat)" \
237 set -e -x \
238 local cfgs='%{?with_dist_kernel:%{?with_smp: smp}%{?with_up: up}}%{!?with_dist_kernel: nondist}' \
239 \
240for cfg in ${cfgs:-dist}; do \
241 [ -r "%{_kernelsrcdir}/config-$cfg" ] || exit 1 \
242 \
243 rm -rf o \
244 install -d o/include/linux o/include/generated o/arch/powerpc/lib \
245 ln -sf %{_kernelsrcdir}/config-$cfg o/.config \
246 ln -sf %{_kernelsrcdir}/Module.symvers-$cfg o/Module.symvers \
247 if [ -f %{_kernelsrcdir}/include/generated/autoconf-$cfg.h ]; then \
248 ln -sf %{_kernelsrcdir}/include/generated/autoconf-$cfg.h o/include/generated/autoconf.h \
249 ln -s ../generated/autoconf.h o/include/linux/autoconf.h \
250 else \
251 ln -sf %{_kernelsrcdir}/include/linux/autoconf-$cfg.h o/include/linux/autoconf.h \
252 fi \
253 \
254 set +x \
255 [ -z "$PATCH_SH" ] || echo "$PATCH_SH" | %__spec_build_shell \
256 set -x \
257 \
258 %if %{with dist_kernel} || %(test -f %{_kernelsrcdir}/scripts/bin2c ; echo $?) \
259 %{__make} -j1 -C %{_kernelsrcdir} prepare scripts \\\
260 %{-p*} %{-P*} \\\
261 %{MakeOpts} \
262 %else \
263 install -d o/include/config \
264 touch o/include/config/MARKER \
265 ln -sf %{_kernelsrcdir}/include/config/auto-$cfg.conf o/include/config/auto.conf \
266 ln -sf %{_kernelsrcdir}/scripts o/scripts \
267 %endif \
268 \
269 %{!?-c:%{__make} -C %{_kernelsrcdir} clean \\\
270 RCS_FIND_IGNORE="-name '*.[ks]o' -o" \\\
271 ${1+"$@"} \\\
272 M=$PWD %{MakeOpts}} \
273 \
274 %{__make} -C %{_kernelsrcdir} modules \\\
275 ${1+"$@"} \\\
276 M=$PWD CONSTIFY_PLUGIN="" %{MakeOpts} \
277 \
278 for MODULE in {%{-m*},}; do \
279 [ -z "${MODULE}" ] || mv ${MODULE}{,-$cfg}.ko \
280 done \
281done \
282%{?-C:cd -} \
283} \
284compile %{*} \
285%{nil}
286
287
288# Install kernel modules built by %build_kernel_modules
289# Author: Przemyslaw Iskra <sparky@pld-linux.org>
290#
291# Usage:
292# %install_kernel_modules -m <modules> -d <directory>
293#
294# Options:
295# -m <modules> (required) -- comma-separated list of modules to install,
296# without .ko extension, may be placed in subdirectory
297# -d <directory> (required) -- in what subdirectory modules should be
298# installed (eg. misc, kernel/drivers/net)
299# -s <suffix> -- suffix to use when installing modules, useful when module
300# with same name exists in kernel already
301# -n <file> -- name of modprobe config file to use (without .conf extension)
302# for defining aliases, only useful with -s
303# -D <directory> -- DESTDIR, base directory for installed files,
304# defaults to RPM_BUILD_ROOT
305
306%install_kernel_modules(m:d:s:n:D:) \
307%{!?-m:%{error:%{0}: Required module name (-m) missing}exit 1} \
308%{!?-d:%{error:%{0}: Required module directory missing}exit 1} \
309%{?-n:%{!?-s:%{error:%{0}: Modprobe .conf file requires module suffix}exit 1}} \
310 \
311INSTALLROOT=%{-D*} \
312[ -n "$INSTALLROOT" ] || INSTALLROOT=$RPM_BUILD_ROOT \
313 \
314%{!?debug:set +x;} \
315 \
316for MODULE in {%{-m*},}; do \
317 [ -n "${MODULE}" ] || continue \
318 MNAME=${MODULE##*/} \
319 install -m 644 -D ${MODULE}.ko $INSTALLROOT/lib/modules/%{_kernel_ver}/%{-d*}/${MNAME}%{-s:-%{-s*}}.ko \
320 %{?-s:install -d $INSTALLROOT%{_sysconfdir}/modprobe.d/%{_kernel_ver} \
321 echo "alias ${MNAME} ${MNAME}-%{-s*}" >> $INSTALLROOT%{_sysconfdir}/modprobe.d/%{_kernel_ver}/%{-n*}.conf} \
322done \
323unset INSTALLROOT \
324%{nil}
325
326%install_kernel_modules_compat(m:d:s:n:D:) \
327%{!?-m:%{error:%{0}: Required module name (-m) missing}exit 1} \
328%{!?-d:%{error:%{0}: Required module directory missing}exit 1} \
329%{?-n:%{!?-s:%{error:%{0}: Modprobe .conf file requires module suffix}exit 1}} \
330 \
331INSTALLROOT=%{-D*} \
332[ -n "$INSTALLROOT" ] || INSTALLROOT=$RPM_BUILD_ROOT \
333 \
334%{!?debug:set +x;} \
335local cfgs='%{?with_dist_kernel:%{?with_smp: smp}%{?with_up: up}}%{!?with_dist_kernel: nondist}' \
336 \
337for MODULE in {%{-m*},}; do \
338 [ -n "${MODULE}" ] || continue \
339 for cfg in ${cfgs:-dist}; do \
340 [ "$cfg" = smp ] && suf=smp || suf= \
341 MNAME=${MODULE##*/} \
342 install -m 644 -D ${MODULE}-$cfg.ko \\\
343 $INSTALLROOT/lib/modules/%{_kernel_ver}$suf/%{-d*}/${MNAME}%{-s:-%{-s*}}.ko \
344 %{?-s:install -d $INSTALLROOT%{_sysconfdir}/modprobe.d/%{_kernel_ver}$suf \
345 echo "alias ${MNAME} ${MNAME}-%{-s*}" \\\
346 >> $INSTALLROOT%{_sysconfdir}/modprobe.d/%{_kernel_ver} $suf/%{-n*}.conf} \
347 done \
348done \
349unset INSTALLROOT \
350%{nil}
This page took 0.184258 seconds and 4 git commands to generate.