]>
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 | ||
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 | 21 | echo %%undefine alt_kernel \ |
f1f5d044 | 22 | [ -z "$n" -o "$n" = "head" ] || echo %%define alt_kernel $n \ |
3a27fcef | 23 | echo "BuildRequires: %{*}" \ |
f1f5d044 | 24 | done) |
1c834f14 JR |
25 | |
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 \ | |
29 | echo %%kernel_pkg \ | |
30 | done) | |
31 | ||
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 \ | |
36 | done) | |
37 | ||
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 \ | |
42 | done) | |
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*}} \ | |
175 | compile() { \ | |
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 | } \ | |
214 | compile %{*} \ | |
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*}} \ | |
234 | compile() { \ | |
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 | \ | |
240 | for 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 \ | |
281 | done \ | |
282 | %{?-C:cd -} \ | |
283 | } \ | |
284 | compile %{*} \ | |
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 | \ | |
311 | INSTALLROOT=%{-D*} \ | |
312 | [ -n "$INSTALLROOT" ] || INSTALLROOT=$RPM_BUILD_ROOT \ | |
313 | \ | |
314 | %{!?debug:set +x;} \ | |
315 | \ | |
316 | for 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} \ | |
322 | done \ | |
323 | unset 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 | \ | |
331 | INSTALLROOT=%{-D*} \ | |
332 | [ -n "$INSTALLROOT" ] || INSTALLROOT=$RPM_BUILD_ROOT \ | |
333 | \ | |
334 | %{!?debug:set +x;} \ | |
335 | local cfgs='%{?with_dist_kernel:%{?with_smp: smp}%{?with_up: up}}%{!?with_dist_kernel: nondist}' \ | |
336 | \ | |
337 | for 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 \ | |
348 | done \ | |
349 | unset INSTALLROOT \ | |
350 | %{nil} |