blob: 80b58b605d11042b38a26e96abb329c8934a277c [file] [log] [blame]
Leonardo Sandoval9dfdd1b2020-08-06 17:08:11 -05001#!/usr/bin/env bash
Fathi Boudra422bf772019-12-02 11:10:16 +02002#
Anurag Koulbaedf932021-12-09 12:49:56 +00003# Copyright (c) 2019-2022 Arm Limited. All rights reserved.
Fathi Boudra422bf772019-12-02 11:10:16 +02004#
5# SPDX-License-Identifier: BSD-3-Clause
6#
7
8# Builds a package with Trusted Firwmare and other payload binaries. The package
9# is meant to be executed by run_package.sh
10
11set -e
12
13ci_root="$(readlink -f "$(dirname "$0")/..")"
14source "$ci_root/utils.sh"
15
16if [ ! -d "$workspace" ]; then
17 die "Directory $workspace doesn't exist"
18fi
19
20# Directory to where the source code e.g. for Trusted Firmware is checked out.
Zelalem219df412020-05-17 19:21:20 -050021export tf_root="${tf_root:-$workspace/trusted_firmware}"
22export tftf_root="${tftf_root:-$workspace/trusted_firmware_tf}"
23export scp_root="${scp_root:-$workspace/scp}"
24scp_tools_root="${scp_tools_root:-$workspace/scp_tools}"
25cc_root="${cc_root:-$ccpathspec}"
Olivier Deprez0a9a3482019-12-16 14:10:31 +010026spm_root="${spm_root:-$workspace/spm}"
Zelalem219df412020-05-17 19:21:20 -050027
28scp_tf_tools_root="$scp_tools_root/scp_tf_tools"
Fathi Boudra422bf772019-12-02 11:10:16 +020029
30# Refspecs
31tf_refspec="$TF_REFSPEC"
32tftf_refspec="$TFTF_REFSPEC"
33scp_refspec="$SCP_REFSPEC"
Zelalem219df412020-05-17 19:21:20 -050034scp_tools_commit="${SCP_TOOLS_COMMIT:-master}"
Olivier Deprez0a9a3482019-12-16 14:10:31 +010035spm_refspec="$SPM_REFSPEC"
Fathi Boudra422bf772019-12-02 11:10:16 +020036
37test_config="${TEST_CONFIG:?}"
38test_group="${TEST_GROUP:?}"
39build_configs="${BUILD_CONFIG:?}"
40run_config="${RUN_CONFIG:?}"
Zelalem219df412020-05-17 19:21:20 -050041cc_config="${CC_ENABLE:-}"
Fathi Boudra422bf772019-12-02 11:10:16 +020042
43archive="$artefacts"
44build_log="$artefacts/build.log"
45fiptool="$tf_root/tools/fiptool/fiptool"
46cert_create="$tf_root/tools/cert_create/cert_create"
47
48# Validate $bin_mode
49case "$bin_mode" in
50 "" | debug | release)
51 ;;
52 *)
53 die "Invalid value for bin_mode: $bin_mode"
54 ;;
55esac
56
57# File to save any environem
58hook_env_file="$(mktempfile)"
59
60# Check if a config is valid
61config_valid() {
62 local config="${1?}"
63 if [ -z "$config" ] || [ "$(basename "$config")" = "nil" ]; then
64 return 1
65 fi
66
67 return 0
68}
69
70# Echo from a build wrapper. Print to descriptor 3 that's opened by the build
71# function.
72echo_w() {
73 echo $echo_flags "$@" >&3
74}
75
76# Print a separator to the log file. Intended to be used at the tail end of a pipe
77log_separator() {
78 {
79 echo
80 echo "----------"
81 } >> "$build_log"
82
83 tee -a "$build_log"
84
85 {
86 echo "----------"
87 echo
88 } >> "$build_log"
89}
90
91# Call function $1 if it's defined
92call_func() {
93 if type "${1:?}" &>/dev/null; then
94 echo
95 echo "> ${2:?}:$1()"
96 eval "$1"
97 echo "< $2:$1()"
98 fi
99}
100
101# Call hook $1 in all chosen fragments if it's defined. Hooks are invoked from
102# within a subshell, so any variables set within a hook are lost. Should a
103# variable needs to be set from within a hook, the function 'set_hook_var'
104# should be used
105call_hook() {
106 local func="$1"
107 local config_fragment
108
109 [ -z "$func" ] && return 0
110
Paul Sokolovskye9962cd2021-12-17 18:39:40 +0300111 echo "=== Calling hooks: $1 ==="
112
Fathi Boudra422bf772019-12-02 11:10:16 +0200113 : >"$hook_env_file"
114
115 if [ "$run_config_candiates" ]; then
116 for config_fragment in $run_config_candiates; do
117 (
118 source "$ci_root/run_config/$config_fragment"
119 call_func "$func" "$config_fragment"
120 )
121 done
122 fi
123
124 # Also source test config file
125 (
126 unset "$func"
127 source "$test_config_file"
128 call_func "$func" "$(basename $test_config_file)"
129 )
130
131 # Have any variables set take effect
132 source "$hook_env_file"
Paul Sokolovskye9962cd2021-12-17 18:39:40 +0300133
134 echo "=== End calling hooks: $1 ==="
Fathi Boudra422bf772019-12-02 11:10:16 +0200135}
136
137# Set a variable from within a hook
138set_hook_var() {
139 echo "export $1=\"${2?}\"" >> "$hook_env_file"
140}
141
142# Append to an array from within a hook
143append_hook_var() {
144 echo "export $1+=\"${2?}\"" >> "$hook_env_file"
145}
146
147# Have the main build script source a file
148source_later() {
149 echo "source ${1?}" >> "$hook_env_file"
150}
151
152# Setup TF build wrapper function by pointing to a script containing a function
153# that will be called with the TF build commands.
154setup_tf_build_wrapper() {
155 source_later "$ci_root/script/${wrapper?}_wrapper.sh"
156 set_hook_var "tf_build_wrapper" "${wrapper}_wrapper"
157 echo "Setup $wrapper build wrapper."
158}
159
160# Collect .bin files for archiving
161collect_build_artefacts() {
162 if [ ! -d "${from:?}" ]; then
163 return
164 fi
165
Javier Almansa Sobrinof98dbd82020-09-30 19:29:27 +0100166 if ! find "$from" \( -name "*.bin" -o -name '*.elf' -o -name '*.dtb' -o -name '*.axf' \) -exec cp -t "${to:?}" '{}' +; then
Fathi Boudra422bf772019-12-02 11:10:16 +0200167 echo "You probably are running local CI on local repositories."
168 echo "Did you set 'dont_clean' but forgot to run 'distclean'?"
169 die
170 fi
171}
172
173# SCP and MCP binaries are named firmware.{bin,elf}, and are placed under
174# scp/mcp_ramfw and scp/mcp_romfw directories, so can't be collected by
175# collect_build_artefacts function.
176collect_scp_artefacts() {
177 to="${to:?}" \
Joel Goddard9bdfe3c2021-02-25 10:15:14 +0000178 find "$scp_root" \( \( -name "*.bin" -o -name '*.elf' \) -and ! -name 'CMake*' \) -exec bash -c '
Fathi Boudra422bf772019-12-02 11:10:16 +0200179 for file; do
180 ext="$(echo $file | awk -F. "{print \$NF}")"
181 case $file in
Anurag Koulbaedf932021-12-09 12:49:56 +0000182 */firmware-scp_ramfw/bin/*|*/firmware-scp_ramfw_fvp/bin/*)
Fathi Boudra422bf772019-12-02 11:10:16 +0200183 cp $file $to/scp_ram.$ext
184 ;;
Joel Goddard9bdfe3c2021-02-25 10:15:14 +0000185 */firmware-scp_romfw/bin/*)
Fathi Boudra422bf772019-12-02 11:10:16 +0200186 cp $file $to/scp_rom.$ext
187 ;;
Anurag Koulbaedf932021-12-09 12:49:56 +0000188 */firmware-mcp_ramfw/bin/*|*/firmware-mcp_ramfw_fvp/bin/*)
Fathi Boudra422bf772019-12-02 11:10:16 +0200189 cp $file $to/mcp_ram.$ext
190 ;;
Joel Goddard9bdfe3c2021-02-25 10:15:14 +0000191 */firmware-mcp_romfw/bin/*)
Fathi Boudra422bf772019-12-02 11:10:16 +0200192 cp $file $to/mcp_rom.$ext
193 ;;
Joel Goddard9bdfe3c2021-02-25 10:15:14 +0000194 */firmware-scp_romfw_bypass/bin/*)
Zelalem219df412020-05-17 19:21:20 -0500195 cp $file $to/scp_rom_bypass.$ext
196 ;;
Fathi Boudra422bf772019-12-02 11:10:16 +0200197 *)
198 echo "Unknown SCP binary: $file" >&2
199 ;;
200 esac
201 done
202 ' bash '{}' +
203}
204
Manish Pandey1e7be852020-11-09 16:04:48 +0000205# Collect SPM/hafnium artefacts with "secure_" appended to the files
206# generated for SPM(secure hafnium).
207collect_spm_artefacts() {
Madhukar Pappireddyc683cf62021-11-01 14:38:32 -0500208 if [ -d "${non_secure_from:?}" ]; then
209 find "$non_secure_from" \( -name "*.bin" -o -name '*.elf' \) -exec cp -t "${to:?}" '{}' +
Manish Pandey1e7be852020-11-09 16:04:48 +0000210 fi
211
Madhukar Pappireddyc683cf62021-11-01 14:38:32 -0500212 if [ -d "${secure_from:?}" ]; then
213 for f in $(find "$secure_from" \( -name "*.bin" -o -name '*.elf' \)); do cp -- "$f" "${to:?}"/secure_$(basename $f); done
214 fi
Manish Pandey1e7be852020-11-09 16:04:48 +0000215}
216
Javier Almansa Sobrino412d3612020-05-22 17:53:12 +0100217# Map the UART ID used for expect with the UART descriptor and port
218# used by the FPGA automation tools.
219map_uart() {
220 local port="${port:?}"
221 local descriptor="${descriptor:?}"
222 local baudrate="${baudrate:?}"
223 local run_root="${archive:?}/run"
224
225 local uart_dir="$run_root/uart${uart:?}"
226 mkdir -p "$uart_dir"
227
228 echo "$port" > "$uart_dir/port"
229 echo "$descriptor" > "$uart_dir/descriptor"
230 echo "$baudrate" > "$uart_dir/baudrate"
231
232 echo "UART${uart} mapped to port ${port} with descriptor ${descriptor} and baudrate ${baudrate}"
233}
234
Fathi Boudra422bf772019-12-02 11:10:16 +0200235# Arrange environment varibles to be set when expect scripts are launched
236set_expect_variable() {
237 local var="${1:?}"
238 local val="${2?}"
239
240 local run_root="${archive:?}/run"
241 local uart_dir="$run_root/uart${uart:?}"
242 mkdir -p "$uart_dir"
243
244 env_file="$uart_dir/env" quote="1" emit_env "$var" "$val"
245 echo "UART$uart: env has $@"
246}
247
248# Place the binary package a pointer to expect script, and its parameters
249track_expect() {
250 local file="${file:?}"
251 local timeout="${timeout-600}"
252 local run_root="${archive:?}/run"
253
254 local uart_dir="$run_root/uart${uart:?}"
255 mkdir -p "$uart_dir"
256
257 echo "$file" > "$uart_dir/expect"
258 echo "$timeout" > "$uart_dir/timeout"
259
260 echo "UART$uart to be tracked with $file; timeout ${timeout}s"
261
262 # The run script assumes UART0 to be primary. If we're asked to set any
263 # other UART to be primary, set a run environment variable to signal
264 # that to the run script
265 if upon "$set_primary"; then
266 echo "Primary UART set to UART$uart."
267 set_run_env "primary_uart" "$uart"
268 fi
Madhukar Pappireddy1e953722021-11-08 15:23:02 -0600269
270 # UART used by payload(such as tftf, Linux) may not be the same as the
271 # primary UART. Set a run environment variable to track the payload
272 # UART which is tracked to check if the test has finished sucessfully.
273 if upon "$set_payload_uart"; then
274 echo "Payload uses UART$uart."
275 set_run_env "payload_uart" "$uart"
276 fi
Fathi Boudra422bf772019-12-02 11:10:16 +0200277}
278
279# Extract a FIP in $1 using fiptool
280extract_fip() {
281 local fip="$1"
282
283 if is_url "$1"; then
284 url="$1" fetch_file
285 fip="$(basename "$1")"
286 fi
287
288 "$fiptool" unpack "$fip"
289 echo "Extracted FIP: $fip"
290}
291
292# Report build failure by printing a the tail end of build log. Archive the
293# build log for later inspection
294fail_build() {
295 local log_path
296
297 if upon "$jenkins_run"; then
298 log_path="$BUILD_URL/artifact/artefacts/build.log"
299 else
300 log_path="$build_log"
301 fi
302
303 echo
Leonardo Sandovalae97eda2020-11-12 10:07:03 -0600304 echo "Build failed! Full build log below:"
Fathi Boudra422bf772019-12-02 11:10:16 +0200305 echo "[...]"
306 echo
Leonardo Sandovalae97eda2020-11-12 10:07:03 -0600307 cat "$build_log"
Fathi Boudra422bf772019-12-02 11:10:16 +0200308 echo
309 echo "See $log_path for full output"
310 echo
311 cp -t "$archive" "$build_log"
312 exit 1;
313}
314
315# Build a FIP with supplied arguments
316build_fip() {
317 (
318 echo "Building FIP with arguments: $@"
319 local tf_env="$workspace/tf.env"
320
321 if [ -f "$tf_env" ]; then
322 set -a
323 source "$tf_env"
324 set +a
325 fi
326
327 make -C "$tf_root" $(cat "$tf_config_file") DEBUG="$DEBUG" V=1 "$@" \
328 ${fip_targets:-fip} &>>"$build_log" || fail_build
329 )
330}
331
332fip_update() {
333 # Before the update process, check if the given image is supported by
334 # the fiptool. It's assumed that both fiptool and cert_create move in
335 # tandem, and therfore, if one has support, the other has it too.
336 if ! "$fiptool" update 2>&1 | grep -qe "\s\+--${bin_name:?}"; then
337 return 1
338 fi
339
340 if not_upon "$(get_tf_opt TRUSTED_BOARD_BOOT)"; then
341 echo "Updating FIP image: $bin_name"
342 # Update HW config. Without TBBR, it's only a matter of using
343 # the update sub-command of fiptool
344 "$fiptool" update "--$bin_name" "${src:-}" \
345 "$archive/fip.bin"
346 else
347 echo "Updating FIP image (TBBR): $bin_name"
348 # With TBBR, we need to unpack, re-create certificates, and then
349 # recreate the FIP.
350 local fip_dir="$(mktempdir)"
351 local bin common_args stem
352 local rot_key="$(get_tf_opt ROT_KEY)"
353
354 rot_key="${rot_key:?}"
355 if ! is_abs "$rot_key"; then
356 rot_key="$tf_root/$rot_key"
357 fi
358
359 # Arguments only for cert_create
360 local cert_args="-n"
361 cert_args+=" --tfw-nvctr ${nvctr:-31}"
362 cert_args+=" --ntfw-nvctr ${nvctr:-223}"
363 cert_args+=" --key-alg ${KEY_ALG:-rsa}"
364 cert_args+=" --rot-key $rot_key"
365
366 local dyn_config_opts=(
Zelalem1af7a7b2020-08-04 17:34:32 -0500367 "fw-config"
Fathi Boudra422bf772019-12-02 11:10:16 +0200368 "hw-config"
369 "tb-fw-config"
370 "nt-fw-config"
371 "soc-fw-config"
372 "tos-fw-config"
373 )
374
375 # Binaries without key certificates
376 declare -A has_no_key_cert
377 for bin in "tb-fw" "${dyn_config_opts[@]}"; do
378 has_no_key_cert["$bin"]="1"
379 done
380
381 # Binaries without certificates
382 declare -A has_no_cert
383 for bin in "hw-config" "${dyn_config_opts[@]}"; do
384 has_no_cert["$bin"]="1"
385 done
386
387 pushd "$fip_dir"
388
389 # Unpack FIP
390 "$fiptool" unpack "$archive/fip.bin" &>>"$build_log"
391
392 # Remove all existing certificates
393 rm -f *-cert.bin
394
395 # Copy the binary to be updated
396 cp -f "$src" "${bin_name}.bin"
397
398 # FIP unpack dumps binaries with the same name as the option
399 # used to pack it; likewise for certificates. Reverse-engineer
400 # the command line from the binary output.
401 common_args="--trusted-key-cert trusted_key.crt"
402 for bin in *.bin; do
403 stem="${bin%%.bin}"
404 common_args+=" --$stem $bin"
405 if not_upon "${has_no_cert[$stem]}"; then
406 common_args+=" --$stem-cert $stem.crt"
407 fi
408 if not_upon "${has_no_key_cert[$stem]}"; then
409 common_args+=" --$stem-key-cert $stem-key.crt"
410 fi
411 done
412
413 # Create certificates
414 "$cert_create" $cert_args $common_args &>>"$build_log"
415
416 # Recreate and archive FIP
417 "$fiptool" create $common_args "fip.bin" &>>"$build_log"
418 archive_file "fip.bin"
419
420 popd
421 fi
422}
423
424# Update hw-config in FIP, and remove the original DTB afterwards.
425update_fip_hw_config() {
426 # The DTB needs to be loaded by the model (and not updated in the FIP)
Madhukar Pappireddy9062ebf2021-03-02 17:07:06 -0600427 # in configs:
428 # 1. Where BL2 isn't present
429 # 2. Where we boot to Linux directly as BL33
Fathi Boudra422bf772019-12-02 11:10:16 +0200430 case "1" in
431 "$(get_tf_opt RESET_TO_BL31)" | \
Madhukar Pappireddy9062ebf2021-03-02 17:07:06 -0600432 "$(get_tf_opt ARM_LINUX_KERNEL_AS_BL33)" | \
Fathi Boudra422bf772019-12-02 11:10:16 +0200433 "$(get_tf_opt RESET_TO_SP_MIN)" | \
434 "$(get_tf_opt BL2_AT_EL3)")
435 return 0;;
436 esac
437
438 if bin_name="hw-config" src="$archive/dtb.bin" fip_update; then
439 # Remove the DTB so that model won't load it
440 rm -f "$archive/dtb.bin"
441 fi
442}
443
444get_scp_opt() {
445 (
446 name="${1:?}"
447 if config_valid "$scp_config_file"; then
448 source "$scp_config_file"
449 echo "${!name}"
450 fi
451 )
452}
453
454get_tftf_opt() {
455 (
456 name="${1:?}"
457 if config_valid "$tftf_config_file"; then
458 source "$tftf_config_file"
459 echo "${!name}"
460 fi
461 )
462}
463
464get_tf_opt() {
465 (
466 name="${1:?}"
467 if config_valid "$tf_config_file"; then
468 source "$tf_config_file"
469 echo "${!name}"
470 fi
471 )
472}
473
474build_tf() {
475 (
476 env_file="$workspace/tf.env"
477 config_file="${tf_build_config:-$tf_config_file}"
478
479 # Build fiptool and all targets by default
480 build_targets="${tf_build_targets:-fiptool all}"
481
482 source "$config_file"
483
484 # If it is a TBBR build, extract the MBED TLS library from archive
Manish V Badarkhe8f125012021-12-21 05:47:52 +0000485 if [ "$(get_tf_opt TRUSTED_BOARD_BOOT)" = 1 ] ||
486 [ "$(get_tf_opt MEASURED_BOOT)" = 1 ]; then
Fathi Boudra422bf772019-12-02 11:10:16 +0200487 mbedtls_dir="$workspace/mbedtls"
488 if [ ! -d "$mbedtls_dir" ]; then
489 mbedtls_ar="$workspace/mbedtls.tar.gz"
490
491 url="$mbedtls_archive" saveas="$mbedtls_ar" fetch_file
492 mkdir "$mbedtls_dir"
Leonardo Sandovalec9e16c2020-09-09 14:32:40 -0500493 extract_tarball $mbedtls_ar $mbedtls_dir --strip-components=1
Fathi Boudra422bf772019-12-02 11:10:16 +0200494 fi
495
496 emit_env "MBEDTLS_DIR" "$mbedtls_dir"
497 fi
498
499 if [ -f "$env_file" ]; then
500 set -a
501 source "$env_file"
502 set +a
503 fi
504
505 cd "$tf_root"
506
507 # Always distclean when running on Jenkins. Skip distclean when running
508 # locally and explicitly requested.
509 if upon "$jenkins_run" || not_upon "$dont_clean"; then
510 make distclean &>>"$build_log" || fail_build
511 fi
512
513 # Log build command line. It is left unfolded on purpose to assist
514 # copying to clipboard.
515 cat <<EOF | log_separator >/dev/null
516
517Build command line:
518 $tf_build_wrapper make $make_j_opts $(cat "$config_file" | tr '\n' ' ') DEBUG=$DEBUG V=1 $build_targets
519
520EOF
521
Javier Almansa Sobrinoe8363182020-11-10 16:40:53 +0000522 if not_upon "$local_ci"; then
523 connect_debugger=0
524 fi
525
Fathi Boudra422bf772019-12-02 11:10:16 +0200526 # Build TF. Since build output is being directed to the build log, have
527 # descriptor 3 point to the current terminal for build wrappers to vent.
528 $tf_build_wrapper make $make_j_opts $(cat "$config_file") \
Javier Almansa Sobrinoe8363182020-11-10 16:40:53 +0000529 DEBUG="$DEBUG" V=1 SPIN_ON_BL1_EXIT="$connect_debugger" \
Fathi Boudra422bf772019-12-02 11:10:16 +0200530 $build_targets 3>&1 &>>"$build_log" || fail_build
531 )
532}
533
534build_tftf() {
535 (
536 config_file="${tftf_build_config:-$tftf_config_file}"
537
538 # Build tftf target by default
539 build_targets="${tftf_build_targets:-all}"
540
541 source "$config_file"
542
543 cd "$tftf_root"
544
545 # Always distclean when running on Jenkins. Skip distclean when running
546 # locally and explicitly requested.
547 if upon "$jenkins_run" || not_upon "$dont_clean"; then
548 make distclean &>>"$build_log" || fail_build
549 fi
550
551 # TFTF build system cannot reliably deal with -j option, so we avoid
552 # using that.
553
554 # Log build command line
555 cat <<EOF | log_separator >/dev/null
556
557Build command line:
558 make $(cat "$config_file" | tr '\n' ' ') DEBUG=$DEBUG V=1 $build_targets
559
560EOF
561
562 make $(cat "$config_file") DEBUG="$DEBUG" V=1 \
563 $build_targets &>>"$build_log" || fail_build
564 )
565}
566
567build_scp() {
568 (
569 config_file="${scp_build_config:-$scp_config_file}"
570
571 source "$config_file"
572
573 cd "$scp_root"
574
575 # Always distclean when running on Jenkins. Skip distclean when running
576 # locally and explicitly requested.
577 if upon "$jenkins_run" || not_upon "$dont_clean"; then
578 make clean &>>"$build_log" || fail_build
579 fi
580
Joel Goddard9bdfe3c2021-02-25 10:15:14 +0000581 python3 -m venv .venv
582 . .venv/bin/activate
583
584 # Install extra tools used by CMake build system
585 pip install -r requirements.txt --timeout 30 --retries 15
586
Fathi Boudra422bf772019-12-02 11:10:16 +0200587 # Log build command line. It is left unfolded on purpose to assist
588 # copying to clipboard.
589 cat <<EOF | log_separator >/dev/null
590
591SCP build command line:
Joel Goddard9bdfe3c2021-02-25 10:15:14 +0000592 make -f Makefile.cmake $(cat "$config_file" | tr '\n' ' ') \
593 TOOLCHAIN=GNU \
594 MODE="$mode" \
Nicola Mazzucato506b5802021-12-24 14:23:25 +0000595 EXTRA_CONFIG_ARGS+=-DDISABLE_CPPCHECK=true \
Joel Goddard9bdfe3c2021-02-25 10:15:14 +0000596 V=1 &>>"$build_log"
Fathi Boudra422bf772019-12-02 11:10:16 +0200597
598EOF
599
600 # Build SCP
Joel Goddard9bdfe3c2021-02-25 10:15:14 +0000601 make -f Makefile.cmake $(cat "$config_file" | tr '\n' ' ') \
602 TOOLCHAIN=GNU \
603 MODE="$mode" \
Nicola Mazzucato506b5802021-12-24 14:23:25 +0000604 EXTRA_CONFIG_ARGS+=-DDISABLE_CPPCHECK=true \
Joel Goddard9bdfe3c2021-02-25 10:15:14 +0000605 V=1 &>>"$build_log" \
Fathi Boudra422bf772019-12-02 11:10:16 +0200606 || fail_build
607 )
608}
609
Zelalem219df412020-05-17 19:21:20 -0500610clone_scp_tools() {
611
612 if [ ! -d "$scp_tools_root" ]; then
613 echo "Cloning SCP-tools ... $scp_tools_commit" |& log_separator
614
615 clone_url="${SCP_TOOLS_CHECKOUT_LOC:-$scp_tools_src_repo_url}" \
616 where="$scp_tools_root" \
617 refspec="${scp_tools_commit}"
618 clone_repo &>>"$build_log"
619 else
620 echo "Already cloned SCP-tools ..." |& log_separator
621 fi
622
623 show_head "$scp_tools_root"
624
625 cd "$scp_tools_root"
626
627 echo "Updating submodules"
628
629 git submodule init
630
631 git submodule update
632
Nicola Mazzucato7302cd32021-12-14 13:36:57 +0000633 lib_commit=$(grep "'scmi_lib_commit'" run_tests/settings.py | cut -d':' -f 2 | tr -d "'")
634
Zelalem219df412020-05-17 19:21:20 -0500635 cd "scmi"
Nicola Mazzucato7302cd32021-12-14 13:36:57 +0000636 git checkout $lib_commit
Zelalem219df412020-05-17 19:21:20 -0500637
638 git show --quiet --no-color | sed 's/^/ > /g'
639}
640
641clone_tf_for_scp_tools() {
642 scp_tools_arm_tf="$scp_tools_root/arm-tf"
643
644 if [ ! -d "$scp_tools_arm_tf" ]; then
645 echo "Cloning TF-4-SCP-tools ..." |& log_separator
646
647 clone_url="$tf_for_scp_tools_src_repo_url"
648 where="$scp_tools_arm_tf"
649
650 git clone "$clone_url" "$where"
651
652 cd "$scp_tools_arm_tf"
653
Joel Goddard3ad03062021-03-16 16:47:42 +0000654 git checkout --track origin/juno-v4.3
Zelalem219df412020-05-17 19:21:20 -0500655
656 git show --quiet --no-color | sed 's/^/ > /g'
657
658 else
659 echo "Already cloned TF-4-SCP-tools ..." |& log_separator
660 fi
661}
662
663build_scmi_lib_scp_tools() {
664 (
665 cd "$scp_tools_root"
666
667 cd "scmi"
668
669 scp_tools_arm_tf="$scp_tools_root/arm-tf"
670
Leonardo Sandovalfeae3a22020-11-17 16:53:59 -0600671 cross_compile="$(set_cross_compile_gcc_linaro_toolchain)"
Zelalem219df412020-05-17 19:21:20 -0500672
673 std_libs="-I$scp_tools_arm_tf/include/common"
674 std_libs="$std_libs -I$scp_tools_arm_tf/include/common/tbbr"
675 std_libs="$std_libs -I$scp_tools_arm_tf/include/drivers/arm"
676 std_libs="$std_libs -I$scp_tools_arm_tf/include/lib"
677 std_libs="$std_libs -I$scp_tools_arm_tf/include/lib/aarch64"
678 std_libs="$std_libs -I$scp_tools_arm_tf/include/lib/stdlib"
679 std_libs="$std_libs -I$scp_tools_arm_tf/include/lib/stdlib/sys"
680 std_libs="$std_libs -I$scp_tools_arm_tf/include/lib/xlat_tables"
681 std_libs="$std_libs -I$scp_tools_arm_tf/include/plat/common"
682 std_libs="$std_libs -I$scp_tools_arm_tf/include/plat/arm/common"
683 std_libs="$std_libs -I$scp_tools_arm_tf/include/plat/arm/css/common"
684 std_libs="$std_libs -I$scp_tools_arm_tf/include/plat/arm/board/common"
685 std_libs="$std_libs -I$scp_tools_arm_tf/include/plat/arm/soc/common"
686 std_libs="$std_libs -I$scp_tools_arm_tf/plat/arm/board/juno/include"
687
688 cflags="-Og -g"
689 cflags="$cflags -mgeneral-regs-only"
690 cflags="$cflags -mstrict-align"
691 cflags="$cflags -nostdinc"
692 cflags="$cflags -fno-inline"
693 cflags="$cflags -ffreestanding"
694 cflags="$cflags -ffunction-sections"
695 cflags="$cflags -fdata-sections"
696 cflags="$cflags -DAARCH64"
697 cflags="$cflags -DPRId32=\"ld\""
Joel Goddard3ad03062021-03-16 16:47:42 +0000698 cflags="$cflags -DVERBOSE_LEVEL=3"
Zelalem219df412020-05-17 19:21:20 -0500699
700 cflags="$cflags $std_libs"
701
Joel Goddard3ad03062021-03-16 16:47:42 +0000702 protocols="performance,power_domain,system_power,reset"
Zelalem219df412020-05-17 19:21:20 -0500703
704 echo "Building SCMI library (SCP-tools) ..."
705
706 make "CROSS_COMPILE=$cross_compile" \
707 "CFLAGS=$cflags" \
Joel Goddard3ad03062021-03-16 16:47:42 +0000708 "PLAT=baremetal" \
Zelalem219df412020-05-17 19:21:20 -0500709 "PROTOCOLS=$protocols" \
710 "clean" \
711 "all"
712 )
713}
714
715build_tf_for_scp_tools() {
716
717 cd "$scp_tools_root/arm-tf"
718
Leonardo Sandovalfeae3a22020-11-17 16:53:59 -0600719 cross_compile="$(set_cross_compile_gcc_linaro_toolchain)"
Zelalem219df412020-05-17 19:21:20 -0500720
721 if [ "$1" = "release" ]; then
722 echo "Build TF-4-SCP-Tools rls..."
723 else
724 echo "Build TF-4-SCP-Tools dbg..."
725
726 make realclean
727
728 make "BM_TEST=scmi" \
729 "ARM_BOARD_OPTIMISE_MEM=1" \
730 "BM_CSS=juno" \
731 "CSS_USE_SCMI_SDS_DRIVER=1" \
732 "PLAT=juno" \
733 "DEBUG=1" \
734 "PLATFORM=juno" \
735 "CROSS_COMPILE=$cross_compile" \
736 "BM_WORKSPACE=$scp_tools_root/baremetal"
737
738 archive_file "build/juno/debug/bl1.bin"
739
740 archive_file "build/juno/debug/bl2.bin"
741
742 archive_file "build/juno/debug/bl31.bin"
743 fi
744}
745
746build_fip_for_scp_tools() {
747
748 cd "$scp_tools_root/arm-tf"
749
Leonardo Sandovalfeae3a22020-11-17 16:53:59 -0600750 cross_compile="$(set_cross_compile_gcc_linaro_toolchain)"
Zelalem219df412020-05-17 19:21:20 -0500751
Joel Goddard9bdfe3c2021-02-25 10:15:14 +0000752 if [ ! -d "$scp_root/build/juno/GNU/debug/firmware-scp_ramfw" ]; then
Zelalem219df412020-05-17 19:21:20 -0500753 make fiptool
754 echo "Make FIP 4 SCP-Tools rls..."
755
756 else
757 make fiptool
758 echo "Make FIP 4 SCP-Tools dbg..."
759
760 make "PLAT=juno" \
761 "all" \
762 "fip" \
763 "DEBUG=1" \
764 "CROSS_COMPILE=$cross_compile" \
765 "BL31=$scp_tools_root/arm-tf/build/juno/debug/bl31.bin" \
766 "BL33=$scp_tools_root/baremetal/dummy_bl33" \
Joel Goddard9bdfe3c2021-02-25 10:15:14 +0000767 "SCP_BL2=$scp_root/build/juno/GNU/$mode/firmware-scp_ramfw/bin/juno-bl2.bin"
Zelalem219df412020-05-17 19:21:20 -0500768
769 archive_file "$scp_tools_root/arm-tf/build/juno/debug/fip.bin"
770 fi
771}
772
773build_cc() {
774# Building code coverage plugin
775 ARM_DIR=/arm
776 pvlibversion=$(/arm/devsys-tools/abs/detag "SysGen:PVModelLib:$model_version::trunk")
777 PVLIB_HOME=$warehouse/SysGen/PVModelLib/$model_version/${pvlibversion}/external
778 if [ -n "$(find "$ARM_DIR" -maxdepth 0 -type d -empty 2>/dev/null)" ]; then
779 echo "Error: Arm warehouse not mounted. Please mount the Arm warehouse to your /arm local folder"
780 exit -1
781 fi # Error if arm warehouse not found
782 cd "$ccpathspec/scripts/tools/code_coverage/fastmodel_baremetal/bmcov"
783
784 make -C model-plugin PVLIB_HOME=$PVLIB_HOME &>>"$build_log"
785}
786
Olivier Deprez0a9a3482019-12-16 14:10:31 +0100787build_spm() {
788 (
789 env_file="$workspace/spm.env"
790 config_file="${spm_build_config:-$spm_config_file}"
791
792 source "$config_file"
793
794 if [ -f "$env_file" ]; then
795 set -a
796 source "$env_file"
797 set +a
798 fi
799
800 cd "$spm_root"
801
802 # Always clean when running on Jenkins. Skip clean when running
803 # locally and explicitly requested.
804 if upon "$jenkins_run" || not_upon "$dont_clean"; then
805 # make clean fails on a fresh repo where the project has not
806 # yet been built. Hence only clean if out/reference directory
807 # already exists.
808 if [ -d "out/reference" ]; then
809 make clean &>>"$build_log" || fail_build
810 fi
811 fi
812
813 # Log build command line. It is left unfolded on purpose to assist
814 # copying to clipboard.
815 cat <<EOF | log_separator >/dev/null
816
817Build command line:
818 make $make_j_opts $(cat "$config_file" | tr '\n' ' ')
819
820EOF
821
822 # Build SPM. Since build output is being directed to the build log, have
823 # descriptor 3 point to the current terminal for build wrappers to vent.
Olivier Deprezf34d1d32021-10-11 09:45:32 +0200824 export PATH=$PWD/prebuilts/linux-x64/clang/bin:$PWD/prebuilts/linux-x64/dtc:$PATH
825
Olivier Deprez0a9a3482019-12-16 14:10:31 +0100826 make $make_j_opts $(cat "$config_file") 3>&1 &>>"$build_log" \
827 || fail_build
828 )
829}
Zelalem219df412020-05-17 19:21:20 -0500830
Fathi Boudra422bf772019-12-02 11:10:16 +0200831# Set metadata for the whole package so that it can be used by both Jenkins and
832# shell
833set_package_var() {
834 env_file="$artefacts/env" emit_env "$@"
835}
836
837set_tf_build_targets() {
838 echo "Set build target to '${targets:?}'"
839 set_hook_var "tf_build_targets" "$targets"
840}
841
842set_tftf_build_targets() {
843 echo "Set build target to '${targets:?}'"
844 set_hook_var "tftf_build_targets" "$targets"
845}
846
847set_scp_build_targets() {
848 echo "Set build target to '${targets:?}'"
849 set_hook_var "scp_build_targets" "$targets"
850}
851
Olivier Deprez0a9a3482019-12-16 14:10:31 +0100852set_spm_build_targets() {
853 echo "Set build target to '${targets:?}'"
854 set_hook_var "spm_build_targets" "$targets"
855}
856
Fathi Boudra422bf772019-12-02 11:10:16 +0200857# Look under $archive directory for known files such as blX images, kernel, DTB,
858# initrd etc. For each known file foo, if foo.bin exists, then set variable
859# foo_bin to the path of the file. Make the path relative to the workspace so as
860# to remove any @ characters, which Jenkins inserts for parallel runs. If the
861# file doesn't exist, unset its path.
862set_default_bin_paths() {
863 local image image_name image_path path
864 local archive="${archive:?}"
865 local set_vars
866 local var
867
868 pushd "$archive"
869
870 for file in *.bin; do
871 # Get a shell variable from the file's stem
872 var_name="${file%%.*}_bin"
873 var_name="$(echo "$var_name" | sed -r 's/[^[:alnum:]]/_/g')"
874
875 # Skip setting the variable if it's already
876 if [ "${!var_name}" ]; then
877 echo "Note: not setting $var_name; already set to ${!var_name}"
878 continue
879 else
880 set_vars+="$var_name "
881 fi
882
883 eval "$var_name=$file"
884 done
885
886 echo "Binary paths set for: "
887 {
888 for var in $set_vars; do
889 echo -n "\$$var "
890 done
891 } | fmt -80 | sed 's/^/ /'
892 echo
893
894 popd
895}
896
897gen_model_params() {
898 local model_param_file="$archive/model_params"
Javier Almansa Sobrinoe8363182020-11-10 16:40:53 +0000899 [ "$connect_debugger" ] && [ "$connect_debugger" -eq 1 ] && wait_debugger=1
Fathi Boudra422bf772019-12-02 11:10:16 +0200900
901 set_default_bin_paths
902 echo "Generating model parameter for $model..."
903 source "$ci_root/model/${model:?}.sh"
904 archive_file "$model_param_file"
905}
906
907set_model_path() {
908 set_run_env "model_path" "${1:?}"
909}
910
Zelalem1af7a7b2020-08-04 17:34:32 -0500911set_model_env() {
912 local var="${1:?}"
913 local val="${2?}"
914 local run_root="${archive:?}/run"
915
916 mkdir -p "$run_root"
917 echo "export $var=$val" >> "$run_root/model_env"
918}
Fathi Boudra422bf772019-12-02 11:10:16 +0200919set_run_env() {
920 local var="${1:?}"
921 local val="${2?}"
922 local run_root="${archive:?}/run"
923
924 mkdir -p "$run_root"
925 env_file="$run_root/env" quote="1" emit_env "$var" "$val"
926}
927
928show_head() {
929 # Display HEAD descripton
930 pushd "$1"
931 git show --quiet --no-color | sed 's/^/ > /g'
932 echo
933 popd
934}
935
936# Choose debug binaries to run; by default, release binaries are chosen to run
937use_debug_bins() {
938 local run_root="${archive:?}/run"
939
940 echo "Choosing debug binaries for execution"
941 set_package_var "BIN_MODE" "debug"
942}
943
944assert_can_git_clone() {
945 local name="${1:?}"
946 local dir="${!name}"
947
948 # If it doesn't exist, it can be cloned into
949 if [ ! -e "$dir" ]; then
950 return 0
951 fi
952
953 # If it's a directory, it must be a Git clone already
954 if [ -d "$dir" ] && [ -d "$dir/.git" ]; then
955 # No need to clone again
956 echo "Using existing git clone for $name: $dir"
957 return 1
958 fi
959
960 die "Path $dir exists but is not a git clone"
961}
962
963clone_repo() {
964 if ! is_url "${clone_url?}"; then
965 # For --depth to take effect on local paths, it needs to use the
966 # file:// scheme.
967 clone_url="file://$clone_url"
968 fi
969
970 git clone -q --depth 1 "$clone_url" "${where?}"
971 if [ "$refspec" ]; then
972 pushd "$where"
973 git fetch -q --depth 1 origin "$refspec"
974 git checkout -q FETCH_HEAD
975 popd
976 fi
977}
978
979build_unstable() {
980 echo "--BUILD UNSTABLE--" | tee -a "$build_log"
981}
982
983undo_patch_record() {
984 if [ ! -f "${patch_record:?}" ]; then
985 return
986 fi
987
988 # Undo patches in reverse
989 echo
990 for patch_name in $(tac "$patch_record"); do
991 echo "Undoing $patch_name..."
992 if ! git apply -R "$ci_root/patch/$patch_name"; then
993 if upon "$local_ci"; then
994 echo
995 echo "Your local directory may have been dirtied."
996 echo
997 fi
998 fail_build
999 fi
1000 done
1001
1002 rm -f "$patch_record"
1003}
1004
1005undo_local_patches() {
1006 pushd "$tf_root"
1007 patch_record="$tf_patch_record" undo_patch_record
1008 popd
1009
1010 if [ -d "$tftf_root" ]; then
1011 pushd "$tftf_root"
1012 patch_record="$tftf_patch_record" undo_patch_record
1013 popd
1014 fi
1015}
1016
1017undo_tftf_patches() {
1018 pushd "$tftf_root"
1019 patch_record="$tftf_patch_record" undo_patch_record
1020 popd
1021}
1022
1023undo_tf_patches() {
1024 pushd "$tf_root"
1025 patch_record="$tf_patch_record" undo_patch_record
1026 popd
1027}
1028
1029apply_patch() {
1030 # If skip_patches is set, the developer has applied required patches
1031 # manually. They probably want to keep them applied for debugging
1032 # purposes too. This means we don't have to apply/revert them as part of
1033 # build process.
1034 if upon "$skip_patches"; then
1035 echo "Skipped applying ${1:?}..."
1036 return 0
1037 else
1038 echo "Applying ${1:?}..."
1039 fi
1040
1041 if git apply < "$ci_root/patch/$1"; then
1042 echo "$1" >> "${patch_record:?}"
1043 else
1044 if upon "$local_ci"; then
1045 undo_local_patches
1046 fi
1047 fail_build
1048 fi
1049}
1050
1051apply_tftf_patch() {
1052 pushd "$tftf_root"
1053 patch_record="$tftf_patch_record" apply_patch "$1"
1054 popd
1055}
1056
1057apply_tf_patch() {
1058 pushd "$tf_root"
1059 patch_record="$tf_patch_record" apply_patch "$1"
1060 popd
1061}
1062
1063# Clear workspace for a local run
1064if not_upon "$jenkins_run"; then
1065 rm -rf "$workspace"
1066
1067 # Clear residue from previous runs
1068 rm -rf "$archive"
1069fi
1070
1071mkdir -p "$workspace"
1072mkdir -p "$archive"
1073set_package_var "TEST_CONFIG" "$test_config"
1074
1075{
1076echo
1077echo "CONFIGURATION: $test_group/$test_config"
1078echo
1079} |& log_separator
1080
1081tf_config="$(echo "$build_configs" | awk -F, '{print $1}')"
1082tftf_config="$(echo "$build_configs" | awk -F, '{print $2}')"
1083scp_config="$(echo "$build_configs" | awk -F, '{print $3}')"
Zelalem219df412020-05-17 19:21:20 -05001084scp_tools_config="$(echo "$build_configs" | awk -F, '{print $4}')"
Olivier Deprez0a9a3482019-12-16 14:10:31 +01001085spm_config="$(echo "$build_configs" | awk -F, '{print $5}')"
Fathi Boudra422bf772019-12-02 11:10:16 +02001086
1087test_config_file="$ci_root/group/$test_group/$test_config"
1088
1089tf_config_file="$ci_root/tf_config/$tf_config"
1090tftf_config_file="$ci_root/tftf_config/$tftf_config"
1091scp_config_file="$ci_root/scp_config/$scp_config"
Zelalem219df412020-05-17 19:21:20 -05001092scp_tools_config_file="$ci_root/scp_tools_config/$scp_tools_config"
Olivier Deprez0a9a3482019-12-16 14:10:31 +01001093spm_config_file="$ci_root/spm_config/$spm_config"
Fathi Boudra422bf772019-12-02 11:10:16 +02001094
1095# File that keeps track of applied patches
1096tf_patch_record="$workspace/tf_patches"
1097tftf_patch_record="$workspace/tftf_patches"
1098
1099pushd "$workspace"
1100
1101if ! config_valid "$tf_config"; then
1102 tf_config=
1103else
1104 echo "Trusted Firmware config:"
1105 echo
1106 sort "$tf_config_file" | sed '/^\s*$/d;s/^/\t/'
1107 echo
1108fi
1109
1110if ! config_valid "$tftf_config"; then
1111 tftf_config=
1112else
1113 echo "Trusted Firmware TF config:"
1114 echo
1115 sort "$tftf_config_file" | sed '/^\s*$/d;s/^/\t/'
1116 echo
1117fi
1118
1119if ! config_valid "$scp_config"; then
1120 scp_config=
1121else
1122 echo "SCP firmware config:"
1123 echo
1124 sort "$scp_config_file" | sed '/^\s*$/d;s/^/\t/'
1125 echo
1126fi
1127
Zelalem219df412020-05-17 19:21:20 -05001128if ! config_valid "$scp_tools_config"; then
1129 scp_tools_config=
1130else
1131 echo "SCP Tools config:"
1132 echo
1133 sort "$scp_tools_config_file" | sed '/^\s*$/d;s/^/\t/'
Olivier Deprez0a9a3482019-12-16 14:10:31 +01001134fi
1135
1136if ! config_valid "$spm_config"; then
1137 spm_config=
1138else
1139 echo "SPM config:"
1140 echo
1141 sort "$spm_config_file" | sed '/^\s*$/d;s/^/\t/'
Zelalem219df412020-05-17 19:21:20 -05001142 echo
1143fi
1144
Fathi Boudra422bf772019-12-02 11:10:16 +02001145if ! config_valid "$run_config"; then
1146 run_config=
1147fi
1148
1149if [ "$tf_config" ] && assert_can_git_clone "tf_root"; then
1150 # If the Trusted Firmware repository has already been checked out, use
1151 # that location. Otherwise, clone one ourselves.
1152 echo "Cloning Trusted Firmware..."
1153 clone_url="${TF_CHECKOUT_LOC:-$tf_src_repo_url}" where="$tf_root" \
1154 refspec="$TF_REFSPEC" clone_repo &>>"$build_log"
1155 show_head "$tf_root"
1156fi
1157
1158if [ "$tftf_config" ] && assert_can_git_clone "tftf_root"; then
1159 # If the Trusted Firmware TF repository has already been checked out,
1160 # use that location. Otherwise, clone one ourselves.
1161 echo "Cloning Trusted Firmware TF..."
1162 clone_url="${TFTF_CHECKOUT_LOC:-$tftf_src_repo_url}" where="$tftf_root" \
1163 refspec="$TFTF_REFSPEC" clone_repo &>>"$build_log"
1164 show_head "$tftf_root"
1165fi
1166
1167if [ "$scp_config" ] && assert_can_git_clone "scp_root"; then
1168 # If the SCP firmware repository has already been checked out,
1169 # use that location. Otherwise, clone one ourselves.
1170 echo "Cloning SCP Firmware..."
1171 clone_url="${SCP_CHECKOUT_LOC:-$scp_src_repo_url}" where="$scp_root" \
1172 refspec="${SCP_REFSPEC-master-upstream}" clone_repo &>>"$build_log"
1173
1174 pushd "$scp_root"
1175
1176 # Use filer submodule as a reference if it exists
Girish Pathak31b824e2021-03-03 20:58:21 +00001177 if [ -d "$SCP_CHECKOUT_LOC/cmsis" ]; then
Fathi Boudra422bf772019-12-02 11:10:16 +02001178 cmsis_reference="--reference $SCP_CHECKOUT_LOC/cmsis"
1179 fi
1180
1181 # If we don't have a reference yet, fall back to $cmsis_root if set, or
1182 # then to project filer if accessible.
1183 if [ -z "$cmsis_reference" ]; then
1184 cmsis_ref_repo="${cmsis_root:-$project_filer/ref-repos/cmsis}"
1185 if [ -d "$cmsis_ref_repo" ]; then
1186 cmsis_reference="--reference $cmsis_ref_repo"
1187 fi
1188 fi
1189
1190 git submodule -q update $cmsis_reference --init
1191
1192 popd
1193
1194 show_head "$scp_root"
1195fi
1196
Zelalem219df412020-05-17 19:21:20 -05001197if [ -n "$cc_config" ] ; then
1198 if [ "$cc_config" -eq 1 ] && assert_can_git_clone "cc_root"; then
1199 # Copy code coverage repository
1200 echo "Cloning Code Coverage..."
1201 git clone -q $cc_src_repo_url cc_plugin --depth 1 -b $cc_src_repo_tag > /dev/null
1202 show_head "$cc_root"
1203 fi
1204fi
1205
Olivier Deprez0a9a3482019-12-16 14:10:31 +01001206if [ "$spm_config" ] && assert_can_git_clone "spm_root"; then
1207 # If the SPM repository has already been checked out, use
1208 # that location. Otherwise, clone one ourselves.
1209 echo "Cloning SPM..."
1210 clone_url="${SPM_CHECKOUT_LOC:-$spm_src_repo_url}" where="$spm_root" \
1211 refspec="$SPM_REFSPEC" clone_repo &>>"$build_log"
1212
1213 # Query git submodules
1214 pushd "$spm_root"
1215 git submodule update --init
1216 popd
1217
1218 show_head "$spm_root"
1219fi
1220
Fathi Boudra422bf772019-12-02 11:10:16 +02001221if [ "$run_config" ]; then
1222 # Get candidates for run config
1223 run_config_candiates="$("$ci_root/script/gen_run_config_candidates.py" \
1224 "$run_config")"
1225 if [ -z "$run_config_candiates" ]; then
1226 die "No run config candidates!"
1227 else
1228 echo
1229 echo "Chosen fragments:"
1230 echo
1231 echo "$run_config_candiates" | sed 's/^\|\n/\t/g'
1232 echo
1233 fi
1234fi
1235
1236call_hook "test_setup"
1237echo
1238
1239if upon "$local_ci"; then
1240 # For local runs, since each config is tried in sequence, it's
1241 # advantageous to run jobs in parallel
1242 if [ "$make_j" ]; then
1243 make_j_opts="-j $make_j"
1244 else
1245 n_cores="$(getconf _NPROCESSORS_ONLN)" 2>/dev/null || true
1246 if [ "$n_cores" ]; then
1247 make_j_opts="-j $n_cores"
1248 fi
1249 fi
1250fi
1251
1252modes="${bin_mode:-debug release}"
1253for mode in $modes; do
Paul Sokolovskye9962cd2021-12-17 18:39:40 +03001254 echo "===== Building package in mode: $mode ====="
Fathi Boudra422bf772019-12-02 11:10:16 +02001255 # Build with a temporary archive
1256 build_archive="$archive/$mode"
1257 mkdir "$build_archive"
1258
1259 if [ "$mode" = "debug" ]; then
Zelalem219df412020-05-17 19:21:20 -05001260 export bin_mode="debug"
Fathi Boudra422bf772019-12-02 11:10:16 +02001261 DEBUG=1
1262 else
Zelalem219df412020-05-17 19:21:20 -05001263 export bin_mode="release"
Fathi Boudra422bf772019-12-02 11:10:16 +02001264 DEBUG=0
1265 fi
1266
1267 # Perform builds in a subshell so as not to pollute the current and
1268 # subsequent builds' environment
1269
Zelalem219df412020-05-17 19:21:20 -05001270 if config_valid "$cc_config"; then
1271 # Build code coverage plugin
1272 build_cc
1273 fi
1274
Fathi Boudra422bf772019-12-02 11:10:16 +02001275 # SCP build
1276 if config_valid "$scp_config"; then
1277 (
1278 echo "##########"
1279
1280 # Source platform-specific utilities
1281 plat="$(get_scp_opt PRODUCT)"
1282 plat_utils="$ci_root/${plat}_utils.sh"
1283 if [ -f "$plat_utils" ]; then
1284 source "$plat_utils"
1285 fi
1286
1287 archive="$build_archive"
1288 scp_build_root="$scp_root/build"
1289
1290 echo "Building SCP Firmware ($mode) ..." |& log_separator
1291
1292 build_scp
Fathi Boudra422bf772019-12-02 11:10:16 +02001293 to="$archive" collect_scp_artefacts
1294
1295 echo "##########"
1296 echo
1297 )
1298 fi
1299
Zelalem219df412020-05-17 19:21:20 -05001300 # SCP-tools build
1301 if config_valid "$scp_tools_config"; then
1302 (
1303 echo "##########"
1304
1305 archive="$build_archive"
1306 scp_tools_build_root="$scp_tools_root/build"
1307
1308 clone_scp_tools
1309
1310 echo "##########"
1311 echo
1312
1313 echo "##########"
1314 clone_tf_for_scp_tools
1315 echo "##########"
1316 echo
1317 )
1318 fi
1319
Fathi Boudra422bf772019-12-02 11:10:16 +02001320 # TFTF build
1321 if config_valid "$tftf_config"; then
1322 (
1323 echo "##########"
1324
Manish V Badarkhe3bd3fea2020-11-08 15:17:00 +00001325 plat_utils="$(get_tf_opt PLAT_UTILS)"
1326 if [ -z ${plat_utils} ]; then
1327 # Source platform-specific utilities.
1328 plat="$(get_tftf_opt PLAT)"
1329 plat_utils="$ci_root/${plat}_utils.sh"
1330 else
1331 # Source platform-specific utilities by
1332 # using plat_utils name.
1333 plat_utils="$ci_root/${plat_utils}.sh"
1334 fi
1335
Fathi Boudra422bf772019-12-02 11:10:16 +02001336 if [ -f "$plat_utils" ]; then
1337 source "$plat_utils"
1338 fi
1339
1340 archive="$build_archive"
1341 tftf_build_root="$tftf_root/build"
1342
1343 echo "Building Trusted Firmware TF ($mode) ..." |& log_separator
1344
1345 # Call pre-build hook
1346 call_hook pre_tftf_build
1347
1348 build_tftf
1349
1350 from="$tftf_build_root" to="$archive" collect_build_artefacts
1351
1352 # Clear any local changes made by applied patches
1353 undo_tftf_patches
1354
1355 echo "##########"
1356 echo
1357 )
1358 fi
1359
Olivier Deprez0a9a3482019-12-16 14:10:31 +01001360 # SPM build
1361 if config_valid "$spm_config"; then
1362 (
1363 echo "##########"
1364
1365 # Get platform name from spm_config file
1366 plat="$(echo "$spm_config" | awk -F- '{print $1}')"
1367 plat_utils="$ci_root/${plat}_utils.sh"
1368 if [ -f "$plat_utils" ]; then
1369 source "$plat_utils"
1370 fi
1371
Manish Pandey1e7be852020-11-09 16:04:48 +00001372 # SPM build generates two sets of binaries, one for normal and other
1373 # for Secure world. We need both set of binaries for CI.
Olivier Deprez0a9a3482019-12-16 14:10:31 +01001374 archive="$build_archive"
Manish Pandey1e7be852020-11-09 16:04:48 +00001375 spm_build_root="$spm_root/out/reference/$spm_secure_out_dir"
1376 hafnium_build_root="$spm_root/out/reference/$spm_non_secure_out_dir"
Olivier Deprez0a9a3482019-12-16 14:10:31 +01001377
1378 echo "Building SPM ($mode) ..." |& log_separator
1379
1380 # NOTE: mode has no effect on SPM build (for now), hence debug
1381 # mode is built but subsequent build using release mode just
1382 # goes through with "nothing to do".
1383 build_spm
1384
1385 # Show SPM/Hafnium binary details
Madhukar Pappireddyc683cf62021-11-01 14:38:32 -05001386 cksum $spm_build_root/hafnium.bin
1387
1388 # Some platforms only have secure configuration enabled. Hence,
1389 # non secure hanfnium binary might not be built.
1390 if [ -f $hafnium_build_root/hafnium.bin ]; then
1391 cksum $hafnium_build_root/hafnium.bin
1392 fi
Olivier Deprez0a9a3482019-12-16 14:10:31 +01001393
Manish Pandey1e7be852020-11-09 16:04:48 +00001394 secure_from="$spm_build_root" non_secure_from="$hafnium_build_root" to="$archive" collect_spm_artefacts
Olivier Deprez0a9a3482019-12-16 14:10:31 +01001395
1396 echo "##########"
1397 echo
1398 )
1399 fi
1400
Fathi Boudra422bf772019-12-02 11:10:16 +02001401 # TF build
1402 if config_valid "$tf_config"; then
1403 (
1404 echo "##########"
1405
Manish V Badarkhe3bd3fea2020-11-08 15:17:00 +00001406 plat_utils="$(get_tf_opt PLAT_UTILS)"
Madhukar Pappireddy2f284e12021-08-30 16:06:14 -05001407 export plat_variant="$(get_tf_opt TARGET_PLATFORM)"
1408
Manish V Badarkhe3bd3fea2020-11-08 15:17:00 +00001409 if [ -z ${plat_utils} ]; then
1410 # Source platform-specific utilities.
1411 plat="$(get_tf_opt PLAT)"
1412 plat_utils="$ci_root/${plat}_utils.sh"
1413 else
1414 # Source platform-specific utilities by
1415 # using plat_utils name.
1416 plat_utils="$ci_root/${plat_utils}.sh"
1417 fi
1418
Fathi Boudra422bf772019-12-02 11:10:16 +02001419 if [ -f "$plat_utils" ]; then
1420 source "$plat_utils"
1421 fi
1422
Chris Kayd0837902021-11-17 10:17:52 +00001423 source "$ci_root/script/install_python_deps_tf.sh"
1424
Fathi Boudra422bf772019-12-02 11:10:16 +02001425 archive="$build_archive"
1426 tf_build_root="$tf_root/build"
1427
1428 echo "Building Trusted Firmware ($mode) ..." |& log_separator
1429
1430 # Call pre-build hook
1431 call_hook pre_tf_build
1432
1433 build_tf
1434
1435 # Call post-build hook
1436 call_hook post_tf_build
1437
1438 # Pre-archive hook
1439 call_hook pre_tf_archive
1440
1441 from="$tf_build_root" to="$archive" collect_build_artefacts
1442
1443 # Post-archive hook
1444 call_hook post_tf_archive
1445
1446 call_hook fetch_tf_resource
1447 call_hook post_fetch_tf_resource
1448
1449 # Clear any local changes made by applied patches
1450 undo_tf_patches
1451
1452 echo "##########"
1453 )
1454 fi
1455
1456 echo
1457 echo
1458done
1459
1460call_hook pre_package
1461
1462call_hook post_package
1463
1464if upon "$jenkins_run" && upon "$artefacts_receiver" && [ -d "artefacts" ]; then
Zelalem219df412020-05-17 19:21:20 -05001465 source "$CI_ROOT/script/send_artefacts.sh" "artefacts"
Fathi Boudra422bf772019-12-02 11:10:16 +02001466fi
1467
1468echo
1469echo "Done"