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