| load("@rules_cc//cc:cc_library.bzl", "cc_library") |
| load("@rules_cc//cc:cc_shared_library.bzl", "cc_shared_library") |
| load("//python:py_test.bzl", "py_test") |
| |
| # buildifier: disable=bzl-visibility |
| load("//python/cc:py_extension.bzl", "py_extension") |
| load(":py_extension_build_test.bzl", "py_extension_build_test") |
| |
| package( |
| default_visibility = ["//tests/cc/py_extension:__subpackages__"], |
| ) |
| |
| licenses(["notice"]) |
| |
| ##### |
| |
| py_extension_build_test( |
| # An extension defined solely by source files, with no deps |
| name = "ext_source", |
| srcs = ["ext_source.c"], |
| ) |
| |
| ##### |
| |
| py_extension_build_test( |
| # A python extension that explicitly includes current_py_cc_headers in deps. |
| # Verifies that explicit current_py_cc_headers does not cause a duplicate label error. |
| name = "ext_explicit_headers", |
| srcs = ["ext_source.c"], |
| deps = [ |
| "@rules_python//python/cc:current_py_cc_headers", |
| ], |
| ) |
| |
| ##### |
| |
| py_extension_build_test( |
| # A python extension that includes current_py_cc_headers inside a select() in deps. |
| # Verifies that select() in deps works cleanly without duplicate label or type error. |
| name = "ext_explicit_headers_select", |
| srcs = ["ext_source.c"], |
| deps = select({ |
| "//conditions:default": ["@rules_python//python/cc:current_py_cc_headers"], |
| }), |
| ) |
| |
| ##### |
| |
| py_extension_build_test( |
| # A python extension that gets its code from a statically-linked library |
| name = "ext_static", |
| deps = [":static_dep"], |
| ) |
| |
| cc_library( |
| name = "static_dep", |
| srcs = ["static_dep.c"], |
| hdrs = ["static_dep.h"], |
| ) |
| |
| ##### |
| |
| py_extension_build_test( |
| # An extension that also depends on a data file |
| name = "ext_with_data", |
| data = ["some_data.txt"], |
| deps = [":static_dep"], |
| ) |
| |
| ##### |
| |
| py_extension_build_test( |
| # A python extension that dynamically links to another shared library |
| name = "ext_shared", |
| dynamic_deps = [ |
| ":add_one_shared", |
| ], |
| imports = ["."], |
| deps = [ |
| # |
| ":ext_shared_impl", |
| ], |
| ) |
| |
| cc_library( |
| name = "ext_shared_impl", |
| srcs = ["ext_shared.c"], |
| copts = [ |
| # Gemini says PIC is needed |
| "-fPIC", |
| "-fvisibility=hidden", |
| ], |
| deps = [ |
| #":add_one_headers", |
| # todo: if we put this here, we statically link add_one into the |
| # extension. |
| ":add_one_impl", |
| "@rules_python//python/cc:current_py_cc_headers", |
| ], |
| ) |
| |
| cc_shared_library( |
| name = "add_one_shared", |
| user_link_flags = select({ |
| "@platforms//os:windows": ["/EXPORT:add_one"], |
| "//conditions:default": [], |
| }), |
| deps = [":add_one_impl"], |
| ) |
| |
| cc_library( |
| name = "add_one_headers", |
| hdrs = ["add_one.h"], |
| ) |
| |
| cc_library( |
| name = "add_one_impl", |
| srcs = ["add_one.c"], |
| deps = [ |
| ":add_one_headers", |
| ":add_one_helper", |
| ], |
| ) |
| |
| cc_library( |
| name = "add_one_helper", |
| srcs = ["add_one_helper.c"], |
| hdrs = ["add_one_helper.h"], |
| ) |
| |
| ##### |
| |
| py_extension_build_test( |
| # An extension that uses the Python limited API |
| name = "ext_limited", |
| py_limited_api = "3.8", |
| deps = [":ext_limited_impl"], |
| ) |
| |
| cc_library( |
| name = "ext_limited_impl", |
| srcs = ["ext_limited.c"], |
| copts = [ |
| "-fPIC", |
| "-fvisibility=hidden", |
| ], |
| defines = ["Py_LIMITED_API=0x3080000"], |
| deps = [ |
| "@rules_python//python/cc:current_py_cc_headers", |
| ], |
| ) |
| |
| ##### |
| |
| py_extension_build_test( |
| # An extension with its PyInit_* function in a static dependency |
| name = "ext_init_in_dep", |
| deps = [":ext_init_in_dep_impl"], |
| ) |
| |
| cc_library( |
| name = "ext_init_in_dep_impl", |
| srcs = ["ext_init_in_dep.c"], |
| deps = [ |
| "@rules_python//python/cc:current_py_cc_headers", |
| ], |
| ) |
| |
| ##### |
| |
| py_test( |
| name = "py_extension_test", |
| srcs = ["py_extension_test.py"], |
| deps = [ |
| ":ext_shared", |
| "@dev_pip//pyelftools", |
| "@rules_python//python/runfiles", |
| ], |
| ) |
| |
| ##### |
| |
| py_extension( |
| name = "ext_pkg_test", |
| srcs = ["ext_pkg_test.c"], |
| ) |
| |
| py_test( |
| name = "py_extension_pkg_test", |
| srcs = ["py_extension_pkg_test.py"], |
| deps = [ |
| ":ext_pkg_test", |
| ], |
| ) |