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