Initial commit for TF-A CI scripts

Signed-off-by: Fathi Boudra <fathi.boudra@linaro.org>
diff --git a/utils.sh b/utils.sh
new file mode 100644
index 0000000..4204133
--- /dev/null
+++ b/utils.sh
@@ -0,0 +1,306 @@
+#!/bin/bash
+#
+# Copyright (c) 2019, Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+
+# This file is meant to be SOURCED only after setting $ci_root. $ci_root must be
+# the absolute path to the root of the CI repository
+#
+# A convenient way to set ci_root from the calling script like this:
+#  ci_root="$(readlink -f "$(dirname "$0")/..")"
+#
+
+# Accept root of CI location from $CI_ROOT or $ci_root, in that order
+ci_root="${ci_root:-$CI_ROOT}"
+ci_root="${ci_root:?}"
+
+# Storage area to host toolchains, rootfs, tools, models, binaries, etc...
+nfs_volume="${nfs_volume:-$NFS_VOLUME}"
+nfs_volume="${nfs_volume:?}"
+
+# Override workspace for local runs
+workspace="${workspace:-$WORKSPACE}"
+workspace="${workspace:?}"
+workspace="$(readlink -f "$workspace")"
+artefacts="$workspace/artefacts"
+
+# pushd and popd outputs the directory stack every time, which could be
+# confusing when shown on the log. Suppress its output.
+pushd() {
+	builtin pushd "$1" &>/dev/null
+}
+popd() {
+	builtin popd &>/dev/null
+}
+
+# Copy a file to the $archive directory
+archive_file() {
+	local f out target md5
+	f="${1:?}"
+
+	out="${archive:?}"
+	[ ! -d "$out" ] && die "$out is not a directory"
+
+	target="$out/$(basename $f)"
+	if [ -f "$target" ]; then
+		# Prevent same file error
+		if [ "$(stat --format=%i "$target")" = \
+				"$(stat --format=%i "$f")" ]; then
+			return
+		fi
+	fi
+
+	md5="$(md5sum "$f" | awk '{print $1}')"
+	cp -t "$out" "$f"
+	echo "Archived: $f (md5: $md5)"
+}
+
+die() {
+	[ "$1" ] && echo "$1" >&2
+	exit 1
+}
+
+# Emit environment variables for the purpose of sourcing from shells and as
+# Jenkins property files. Whether the RHS is quoted depends on "$quote".
+emit_env() {
+	local env_file="${env_file:?}"
+	local var="${1:?}"
+
+	# Value parameter is mandatory, but allow for it to be empty
+	local val="${2?}"
+
+	if upon "$quote"; then
+		val="\"$val\""
+	else
+		# If RHS is not required to be quoted, any white space in it
+		# won't go well with a shell sourcing this file.
+		if echo "$var" | grep -q '\s'; then
+			die "$var: value '$val' has white space"
+		fi
+	fi
+
+	echo "$var=$val" >> "$env_file"
+}
+
+# # FIXME add support for file:// protocol
+fetch_directory() {
+	local base="$(basename "${url:?}")"
+	local sa
+
+	if is_url "$url"; then
+		# Have exactly one trailing /
+		local modified_url="$(echo "$url" | sed 's#/*$##')/"
+
+		# Figure out the number of components between hostname and the
+		# final one
+		local cut_dirs="$(echo "$modified_url" | awk -F/ '{print NF - 5}')"
+		sa="${saveas:-$base}"
+		echo "Fetch: $modified_url -> $sa"
+		wget -rq -nH --cut-dirs="$cut_dirs" --no-parent \
+			--reject="index.html*" "$modified_url"
+		if [ "$sa" != "$base" ]; then
+			mv "$base" "$sa"
+		fi
+	else
+		sa="${saveas:-.}"
+		echo "Fetch: $url -> $sa"
+		cp -r "$url" "$sa"
+	fi
+}
+
+fetch_file() {
+	local url="${url:?}"
+	local sa
+	local saveas
+
+	if is_url "$url"; then
+		sa="${saveas+-o $saveas}"
+		saveas="${saveas-"$(basename "$url")"}"
+		echo "Fetch: $url -> $saveas"
+		# Use curl to support file protocol
+		curl -sLS -C - $sa "$url"
+	else
+		sa="${saveas-.}"
+		echo "Fetch: $url -> $sa"
+		cp "$url" "$sa"
+	fi
+}
+
+# Make a temporary directory/file insdie workspace, so that it doesn't need to
+# be cleaned up. Jenkins is setup to clean up workspace before a job runs.
+mktempdir() {
+	local ws="${workspace:?}"
+
+	mktemp -d --tmpdir="$ws"
+}
+mktempfile() {
+	local ws="${workspace:?}"
+
+	mktemp --tmpdir="$ws"
+}
+
+not_upon() {
+	! upon "$1"
+}
+
+# Use "$1" as a boolean
+upon() {
+	case "$1" in
+		"" | "0" | "false") return 1;;
+		*) return 0;;
+	esac
+}
+
+# Check if the argument is a URL
+is_url() {
+	echo "$1" | grep -q "://"
+}
+
+# Check if a path is absolute
+is_abs() {
+	[ "${1:0:1}" = "/" ]
+}
+
+# Unset a variable based on its boolean value
+# If foo=, foo will be unset
+# If foo=blah, then leave it as is
+reset_var() {
+	local var="$1"
+	local val="${!var}"
+
+	if [ -z "$val" ]; then
+		unset "$var"
+	else
+		var="$val"
+	fi
+}
+
+default_var() {
+	local var="$1"
+	local val="${!var}"
+	local default="$2"
+
+	if [ -z "$val" ]; then
+		eval "$var=$default"
+	fi
+}
+
+# String various items joined by ":" to form a path. Items are prepended by
+# default; or 'op' can be set to 'append' to have them appended.
+# For example, to set: PATH=foo:bar:baz:$PATH
+extend_path() {
+	local path_var="$1"
+	local array_var="$2"
+	local tmp_path="${!path_var}"
+	local tmp_array
+	local item
+	local op="${op:-prepend}"
+
+	eval "tmp_array=\"\${$array_var[@]}\""
+	for item in $tmp_array; do
+		if [ "$op" = "prepend" ]; then
+			tmp_path="$item${tmp_path+:}$tmp_path"
+		elif [ "$op" = "append" ]; then
+			tmp_path="$tmp_path${tmp_path+:}$item"
+		fi
+	done
+	eval "$path_var=\"$tmp_path\""
+}
+
+# Assume running on Jenkins if JENKINS_HOME is set
+if [ "$JENKINS_HOME" ]; then
+	jenkins_run=1
+	umask 0002
+else
+	unset jenkins_run
+fi
+
+# Project scratch location for Trusted Firmware CI
+project_filer="${nfs_volume}/projectscratch/ssg/trusted-fw"
+project_scratch="${PROJECT_SCRATCH:-$project_filer/ci-workspace}"
+warehouse="${nfs_volume}/warehouse"
+jenkins_url="${JENKINS_URL%/*}"
+jenkins_url="${jenkins_url:-https://ci.trustedfirmware.org/}"
+
+# Model revisions
+model_version="${model_version:-11.6}"
+model_build="${model_build:-45}"
+
+# Model snapshots from filer are not normally not accessible from developer
+# systems. Ignore failures from picking real path for local runs.
+pinned_cortex="$(readlink -f ${pinned_cortex:-$project_filer/models/cortex})" || true
+pinned_css="$(readlink -f ${pinned_css:-$project_filer/models/css})" || true
+
+#arm_gerrit_url="gerrit.oss.arm.com"
+tforg_gerrit_url="review.trustedfirmware.org"
+
+# Repository URLs. We're using anonymous HTTP as they appear to be faster rather
+# than any scheme with authentication.
+#tf_ci_repo_url="http://$arm_gerrit_url/pdswinf/ci/pdcs-platforms/platform-ci"
+tf_src_repo_url="${tf_src_repo_url:-$TF_SRC_REPO_URL}"
+tf_src_repo_url="${tf_src_repo_url:-https://$tforg_gerrit_url/TF-A/trusted-firmware-a}"
+#tf_arm_gerrit_repo="ssh://$arm_gerrit_url:29418/pdcs-platforms/ap/tf-topics.git"
+tftf_src_repo_url="${tftf_src_repo_url:-$TFTF_SRC_REPO_URL}"
+tftf_src_repo_url="${tftf_src_repo_url:-https://$tforg_gerrit_url/TF-A/tf-a-tests}"
+#tftf_arm_gerrit_repo="ssh://$arm_gerrit_url:29418/trusted-firmware/tf-a-tests.git"
+scp_src_repo_url="${scp_src_repo_url:-$SCP_SRC_REPO_URL}"
+#scp_src_repo_url="${scp_src_repo_url:-http://$arm_gerrit_url/scp/firmware}"
+
+# FIXME set a sane default for tfa_downloads
+tfa_downloads="${tfa_downloads:-file:///downloads/tf-a}"
+css_downloads="${css_downloads:-$tfa_downloads/css}"
+
+# FIXME public hosting has mbedtls-2.16.0-apache.tgz or mbedtls-2.16.0-gpl.tgz"
+#       See https://tls.mbed.org/download/start/
+mbedtls_archive="${mbedtls_archive:-$tfa_downloads/mbedtls/mbedtls-2.16.0.tar.gz}"
+linaro_release="${linaro_release:-$tfa_downloads/linaro/18.04}"
+
+coverity_path="${coverity_path:-${nfs_volume}/tools/coverity/static-analysis/2018.06}"
+#coverity_host="${coverity_host:-coverity.cambridge.arm.com}"
+coverity_default_checkers=(
+"--all"
+"--checker-option DEADCODE:no_dead_default:true"
+"--concurrency"
+"--enable AUDIT.SPECULATIVE_EXECUTION_DATA_LEAK"
+"--enable-constraint-fpp"
+"--security"
+"--ticker-mode none"
+)
+
+#export coverity_host
+
+path_list=(
+"${nfs_volume}/pdsw/tools/gcc-linaro-6.2.1-2016.11-x86_64_aarch64-linux-gnu/bin"
+"${nfs_volume}/pdsw/tools/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin"
+"${nfs_volume}/pdsw/tools/gcc-arm-none-eabi-5_4-2016q3/bin"
+"$coverity_path/bin"
+)
+
+ld_library_path_list=(
+)
+
+license_path_list=(
+)
+
+# Setup various paths
+if upon "$retain_paths"; then
+	# If explicitly requested, retain local paths; apppend CI paths to the
+	# existing ones.
+	op="append" extend_path "PATH" "path_list"
+	op="append" extend_path "LD_LIBRARY_PATH" "ld_library_path_list"
+	op="append" extend_path "LM_LICENSE_FILE" "license_path_list"
+else
+	# Otherwise, prepend CI paths so that they take effect before local ones
+	extend_path "PATH" "path_list"
+	extend_path "LD_LIBRARY_PATH" "ld_library_path_list"
+	extend_path "LM_LICENSE_FILE" "license_path_list"
+fi
+
+export LD_LIBRARY_PATH
+export LM_LICENSE_FILE
+export ARMLMD_LICENSE_FILE="$LM_LICENSE_FILE"
+export ARM_TOOL_VARIANT=ult
+
+# vim: set tw=80 sw=8 noet: