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