blob: b75afeb8323f1d3b559a741fd2a7cfb042ec1618 [file] [log] [blame]
#!/bin/bash
# Copyright 2018 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
### run various checks to determine the health of a Fuchsia checkout
## usage: fx doctor
# The goal of this script is to detect common issues with a Fuchsia
# checkout and potential conflicts in the user's shell environment.
#
# For example, on OS X the xcode command line tool
# installation often lapses. Ensuring that `xcode select --install` is
# run as part of a checkout or build is problematic: the step involves
# manual input. Detecting that it needs to be run, however, is
# perfectly mechanizable.
#
# For potential issues in the user's shell initialization script
# (such as ~/.bashrc), this script will also run a shell checkup
# script (for example, devshell/lib/bashrc_checkup.sh)
# under the user's bash "${SHELL}" (if different from /bin/bash),
# load the user's shell settings, and check for any known issues.
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/vars.sh || exit $?
source "${FUCHSIA_DIR}/tools/devshell/lib/style.sh" || exit $?
source "${FUCHSIA_DIR}/tools/devshell/lib/common_term_styles.sh" || exit $?
fx-config-read || exit $?
dr_mac() {
local status=0
local xcode_path=$(xcode-select --print-path)
local expected_path='/Library/Developer/CommandLineTools'
local required_subpath='usr/include/c++'
if [[ ! -d "${xcode_path}/${required_subpath}" ]]; then
if [[ "${xcode_path}" != "${expected_path}" ]] && \
[[ -d "${expected_path}/${required_subpath}" ]]; then
warn "You may need to run \`sudo xcode-select --switch \"${expected_path}\"\`"
else
warn "Make sure you've run \`sudo xcode-select --install\`"
fi
details << EOF
A common issue with Fuchsia development on macOS is needing to
re-run the \`xcode-select\` command. The typical symptom is
failure to find system C or C++ headers after a reboot or update.
If the XCode Command Line Tools are missing, install them with:
EOF
code << EOF
sudo xcode-select --install
EOF
details << EOF
If the XCode Command Line Tools are already installed, but XCode
is configured to use the wrong path (e.g., an Xcode application
directory, instead of the "CommandLineTools", which you can
verify with \`xcode-select --print-path\`) then you may need to
"switch" to the CommandLineTools, using:
EOF
code << EOF
sudo xcode-select --switch "${expected_path}"
EOF
details << EOF
See $(link 'https://fuchsia.googlesource.com/fuchsia/+/master/docs/getting_started.md#macos')
for more details.
EOF
fi
return ${status}
}
dr_linux() {
local status=0
return ${status}
}
shell_checkup() {
local status=0
# If the user is using bash, their default interactive "${SHELL}"
# may differ from the script-standard "/bin/bash", and their ~/.bashrc
# may depend on features of their shell that are not present in
# /bin/bash, so launch the shell checkup script using "${SHELL}".
#
# For example, since MacOS includes only bash version 3, Homebrew users
# may install bash 4 in /usr/local/bin/bash, and then select
# bash 4 by adding it to /etc/shells, and running the "chsh" command.
local shell_type="$(basename "${SHELL}")"
case "${shell_type}" in
bash)
local current_debug_flag="$(echo $-|sed -n 's/.*x.*/-x/p')"
eval "${SHELL}" "${current_debug_flag}" "${FUCHSIA_DIR}/tools/devshell/lib/bashrc_checkup.sh" || status=$?
;;
*)
info "No shell checkup for ${shell_type}"
;;
esac
return ${status}
}
dr_all() {
local status=0
shell_checkup || status=$?
return ${status}
}
main() {
local status=0
case $(uname) in
Darwin)
dr_mac || status=$?
;;
Linux)
dr_linux || status=$?
;;
esac
dr_all || status=$?
if (( ${status} == 0 )); then
info "No known issues were found. You appear to be in good health!"
fi
return ${status}
}
main "$@" || exit $?