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