]>
Commit | Line | Data |
---|---|---|
1c834f14 JR |
1 | # vim:ts=4 sw=4 noet ft=spec |
2 | # Kernel specific macro definitions. | |
1c834f14 JR |
3 | |
4 | %__modinfo /sbin/modinfo | |
5 | ||
1c834f14 JR |
6 | # Alternative kernel type/version |
7 | %_alt_kernel %{nil}%{?alt_kernel:-%{?alt_kernel}} | |
8 | %_build_kernels %{nil}%{?build_kernels:%{?build_kernels}}%{!?build_kernels:%{?alt_kernel}} | |
9 | ||
f1f5d044 JR |
10 | # Macros for building kernel packages for multiple kernels from same spec |
11 | # Usage: | |
12 | # | |
13 | # %{expand:%buildrequires_kernel kernel%%{_alt_kernel}-module-build >= 3:2.6.20.2}} | |
14 | # %{expand:%create_kernel_packages} | |
15 | # %{expand:%build_kernel_packages} | |
16 | # %{expand:%install_kernel_packages} | |
17 | # | |
18 | %buildrequires_kernel() %(echo %{_build_kernels} | tr , '\\n' | while read n ; do \ | |
ccab679d | 19 | echo %%undefine alt_kernel \ |
f1f5d044 | 20 | [ -z "$n" -o "$n" = "head" ] || echo %%define alt_kernel $n \ |
3a27fcef | 21 | echo "BuildRequires: %{*}" \ |
f1f5d044 | 22 | done) |
1c834f14 JR |
23 | |
24 | %create_kernel_packages %(echo %{_build_kernels} | tr , '\\n' | while read n ; do \ | |
25 | echo %%undefine alt_kernel \ | |
26 | [ -z "$n" -o "$n" = "head" ] || echo %%define alt_kernel $n \ | |
27 | echo %%kernel_pkg \ | |
28 | done) | |
29 | ||
30 | %build_kernel_packages %(echo %{_build_kernels} | tr , '\\n' | while read n ; do \ | |
31 | echo %%undefine alt_kernel \ | |
32 | [ -z "$n" -o "$n" = "head" ] || echo %%define alt_kernel $n \ | |
33 | echo %%build_kernel_pkg \ | |
34 | done) | |
35 | ||
36 | %install_kernel_packages %(echo %{_build_kernels} | tr , '\\n' | while read n ; do \ | |
37 | echo %%undefine alt_kernel \ | |
38 | [ -z "$n" -o "$n" = "head" ] || echo %%define alt_kernel $n \ | |
39 | echo %%install_kernel_pkg \ | |
40 | done) | |
41 | ||
42 | # The directory holding Linux kernel sources | |
43 | %_kernelsrcdir /usr/src/linux%{_alt_kernel} | |
44 | ||
45 | # rpm -qf on kernel version.h file | |
46 | %__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}) | |
47 | ||
48 | # kernel %{name} and kernel %{epoch}:%{version}-%{release} macro respecing alt_kernel | |
49 | %kernel_name %(N=%{__kernel_qf %{N}}; echo ${N%%-headers}) | |
50 | %kernel_version %{__kernel_qf %|E?{%{E}:}|%{V}-%{R}} | |
51 | ||
52 | # -n drm to generate kernel%{_alt_kernel}-drm dependency | |
53 | %releq_kernel(n:) %{kernel_name}%{?-n:-%{-n*}} = %{kernel_version} | |
54 | %releq_kernel_up(n:) %{kernel_name}-up%{?-n:-%{-n*}} = %{kernel_version} | |
55 | %releq_kernel_smp(n:) %{kernel_name}-smp%{?-n:-%{-n*}} = %{kernel_version} | |
56 | ||
57 | # -s post to generate Requires(post) dependency | |
58 | %requires_releq_kernel(s:n:) Requires%{-s:(%{-s*})}: %releq_kernel | |
59 | %requires_releq_kernel_up(s:n:) Requires%{-s:(%{-s*})}: %releq_kernel_up | |
60 | %requires_releq_kernel_smp(s:n:) Requires%{-s:(%{-s*})}: %releq_kernel_smp | |
61 | ||
e36bf111 JR |
62 | # kernel version-release handling, `uname -r` used for building/installing kernel modules |
63 | %_kernel_ver %( \\ | |
1c834f14 JR |
64 | Z=$([ -f '%{_kernelsrcdir}/include/generated/utsrelease.h' ] && \\ |
65 | awk -F'"' '/UTS_RELEASE/{print $2}' %{_kernelsrcdir}/include/{linux/version,generated/utsrelease}.h 2>/dev/null || \\ | |
66 | awk -F'"' '/UTS_RELEASE/{print $2}' %{_kernelsrcdir}/include/linux/{version,utsrelease}.h 2>/dev/null); \\ | |
67 | 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)}' \\ | |
68 | %{_kernelsrcdir}/Makefile 2>/dev/null)}; \\ | |
69 | echo ${Z:-ERROR}; \\ | |
70 | ) | |
e36bf111 JR |
71 | # left for compatibility |
72 | %__kernel_ver %{_kernel_ver} | |
73 | ||
74 | # package version to be used in @release field | |
75 | %_kernel_ver_str %( \\ | |
76 | Z=$([ -f '%{_kernelsrcdir}/include/generated/utsrelease.h' ] && \\ | |
77 | awk -F'"' '/UTS_RELEASE/{gsub(/-/,"_",$2); print $2}' %{_kernelsrcdir}/include/{linux/version,generated/utsrelease}.h 2>/dev/null || \\ | |
78 | awk -F'"' '/UTS_RELEASE/{gsub(/-/,"_",$2); print $2}' %{_kernelsrcdir}/include/linux/{version,utsrelease}.h 2>/dev/null); \\ | |
79 | 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}' \\ | |
80 | %{_kernelsrcdir}/Makefile 2>/dev/null)}; \\ | |
81 | echo ${Z:-ERROR}; \\ | |
82 | ) | |
1c834f14 JR |
83 | |
84 | %_kernel_version_code %( \\ | |
85 | Z=$(awk '/LINUX_VERSION_CODE/{print $3}' %{_kernelsrcdir}/include/linux/version.h 2>/dev/null); \\ | |
34789b3e | 86 | echo ${Z:-16777215}; \\ |
1c834f14 JR |
87 | ) |
88 | ||
89 | %_kernel_version_magic() %(echo $((%{1} * 65536 + %{2} * 256 + %{3}))) | |
90 | ||
d9c557d8 JR |
91 | %_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 |
92 | %_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 | |
93 | ||
ac67d8e1 ER |
94 | # Compression used for %__spec_install_post_compress_modules |
95 | # Supported values: | |
96 | # - "gzip -9nf" (module-init-tools and kmod) | |
97 | # - "xz" (kmod) | |
ffbeb310 | 98 | # - "xz -9e" (kmod), however size difference with "xz" default options is very minimal |
ac67d8e1 ER |
99 | # @since 1.707 |
100 | %kmod_compress_cmd %{__gzip} -9nf | |
101 | ||
1c834f14 | 102 | #----------------------------------------------------------------- |
ac67d8e1 | 103 | # Find and compress all kernel modules |
1c834f14 JR |
104 | # |
105 | # Requires: find | |
ac67d8e1 | 106 | # Depends: kmod_compress_cmd |
1c834f14 JR |
107 | # |
108 | #%no_install_post_compress_modules 1 | |
109 | %__spec_install_post_compress_modules { \ | |
110 | %{!?no_install_post_compress_modules: __spec_install_post_compress_modules() { \ | |
111 | %{!?debug:set +x;} \ | |
112 | if [ -d $RPM_BUILD_ROOT/lib/modules ]; then \ | |
ac67d8e1 | 113 | tool=$(%{kmod_compress_cmd} --version | head -n1); \ |
0109ecc6 | 114 | case "$tool" in gzip*) ext=gz;; xz*) ext=xz;; esac; \ |
1c834f14 JR |
115 | q=$(find $RPM_BUILD_ROOT/lib/modules -name '*o' -type f -print); \ |
116 | if [ "$q" ]; then \ | |
117 | printf "Compress %d kernel modules..." $(echo "$q" | wc -l); \ | |
ac67d8e1 | 118 | echo "$q" | xargs -r %{kmod_compress_cmd}; \ |
1c834f14 JR |
119 | echo "DONE"; \ |
120 | find $RPM_BUILD_ROOT/lib/modules -name '*o' -type l -printf "%p %l\n" | \ | |
ac67d8e1 | 121 | while read a b; do ln -sf $b.$ext $a.$ext; rm -f $a; done; \ |
1c834f14 JR |
122 | fi; \ |
123 | fi; \ | |
124 | }; __spec_install_post_compress_modules } } | |
125 | ||
126 | # Build modules for kernels 2.6 | |
127 | # Author: Przemyslaw Iskra <sparky@pld-linux.org> | |
128 | # | |
129 | # Usage: | |
130 | # %build_kernel_modules -m <modules> -C <directory> | |
131 | # | |
132 | # remember that proper Makefile is still required | |
133 | # Options: | |
134 | # -m <modules> (required) -- comma-separated list of modules to save, | |
135 | # without .ko extension, may be placed in subdirectory | |
136 | # -C <directory> -- change to <directory> before doing anything | |
137 | # -p <arg>, -P <arg> -- arguments passeed to make scripts | |
138 | # -c -- do not execute make clean | |
139 | # <additional arguments> -- all additional arguments will be passed to | |
140 | # make modules | |
141 | # | |
142 | # Additional patching supported via here document. Try: | |
143 | # %build_kernel_modules -m module <<'EOF' | |
144 | # your patch script here | |
145 | # EOF | |
146 | # Don't use it unless patching depends on config options. | |
147 | ||
148 | # Developer note: don't touch it unless you know how to handle '\'. | |
149 | # - \ in script expands to nothing | |
150 | # - \\\ in script expands to \ | |
151 | # - \\\ inside definition expands to nothing | |
152 | # - \\\\\\\ inside definition expands to \ | |
153 | # - in last line \ has to touch arguments so arguments passing | |
154 | # in new lines (using \) will be supported | |
155 | ||
156 | %build_kernel_modules(p:P:m:C:c) \ | |
157 | %{!?-m:%{error:%{0}: Required module name/list missing} exit 1} \ | |
158 | \ | |
159 | %define Opts \\\\\\\ | |
160 | %if "%{_target_base_arch}" != "%{_host_base_arch}" \\\ | |
161 | %if "%{_host_base_arch}" == "x86_64" && "%{_target_base_arch}" == "i386" \\\ | |
162 | CC="%{__cc}" ARCH=%{_target_base_arch} \\\ | |
163 | %else \\\ | |
164 | ARCH=%{_target_base_arch} CROSS_COMPILE=%{_target_cpu}-pld-linux- \\\ | |
165 | %endif \\\ | |
166 | %else \\\ | |
a7086662 JP |
167 | %ifarch aarch64 \\\ |
168 | ARCH=arm64 \\\ | |
169 | %endif \\\ | |
170 | %ifarch ppc ppc64 \\\ | |
171 | ARCH=powerpc \\\ | |
172 | %endif \\\ | |
173 | %ifnarch aarch64 ppc ppc64 \\\ | |
174 | ARCH=%{_target_base_arch} \\\ | |
175 | %endif \\\ | |
1c834f14 JR |
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} |