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:
Jason Zaman 2018-06-26 00:43:07 +08:00
parent 17b1f8aa29
commit b5499a3f84
3 changed files with 191 additions and 0 deletions

0
third_party/systemlibs/BUILD.tpl vendored Normal file
View File

View 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)

View 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.
"""