blob: 4b18bf3578d77e86826244243b9e09c61cbbf8da [file] [log] [blame]
Geoffrey Irving4c85a082016-03-16 12:20:34 -08001#!/usr/bin/env bash
A. Unique TensorFlower122cdce2016-06-02 12:32:54 -08002# Copyright 2015 The TensorFlow Authors. All Rights Reserved.
Vijay Vasudevana4806a32015-12-03 10:26:25 -08003#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15# ==============================================================================
Vijay Vasudevanbf6b5362015-12-02 15:04:40 -080016
17set -e -o errexit
18
Vijay Vasudevan8cc567b2016-05-26 11:05:13 -080019if [ -d "../org_tensorflow" ]; then
20 script_path="../org_tensorflow"
21else
22 # Prefix expected paths with ./ locally and external/reponame/ for remote repos.
23 # TODO(kchodorow): remove once runfiles paths are fixed, see
24 # https://github.com/bazelbuild/bazel/issues/848.
25 script_path=$(dirname $(dirname $(dirname "$0")))
26 script_path=${script_path:-.}
27fi
28
Martin Wicke59f1eba2016-02-07 12:34:25 -080029EXPECTED_PATHS="$script_path/util/python/python_include"\
30" $script_path/util/python/python_lib"\
31" $script_path/third_party/py/numpy/numpy_include"
Vijay Vasudevanbf6b5362015-12-02 15:04:40 -080032
33function main {
34 argument="$1"
35 shift
36 case $argument in
37 --check)
38 check_python
39 exit 0
40 ;;
41 --setup)
42 setup_python "$1"
43 exit 0
44 ;;
45 esac
46}
47
Olivia Nordquist4959a122016-08-09 11:16:44 -080048function python_path {
Patrick Nguyenc5ab3dd2016-10-20 12:09:18 -080049 "$PYTHON_BIN_PATH" - <<END
Olivia Nordquist4959a122016-08-09 11:16:44 -080050from __future__ import print_function
51import site
52import os
53
54try:
55 input = raw_input
56except NameError:
57 pass
58
59python_paths = []
60if os.getenv('PYTHONPATH') is not None:
61 python_paths = os.getenv('PYTHONPATH').split(':')
Olivia Nordquist308e34f2016-08-23 09:27:27 -080062try:
Dan Mané54a71782016-09-09 16:07:46 -080063 library_paths = site.getsitepackages()
Olivia Nordquist308e34f2016-08-23 09:27:27 -080064except AttributeError:
65 from distutils.sysconfig import get_python_lib
Dan Mané54a71782016-09-09 16:07:46 -080066 library_paths = [get_python_lib()]
Olivia Nordquist308e34f2016-08-23 09:27:27 -080067all_paths = set(python_paths + library_paths)
Olivia Nordquist4959a122016-08-09 11:16:44 -080068
69paths = []
70for path in all_paths:
71 if os.path.isdir(path):
72 paths.append(path)
73
74if len(paths) == 1:
75 print(paths[0])
Benoit Steiner8b3d8c82016-08-16 14:01:13 -080076else:
Patrick Nguyenc5ab3dd2016-10-20 12:09:18 -080077 ret_paths = ",".join(paths)
Benoit Steiner8b3d8c82016-08-16 14:01:13 -080078 print(ret_paths)
Olivia Nordquist4959a122016-08-09 11:16:44 -080079END
80}
81
82function default_python_path {
Patrick Nguyenc5ab3dd2016-10-20 12:09:18 -080083 PYTHON_ARG="$1" "$PYTHON_BIN_PATH" - <<END
Olivia Nordquist4959a122016-08-09 11:16:44 -080084from __future__ import print_function
85import os
86
87default = os.getenv('PYTHON_ARG')
88default = str(default)
89print(default)
90END
91}
92
Vijay Vasudevanbf6b5362015-12-02 15:04:40 -080093function setup_python {
94 PYTHON_BIN_PATH="$1";
95
96 if [ -z "$PYTHON_BIN_PATH" ]; then
97 echo "PYTHON_BIN_PATH was not provided. Did you run configure?"
98 exit 1
99 fi
100 if [ ! -x "$PYTHON_BIN_PATH" ] || [ -d "$PYTHON_BIN_PATH" ]; then
101 echo "PYTHON_BIN_PATH is not executable. Is it the python binary?"
102 exit 1
103 fi
104
Vijay Vasudevaneb5e56e2015-12-03 14:39:42 -0800105 local python_major_version=$("${PYTHON_BIN_PATH}" -c 'from __future__ import print_function; import sys; print(sys.version_info[0]);')
106 if [ "$python_major_version" == "" ]; then
107 echo -e "\n\nERROR: Problem getting python version. Is $PYTHON_BIN_PATH the correct python binary?"
108 exit 1
109 fi
110
Patrick Nguyenc5ab3dd2016-10-20 12:09:18 -0800111 local python_include="$("${PYTHON_BIN_PATH}" -c 'from __future__ import print_function; from distutils import sysconfig; print(sysconfig.get_python_inc());')"
Vijay Vasudevanbf6b5362015-12-02 15:04:40 -0800112 if [ "$python_include" == "" ]; then
113 echo -e "\n\nERROR: Problem getting python include path. Is distutils installed?"
114 exit 1
115 fi
Xiaoqiang Zhenge2d51a82016-10-28 10:29:28 -0800116
117 if [ -z "$PYTHON_LIB_PATH" ]; then
118 local python_lib_path
119 # Split python_path into an array of paths, this allows path containing spaces
120 IFS=','
121 python_lib_path=($(python_path))
122 unset IFS
Benoit Steinera7715982016-11-09 13:14:03 -0800123
124 if [ 1 = "$USE_DEFAULT_PYTHON_LIB_PATH" ]; then
Xiaoqiang Zhenge2d51a82016-10-28 10:29:28 -0800125 PYTHON_LIB_PATH="$(default_python_path "${python_lib_path[0]}")"
Benoit Steinera7715982016-11-09 13:14:03 -0800126 echo "Using python library path: $PYTHON_LIB_PATH"
127
Olivia Nordquist4959a122016-08-09 11:16:44 -0800128 else
Benoit Steinera7715982016-11-09 13:14:03 -0800129 echo "Found possible Python library paths:"
130 for x in "${python_lib_path[@]}"; do
131 echo " $x"
132 done
133 set -- "${python_lib_path[@]}"
134 echo "Please input the desired Python library path to use. Default is ["$1"]"
135 read b || true
136 if [ "$b" == "" ]; then
137 PYTHON_LIB_PATH="$(default_python_path "${python_lib_path[0]}")"
138 echo "Using python library path: $PYTHON_LIB_PATH"
139 else
140 PYTHON_LIB_PATH="$b"
141 fi
Olivia Nordquist4959a122016-08-09 11:16:44 -0800142 fi
Vijay Vasudevanbf6b5362015-12-02 15:04:40 -0800143 fi
Benoit Steinera7715982016-11-09 13:14:03 -0800144
Xiaoqiang Zhenge2d51a82016-10-28 10:29:28 -0800145 if test -d "$PYTHON_LIB_PATH" -a -x "$PYTHON_LIB_PATH"; then
146 python_lib="$PYTHON_LIB_PATH"
147 else
148 echo -e "\n\nERROR: Invalid python library path: ${PYTHON_LIB_PATH}."
149 exit 1
150 fi
Olivia Nordquist4959a122016-08-09 11:16:44 -0800151
Vijay Vasudevanbf6b5362015-12-02 15:04:40 -0800152 local numpy_include=$("${PYTHON_BIN_PATH}" -c 'from __future__ import print_function; import numpy; print(numpy.get_include());')
153 if [ "$numpy_include" == "" ]; then
154 echo -e "\n\nERROR: Problem getting numpy include path. Is numpy installed?"
155 exit 1
156 fi
157
158 for x in $EXPECTED_PATHS; do
159 if [ -e "$x" ]; then
Martin Wicke999b7942016-09-21 13:16:48 -0800160 rm -rf "$x"
Vijay Vasudevanbf6b5362015-12-02 15:04:40 -0800161 fi
162 done
163
Patrick Nguyenc5ab3dd2016-10-20 12:09:18 -0800164# ln -sf is actually implemented as copying in msys since creating symbolic
165# links is privileged on Windows. But copying is too slow, so invoke mklink
166# to create junctions on Windows.
167 if is_windows; then
168 cmd /c "mklink /J util\\python\\python_include \"${python_include}\""
169 cmd /c "mklink /J util\\python\\python_lib \"${python_lib}\""
170 cmd /c "mklink /J third_party\\py\\numpy\\numpy_include \"${numpy_include}\""
171 else
172 ln -sf "${python_include}" util/python/python_include
173 ln -sf "${python_lib}" util/python/python_lib
174 ln -sf "${numpy_include}" third_party/py/numpy/numpy_include
175 fi
176 # Convert python path to Windows style before writing into bazel.rc
177 if is_windows; then
178 PYTHON_BIN_PATH="$(cygpath -m "$PYTHON_BIN_PATH")"
179 fi
Vijay Vasudevaneb5e56e2015-12-03 14:39:42 -0800180
181 # Write tools/bazel.rc
182 echo "# Autogenerated by configure: DO NOT EDIT" > tools/bazel.rc
183 sed -e "s/\$PYTHON_MAJOR_VERSION/$python_major_version/g" \
Martin Wickebc456e32017-03-23 12:31:16 -0800184 -e "s|\$PYTHON_BINARY|\"$PYTHON_BIN_PATH\"|g" \
Vijay Vasudevaneb5e56e2015-12-03 14:39:42 -0800185 tools/bazel.rc.template >> tools/bazel.rc
Vijay Vasudevan019c6792015-12-10 10:15:38 -0800186 # Write tools/python_bin_path.sh
Patrick Nguyenc5ab3dd2016-10-20 12:09:18 -0800187 echo "export PYTHON_BIN_PATH=\"$PYTHON_BIN_PATH\"" > tools/python_bin_path.sh
Vijay Vasudevanbf6b5362015-12-02 15:04:40 -0800188}
189
Martin Wicke999b7942016-09-21 13:16:48 -0800190PLATFORM="$(uname -s | tr 'A-Z' 'a-z')"
191function is_windows() {
192 # On windows, the shell script is actually running in msys
193 if [[ "${PLATFORM}" =~ msys_nt* ]]; then
194 true
195 else
196 false
197 fi
198}
199
Vijay Vasudevanbf6b5362015-12-02 15:04:40 -0800200function check_python {
201 for x in $EXPECTED_PATHS; do
202 if [ ! -e "$x" ]; then
203 echo -e "\n\nERROR: Cannot find '${x}'. Did you run configure?\n\n" 1>&2
204 exit 1
205 fi
Martin Wicke999b7942016-09-21 13:16:48 -0800206 # Don't check symbolic link on Windows
207 if ! is_windows && [ ! -L "${x}" ]; then
Vijay Vasudevanbf6b5362015-12-02 15:04:40 -0800208 echo -e "\n\nERROR: '${x}' is not a symbolic link. Internal error.\n\n" 1>&2
209 exit 1
210 fi
Patrick Nguyenc5ab3dd2016-10-20 12:09:18 -0800211 if is_windows; then
212 # In msys, readlink <path> doesn't work, because no symbolic link on
213 # Windows. readlink -f <path> returns the real path of a junction.
214 true_path=$(readlink -f "${x}")
215 else
216 true_path=$(readlink "${x}")
217 fi
Vijay Vasudevanbf6b5362015-12-02 15:04:40 -0800218 if [ ! -d "${true_path}" ]; then
219 echo -e "\n\nERROR: '${x}' does not refer to an existing directory: ${true_path}. Do you need to rerun configure?\n\n" 1>&2
220 exit 1
221 fi
222 done
223}
224
225main "$@"