blob: e627ef297193ccfb0c3df1abe3a38d809e4402eb [file] [log] [blame]
Miguel Osorio03f2e232019-09-17 19:44:37 -07001#!/bin/bash
2# Copyright lowRISC contributors.
3# Licensed under the Apache License, Version 2.0, see LICENSE for details.
4# SPDX-License-Identifier: Apache-2.0
5
6set -o errexit
7set -o pipefail
8set -o nounset
9
Miguel Young de la Sota4a4946d2019-11-21 10:44:18 -060010# meson_init.sh configures OpenTitan's Meson build system. Rather than calling
11# Meson directly, this script should be used instead, since it handles things
12# that Meson does not out of the box, such as:
13# - The RISC-V toolchain.
14# - Idempotence.
15# - Building for multiple device platforms.
16#
17# This script's semantics for creating build directories are as follows:
18# - By default, this script will create any missing build directories and
19# configure them. It is idempotent: if there is no work to be done, nothing
20# will change and this script will exit successfully.
21# - Passing -r will reconfigure existing build directories. This should be used
22# when editing meson.build files.
23# - Passing -f will erase existing build directories. This should be used when
24# existing configuration is completely broken, or a clean build is desired
25# (neither of these should be necessary).
26# - Passing -A will explicitly disable idempotence, and cause the script to exit
27# if a build directory already exists. This should be used only in CI, where
28# such error-checking is desireable.
29#
30# Note that only the first option above is actually guaranteed to be idempotent.
31
Miguel Young de la Sota63793572019-11-13 14:18:51 -060032. util/build_consts.sh
33
34echo "Detected \$REPO_TOP at $REPO_TOP."
35echo "Object directory set at $OBJ_DIR."
36echo "Binary directory set at $BIN_DIR."
Miguel Young de la Sotab2ef4832019-11-22 12:55:46 -060037echo "OpenTitan version: $OT_VERSION"
Miguel Young de la Sota63793572019-11-13 14:18:51 -060038echo
Miguel Osorio03f2e232019-09-17 19:44:37 -070039
40function usage() {
41 cat << USAGE
42Configure Meson build targets.
43
Miguel Young de la Sota4a4946d2019-11-21 10:44:18 -060044Usage: $0 [-r|-f|-A|-K]
Miguel Osorio03f2e232019-09-17 19:44:37 -070045
Miguel Young de la Sota4a4946d2019-11-21 10:44:18 -060046 -f: Force a reconfiguration by removing existing build dirs.
47 -r: Reconfigure build dirs, if they exist.
48 -A: Assert that no build dirs exist when running this command.
Miguel Young de la Sota3fbb28a2019-10-16 15:15:07 -050049 -K: Keep include search paths as generated by Meson.
Miguel Osorio03f2e232019-09-17 19:44:37 -070050
51USAGE
52}
53
Miguel Young de la Sota4a4946d2019-11-21 10:44:18 -060054FLAGS_assert=false
Miguel Osorio03f2e232019-09-17 19:44:37 -070055FLAGS_force=false
56FLAGS_reconfigure=""
Miguel Young de la Sota3fbb28a2019-10-16 15:15:07 -050057FLAGS_keep_includes=false
Miguel Young de la Sota4a4946d2019-11-21 10:44:18 -060058while getopts 'r?:f?:K?:A?' flag; do
Miguel Osorio03f2e232019-09-17 19:44:37 -070059 case "${flag}" in
60 f) FLAGS_force=true;;
61 r) FLAGS_reconfigure="--reconfigure";;
Miguel Young de la Sota4a4946d2019-11-21 10:44:18 -060062 A) FLAGS_assert=true;;
Miguel Young de la Sota3fbb28a2019-10-16 15:15:07 -050063 K) FLAGS_keep_includes=true;;
Miguel Osorio03f2e232019-09-17 19:44:37 -070064 ?) usage && exit 1;;
65 *) usage
66 error "Unexpected option ${flag}"
67 ;;
68 esac
69done
70
Miguel Osorio03f2e232019-09-17 19:44:37 -070071if [[ ! -n "$(command -v meson)" ]]; then
72 echo "Unable to find meson. Please install meson before running this command." >&2
73 exit 1
74fi
75
76if [[ ! -n "$(command -v ninja)" ]]; then
77 echo "Unable to find ninja. Please install ninja before running this command." >&2
78 exit 1
79fi
80
81if [[ "${FLAGS_force}" == true ]]; then
Miguel Young de la Sota4a4946d2019-11-21 10:44:18 -060082 rm -rf "$OBJ_DIR"
83 rm -rf "$BIN_DIR"
Miguel Osorio03f2e232019-09-17 19:44:37 -070084fi
85
Miguel Young de la Sota4a4946d2019-11-21 10:44:18 -060086if [[ "${FLAGS_assert}" == true ]]; then
87 if [[ -e "$OBJ_DIR" ]]; then
88 echo "Object directory at $OBJ_DIR already exists. Aborting." >&2
89 exit 1
90 fi
91 if [[ -e "$BIN_DIR" ]]; then
92 echo "Binary directory at $BIN_DIR already exists. Aborting." >&2
93 exit 1
94 fi
Miguel Osorio03f2e232019-09-17 19:44:37 -070095fi
96
Miguel Young de la Sotad258b332019-10-29 14:05:23 -050097readonly DEFAULT_RISCV_TOOLS=/tools/riscv
98TOOLCHAIN_PATH="${TOOLCHAIN_PATH:-$DEFAULT_RISCV_TOOLS}"
99CROSS_FILE=$(mktemp /tmp/toolchain.XXXXXX.txt)
100cp toolchain.txt "$CROSS_FILE"
101perl -pi -e "s#$DEFAULT_RISCV_TOOLS#$TOOLCHAIN_PATH#g" "$CROSS_FILE"
102echo "Set up toolchain file at $CROSS_FILE." >&2
103
104# purge_includes $build_dir deletes any -I command line arguments that are not
Miguel Young de la Sota3fbb28a2019-10-16 15:15:07 -0500105# - Absolute paths.
106# - Ephemeral build directories.
107#
108# This function is necessary because Meson does not give adequate
109# control over what directories are passed in as -I search directories
110# to the C compiler. While Meson does provide |implicit_include_directories|,
111# support for this option is poor: empirically, Meson ignores this option for
112# some targerts. Doing it as a post-processing step ensures that Meson does
113# not allow improper #includes to compile successfully.
114function purge_includes() {
115 if [[ "${FLAGS_keep_includes}" == "true" ]]; then
116 return
117 fi
118 echo "Purging superfluous -I arguments from $1."
Miguel Young de la Sotad258b332019-10-29 14:05:23 -0500119 local ninja_file="$1/build.ninja"
Miguel Young de la Sota3fbb28a2019-10-16 15:15:07 -0500120 perl -pi -e 's#-I[^/][^@ ]+ # #g' -- "$ninja_file"
121}
122
Miguel Young de la Sota76526c32020-01-28 10:24:41 -0500123reconf="${FLAGS_reconfigure}"
Miguel Young de la Sota4a4946d2019-11-21 10:44:18 -0600124
Miguel Young de la Sota76526c32020-01-28 10:24:41 -0500125if [[ ! -d "$OBJ_DIR" ]]; then
126 echo "Output directory does not exist at $OBJ_DIR; creating." >&2
127 mkdir -p "$OBJ_DIR"
128 reconf=""
129elif [[ -z "$reconf" ]]; then
130 echo "Output directory already exists at $OBJ_DIR; skipping." >&2
131 continue
132fi
Miguel Young de la Sota4a4946d2019-11-21 10:44:18 -0600133
Miguel Young de la Sota76526c32020-01-28 10:24:41 -0500134mkdir -p "$DEV_BIN_DIR"
135set -x
136meson $reconf \
137 -Dot_version="$OT_VERSION" \
138 -Ddev_bin_dir="$DEV_BIN_DIR" \
139 -Dhost_bin_dir="$HOST_BIN_DIR" \
140 --cross-file="$CROSS_FILE" \
141 "$OBJ_DIR"
142{ set +x; } 2>/dev/null
143purge_includes "$OBJ_DIR"