1#!/bin/bash 2# Stop immediately if any executed command has exit status different from 0. 3set -e 4set -o pipefail 5 6script_name="$(basename "$0")" 7 8fatal() { 9 echo "${script_name}: $*" >&2 10 exit 1 11} 12 13usage() { 14 fatal "Usage: ${script_name} <ARM64|X86_64> <accepted|monitored>" 15} 16 17if [[ $# -ne 2 ]]; then 18 usage 19fi 20 21# Absolute path of the ECLAIR bin directory. 22export ECLAIR_BIN_DIR=/opt/bugseng/eclair/bin/ 23 24# Directory where this script resides: usually in a directory named "ECLAIR". 25SCRIPT_DIR="$( 26 cd "$(dirname "$0")" 27 echo "${PWD}" 28)" 29# Directory where to put all ECLAIR output and temporary files. 30if [[ -z "${ECLAIR_OUTPUT_DIR:-}" ]]; then 31 ECLAIR_OUTPUT_DIR="${PWD}/ECLAIR/out" 32fi 33 34export ECLAIR_DIAGNOSTICS_OUTPUT="${ECLAIR_OUTPUT_DIR}/ANALYSIS.log" 35# Set the variable for the build log file. 36ECLAIR_BUILD_LOG=${ECLAIR_OUTPUT_DIR}/BUILD.log 37# Set the variable for the report log file. 38ECLAIR_REPORT_LOG=${ECLAIR_OUTPUT_DIR}/REPORT.log 39 40if [[ "$1" = "X86_64" ]]; then 41 export CROSS_COMPILE= 42 export XEN_TARGET_ARCH=x86_64 43elif [[ "$1" = "ARM64" ]]; then 44 export CROSS_COMPILE=aarch64-linux-gnu- 45 export XEN_TARGET_ARCH=arm64 46else 47 fatal "Unknown configuration: $1" 48fi 49 50VARIANT="${XEN_TARGET_ARCH}" 51 52# Used in analysis.ecl 53case "$2" in 54accepted|monitored) 55 export SET="$2" 56 ;; 57*) 58 fatal "Unknown configuration: $2" 59 ;; 60esac 61 62export CC_ALIASES="${CROSS_COMPILE}gcc-12" 63export CXX_ALIASES="${CROSS_COMPILE}g++-12" 64export LD_ALIASES="${CROSS_COMPILE}ld" 65export AR_ALIASES="${CROSS_COMPILE}ar" 66export AS_ALIASES="${CROSS_COMPILE}as" 67export FILEMANIP_ALIASES="cp mv ${CROSS_COMPILE}objcopy" 68 69# ECLAIR binary data directory and workspace. 70export ECLAIR_DATA_DIR="${ECLAIR_OUTPUT_DIR}/.data" 71# ECLAIR workspace. 72export ECLAIR_WORKSPACE="${ECLAIR_DATA_DIR}/eclair_workspace" 73 74# Identifies the particular build of the project. 75export ECLAIR_PROJECT_NAME="XEN_${VARIANT}-${SET}" 76 77# Erase and recreate the output directory and the data directory. 78rm -rf "${ECLAIR_OUTPUT_DIR:?}/*" 79mkdir -p "${ECLAIR_DATA_DIR}" 80 81# Perform the build (from scratch) in an ECLAIR environment. 82"${ECLAIR_BIN_DIR}eclair_env" \ 83 "-config_file='${SCRIPT_DIR}/analysis.ecl'" \ 84 "${EXTRA_ECLAIR_ENV_OPTIONS}" \ 85 -- "${SCRIPT_DIR}/../build.sh" "$1" | tee "${ECLAIR_BUILD_LOG}" 86 87 88# Create the project database. 89PROJECT_ECD="${ECLAIR_OUTPUT_DIR}/PROJECT.ecd" 90find "${ECLAIR_DATA_DIR}" -maxdepth 1 -name "FRAME.*.ecb" | 91 sort | xargs cat | 92 "${ECLAIR_BIN_DIR}eclair_report" \ 93 "-create_db='${PROJECT_ECD}'" \ 94 -quiet \ 95 -load=/dev/stdin > "${ECLAIR_REPORT_LOG}" 2>&1 96 97# Create the Jenkins reports file. 98"${ECLAIR_BIN_DIR}eclair_report" \ 99 "-db='${PROJECT_ECD}'" \ 100 -quiet \ 101 "-eval_file='${SCRIPT_DIR}/report.ecl'" \ 102 >> "${ECLAIR_REPORT_LOG}" 2>&1 103 104"${SCRIPT_DIR}/print_analyzed_files.sh" "${PROJECT_ECD}" "${ECLAIR_OUTPUT_DIR}" 105