python/py_extension.bzl (42 lines of code) (raw):

def py_extension( name = None, srcs = None, hdrs = None, data = None, visibility = None, deps = None): """Creates a Python module implemented in C++. Python modules can depend on a py_extension. Other py_extensions can depend on a generated C++ library named with "_cc" suffix. Args: name: Name for this target. srcs: C++ source files. hdrs: C++ header files, for other py_extensions which depend on this. data: Files needed at runtime. This may include Python libraries. visibility: Controls which rules can depend on this. deps: Other C++ libraries that this library depends upon. """ cc_library_name = name + "_cc" cc_binary_name = name + ".so" native.cc_library( name = cc_library_name, srcs = srcs, hdrs = hdrs, data = data, visibility = visibility, deps = deps, alwayslink = True, ) native.cc_binary( name = cc_binary_name, linkshared = True, linkstatic = True, visibility = ["//visibility:private"], deps = [cc_library_name], ) native.py_library( name = name, srcs_version = "PY3", data = [cc_binary_name], visibility = visibility, )