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