xref: /aosp_15_r20/external/grpc-grpc/src/python/grpcio_observability/setup.py (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1*cc02d7e2SAndroid Build Coastguard Worker# Copyright 2023 gRPC authors.
2*cc02d7e2SAndroid Build Coastguard Worker#
3*cc02d7e2SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
4*cc02d7e2SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
5*cc02d7e2SAndroid Build Coastguard Worker# You may obtain a copy of the License at
6*cc02d7e2SAndroid Build Coastguard Worker#
7*cc02d7e2SAndroid Build Coastguard Worker#     http://www.apache.org/licenses/LICENSE-2.0
8*cc02d7e2SAndroid Build Coastguard Worker#
9*cc02d7e2SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
10*cc02d7e2SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
11*cc02d7e2SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*cc02d7e2SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
13*cc02d7e2SAndroid Build Coastguard Worker# limitations under the License.
14*cc02d7e2SAndroid Build Coastguard Worker
15*cc02d7e2SAndroid Build Coastguard Workerimport os
16*cc02d7e2SAndroid Build Coastguard Workerimport os.path
17*cc02d7e2SAndroid Build Coastguard Workerimport platform
18*cc02d7e2SAndroid Build Coastguard Workerimport re
19*cc02d7e2SAndroid Build Coastguard Workerimport shlex
20*cc02d7e2SAndroid Build Coastguard Workerimport subprocess
21*cc02d7e2SAndroid Build Coastguard Workerfrom subprocess import PIPE
22*cc02d7e2SAndroid Build Coastguard Workerimport sys
23*cc02d7e2SAndroid Build Coastguard Workerimport sysconfig
24*cc02d7e2SAndroid Build Coastguard Worker
25*cc02d7e2SAndroid Build Coastguard Workerimport setuptools
26*cc02d7e2SAndroid Build Coastguard Workerfrom setuptools import Extension
27*cc02d7e2SAndroid Build Coastguard Workerfrom setuptools.command import build_ext
28*cc02d7e2SAndroid Build Coastguard Worker
29*cc02d7e2SAndroid Build Coastguard WorkerPYTHON_STEM = os.path.realpath(os.path.dirname(__file__))
30*cc02d7e2SAndroid Build Coastguard WorkerREADME_PATH = os.path.join(PYTHON_STEM, "README.rst")
31*cc02d7e2SAndroid Build Coastguard Worker
32*cc02d7e2SAndroid Build Coastguard Workeros.chdir(os.path.dirname(os.path.abspath(__file__)))
33*cc02d7e2SAndroid Build Coastguard Workersys.path.insert(0, os.path.abspath("."))
34*cc02d7e2SAndroid Build Coastguard Worker
35*cc02d7e2SAndroid Build Coastguard Workerimport _parallel_compile_patch
36*cc02d7e2SAndroid Build Coastguard Workerimport observability_lib_deps
37*cc02d7e2SAndroid Build Coastguard Worker
38*cc02d7e2SAndroid Build Coastguard Workerimport grpc_version
39*cc02d7e2SAndroid Build Coastguard Worker
40*cc02d7e2SAndroid Build Coastguard Worker_parallel_compile_patch.monkeypatch_compile_maybe()
41*cc02d7e2SAndroid Build Coastguard Worker
42*cc02d7e2SAndroid Build Coastguard WorkerCLASSIFIERS = [
43*cc02d7e2SAndroid Build Coastguard Worker    "Development Status :: 4 - Beta",
44*cc02d7e2SAndroid Build Coastguard Worker    "Programming Language :: Python",
45*cc02d7e2SAndroid Build Coastguard Worker    "Programming Language :: Python :: 3",
46*cc02d7e2SAndroid Build Coastguard Worker    "License :: OSI Approved :: Apache Software License",
47*cc02d7e2SAndroid Build Coastguard Worker]
48*cc02d7e2SAndroid Build Coastguard Worker
49*cc02d7e2SAndroid Build Coastguard WorkerO11Y_CC_SRCS = [
50*cc02d7e2SAndroid Build Coastguard Worker    "server_call_tracer.cc",
51*cc02d7e2SAndroid Build Coastguard Worker    "client_call_tracer.cc",
52*cc02d7e2SAndroid Build Coastguard Worker    "observability_util.cc",
53*cc02d7e2SAndroid Build Coastguard Worker    "python_census_context.cc",
54*cc02d7e2SAndroid Build Coastguard Worker    "sampler.cc",
55*cc02d7e2SAndroid Build Coastguard Worker    "rpc_encoding.cc",
56*cc02d7e2SAndroid Build Coastguard Worker]
57*cc02d7e2SAndroid Build Coastguard Worker
58*cc02d7e2SAndroid Build Coastguard Worker
59*cc02d7e2SAndroid Build Coastguard Workerdef _env_bool_value(env_name, default):
60*cc02d7e2SAndroid Build Coastguard Worker    """Parses a bool option from an environment variable"""
61*cc02d7e2SAndroid Build Coastguard Worker    return os.environ.get(env_name, default).upper() not in ["FALSE", "0", ""]
62*cc02d7e2SAndroid Build Coastguard Worker
63*cc02d7e2SAndroid Build Coastguard Worker
64*cc02d7e2SAndroid Build Coastguard Workerdef _is_alpine():
65*cc02d7e2SAndroid Build Coastguard Worker    """Checks if it's building Alpine"""
66*cc02d7e2SAndroid Build Coastguard Worker    os_release_content = ""
67*cc02d7e2SAndroid Build Coastguard Worker    try:
68*cc02d7e2SAndroid Build Coastguard Worker        with open("/etc/os-release", "r") as f:
69*cc02d7e2SAndroid Build Coastguard Worker            os_release_content = f.read()
70*cc02d7e2SAndroid Build Coastguard Worker        if "alpine" in os_release_content:
71*cc02d7e2SAndroid Build Coastguard Worker            return True
72*cc02d7e2SAndroid Build Coastguard Worker    except Exception:
73*cc02d7e2SAndroid Build Coastguard Worker        return False
74*cc02d7e2SAndroid Build Coastguard Worker
75*cc02d7e2SAndroid Build Coastguard Worker
76*cc02d7e2SAndroid Build Coastguard Worker# Environment variable to determine whether or not the Cython extension should
77*cc02d7e2SAndroid Build Coastguard Worker# *use* Cython or use the generated C files. Note that this requires the C files
78*cc02d7e2SAndroid Build Coastguard Worker# to have been generated by building first *with* Cython support.
79*cc02d7e2SAndroid Build Coastguard WorkerBUILD_WITH_CYTHON = _env_bool_value("GRPC_PYTHON_BUILD_WITH_CYTHON", "False")
80*cc02d7e2SAndroid Build Coastguard Worker
81*cc02d7e2SAndroid Build Coastguard Worker# Export this variable to force building the python extension with a statically linked libstdc++.
82*cc02d7e2SAndroid Build Coastguard Worker# At least on linux, this is normally not needed as we can build manylinux-compatible wheels on linux just fine
83*cc02d7e2SAndroid Build Coastguard Worker# without statically linking libstdc++ (which leads to a slight increase in the wheel size).
84*cc02d7e2SAndroid Build Coastguard Worker# This option is useful when crosscompiling wheels for aarch64 where
85*cc02d7e2SAndroid Build Coastguard Worker# it's difficult to ensure that the crosscompilation toolchain has a high-enough version
86*cc02d7e2SAndroid Build Coastguard Worker# of GCC (we require >=5.1) but still uses old-enough libstdc++ symbols.
87*cc02d7e2SAndroid Build Coastguard Worker# TODO(jtattermusch): remove this workaround once issues with crosscompiler version are resolved.
88*cc02d7e2SAndroid Build Coastguard WorkerBUILD_WITH_STATIC_LIBSTDCXX = _env_bool_value(
89*cc02d7e2SAndroid Build Coastguard Worker    "GRPC_PYTHON_BUILD_WITH_STATIC_LIBSTDCXX", "False"
90*cc02d7e2SAndroid Build Coastguard Worker)
91*cc02d7e2SAndroid Build Coastguard Worker
92*cc02d7e2SAndroid Build Coastguard Worker
93*cc02d7e2SAndroid Build Coastguard Workerdef check_linker_need_libatomic():
94*cc02d7e2SAndroid Build Coastguard Worker    """Test if linker on system needs libatomic."""
95*cc02d7e2SAndroid Build Coastguard Worker    code_test = (
96*cc02d7e2SAndroid Build Coastguard Worker        b"#include <atomic>\n"
97*cc02d7e2SAndroid Build Coastguard Worker        + b"int main() { return std::atomic<int64_t>{}; }"
98*cc02d7e2SAndroid Build Coastguard Worker    )
99*cc02d7e2SAndroid Build Coastguard Worker    cxx = shlex.split(os.environ.get("CXX", "c++"))
100*cc02d7e2SAndroid Build Coastguard Worker    cpp_test = subprocess.Popen(
101*cc02d7e2SAndroid Build Coastguard Worker        cxx + ["-x", "c++", "-std=c++14", "-"],
102*cc02d7e2SAndroid Build Coastguard Worker        stdin=PIPE,
103*cc02d7e2SAndroid Build Coastguard Worker        stdout=PIPE,
104*cc02d7e2SAndroid Build Coastguard Worker        stderr=PIPE,
105*cc02d7e2SAndroid Build Coastguard Worker    )
106*cc02d7e2SAndroid Build Coastguard Worker    cpp_test.communicate(input=code_test)
107*cc02d7e2SAndroid Build Coastguard Worker    if cpp_test.returncode == 0:
108*cc02d7e2SAndroid Build Coastguard Worker        return False
109*cc02d7e2SAndroid Build Coastguard Worker    # Double-check to see if -latomic actually can solve the problem.
110*cc02d7e2SAndroid Build Coastguard Worker    # https://github.com/grpc/grpc/issues/22491
111*cc02d7e2SAndroid Build Coastguard Worker    cpp_test = subprocess.Popen(
112*cc02d7e2SAndroid Build Coastguard Worker        cxx + ["-x", "c++", "-std=c++14", "-", "-latomic"],
113*cc02d7e2SAndroid Build Coastguard Worker        stdin=PIPE,
114*cc02d7e2SAndroid Build Coastguard Worker        stdout=PIPE,
115*cc02d7e2SAndroid Build Coastguard Worker        stderr=PIPE,
116*cc02d7e2SAndroid Build Coastguard Worker    )
117*cc02d7e2SAndroid Build Coastguard Worker    cpp_test.communicate(input=code_test)
118*cc02d7e2SAndroid Build Coastguard Worker    return cpp_test.returncode == 0
119*cc02d7e2SAndroid Build Coastguard Worker
120*cc02d7e2SAndroid Build Coastguard Worker
121*cc02d7e2SAndroid Build Coastguard Workerclass BuildExt(build_ext.build_ext):
122*cc02d7e2SAndroid Build Coastguard Worker    """Custom build_ext command."""
123*cc02d7e2SAndroid Build Coastguard Worker
124*cc02d7e2SAndroid Build Coastguard Worker    def get_ext_filename(self, ext_name):
125*cc02d7e2SAndroid Build Coastguard Worker        # since python3.5, python extensions' shared libraries use a suffix that corresponds to the value
126*cc02d7e2SAndroid Build Coastguard Worker        # of sysconfig.get_config_var('EXT_SUFFIX') and contains info about the architecture the library targets.
127*cc02d7e2SAndroid Build Coastguard Worker        # E.g. on x64 linux the suffix is ".cpython-XYZ-x86_64-linux-gnu.so"
128*cc02d7e2SAndroid Build Coastguard Worker        # When crosscompiling python wheels, we need to be able to override this suffix
129*cc02d7e2SAndroid Build Coastguard Worker        # so that the resulting file name matches the target architecture and we end up with a well-formed
130*cc02d7e2SAndroid Build Coastguard Worker        # wheel.
131*cc02d7e2SAndroid Build Coastguard Worker        filename = build_ext.build_ext.get_ext_filename(self, ext_name)
132*cc02d7e2SAndroid Build Coastguard Worker        orig_ext_suffix = sysconfig.get_config_var("EXT_SUFFIX")
133*cc02d7e2SAndroid Build Coastguard Worker        new_ext_suffix = os.getenv("GRPC_PYTHON_OVERRIDE_EXT_SUFFIX")
134*cc02d7e2SAndroid Build Coastguard Worker        if new_ext_suffix and filename.endswith(orig_ext_suffix):
135*cc02d7e2SAndroid Build Coastguard Worker            filename = filename[: -len(orig_ext_suffix)] + new_ext_suffix
136*cc02d7e2SAndroid Build Coastguard Worker        return filename
137*cc02d7e2SAndroid Build Coastguard Worker
138*cc02d7e2SAndroid Build Coastguard Worker
139*cc02d7e2SAndroid Build Coastguard Worker# There are some situations (like on Windows) where CC, CFLAGS, and LDFLAGS are
140*cc02d7e2SAndroid Build Coastguard Worker# entirely ignored/dropped/forgotten by distutils and its Cygwin/MinGW support.
141*cc02d7e2SAndroid Build Coastguard Worker# We use these environment variables to thus get around that without locking
142*cc02d7e2SAndroid Build Coastguard Worker# ourselves in w.r.t. the multitude of operating systems this ought to build on.
143*cc02d7e2SAndroid Build Coastguard Worker# We can also use these variables as a way to inject environment-specific
144*cc02d7e2SAndroid Build Coastguard Worker# compiler/linker flags. We assume GCC-like compilers and/or MinGW as a
145*cc02d7e2SAndroid Build Coastguard Worker# reasonable default.
146*cc02d7e2SAndroid Build Coastguard WorkerEXTRA_ENV_COMPILE_ARGS = os.environ.get("GRPC_PYTHON_CFLAGS", None)
147*cc02d7e2SAndroid Build Coastguard WorkerEXTRA_ENV_LINK_ARGS = os.environ.get("GRPC_PYTHON_LDFLAGS", None)
148*cc02d7e2SAndroid Build Coastguard Workerif EXTRA_ENV_COMPILE_ARGS is None:
149*cc02d7e2SAndroid Build Coastguard Worker    EXTRA_ENV_COMPILE_ARGS = "-std=c++14"
150*cc02d7e2SAndroid Build Coastguard Worker    if "win32" in sys.platform:
151*cc02d7e2SAndroid Build Coastguard Worker        # We need to statically link the C++ Runtime, only the C runtime is
152*cc02d7e2SAndroid Build Coastguard Worker        # available dynamically
153*cc02d7e2SAndroid Build Coastguard Worker        EXTRA_ENV_COMPILE_ARGS += " /MT"
154*cc02d7e2SAndroid Build Coastguard Worker    elif "linux" in sys.platform or "darwin" in sys.platform:
155*cc02d7e2SAndroid Build Coastguard Worker        EXTRA_ENV_COMPILE_ARGS += " -fno-wrapv -frtti -fvisibility=hidden"
156*cc02d7e2SAndroid Build Coastguard Worker
157*cc02d7e2SAndroid Build Coastguard Workerif EXTRA_ENV_LINK_ARGS is None:
158*cc02d7e2SAndroid Build Coastguard Worker    EXTRA_ENV_LINK_ARGS = ""
159*cc02d7e2SAndroid Build Coastguard Worker    if "linux" in sys.platform or "darwin" in sys.platform:
160*cc02d7e2SAndroid Build Coastguard Worker        EXTRA_ENV_LINK_ARGS += " -lpthread"
161*cc02d7e2SAndroid Build Coastguard Worker        if check_linker_need_libatomic():
162*cc02d7e2SAndroid Build Coastguard Worker            EXTRA_ENV_LINK_ARGS += " -latomic"
163*cc02d7e2SAndroid Build Coastguard Worker
164*cc02d7e2SAndroid Build Coastguard Worker# This enables the standard link-time optimizer, which help us prevent some undefined symbol errors by
165*cc02d7e2SAndroid Build Coastguard Worker# remove some unused symbols from .so file.
166*cc02d7e2SAndroid Build Coastguard Worker# Note that it does not work for MSCV on windows.
167*cc02d7e2SAndroid Build Coastguard Workerif "win32" not in sys.platform:
168*cc02d7e2SAndroid Build Coastguard Worker    EXTRA_ENV_COMPILE_ARGS += " -flto"
169*cc02d7e2SAndroid Build Coastguard Worker    # Compile with fail with error: `lto-wrapper failed` when lto flag was enabled in Alpine using musl libc.
170*cc02d7e2SAndroid Build Coastguard Worker    # As a work around we need to disable ipa-cp.
171*cc02d7e2SAndroid Build Coastguard Worker    if _is_alpine():
172*cc02d7e2SAndroid Build Coastguard Worker        EXTRA_ENV_COMPILE_ARGS += " -fno-ipa-cp"
173*cc02d7e2SAndroid Build Coastguard Worker
174*cc02d7e2SAndroid Build Coastguard WorkerEXTRA_COMPILE_ARGS = shlex.split(EXTRA_ENV_COMPILE_ARGS)
175*cc02d7e2SAndroid Build Coastguard WorkerEXTRA_LINK_ARGS = shlex.split(EXTRA_ENV_LINK_ARGS)
176*cc02d7e2SAndroid Build Coastguard Worker
177*cc02d7e2SAndroid Build Coastguard Workerif BUILD_WITH_STATIC_LIBSTDCXX:
178*cc02d7e2SAndroid Build Coastguard Worker    EXTRA_LINK_ARGS.append("-static-libstdc++")
179*cc02d7e2SAndroid Build Coastguard Worker
180*cc02d7e2SAndroid Build Coastguard WorkerCC_FILES = [
181*cc02d7e2SAndroid Build Coastguard Worker    os.path.normpath(cc_file) for cc_file in observability_lib_deps.CC_FILES
182*cc02d7e2SAndroid Build Coastguard Worker]
183*cc02d7e2SAndroid Build Coastguard WorkerCC_INCLUDES = [
184*cc02d7e2SAndroid Build Coastguard Worker    os.path.normpath(include_dir)
185*cc02d7e2SAndroid Build Coastguard Worker    for include_dir in observability_lib_deps.CC_INCLUDES
186*cc02d7e2SAndroid Build Coastguard Worker]
187*cc02d7e2SAndroid Build Coastguard Worker
188*cc02d7e2SAndroid Build Coastguard WorkerDEFINE_MACROS = (("_WIN32_WINNT", 0x600),)
189*cc02d7e2SAndroid Build Coastguard Worker
190*cc02d7e2SAndroid Build Coastguard Workerif "win32" in sys.platform:
191*cc02d7e2SAndroid Build Coastguard Worker    DEFINE_MACROS += (
192*cc02d7e2SAndroid Build Coastguard Worker        ("WIN32_LEAN_AND_MEAN", 1),
193*cc02d7e2SAndroid Build Coastguard Worker        ("CARES_STATICLIB", 1),
194*cc02d7e2SAndroid Build Coastguard Worker        ("GRPC_ARES", 0),
195*cc02d7e2SAndroid Build Coastguard Worker        ("NTDDI_VERSION", 0x06000000),
196*cc02d7e2SAndroid Build Coastguard Worker        # avoid https://github.com/abseil/abseil-cpp/issues/1425
197*cc02d7e2SAndroid Build Coastguard Worker        ("NOMINMAX", 1),
198*cc02d7e2SAndroid Build Coastguard Worker    )
199*cc02d7e2SAndroid Build Coastguard Worker    if "64bit" in platform.architecture()[0]:
200*cc02d7e2SAndroid Build Coastguard Worker        DEFINE_MACROS += (("MS_WIN64", 1),)
201*cc02d7e2SAndroid Build Coastguard Worker    else:
202*cc02d7e2SAndroid Build Coastguard Worker        # For some reason, this is needed to get access to inet_pton/inet_ntop
203*cc02d7e2SAndroid Build Coastguard Worker        # on msvc, but only for 32 bits
204*cc02d7e2SAndroid Build Coastguard Worker        DEFINE_MACROS += (("NTDDI_VERSION", 0x06000000),)
205*cc02d7e2SAndroid Build Coastguard Workerelif "linux" in sys.platform or "darwin" in sys.platform:
206*cc02d7e2SAndroid Build Coastguard Worker    DEFINE_MACROS += (("HAVE_PTHREAD", 1),)
207*cc02d7e2SAndroid Build Coastguard Worker
208*cc02d7e2SAndroid Build Coastguard Worker# Fix for Cython build issue in aarch64.
209*cc02d7e2SAndroid Build Coastguard Worker# It's required to define this macro before include <inttypes.h>.
210*cc02d7e2SAndroid Build Coastguard Worker# <inttypes.h> was included in core/lib/channel/call_tracer.h.
211*cc02d7e2SAndroid Build Coastguard Worker# This macro should already be defined in grpc/grpc.h through port_platform.h,
212*cc02d7e2SAndroid Build Coastguard Worker# but we're still having issue in aarch64, so we manually define the macro here.
213*cc02d7e2SAndroid Build Coastguard Worker# TODO(xuanwn): Figure out what's going on in the aarch64 build so we can support
214*cc02d7e2SAndroid Build Coastguard Worker# gcc + Bazel.
215*cc02d7e2SAndroid Build Coastguard WorkerDEFINE_MACROS += (("__STDC_FORMAT_MACROS", None),)
216*cc02d7e2SAndroid Build Coastguard Worker
217*cc02d7e2SAndroid Build Coastguard Worker
218*cc02d7e2SAndroid Build Coastguard Worker# Use `-fvisibility=hidden` will hide cython init symbol, we need that symbol exported
219*cc02d7e2SAndroid Build Coastguard Worker# in order to import cython module.
220*cc02d7e2SAndroid Build Coastguard Workerif "linux" in sys.platform or "darwin" in sys.platform:
221*cc02d7e2SAndroid Build Coastguard Worker    pymodinit = 'extern "C" __attribute__((visibility ("default"))) PyObject*'
222*cc02d7e2SAndroid Build Coastguard Worker    DEFINE_MACROS += (("PyMODINIT_FUNC", pymodinit),)
223*cc02d7e2SAndroid Build Coastguard Worker
224*cc02d7e2SAndroid Build Coastguard Worker
225*cc02d7e2SAndroid Build Coastguard Workerdef extension_modules():
226*cc02d7e2SAndroid Build Coastguard Worker    if BUILD_WITH_CYTHON:
227*cc02d7e2SAndroid Build Coastguard Worker        cython_module_files = [
228*cc02d7e2SAndroid Build Coastguard Worker            os.path.join("grpc_observability", "_cyobservability.pyx")
229*cc02d7e2SAndroid Build Coastguard Worker        ]
230*cc02d7e2SAndroid Build Coastguard Worker    else:
231*cc02d7e2SAndroid Build Coastguard Worker        cython_module_files = [
232*cc02d7e2SAndroid Build Coastguard Worker            os.path.join("grpc_observability", "_cyobservability.cpp")
233*cc02d7e2SAndroid Build Coastguard Worker        ]
234*cc02d7e2SAndroid Build Coastguard Worker
235*cc02d7e2SAndroid Build Coastguard Worker    plugin_include = [
236*cc02d7e2SAndroid Build Coastguard Worker        ".",
237*cc02d7e2SAndroid Build Coastguard Worker        "grpc_root",
238*cc02d7e2SAndroid Build Coastguard Worker        os.path.join("grpc_root", "include"),
239*cc02d7e2SAndroid Build Coastguard Worker    ] + CC_INCLUDES
240*cc02d7e2SAndroid Build Coastguard Worker
241*cc02d7e2SAndroid Build Coastguard Worker    plugin_sources = CC_FILES
242*cc02d7e2SAndroid Build Coastguard Worker
243*cc02d7e2SAndroid Build Coastguard Worker    O11Y_CC_PATHS = (
244*cc02d7e2SAndroid Build Coastguard Worker        os.path.join("grpc_observability", f) for f in O11Y_CC_SRCS
245*cc02d7e2SAndroid Build Coastguard Worker    )
246*cc02d7e2SAndroid Build Coastguard Worker    plugin_sources += O11Y_CC_PATHS
247*cc02d7e2SAndroid Build Coastguard Worker
248*cc02d7e2SAndroid Build Coastguard Worker    plugin_sources += cython_module_files
249*cc02d7e2SAndroid Build Coastguard Worker
250*cc02d7e2SAndroid Build Coastguard Worker    plugin_ext = Extension(
251*cc02d7e2SAndroid Build Coastguard Worker        name="grpc_observability._cyobservability",
252*cc02d7e2SAndroid Build Coastguard Worker        sources=plugin_sources,
253*cc02d7e2SAndroid Build Coastguard Worker        include_dirs=plugin_include,
254*cc02d7e2SAndroid Build Coastguard Worker        language="c++",
255*cc02d7e2SAndroid Build Coastguard Worker        define_macros=list(DEFINE_MACROS),
256*cc02d7e2SAndroid Build Coastguard Worker        extra_compile_args=list(EXTRA_COMPILE_ARGS),
257*cc02d7e2SAndroid Build Coastguard Worker        extra_link_args=list(EXTRA_LINK_ARGS),
258*cc02d7e2SAndroid Build Coastguard Worker    )
259*cc02d7e2SAndroid Build Coastguard Worker    extensions = [plugin_ext]
260*cc02d7e2SAndroid Build Coastguard Worker    if BUILD_WITH_CYTHON:
261*cc02d7e2SAndroid Build Coastguard Worker        from Cython import Build
262*cc02d7e2SAndroid Build Coastguard Worker
263*cc02d7e2SAndroid Build Coastguard Worker        return Build.cythonize(
264*cc02d7e2SAndroid Build Coastguard Worker            extensions, compiler_directives={"language_level": "3"}
265*cc02d7e2SAndroid Build Coastguard Worker        )
266*cc02d7e2SAndroid Build Coastguard Worker    else:
267*cc02d7e2SAndroid Build Coastguard Worker        return extensions
268*cc02d7e2SAndroid Build Coastguard Worker
269*cc02d7e2SAndroid Build Coastguard Worker
270*cc02d7e2SAndroid Build Coastguard WorkerPACKAGES = setuptools.find_packages(PYTHON_STEM)
271*cc02d7e2SAndroid Build Coastguard Worker
272*cc02d7e2SAndroid Build Coastguard Workersetuptools.setup(
273*cc02d7e2SAndroid Build Coastguard Worker    name="grpcio-observability",
274*cc02d7e2SAndroid Build Coastguard Worker    version=grpc_version.VERSION,
275*cc02d7e2SAndroid Build Coastguard Worker    description="gRPC Python observability package",
276*cc02d7e2SAndroid Build Coastguard Worker    long_description_content_type="text/x-rst",
277*cc02d7e2SAndroid Build Coastguard Worker    long_description=open(README_PATH, "r").read(),
278*cc02d7e2SAndroid Build Coastguard Worker    author="The gRPC Authors",
279*cc02d7e2SAndroid Build Coastguard Worker    author_email="[email protected]",
280*cc02d7e2SAndroid Build Coastguard Worker    url="https://grpc.io",
281*cc02d7e2SAndroid Build Coastguard Worker    project_urls={
282*cc02d7e2SAndroid Build Coastguard Worker        "Source Code": "https://github.com/grpc/grpc/tree/master/src/python/grpcio_observability",
283*cc02d7e2SAndroid Build Coastguard Worker        "Bug Tracker": "https://github.com/grpc/grpc/issues",
284*cc02d7e2SAndroid Build Coastguard Worker    },
285*cc02d7e2SAndroid Build Coastguard Worker    license="Apache License 2.0",
286*cc02d7e2SAndroid Build Coastguard Worker    classifiers=CLASSIFIERS,
287*cc02d7e2SAndroid Build Coastguard Worker    ext_modules=extension_modules(),
288*cc02d7e2SAndroid Build Coastguard Worker    packages=list(PACKAGES),
289*cc02d7e2SAndroid Build Coastguard Worker    python_requires=">=3.8",
290*cc02d7e2SAndroid Build Coastguard Worker    install_requires=[
291*cc02d7e2SAndroid Build Coastguard Worker        "grpcio=={version}".format(version=grpc_version.VERSION),
292*cc02d7e2SAndroid Build Coastguard Worker        "setuptools>=59.6.0",
293*cc02d7e2SAndroid Build Coastguard Worker        "opentelemetry-api==1.21.0",
294*cc02d7e2SAndroid Build Coastguard Worker    ],
295*cc02d7e2SAndroid Build Coastguard Worker    cmdclass={
296*cc02d7e2SAndroid Build Coastguard Worker        "build_ext": BuildExt,
297*cc02d7e2SAndroid Build Coastguard Worker    },
298*cc02d7e2SAndroid Build Coastguard Worker)
299