systemlibs: Add syslibs_configure repository_rule to generate if_system_lib macros
Signed-off-by: Jason Zaman <jason@perfinion.com>
This commit is contained in:
parent
17b1f8aa29
commit
b5499a3f84
0
third_party/systemlibs/BUILD.tpl
vendored
Normal file
0
third_party/systemlibs/BUILD.tpl
vendored
Normal file
32
third_party/systemlibs/build_defs.bzl.tpl
vendored
Normal file
32
third_party/systemlibs/build_defs.bzl.tpl
vendored
Normal file
@ -0,0 +1,32 @@
|
||||
# -*- Python -*-
|
||||
"""Skylark macros for system libraries.
|
||||
"""
|
||||
|
||||
SYSTEM_LIBS_ENABLED = %{syslibs_enabled}
|
||||
|
||||
SYSTEM_LIBS_LIST = [
|
||||
%{syslibs_list}
|
||||
]
|
||||
|
||||
|
||||
def if_any_system_libs(a, b=[]):
|
||||
"""Conditional which evaluates to 'a' if any system libraries are configured."""
|
||||
if SYSTEM_LIBS_ENABLED:
|
||||
return a
|
||||
else:
|
||||
return b
|
||||
|
||||
|
||||
def if_system_lib(lib, a, b=[]):
|
||||
"""Conditional which evaluates to 'a' if we're using the system version of lib"""
|
||||
|
||||
if SYSTEM_LIBS_ENABLED and lib in SYSTEM_LIBS_LIST:
|
||||
return a
|
||||
else:
|
||||
return b
|
||||
|
||||
|
||||
def if_not_system_lib(lib, a, b=[]):
|
||||
"""Conditional which evaluates to 'a' if we're using the system version of lib"""
|
||||
|
||||
return if_system_lib(lib, b, a)
|
159
third_party/systemlibs/syslibs_configure.bzl
vendored
Normal file
159
third_party/systemlibs/syslibs_configure.bzl
vendored
Normal file
@ -0,0 +1,159 @@
|
||||
# -*- 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=[
|
||||
"astor_archive",
|
||||
"com_googlesource_code_re2",
|
||||
"curl",
|
||||
"cython",
|
||||
"flatbuffers",
|
||||
"gif_archive",
|
||||
"grpc",
|
||||
"jemalloc",
|
||||
"jpeg",
|
||||
"lmdb",
|
||||
"nasm",
|
||||
"org_sqlite",
|
||||
"pcre",
|
||||
"png_archive",
|
||||
"six_archive",
|
||||
"snappy",
|
||||
"swig",
|
||||
"termcolor_archive",
|
||||
"zlib_archive",
|
||||
]
|
||||
|
||||
|
||||
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 l in list(libenv.split(',')):
|
||||
l = l.strip()
|
||||
if l == "":
|
||||
continue
|
||||
if l not in VALID_LIBS:
|
||||
auto_configure_fail("Invalid system lib set: %s" % l)
|
||||
return []
|
||||
libs.append(l)
|
||||
|
||||
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 l in libs:
|
||||
ret += "'%s',\n" % l
|
||||
|
||||
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.
|
||||
"""
|
Loading…
Reference in New Issue
Block a user