jjb: Update modules based jobs
[lttng-ci.git] / scripts / lttng-modules / param-build.sh
1 #!/bin/sh -exu
2 #
3 # Copyright (C) 2016 - Michael Jeanson <mjeanson@efficios.com>
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18 ## FUNCTIONS ##
19
20 # Kernel version compare functions
21 verlte() {
22 [ "$1" = "`printf '%s\n%s' $1 $2 | sort -V | head -n1`" ]
23 }
24
25 verlt() {
26 [ "$1" = "$2" ] && return 1 || verlte $1 $2
27 }
28
29 vergte() {
30 [ "$1" = "`printf '%s\n%s' $1 $2 | sort -V | tail -n1`" ]
31 }
32
33 vergt() {
34 [ "$1" = "$2" ] && return 1 || vergte $1 $2
35 }
36
37
38 prepare_lnx_sources() {
39
40 outdir=$1
41
42 if [ "$outdir" = "." ]; then
43 koutput=""
44 else
45 koutput="O=\"${outdir}\""
46 fi
47
48 # Generate kernel configuration
49 case "$kversion" in
50 Ubuntu*)
51 fakeroot debian/rules clean
52 fakeroot debian/rules genconfigs
53 cp CONFIGS/${ubuntu_config} "${outdir}"/.config
54 ;;
55 *)
56 # Que sera sera
57 make ${koutput} ${vanilla_config} CC=$CC
58 ;;
59 esac
60
61 # GCC 4.8
62 sed -i "s/CONFIG_CC_STACKPROTECTOR_STRONG=y/# CONFIG_CC_STACKPROTECTOR_STRONG is not set/g" "${outdir}"/.config
63
64 # Don't try to sign modules
65 sed -i "s/CONFIG_MODULE_SIG=y/# CONFIG_MODULE_SIG is not set/g" "${outdir}"/.config
66
67 # Disable kernel stack frame correctness validation, introduced in 4.6.0 and currently fails
68 sed -i "s/CONFIG_STACK_VALIDATION=y/# CONFIG_STACK_VALIDATION is not set/g" "${outdir}"/.config
69
70 # Enable CONFIG_KALLSYMS_ALL
71 echo "CONFIG_KPROBES=y" >> "${outdir}"/.config
72 echo "CONFIG_FTRACE=y" >> "${outdir}"/.config
73 echo "CONFIG_BLK_DEV_IO_TRACE=y" >> "${outdir}"/.config
74 echo "CONFIG_TRACEPOINTS=y" >> "${outdir}"/.config
75 echo "CONFIG_KALLSYMS_ALL=y" >> "${outdir}"/.config
76
77
78 make ${koutput} olddefconfig CC=$CC
79 make ${koutput} modules_prepare CC=$CC
80
81 # Version specific tasks
82 case "$kversion" in
83 Ubuntu*)
84 # Add Ubuntu ABI number to kernel headers, this is normally done by the packaging code
85 ABINUM=$(echo $kversion | grep -P -o 'Ubuntu-(lts-)?.*-\K\d+(?=\..*)')
86 echo "#define UTS_UBUNTU_RELEASE_ABI $ABINUM" >> ${outdir}/include/generated/utsrelease.h
87 ;;
88 esac
89
90 # On powerpc this object is required to link modules
91 if [ "${karch}" = "powerpc" ]; then
92 make ${koutput} arch/powerpc/lib/crtsavres.o CC=$CC
93 fi
94 }
95
96
97
98 build_modules() {
99
100 kdir="$1"
101 bdir="$2"
102
103 # Get kernel version from source tree
104 cd "${kdir}"
105 kversion=$(make kernelversion)
106
107 # Enter lttng-modules source dir
108 cd "${LTTSRCDIR}"
109
110 # kernels 3.10 to 3.10.13 and 3.11 to 3.11.2 introduce a deadlock in the
111 # timekeeping subsystem. We want those build to fail.
112 if { vergte "$kversion" "3.10" && verlte "$kversion" "3.10.13"; } || \
113 { vergte "$kversion" "3.11" && verlte "$kversion" "3.11.2"; }; then
114
115 set +e
116
117 # Build modules
118 KERNELDIR="${kdir}" make -j${NPROC} V=1 CC=$CC
119
120 # We expect this build to fail, if it doesn't, fail the job.
121 if [ "$?" -eq 0 ]; then
122 echo "This build should have failed."
123 exit 1
124 fi
125
126 # We have to publish at least one file or the build will fail
127 echo "This kernel is broken, there is a deadlock in the timekeeping subsystem." > "${bdir}/BROKEN.txt.ko"
128
129 set -e
130
131 KERNELDIR="${kdir}" make clean CC=$CC
132
133 else # Regular build
134
135 # Build modules against full kernel sources
136 KERNELDIR="${kdir}" make -j${NPROC} V=1 CC=$CC
137
138 # Install modules to build dir
139 KERNELDIR="${kdir}" make INSTALL_MOD_PATH="${bdir}" modules_install CC=$CC
140
141 # Clean build dir
142 KERNELDIR="${kdir}" make clean CC=$CC
143 fi
144 }
145
146
147 ## MAIN ##
148
149 # Use all CPU cores
150 NPROC=$(nproc)
151
152 LTTSRCDIR="${WORKSPACE}/src/lttng-modules"
153 LNXSRCDIR="${WORKSPACE}/src/linux"
154
155 LNXBUILDDIR="${WORKSPACE}/build/linux"
156 LNXHDRDIR="${WORKSPACE}/build/linux-headers"
157
158 LTTBUILDKSRCDIR="${WORKSPACE}/build/lttng-modules-ksrc"
159 LTTBUILDKHDRDIR="${WORKSPACE}/build/lttng-modules-khdr"
160
161
162 # Setup cross compile env if available
163 if [ "x${cross_arch:-}" != "x" ]; then
164
165 case "$cross_arch" in
166 "armhf")
167 karch="arm"
168 cross_compile="arm-linux-gnueabihf-"
169 vanilla_config="allyesconfig"
170 ubuntu_config="armhf-config.flavour.generic"
171 ;;
172
173 "arm64")
174 karch="arm64"
175 cross_compile="aarch64-linux-gnu-"
176 vanilla_config="allyesconfig"
177 ubuntu_config="arm64-config.flavour.generic"
178 ;;
179
180 "powerpc")
181 karch="powerpc"
182 cross_compile="powerpc-linux-gnu-"
183 vanilla_config="ppc44x_defconfig"
184 ubuntu_config="powerpc-config.flavour.powerpc-smp"
185 ;;
186
187 "ppc64el")
188 karch="powerpc"
189 cross_compile="powerpc64le-linux-gnu-"
190 vanilla_config="pseries_le_defconfig"
191 ubuntu_config="ppc64el-config.flavour.generic"
192 ;;
193
194 *)
195 echo "Unsupported cross arch $arch"
196 exit 1
197 ;;
198 esac
199
200 # Use default gcc when cross-compiling
201 CC="${cross_compile}gcc"
202
203 # Export variables used by Kbuild for cross compilation
204 export ARCH="${karch}"
205 export CROSS_COMPILE="${cross_compile}"
206
207 # Set arch specific values if we are not cross compiling
208 elif [ "x${arch:-}" != "x" ]; then
209
210 case "$arch" in
211 "x86-32")
212 karch="x86"
213 vanilla_config="allyesconfig"
214 ubuntu_config="i386-config.flavour.generic"
215 ;;
216
217 "x86-64")
218 karch="x86"
219 vanilla_config="allyesconfig"
220 ubuntu_config="amd64-config.flavour.generic"
221 ;;
222
223 "armhf")
224 karch="arm"
225 vanilla_config="allyesconfig"
226 ubuntu_config="armhf-config.flavour.generic"
227 ;;
228
229 "arm64")
230 karch="arm64"
231 vanilla_config="allyesconfig"
232 ubuntu_config="arm64-config.flavour.generic"
233 ;;
234
235 "powerpc")
236 karch="powerpc"
237 vanilla_config="allyesconfig"
238 ubuntu_config="powerpc-config.flavour.powerpc-smp"
239 ;;
240
241 "ppc64el")
242 karch="powerpc"
243 vanilla_config="allyesconfig"
244 ubuntu_config="ppc64el-config.flavour.generic"
245 ;;
246
247 *)
248 echo "Unsupported arch $arch"
249 exit 1
250 ;;
251 esac
252
253 # Use gcc 4.9, older kernel don't build with gcc 5
254 CC=gcc-4.9
255
256 else
257 echo "Not arch or cross_arch specified"
258 exit 1
259 fi
260
261
262
263
264 # Create build directories
265 mkdir -p "${LNXBUILDDIR}" "${LNXHDRDIR}" "${LTTBUILDKSRCDIR}" "${LTTBUILDKHDRDIR}"
266
267
268
269 ## PREPARE DISTRO STYLE KERNEL HEADERS / DEVEL
270
271 # Enter linux source dir
272 cd "${LNXSRCDIR}"
273
274 prepare_lnx_sources "."
275
276 # For RT kernels, copy version file
277 if [ -s localversion-rt ]; then
278 cp -a localversion-rt "${LNXHDRDIR}"
279 fi
280
281 # Copy all Makefile related stuff
282 find . -path './include/*' -prune \
283 -o -path './scripts/*' -prune -o -type f \
284 \( -name 'Makefile*' -o -name 'Kconfig*' -o -name 'Kbuild*' -o \
285 -name '*.sh' -o -name '*.pl' -o -name '*.lds' \) \
286 -print | cpio -pd --preserve-modification-time "${LNXHDRDIR}"
287
288 # Copy base scripts and include dirs
289 cp -a scripts include "${LNXHDRDIR}"
290
291 # Copy arch includes
292 (find arch -name include -type d -print | \
293 xargs -n1 -i: find : -type f) | \
294 cpio -pd --preserve-modification-time "${LNXHDRDIR}"
295
296 # Copy arch scripts
297 (find arch -name scripts -type d -print | \
298 xargs -n1 -i: find : -type f) | \
299 cpio -pd --preserve-modification-time "${LNXHDRDIR}"
300
301 # Cleanup scripts
302 rm -f "${LNXHDRDIR}/scripts/*.o"
303 rm -f "${LNXHDRDIR}/scripts/*/*.o"
304
305 # On powerpc this object is required to link modules
306 if [ "${karch}" = "powerpc" ]; then
307 cp -a --parents arch/powerpc/lib/crtsavres.[So] "${LNXHDRDIR}/"
308 fi
309
310 # Copy modules related stuff, if available
311 if [ -s Module.symvers ]; then
312 cp Module.symvers "${LNXHDRDIR}"
313 fi
314
315 if [ -s System.map ]; then
316 cp System.map "${LNXHDRDIR}"
317 fi
318
319 if [ -s Module.markers ]; then
320 cp Module.markers "${LNXHDRDIR}"
321 fi
322
323 # Copy config file
324 cp .config "${LNXHDRDIR}"
325
326 # Make sure the Makefile and version.h have a matching timestamp so that
327 # external modules can be built
328 if [ -s "${LNXHDRDIR}/include/generated/uapi/linux/version.h" ]; then
329 touch -r "${LNXHDRDIR}/Makefile" "${LNXHDRDIR}/include/generated/uapi/linux/version.h"
330 elif [ -s "${LNXHDRDIR}/include/linux/version.h" ]; then
331 touch -r "${LNXHDRDIR}/Makefile" "${LNXHDRDIR}/include/linux/version.h"
332 else
333 echo "Missing version.h"
334 exit 1
335 fi
336 touch -r "${LNXHDRDIR}/.config" "${LNXHDRDIR}/include/generated/autoconf.h"
337
338 # Copy .config to include/config/auto.conf so "make prepare" is unnecessary.
339 cp "${LNXHDRDIR}/.config" "${LNXHDRDIR}/include/config/auto.conf"
340
341
342
343
344 ## PREPARE FULL LINUX SOURCE TREE
345
346 # Enter linux source dir
347 cd "${LNXSRCDIR}"
348
349 # Make sure linux source dir is clean
350 git clean -xdf
351
352 prepare_lnx_sources "${LNXBUILDDIR}"
353
354
355 ## BUILD modules
356
357 # Build modules against full kernel sources
358 build_modules "${LNXBUILDDIR}" "${LTTBUILDKSRCDIR}"
359
360 # Build modules against kernel headers
361 build_modules "${LNXHDRDIR}" "${LTTBUILDKHDRDIR}"
362
363 # Make sure modules were built
364 tree "${LTTBUILDKSRCDIR}"
365 if [ "x$(find "${LTTBUILDKSRCDIR}" -name '*.ko*' -printf yes -quit)" != "xyes" ]; then
366 echo "No modules built!"
367 exit 1
368 fi
369
370 tree "${LTTBUILDKHDRDIR}"
371 if [ "x$(find "${LTTBUILDKHDRDIR}" -name '*.ko*' -printf yes -quit)" != "xyes" ]; then
372 echo "No modules built!"
373 exit 1
374 fi
375
376 # EOF
This page took 0.048969 seconds and 5 git commands to generate.