blob: ccc515f03ea7310572613ab16761b408acfa627e [file] [log] [blame]
#!/bin/bash -e
# Copyright 2015 Google Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Initializes the Bazel workspace. Uses the GO environmental variables to pick
# the Go tool and falls back onto "$(which go)".
cd "$(dirname "$0")"
if [[ $(uname) == 'Darwin' ]]; then
LNOPTS="-sf"
realpath() {
python -c 'import os, sys; print os.path.realpath(sys.argv[2])' $@
}
readlink() {
if [[ -L "$2" ]]; then
python -c 'import os, sys; print os.readlink(sys.argv[2])' $@
else
echo $2
fi
}
else
LNOPTS="-sTf"
fi
if [[ -z "$GO" ]]; then
if [[ -z "$(which go)" ]]; then
echo 'You need to have go installed to build Kythe.'
echo 'Please see http://kythe.io/contributing for more information.'
exit 1
fi
if ! GO="$(readlink -e "$(which go)")"; then
echo 'ERROR: could not locate `go` binary on PATH' >&2
exit 1
fi
fi
echo "Using go found at $GO" >&2
ln ${LNOPTS} "$GO" tools/go/go
# This must be the same C++ compiler used to build the LLVM source.
if [[ -z "$CLANG" ]]; then
if [[ -z "$(which clang)" ]]; then
echo 'You need to have clang installed to build Kythe.'
echo 'Note: Some vendors install clang with a versioned name'
echo '(like /usr/bin/clang-3.5). You can set the CLANG environment'
echo 'variable to specify the full path to yours.'
echo 'Please see http://kythe.io/contributing for more information.'
exit 1
fi
CLANG="$(realpath -s $(which clang))"
fi
echo "Using clang found at ${CLANG}" >&2
# The C++ compiler looks at some fixed but version-specific paths in the local
# filesystem for headers. We can't predict where these will be on users'
# machines because (among other reasons) they sometimes include the version
# number of the compiler being used. We can interrogate Clang (and gcc, which
# thankfully has a similar enough output format) for these paths.
# We use realpath -s as well as readlink -e to allow compilers to employ various
# methods for path canonicalization (and because Bazel doesn't allow paths with
# relative arcs in its whitelist).
BUILTIN_INCLUDES=$(${CLANG} -E -x c++ - -v 2>&1 < /dev/null \
| sed -n '/search starts here\:/,/End of search list/p' \
| sed '/#include.*/d
/End of search list./d' \
| while read -r INCLUDE_PATH ; do
printf "%s" " cxx_builtin_include_directory: \"$(realpath -s ${INCLUDE_PATH})\"__EOL__"
if [[ $(uname) != 'Darwin' ]]; then
printf "%s" " cxx_builtin_include_directory: \"$(readlink -e ${INCLUDE_PATH})\"__EOL__"
fi
done)
sed "s|ADD_CXX_COMPILER|${CLANG}|g
s|ADD_CXX_BUILTIN_INCLUDE_DIRECTORIES|${BUILTIN_INCLUDES}|g" \
tools/cpp/CROSSTOOL.in | \
sed 's|__EOL__|\
|g' > tools/cpp/CROSSTOOL