1
1
import argparse
2
2
import glob
3
3
import io
4
+ import logging
4
5
import os
5
6
import re
6
7
import shutil
16
17
import urllib .parse
17
18
import urllib .request
18
19
20
+ logger = logging .getLogger (__name__ )
21
+
19
22
# Ideally, we could include these files by putting them in a
20
23
# MANIFEST.in or using the package_data argument to setup, but the
21
24
# MANIFEST.in gets applied at the very beginning when setup.py runs
22
25
# before these files have been created, so we have to move the files
23
26
# manually.
24
27
25
28
SUPPORTED_PYTHONS = [(3 , 5 ), (3 , 6 ), (3 , 7 ), (3 , 8 )]
29
+ SUPPORTED_BAZEL = (3 , 2 , 0 )
26
30
27
31
ROOT_DIR = os .path .dirname (__file__ )
28
32
BUILD_JAVA = os .getenv ("RAY_INSTALL_JAVA" ) == "1"
@@ -129,6 +133,28 @@ def is_invalid_windows_platform():
129
133
return platform == "msys" or (platform == "win32" and ver and "GCC" in ver )
130
134
131
135
136
+ # Calls Bazel in PATH, falling back to the standard user installatation path
137
+ # (~/.bazel/bin/bazel) if it isn't found.
138
+ def bazel_invoke (invoker , cmdline , * args , ** kwargs ):
139
+ home = os .path .expanduser ("~" )
140
+ candidates = ["bazel" ]
141
+ if sys .platform == "win32" :
142
+ mingw_dir = os .getenv ("MINGW_DIR" )
143
+ if mingw_dir :
144
+ candidates .append (mingw_dir + "/bin/bazel.exe" )
145
+ else :
146
+ candidates .append (os .path .join (home , ".bazel" , "bin" , "bazel" ))
147
+ result = None
148
+ for i , cmd in enumerate (candidates ):
149
+ try :
150
+ result = invoker ([cmd ] + cmdline , * args , ** kwargs )
151
+ break
152
+ except IOError :
153
+ if i >= len (candidates ) - 1 :
154
+ raise
155
+ return result
156
+
157
+
132
158
def download (url ):
133
159
try :
134
160
result = urllib .request .urlopen (url ).read ()
@@ -221,12 +247,19 @@ def build(build_python, build_java):
221
247
] + pip_packages ,
222
248
env = dict (os .environ , CC = "gcc" ))
223
249
224
- bazel = os .getenv ("BAZEL_EXECUTABLE" , "bazel" )
250
+ version_info = bazel_invoke (subprocess .check_output , ["--version" ])
251
+ bazel_version_str = version_info .rstrip ().decode ("utf-8" ).split (" " , 1 )[1 ]
252
+ bazel_version = tuple (map (int , bazel_version_str .split ("." )))
253
+ if bazel_version <= SUPPORTED_BAZEL :
254
+ logger .warning ("Expected Bazel version {} but found {}" ,
255
+ bazel_version , SUPPORTED_BAZEL )
256
+
225
257
bazel_targets = []
226
258
bazel_targets += ["//:ray_pkg" ] if build_python else []
227
259
bazel_targets += ["//java:ray_java_pkg" ] if build_java else []
228
- return subprocess .check_call (
229
- [bazel , "build" , "--verbose_failures" , "--" ] + bazel_targets ,
260
+ return bazel_invoke (
261
+ subprocess .check_call ,
262
+ ["build" , "--verbose_failures" , "--" ] + bazel_targets ,
230
263
env = bazel_env )
231
264
232
265
@@ -318,7 +351,8 @@ def pip_run(build_ext):
318
351
319
352
def api_main (program , * args ):
320
353
parser = argparse .ArgumentParser ()
321
- parser .add_argument ("command" , type = str , choices = ["build" , "help" ])
354
+ choices = ["build" , "bazel_version" , "help" ]
355
+ parser .add_argument ("command" , type = str , choices = choices )
322
356
parser .add_argument (
323
357
"-l" ,
324
358
"--language" ,
@@ -341,6 +375,8 @@ def api_main(program, *args):
341
375
else :
342
376
raise ValueError ("invalid language: {!r}" .format (lang ))
343
377
result = build (** kwargs )
378
+ elif parsed_args .command == "bazel_version" :
379
+ print ("." .join (map (str , SUPPORTED_BAZEL )))
344
380
elif parsed_args .command == "help" :
345
381
parser .print_help ()
346
382
else :
0 commit comments