blob: 99dcad0f4be0830146694260b4a11beda9d40f9a [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
Rob Mohr895d3df2020-10-14 08:42:39 -070017_bootstrap_abspath () {
Rob Mohr248903c2021-04-19 11:30:29 -070018 $(command -v python3 || command -v python2 || command -v python) -c "import os.path; print(os.path.abspath('$@'))"
Rob Mohrdc70d1c2019-12-04 10:05:28 -080019}
20
Rob Mohr323f7c42020-02-06 14:38:37 -080021# Users are not expected to set PW_CHECKOUT_ROOT, it's only used because it
22# seems to be impossible to reliably determine the path to a sourced file in
23# dash when sourced from a dash script instead of a dash interactive prompt.
24# To reinforce that users should not be using PW_CHECKOUT_ROOT, it is cleared
25# here after it is used, and other pw tools will complain if they see that
26# variable set.
27# TODO(mohrr) find out a way to do this without PW_CHECKOUT_ROOT.
28if test -n "$PW_CHECKOUT_ROOT"; then
Rob Mohrdfdce522021-04-02 12:02:43 -070029 _PW_BOOTSTRAP_PATH="$(_bootstrap_abspath "$PW_CHECKOUT_ROOT/bootstrap.sh")"
Rob Mohr895d3df2020-10-14 08:42:39 -070030 # Downstream projects need to set PW_CHECKOUT_ROOT to point to Pigweed if
31 # they're using Pigweed's CI/CQ system.
Rob Mohr323f7c42020-02-06 14:38:37 -080032 unset PW_CHECKOUT_ROOT
Rob Mohrcacb8772019-11-22 13:14:01 -080033# Shell: bash.
Rob Mohr323f7c42020-02-06 14:38:37 -080034elif test -n "$BASH"; then
Rob Mohrdfdce522021-04-02 12:02:43 -070035 _PW_BOOTSTRAP_PATH="$(_bootstrap_abspath "$BASH_SOURCE")"
Rob Mohrcacb8772019-11-22 13:14:01 -080036# Shell: zsh.
37elif test -n "$ZSH_NAME"; then
Rob Mohrdfdce522021-04-02 12:02:43 -070038 _PW_BOOTSTRAP_PATH="$(_bootstrap_abspath "${(%):-%N}")"
Rob Mohrcacb8772019-11-22 13:14:01 -080039# Shell: dash.
40elif test ${0##*/} = dash; then
Rob Mohrdfdce522021-04-02 12:02:43 -070041 _PW_BOOTSTRAP_PATH="$(_bootstrap_abspath \
Wyatt Hepler77bd6d22020-03-19 10:13:30 -070042 "$(lsof -p $$ -Fn0 | tail -1 | sed 's#^[^/]*##;')")"
Rob Mohrcacb8772019-11-22 13:14:01 -080043# If everything else fails, try $0. It could work.
44else
Rob Mohrdfdce522021-04-02 12:02:43 -070045 _PW_BOOTSTRAP_PATH="$(_bootstrap_abspath "$0")"
Rob Mohrcacb8772019-11-22 13:14:01 -080046fi
47
Rob Mohr6ac3f7d2020-03-27 12:43:28 -070048# Check if this file is being executed or sourced.
49_pw_sourced=0
50if [ -n "$SWARMING_BOT_ID" ]; then
51 # If set we're running on swarming and don't need this check.
52 _pw_sourced=1
53elif [ -n "$ZSH_EVAL_CONTEXT" ]; then
54 case $ZSH_EVAL_CONTEXT in *:file) _pw_sourced=1;; esac
55elif [ -n "$KSH_VERSION" ]; then
56 [ "$(cd $(dirname -- $0) && pwd -P)/$(basename -- $0)" != \
57 "$(cd $(dirname -- ${.sh.file}) && pwd -P)/$(basename -- ${.sh.file})" ] \
58 && _pw_sourced=1
59elif [ -n "$BASH_VERSION" ]; then
60 (return 0 2>/dev/null) && _pw_sourced=1
61else # All other shells: examine $0 for known shell binary filenames
62 # Detects `sh` and `dash`; add additional shell filenames as needed.
63 case ${0##*/} in sh|dash) _pw_sourced=1;; esac
64fi
65
Rob Mohr895d3df2020-10-14 08:42:39 -070066# Downstream projects need to set something other than PW_ROOT here, like
67# YOUR_PROJECT_ROOT. Please also set PW_ROOT before invoking pw_bootstrap or
68# pw_activate.
Rob Mohrdfdce522021-04-02 12:02:43 -070069PW_ROOT="$(dirname "$_PW_BOOTSTRAP_PATH")"
Rob Mohrcacb8772019-11-22 13:14:01 -080070export PW_ROOT
71
Rob Mohrfcf60372020-11-04 11:41:36 -080072# Please also set PW_PROJECT_ROOT to YOUR_PROJECT_ROOT.
73PW_PROJECT_ROOT="$PW_ROOT"
74export PW_PROJECT_ROOT
75
Rob Mohr895d3df2020-10-14 08:42:39 -070076. "$PW_ROOT/pw_env_setup/util.sh"
77
Rob Mohr428e4792020-10-27 11:46:43 -070078pw_deactivate
Rob Mohrdfdce522021-04-02 12:02:43 -070079pw_eval_sourced "$_pw_sourced" "$_PW_BOOTSTRAP_PATH"
Rob Mohr895d3df2020-10-14 08:42:39 -070080pw_check_root "$PW_ROOT"
81_PW_ACTUAL_ENVIRONMENT_ROOT="$(pw_get_env_root)"
Anthony DiGirolamo00cb5b22020-10-19 14:03:11 -070082export _PW_ACTUAL_ENVIRONMENT_ROOT
Rob Mohre34001c2020-07-29 09:05:55 -070083SETUP_SH="$_PW_ACTUAL_ENVIRONMENT_ROOT/activate.sh"
Rob Mohr93825562020-01-02 15:20:50 -080084
Rob Mohr895d3df2020-10-14 08:42:39 -070085# Downstream projects may wish to set PW_BANNER_FUNC to a function that prints
86# an ASCII art banner here.
Rob Mohrde7c77a2020-01-16 13:51:44 -080087
Rob Mohr5898a9d2020-01-22 13:54:43 -080088# Run full bootstrap when invoked as bootstrap, or env file is missing/empty.
Rob Mohrdfdce522021-04-02 12:02:43 -070089if [ "$(basename "$_PW_BOOTSTRAP_PATH")" = "bootstrap.sh" ] || \
Wyatt Hepler77bd6d22020-03-19 10:13:30 -070090 [ ! -f "$SETUP_SH" ] || \
Michael Spangf046fee2020-09-09 18:16:13 -040091 [ ! -s "$SETUP_SH" ]; then
Rob Mohr1d2ffdf2021-05-12 14:44:45 -070092 pw_bootstrap --shell-file "$SETUP_SH" --install-dir "$_PW_ACTUAL_ENVIRONMENT_ROOT" --config-file "$PW_ROOT/pw_env_setup/config.json"
Rob Mohr895d3df2020-10-14 08:42:39 -070093 pw_finalize bootstrap "$SETUP_SH"
Michael Spangf046fee2020-09-09 18:16:13 -040094else
Rob Mohr895d3df2020-10-14 08:42:39 -070095 pw_activate
96 pw_finalize activate "$SETUP_SH"
Michael Spangf046fee2020-09-09 18:16:13 -040097fi
Alexei Frolova137f972020-03-06 11:14:13 -080098
Rob Mohr6ac3f7d2020-03-27 12:43:28 -070099unset _pw_sourced
Rob Mohrdfdce522021-04-02 12:02:43 -0700100unset _PW_BOOTSTRAP_PATH
Rob Mohr895d3df2020-10-14 08:42:39 -0700101unset SETUP_SH
102unset _bootstrap_abspath
103
104pw_cleanup