174 lines
4.2 KiB
Python
174 lines
4.2 KiB
Python
"""Repository rule for system library autoconfiguration.
|
|
|
|
`syslibs_configure` depends on the following environment variables:
|
|
|
|
* `TF_SYSTEM_LIBS`: list of third party dependencies that should use
|
|
the system version instead
|
|
"""
|
|
|
|
_TF_SYSTEM_LIBS = "TF_SYSTEM_LIBS"
|
|
|
|
VALID_LIBS = [
|
|
"absl_py",
|
|
"astor_archive",
|
|
"astunparse_archive",
|
|
"boringssl",
|
|
"com_github_googlecloudplatform_google_cloud_cpp",
|
|
"com_github_grpc_grpc",
|
|
"com_google_protobuf",
|
|
"com_googlesource_code_re2",
|
|
"curl",
|
|
"cython",
|
|
"dill_archive",
|
|
"double_conversion",
|
|
"enum34_archive",
|
|
"flatbuffers",
|
|
"functools32_archive",
|
|
"gast_archive",
|
|
"gif",
|
|
"hwloc",
|
|
"icu",
|
|
"jsoncpp_git",
|
|
"libjpeg_turbo",
|
|
"lmdb",
|
|
"nasm",
|
|
"nsync",
|
|
"opt_einsum_archive",
|
|
"org_sqlite",
|
|
"pasta",
|
|
"pcre",
|
|
"png",
|
|
"pybind11",
|
|
"six_archive",
|
|
"snappy",
|
|
"tblib_archive",
|
|
"termcolor_archive",
|
|
"typing_extensions_archive",
|
|
"wrapt",
|
|
"zlib",
|
|
]
|
|
|
|
def auto_configure_fail(msg):
|
|
"""Output failure message when syslibs configuration fails."""
|
|
red = "\033[0;31m"
|
|
no_color = "\033[0m"
|
|
fail("\n%sSystem Library Configuration Error:%s %s\n" % (red, no_color, msg))
|
|
|
|
def _is_windows(repository_ctx):
|
|
"""Returns true if the host operating system is windows."""
|
|
os_name = repository_ctx.os.name.lower()
|
|
if os_name.find("windows") != -1:
|
|
return True
|
|
return False
|
|
|
|
def _enable_syslibs(repository_ctx):
|
|
s = repository_ctx.os.environ.get(_TF_SYSTEM_LIBS, "").strip()
|
|
if not _is_windows(repository_ctx) and s != None and s != "":
|
|
return True
|
|
return False
|
|
|
|
def _get_system_lib_list(repository_ctx):
|
|
"""Gets the list of deps that should use the system lib.
|
|
|
|
Args:
|
|
repository_ctx: The repository context.
|
|
|
|
Returns:
|
|
A string version of a python list
|
|
"""
|
|
if _TF_SYSTEM_LIBS not in repository_ctx.os.environ:
|
|
return []
|
|
|
|
libenv = repository_ctx.os.environ[_TF_SYSTEM_LIBS].strip()
|
|
libs = []
|
|
|
|
for lib in list(libenv.split(",")):
|
|
lib = lib.strip()
|
|
if lib == "":
|
|
continue
|
|
if lib not in VALID_LIBS:
|
|
auto_configure_fail("Invalid system lib set: %s" % lib)
|
|
return []
|
|
libs.append(lib)
|
|
|
|
return libs
|
|
|
|
def _format_system_lib_list(repository_ctx):
|
|
"""Formats the list of deps that should use the system lib.
|
|
|
|
Args:
|
|
repository_ctx: The repository context.
|
|
|
|
Returns:
|
|
A list of the names of deps that should use the system lib.
|
|
"""
|
|
libs = _get_system_lib_list(repository_ctx)
|
|
ret = ""
|
|
for lib in libs:
|
|
ret += "'%s',\n" % lib
|
|
|
|
return ret
|
|
|
|
def _tpl(repository_ctx, tpl, substitutions = {}, out = None):
|
|
if not out:
|
|
out = tpl.replace(":", "")
|
|
repository_ctx.template(
|
|
out,
|
|
Label("//third_party/systemlibs%s.tpl" % tpl),
|
|
substitutions,
|
|
False,
|
|
)
|
|
|
|
def _create_dummy_repository(repository_ctx):
|
|
"""Creates the dummy repository to build with all bundled libraries."""
|
|
|
|
_tpl(repository_ctx, ":BUILD")
|
|
_tpl(
|
|
repository_ctx,
|
|
":build_defs.bzl",
|
|
{
|
|
"%{syslibs_enabled}": "False",
|
|
"%{syslibs_list}": "",
|
|
},
|
|
)
|
|
|
|
def _create_local_repository(repository_ctx):
|
|
"""Creates the repository to build with system libraries."""
|
|
|
|
_tpl(repository_ctx, ":BUILD")
|
|
_tpl(
|
|
repository_ctx,
|
|
":build_defs.bzl",
|
|
{
|
|
"%{syslibs_enabled}": "True",
|
|
"%{syslibs_list}": _format_system_lib_list(repository_ctx),
|
|
},
|
|
)
|
|
|
|
def _syslibs_autoconf_impl(repository_ctx):
|
|
"""Implementation of the syslibs_configure repository rule."""
|
|
if not _enable_syslibs(repository_ctx):
|
|
_create_dummy_repository(repository_ctx)
|
|
else:
|
|
_create_local_repository(repository_ctx)
|
|
|
|
syslibs_configure = repository_rule(
|
|
implementation = _syslibs_autoconf_impl,
|
|
environ = [
|
|
_TF_SYSTEM_LIBS,
|
|
],
|
|
)
|
|
|
|
"""Configures the build to link to system libraries
|
|
instead of using bundled versions.
|
|
|
|
Add the following to your WORKSPACE FILE:
|
|
|
|
```python
|
|
syslibs_configure(name = "local_config_syslibs")
|
|
```
|
|
|
|
Args:
|
|
name: A unique name for this workspace rule.
|
|
"""
|