]> TLD Linux GIT Repositories - packages/rpm-tld-macros.git/blob - macros.kernel
- merged 2.029 from PLD
[packages/rpm-tld-macros.git] / macros.kernel
1 # vim:ts=4 sw=4 noet ft=spec
2 # Kernel specific macro definitions.
3
4 %__modinfo              /sbin/modinfo
5
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
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 \
19 echo %%undefine alt_kernel \
20 [ -z "$n" -o "$n" = "head" ] || echo %%define alt_kernel $n \
21 echo "BuildRequires:    %{*}" \
22 done)
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
62 # kernel version-release handling, `uname -r` used for building/installing kernel modules
63 %_kernel_ver     %( \\
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 )
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 )
83
84 %_kernel_version_code    %( \\
85         Z=$(awk '/LINUX_VERSION_CODE/{print $3}' %{_kernelsrcdir}/include/linux/version.h 2>/dev/null); \\
86         echo ${Z:-16777215}; \\
87 )
88
89 %_kernel_version_magic()         %(echo $((%{1} * 65536 + %{2} * 256 + %{3})))
90
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
94 # Compression used for %__spec_install_post_compress_modules
95 # Supported values:
96 # - "gzip -9nf" (module-init-tools and kmod)
97 # - "xz" (kmod)
98 # - "xz -9e" (kmod), however size difference with "xz" default options is very minimal
99 # @since 1.707
100 %kmod_compress_cmd %{__gzip} -9nf
101
102 #-----------------------------------------------------------------
103 # Find and compress all kernel modules
104 #
105 # Requires: find
106 # Depends: kmod_compress_cmd
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 \
113                 tool=$(%{kmod_compress_cmd} --version | head -n1); \
114                 case "$tool" in gzip*) ext=gz;; xz*) ext=xz;; esac; \
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); \
118                         echo "$q" | xargs -r %{kmod_compress_cmd}; \
119                         echo "DONE"; \
120                         find $RPM_BUILD_ROOT/lib/modules -name '*o' -type l -printf "%p %l\n" | \
121                         while read a b; do ln -sf $b.$ext $a.$ext; rm -f $a; done; \
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                                                                                                                           \\\
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                                                                                                                  \\\
176         CC="%{__cc}"                                                                                                    \\\
177 %endif                                                                                                                          \
178 %define MakeOpts HOSTCC="%{__cc}" SYSSRC=%{_kernelsrcdir} SYSOUT=$PWD/o \\\\\\\
179                 %{?with_verbose:V=1} %{Opts}                                            \
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 \\\\\\\
238                 %{?with_verbose:V=1} %{Opts}                                            \
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}