blob: dbb8059f2948d62049f278131fc2dee698e9d5fe [file] [log] [blame]
Rob Mohr2cc32ec2020-02-05 10:55:12 -08001# Copyright 2020 The Pigweed Authors
Rob Mohrcacb8772019-11-22 13:14:01 -08002#
3# Licensed under the Apache License, Version 2.0 (the "License"); you may not
4# use this file except in compliance with the License. You may obtain a copy of
5# the License at
6#
7# https://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12# License for the specific language governing permissions and limitations under
13# the License.
14
15# This script must be tested on bash, zsh, and dash.
16
Alexei Frolova137f972020-03-06 11:14:13 -080017_pw_abspath () {
Rob Mohr93825562020-01-02 15:20:50 -080018 python -c "import os.path; print(os.path.abspath('$@'))"
Rob Mohrdc70d1c2019-12-04 10:05:28 -080019}
20
Alexei Frolova137f972020-03-06 11:14:13 -080021_pw_red() {
Alexei Frolov02461482020-03-09 10:19:49 -070022 echo -e "\033[0;31m$*\033[0m"
Alexei Frolova137f972020-03-06 11:14:13 -080023}
24
25_pw_bold_red() {
Alexei Frolov02461482020-03-09 10:19:49 -070026 echo -e "\033[1;31m$*\033[0m"
Alexei Frolova137f972020-03-06 11:14:13 -080027}
28
29_pw_green() {
Alexei Frolov02461482020-03-09 10:19:49 -070030 echo -e "\033[0;32m$*\033[0m"
Alexei Frolova137f972020-03-06 11:14:13 -080031}
32
33_pw_bright_magenta() {
Alexei Frolov02461482020-03-09 10:19:49 -070034 echo -e "\033[0;35m$*\033[0m"
Alexei Frolova137f972020-03-06 11:14:13 -080035}
36
37_PIGWEED_BANNER=$(cat <<EOF
38 ▒█████▄ █▓ ▄███▒ ▒█ ▒█ ░▓████▒ ░▓████▒ ▒▓████▄
39 ▒█░ █░ ░█▒ ██▒ ▀█▒ ▒█░ ▒█ ▒█ ▒█ ▒█ ▀█▌
40 ▒█▄▄▄█░ ░█▒ █▓░ ▄▄░ ▒█░ ▒█ ▒███ ▒███ ░█ █▌
41 ▒█▀ ░█░ ▓█ █▓ ░█░ ▒█ ▒█ ▒█ ░█ ▄█▌
42 ▒█ ░█░ ░▓███▀ ▒█▓▀▓█░ ░▓████▒ ░▓████▒ ▒▓████▀
43EOF
44)
45
Rob Mohr323f7c42020-02-06 14:38:37 -080046# Users are not expected to set PW_CHECKOUT_ROOT, it's only used because it
47# seems to be impossible to reliably determine the path to a sourced file in
48# dash when sourced from a dash script instead of a dash interactive prompt.
49# To reinforce that users should not be using PW_CHECKOUT_ROOT, it is cleared
50# here after it is used, and other pw tools will complain if they see that
51# variable set.
52# TODO(mohrr) find out a way to do this without PW_CHECKOUT_ROOT.
53if test -n "$PW_CHECKOUT_ROOT"; then
Wyatt Hepler77bd6d22020-03-19 10:13:30 -070054 PW_SETUP_SCRIPT_PATH="$(_pw_abspath "$PW_CHECKOUT_ROOT/bootstrap.sh")"
Rob Mohr323f7c42020-02-06 14:38:37 -080055 unset PW_CHECKOUT_ROOT
Rob Mohrcacb8772019-11-22 13:14:01 -080056# Shell: bash.
Rob Mohr323f7c42020-02-06 14:38:37 -080057elif test -n "$BASH"; then
Wyatt Hepler77bd6d22020-03-19 10:13:30 -070058 PW_SETUP_SCRIPT_PATH="$(_pw_abspath "$BASH_SOURCE")"
Rob Mohrcacb8772019-11-22 13:14:01 -080059# Shell: zsh.
60elif test -n "$ZSH_NAME"; then
Wyatt Hepler77bd6d22020-03-19 10:13:30 -070061 PW_SETUP_SCRIPT_PATH="$(_pw_abspath "${(%):-%N}")"
Rob Mohrcacb8772019-11-22 13:14:01 -080062# Shell: dash.
63elif test ${0##*/} = dash; then
Wyatt Hepler77bd6d22020-03-19 10:13:30 -070064 PW_SETUP_SCRIPT_PATH="$(_pw_abspath \
65 "$(lsof -p $$ -Fn0 | tail -1 | sed 's#^[^/]*##;')")"
Rob Mohrcacb8772019-11-22 13:14:01 -080066# If everything else fails, try $0. It could work.
67else
Wyatt Hepler77bd6d22020-03-19 10:13:30 -070068 PW_SETUP_SCRIPT_PATH="$(_pw_abspath "$0")"
Rob Mohrcacb8772019-11-22 13:14:01 -080069fi
70
Rob Mohr6ac3f7d2020-03-27 12:43:28 -070071# Check if this file is being executed or sourced.
72_pw_sourced=0
73if [ -n "$SWARMING_BOT_ID" ]; then
74 # If set we're running on swarming and don't need this check.
75 _pw_sourced=1
76elif [ -n "$ZSH_EVAL_CONTEXT" ]; then
77 case $ZSH_EVAL_CONTEXT in *:file) _pw_sourced=1;; esac
78elif [ -n "$KSH_VERSION" ]; then
79 [ "$(cd $(dirname -- $0) && pwd -P)/$(basename -- $0)" != \
80 "$(cd $(dirname -- ${.sh.file}) && pwd -P)/$(basename -- ${.sh.file})" ] \
81 && _pw_sourced=1
82elif [ -n "$BASH_VERSION" ]; then
83 (return 0 2>/dev/null) && _pw_sourced=1
84else # All other shells: examine $0 for known shell binary filenames
85 # Detects `sh` and `dash`; add additional shell filenames as needed.
86 case ${0##*/} in sh|dash) _pw_sourced=1;; esac
87fi
88
89if [ "$_pw_sourced" -eq 0 ]; then
90 _PW_NAME=$(basename "$PW_SETUP_SCRIPT_PATH" .sh)
91 _pw_bold_red "Error: Attempting to $_PW_NAME in a subshell"
92 _pw_red " Since $_PW_NAME.sh modifies your shell's environment variables, it"
93 _pw_red " must be sourced rather than executed. In particular, "
94 _pw_red " 'bash $_PW_NAME.sh' will not work since the modified environment "
95 _pw_red " will get destroyed at the end of the script. Instead, source the "
96 _pw_red " script's contents in your shell:"
97 _pw_red ""
98 _pw_red " \$ source $_PW_NAME.sh"
99 exit 1
100fi
101
Wyatt Hepler77bd6d22020-03-19 10:13:30 -0700102PW_ROOT="$(dirname "$PW_SETUP_SCRIPT_PATH")"
103
104if [[ "$PW_ROOT" = *" "* ]]; then
105 _pw_bold_red "Error: The Pigweed path contains spaces\n"
106 _pw_red " The path '$PW_ROOT' contains spaces. "
107 _pw_red " Pigweed's Python environment currently requires Pigweed to be "
108 _pw_red " at a path without spaces. Please checkout Pigweed in a directory "
109 _pw_red " without spaces and retry running bootstrap."
110 return
111fi
112
Rob Mohrcacb8772019-11-22 13:14:01 -0800113export PW_ROOT
114
Rob Mohr3352ccf2020-03-11 14:01:18 -0700115SETUP_SH="$PW_ROOT/pw_env_setup/.env_setup.sh"
Rob Mohr93825562020-01-02 15:20:50 -0800116
Rob Mohr34466c42020-03-10 12:04:14 -0700117if [ -z "$PW_ENVSETUP_QUIET" ]; then
118 _pw_green "\n WELCOME TO...\n"
119 _pw_bright_magenta "$_PIGWEED_BANNER\n"
120fi
Rob Mohrde7c77a2020-01-16 13:51:44 -0800121
Rob Mohr5898a9d2020-01-22 13:54:43 -0800122# Run full bootstrap when invoked as bootstrap, or env file is missing/empty.
Wyatt Hepler77bd6d22020-03-19 10:13:30 -0700123[ "$(basename "$PW_SETUP_SCRIPT_PATH")" = "bootstrap.sh" ] || \
124 [ ! -f "$SETUP_SH" ] || \
125 [ ! -s "$SETUP_SH" ]
126_PW_IS_BOOTSTRAP="$?"
Alexei Frolova137f972020-03-06 11:14:13 -0800127
Wyatt Hepler77bd6d22020-03-19 10:13:30 -0700128if [ "$_PW_IS_BOOTSTRAP" -eq 0 ]; then
Rob Mohrd679bde2020-03-18 09:27:17 -0700129 _PW_NAME="bootstrap"
130
Rob Mohr34466c42020-03-10 12:04:14 -0700131 if [ -z "$PW_ENVSETUP_QUIET" ]; then
132 _pw_green " BOOTSTRAP! Bootstrap may take a few minutes; please be patient.\n"
133 fi
Alexei Frolova137f972020-03-06 11:14:13 -0800134
Alexei Frolov426b9b82020-03-09 14:30:22 -0700135 # Allow forcing a specific version of Python for testing pursposes.
136 if [ -n "$PW_BOOTSTRAP_PYTHON" ]; then
137 PYTHON="$PW_BOOTSTRAP_PYTHON"
Alexei Frolova137f972020-03-06 11:14:13 -0800138 elif which python &> /dev/null; then
139 PYTHON=python
140 else
141 _pw_bold_red "Error: No system Python present\n"
142 _pw_red " Pigweed's bootstrap process requires a local system Python."
143 _pw_red " Please install Python on your system, add it to your PATH"
144 _pw_red " and re-try running bootstrap."
145 return
146 fi
147
Rob Mohrd596a532020-04-03 08:59:12 -0700148 _PW_OLD_CIPD_PACKAGE_FILES="$PW_CIPD_PACKAGE_FILES"
149 PW_CIPD_PACKAGE_FILES="$PW_ROOT/pw_env_setup/py/pw_env_setup/cipd_setup/*.json:$PW_CIPD_PACKAGE_FILES"
150 export PW_CIPD_PACKAGE_FILES
151
152 _PW_OLD_VIRTUALENV_REQUIREMENTS="$PW_VIRTUALENV_REQUIREMENTS"
153 PW_VIRTUALENV_REQUIREMENTS="$PW_ROOT/pw_env_setup/py/pw_env_setup/virtualenv_setup/requirements.txt:$PW_VIRTUALENV_REQUIREMENTS"
154 export PW_VIRTUALENV_REQUIREMENTS
155
156 _PW_OLD_VIRTUALENV_SETUP_PY_ROOTS="$PW_VIRTUALENV_SETUP_PY_ROOTS"
157 PW_VIRTUALENV_SETUP_PY_ROOTS="$PW_ROOT/*:$PW_VIRTUALENV_SETUP_PY_ROOTS"
158 export PW_VIRTUALENV_SETUP_PY_ROOTS
159
160 _PW_OLD_CARGO_PACKAGE_FILES="$PW_CARGO_PACKAGE_FILES"
161 PW_CARGO_PACKAGE_FILES="$PW_ROOT/pw_env_setup/py/pw_env_setup/cargo_setup/packages.txt:$PW_CARGO_PACKAGE_FILES"
162 export PW_CARGO_PACKAGE_FILES
163
Wyatt Hepler77bd6d22020-03-19 10:13:30 -0700164 "$PYTHON" "$PW_ROOT/pw_env_setup/py/pw_env_setup/env_setup.py" --shell-file "$SETUP_SH"
Rob Mohrd596a532020-04-03 08:59:12 -0700165
166
167 PW_CIPD_PACKAGE_FILES="$_PW_OLD_CIPD_PACKAGE_FILES"
168 PW_VIRTUALENV_REQUIREMENTS="$_PW_OLD_VIRTUALENV_REQUIREMENTS"
169 PW_VIRTUALENV_SETUP_PY_ROOTS="$_PW_OLD_VIRTUALENV_SETUP_PY_ROOTS"
170 PW_CARGO_PACKAGE_FILES="$_PW_OLD_CARGO_PACKAGE_FILES"
Alexei Frolova137f972020-03-06 11:14:13 -0800171else
Rob Mohrd679bde2020-03-18 09:27:17 -0700172 _PW_NAME="activate"
173
Rob Mohr34466c42020-03-10 12:04:14 -0700174 if [ -z "$PW_ENVSETUP_QUIET" ]; then
175 _pw_green " ACTIVATOR! This sets your shell environment variables.\n"
176 fi
Rob Mohr93825562020-01-02 15:20:50 -0800177fi
Rob Mohrdc70d1c2019-12-04 10:05:28 -0800178
Wyatt Hepler77bd6d22020-03-19 10:13:30 -0700179if [ -f "$SETUP_SH" ]; then
180 . "$SETUP_SH"
Alexei Frolova137f972020-03-06 11:14:13 -0800181
Wyatt Hepler77bd6d22020-03-19 10:13:30 -0700182 if [ "$?" -eq 0 ]; then
183 if [ "$_PW_IS_BOOTSTRAP" -eq 0 ] && [ -z "$PW_ENVSETUP_QUIET" ]; then
Rob Mohrd679bde2020-03-18 09:27:17 -0700184 echo "To activate this environment in the future, run this in your "
185 echo "terminal:"
186 echo
Rob Mohr6ac3f7d2020-03-27 12:43:28 -0700187 _pw_green " source ./activate.sh\n"
Rob Mohrd679bde2020-03-18 09:27:17 -0700188 fi
189 else
190 _pw_red "Error during $_PW_NAME--see messages above."
Rob Mohr47bd9232020-03-13 12:07:26 -0700191 fi
192else
Rob Mohrd679bde2020-03-18 09:27:17 -0700193 _pw_red "Error during $_PW_NAME--see messages above."
Alexei Frolova137f972020-03-06 11:14:13 -0800194fi
195
196unset _PW_IS_BOOTSTRAP
Rob Mohrd679bde2020-03-18 09:27:17 -0700197unset _PW_NAME
Alexei Frolova137f972020-03-06 11:14:13 -0800198unset _PIGWEED_BANNER
Rob Mohrd596a532020-04-03 08:59:12 -0700199unset _PW_OLD_CIPD_PACKAGE_FILES
200unset _PW_OLD_VIRTUALENV_REQUIREMENTS
201unset _PW_OLD_VIRTUALENV_SETUP_PY_ROOTS
202unset _PW_OLD_CARGO_PACKAGE_FILES
Alexei Frolova137f972020-03-06 11:14:13 -0800203unset _pw_abspath
204unset _pw_red
205unset _pw_bold_red
206unset _pw_green
207unset _pw_bright_magenta
Rob Mohr6ac3f7d2020-03-27 12:43:28 -0700208unset _pw_sourced