forked from lowRISC/opentitan
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmeson_init.sh
executable file
·118 lines (102 loc) · 3.24 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
#!/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
. 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]
-f: Remove build directories before running Meson.
-r: Force reconfiguration of build directories.
-K: Keep include search paths as generated by Meson.
USAGE
}
FLAGS_force=false
FLAGS_reconfigure=""
FLAGS_keep_includes=false
while getopts 'r?:f?:K?' flag; do
case "${flag}" in
f) FLAGS_force=true;;
r) FLAGS_reconfigure="--reconfigure";;
K) FLAGS_keep_includes=true;;
?) usage && exit 1;;
*) usage
error "Unexpected option ${flag}"
;;
esac
done
if [[ "${FLAGS_force}" == true && -n "${FLAGS_reconfigure}" ]]; then
usage >&2
echo "Error: -r and -f cannont be used at the same time." >&2
exit 1
fi
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 $BUILD_ROOT/build-*
fi
if [[ ! -n "${FLAGS_reconfigure}" ]] ; then
for platform in "${PLATFORMS[@]}"; do
obj_dir="$(sw_obj_dir "$platform")"
if [[ -d "$obj_dir" ]]; then
usage >&2
echo "Error: $obj_dir already exists. Remove directory, or rerun $0 " \
"with the -r option" >&2
exit 1
fi
done
fi
readonly DEFAULT_RISCV_TOOLS=/tools/riscv
TOOLCHAIN_PATH="${TOOLCHAIN_PATH:-$DEFAULT_RISCV_TOOLS}"
CROSS_FILE=$(mktemp /tmp/toolchain.XXXXXX.txt)
cp toolchain.txt "$CROSS_FILE"
perl -pi -e "s#$DEFAULT_RISCV_TOOLS#$TOOLCHAIN_PATH#g" "$CROSS_FILE"
echo "Set up toolchain file at $CROSS_FILE." >&2
# purge_includes $build_dir deletes any -I command line arguments that are not
# - Absolute paths.
# - Ephemeral build directories.
#
# This function is necessary because Meson does not give adequate
# control over what directories are passed in as -I search directories
# to the C compiler. While Meson does provide |implicit_include_directories|,
# support for this option is poor: empirically, Meson ignores this option for
# some targerts. Doing it as a post-processing step ensures that Meson does
# not allow improper #includes to compile successfully.
function purge_includes() {
if [[ "${FLAGS_keep_includes}" == "true" ]]; then
return
fi
echo "Purging superfluous -I arguments from $1."
local ninja_file="$1/build.ninja"
perl -pi -e 's#-I[^/][^@ ]+ # #g' -- "$ninja_file"
}
for platform in ${PLATFORMS[@]}; do
obj_dir="$(sw_obj_dir "$platform")"
bin_dir="$(sw_bin_dir "$platform")"
mkdir -p "$obj_dir"
mkdir -p "$bin_dir"
meson ${FLAGS_reconfigure} \
-Dtarget="$platform" \
-Dot_version="$OT_VERSION" \
-Ddev_bin_dir="$bin_dir" \
-Dhost_bin_dir="$HOST_BIN_DIR" \
--cross-file="$CROSS_FILE" \
--buildtype=plain \
"$obj_dir"
purge_includes "$obj_dir"
done