forked from lowRISC/opentitan
-
Notifications
You must be signed in to change notification settings - Fork 0
/
meson_init.sh
executable file
·169 lines (148 loc) · 5.15 KB
/
meson_init.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#!/bin/bash
# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0
set -o errexit
set -o pipefail
set -o nounset
# meson_init.sh configures OpenTitan's Meson build system. Rather than calling
# Meson directly, this script should be used instead, since it handles things
# that Meson does not out of the box, such as:
# - The RISC-V toolchain.
# - Idempotence.
# - Building for multiple device platforms.
#
# This script's semantics for creating build directories are as follows:
# - By default, this script will create any missing build directories and
# configure them. It is idempotent: if there is no work to be done, nothing
# will change and this script will exit successfully.
# - Passing -r will reconfigure existing build directories. This should be used
# when editing meson.build files.
# - Passing -f will erase existing build directories. This should be used when
# existing configuration is completely broken, or a clean build is desired
# (neither of these should be necessary).
# - Passing -A will explicitly disable idempotence, and cause the script to exit
# if a build directory already exists. This should be used only in CI, where
# such error-checking is desireable.
#
# Note that only the first option above is actually guaranteed to be idempotent.
. util/build_consts.sh
echo "Detected \$REPO_TOP at $REPO_TOP."
echo "Object directory set at $OBJ_DIR."
echo "Binary directory set at $BIN_DIR."
echo "OpenTitan version: $OT_VERSION"
echo
function usage() {
cat << USAGE
Configure Meson build targets.
Usage: $0 [-r|-f|-A|-K|-T|-t]
-f: Force a reconfiguration by removing existing build dirs.
-r: Reconfigure build dirs, if they exist.
-A: Assert that no build dirs exist when running this command.
-K: Keep include search paths as generated by Meson.
-t FILE: Configure Meson with toolchain configuration FILE
-T PATH: Build tock from PATH rather than the remote repository.
-c: Enable coverage (requires clang).
USAGE
}
readonly DEFAULT_RISCV_TOOLS=/tools/riscv
TOOLCHAIN_PATH="${TOOLCHAIN_PATH:-$DEFAULT_RISCV_TOOLS}"
FLAGS_assert=false
FLAGS_force=false
FLAGS_reconfigure=""
FLAGS_keep_includes=false
FLAGS_specified_toolchain_file=false
FLAGS_coverage=false
ARG_toolchain_file="${TOOLCHAIN_PATH}/meson-riscv32-unknown-elf-clang.txt"
ARG_tock_dir=""
while getopts 'r?:f?:K?:A?:T:t:c?' flag; do
case "${flag}" in
f) FLAGS_force=true;;
r) FLAGS_reconfigure="--reconfigure";;
A) FLAGS_assert=true;;
K) FLAGS_keep_includes=true;;
t) FLAGS_specified_toolchain_file=true
ARG_toolchain_file="${OPTARG}";;
T) ARG_tock_dir="${OPTARG}";;
c) FLAGS_coverage=true;;
?) usage && exit 1;;
:) usage
error "${OPTARG} requires a path argument"
;;
*) usage
error "Unexpected option ${flag}"
;;
esac
done
if [[ ! -n "$(command -v meson)" ]]; then
echo "Unable to find meson. Please install meson before running this command." >&2
exit 1
fi
if [[ ! -n "$(command -v ninja)" ]]; then
echo "Unable to find ninja. Please install ninja before running this command." >&2
exit 1
fi
if [[ "${FLAGS_force}" == true ]]; then
rm -rf "$OBJ_DIR"
rm -rf "$BIN_DIR"
fi
if [[ "${FLAGS_assert}" == true ]]; then
if [[ -e "$OBJ_DIR" ]]; then
echo "Object directory at $OBJ_DIR already exists. Aborting." >&2
exit 1
fi
if [[ -e "$BIN_DIR" ]]; then
echo "Binary directory at $BIN_DIR already exists. Aborting." >&2
exit 1
fi
fi
TOCK_LOCAL=false
if [[ ! -z "${ARG_tock_dir}" ]]; then
TOCK_LOCAL=true
if [[ ! -d "${ARG_tock_dir}" ]]; then
echo "Referenced Tock directory ${ARG_tock_dir} doesn't exist. Aborting." >&2
exit 1
fi
if [[ ! -f "${TOCK_SYMLINK}" || -L "${TOCK_SYMLINK}" ]]; then
echo "Creating symlink to Tock project at ${ARG_tock_dir}."
ln -sf "${ARG_tock_dir}" "${TOCK_SYMLINK}"
elif [[ -d "${TOCK_SYMLINK}" ]]; then
echo "Tock directory $TOCK_SYMLINK exists in place. Leaving as is."
else
echo "Placing Tock at ${TOCK_SYMLINK} would clobber something. Aborting." >&2
exit 1
fi
fi
reconf="${FLAGS_reconfigure}"
if [[ ! -d "$OBJ_DIR" ]]; then
echo "Output directory does not exist at $OBJ_DIR; creating." >&2
mkdir -p "$OBJ_DIR"
reconf=""
elif [[ -z "$reconf" ]]; then
echo "Output directory already exists at $OBJ_DIR; skipping." >&2
fi
if [[ -f "${ARG_toolchain_file}" ]]; then
echo "Using meson toolchain file at $ARG_toolchain_file." >&2
else
if [[ "${FLAGS_specified_toolchain_file}" == true ]]; then
echo "Unable to find meson toolchain file at $ARG_toolchain_file. Aborting." >&2
exit 1
else
cross_file="$OBJ_DIR/toolchain-configured.txt"
cp toolchain.txt "$cross_file"
perl -pi -e "s#$DEFAULT_RISCV_TOOLS#$TOOLCHAIN_PATH#g" "$cross_file"
touch -r toolchain.txt "$cross_file"
echo "Set up toolchain file at $cross_file." >&2
ARG_toolchain_file="${cross_file}"
fi
fi
mkdir -p "$BIN_DIR"
set -x
meson $reconf \
-Dot_version="$OT_VERSION" \
-Dbin_dir="$BIN_DIR" \
-Dtock_local="$TOCK_LOCAL" \
-Dkeep_includes="$FLAGS_keep_includes" \
-Dcoverage="$FLAGS_coverage" \
--cross-file="$ARG_toolchain_file" \
"$OBJ_DIR"