aboutsummaryrefslogtreecommitdiffstats
path: root/build/conf/python.conf
diff options
context:
space:
mode:
authorsnermolaev <snermolaev@yandex-team.com>2023-07-30 06:01:34 +0300
committersnermolaev <snermolaev@yandex-team.com>2023-07-30 06:01:34 +0300
commitccadbc42de5fafe11134d6b6c3e926c1de1ab819 (patch)
tree63ed2684b410fb54368dd5d4d654c9949cb8e423 /build/conf/python.conf
parent1b3a2857c174a0c9c6f5081aeb2da0bfee24b5d2 (diff)
downloadydb-ccadbc42de5fafe11134d6b6c3e926c1de1ab819.tar.gz
move python stuff to its own conf
Diffstat (limited to 'build/conf/python.conf')
-rw-r--r--build/conf/python.conf1028
1 files changed, 1028 insertions, 0 deletions
diff --git a/build/conf/python.conf b/build/conf/python.conf
new file mode 100644
index 0000000000..1673934290
--- /dev/null
+++ b/build/conf/python.conf
@@ -0,0 +1,1028 @@
+# tag:python-specific tag:cython-specific
+CYTHON_SCRIPT=${input:"${ARCADIA_ROOT}/contrib/tools/cython/cython.py"} ${hide:CYTHON_FAKE_ID} $CYTHON_PREDEFINED_INCLUDES
+RUN_CYTHON_SCRIPT=$YMAKE_PYTHON $CYTHON_SCRIPT
+RUN_CYTHON_SCRIPT_H=$YMAKE_PYTHON $CYTHON_SCRIPT
+PYTHON_TYPE_FOR_CYTHON=PY2
+CYTHON_OUTPUT_INCLUDES=\
+${output_include;hide:"contrib/libs/python/Include/compile.h"} \
+${output_include;hide:"contrib/libs/python/Include/frameobject.h"} \
+${output_include;hide:"contrib/libs/python/Include/longintrepr.h"} \
+${output_include;hide:"contrib/libs/python/Include/pyconfig.h"} \
+${output_include;hide:"contrib/libs/python/Include/Python.h"} \
+${output_include;hide:"contrib/libs/python/Include/pythread.h"} \
+${output_include;hide:"contrib/libs/python/Include/structmember.h"} \
+${output_include;hide:"contrib/libs/python/Include/traceback.h"} \
+${output_include;hide:"contrib/tools/cython/generated_c_headers.h"} \
+${output_include;hide:"omp.h"}
+
+# tag:cython-specific
+CYTHON_CPP_OUTPUT_INCLUDES=${output_include;hide:"contrib/tools/cython/generated_cpp_headers.h"}
+
+# tag:cython-specific
+CYTHON_PREDEFINED_INCLUDES=\
+ ${input;hide:"contrib/tools/cython/Cython/Utility/Buffer.c"} \
+ ${input;hide:"contrib/tools/cython/Cython/Utility/Builtins.c"} \
+ ${input;hide:"contrib/tools/cython/Cython/Utility/CMath.c"} \
+ ${input;hide:"contrib/tools/cython/Cython/Utility/Capsule.c"} \
+ ${input;hide:"contrib/tools/cython/Cython/Utility/CommonTypes.c"} \
+ ${input;hide:"contrib/tools/cython/Cython/Utility/Complex.c"} \
+ ${input;hide:"contrib/tools/cython/Cython/Utility/Coroutine.c"} \
+ ${input;hide:"contrib/tools/cython/Cython/Utility/CythonFunction.c"} \
+ ${input;hide:"contrib/tools/cython/Cython/Utility/Embed.c"} \
+ ${input;hide:"contrib/tools/cython/Cython/Utility/Exceptions.c"} \
+ ${input;hide:"contrib/tools/cython/Cython/Utility/ExtensionTypes.c"} \
+ ${input;hide:"contrib/tools/cython/Cython/Utility/FunctionArguments.c"} \
+ ${input;hide:"contrib/tools/cython/Cython/Utility/ImportExport.c"} \
+ ${input;hide:"contrib/tools/cython/Cython/Utility/MemoryView_C.c"} \
+ ${input;hide:"contrib/tools/cython/Cython/Utility/ModuleSetupCode.c"} \
+ ${input;hide:"contrib/tools/cython/Cython/Utility/ObjectHandling.c"} \
+ ${input;hide:"contrib/tools/cython/Cython/Utility/Optimize.c"} \
+ ${input;hide:"contrib/tools/cython/Cython/Utility/Overflow.c"} \
+ ${input;hide:"contrib/tools/cython/Cython/Utility/Printing.c"} \
+ ${input;hide:"contrib/tools/cython/Cython/Utility/Profile.c"} \
+ ${input;hide:"contrib/tools/cython/Cython/Utility/StringTools.c"} \
+ ${input;hide:"contrib/tools/cython/Cython/Utility/TestUtilityLoader.c"} \
+ ${input;hide:"contrib/tools/cython/Cython/Utility/TypeConversion.c"}
+
+# tag:cython-specific
+CYTHON_PREDEFINED_INDUCED=\
+ contrib/libs/python/Include/Python.h
+
+# tag:cython-specific
+CYTHON_OPTIONS=
+when ($OS_LINUX) {
+ CYTHON_OPTIONS += -E UNAME_SYSNAME=Linux
+}
+elsewhen ($OS_DARWIN) {
+ CYTHON_OPTIONS += -E UNAME_SYSNAME=Darwin
+}
+elsewhen ($OS_WINDOWS) {
+ CYTHON_OPTIONS += -E UNAME_SYSNAME=Windows
+}
+
+# tag:python-specific
+# PYTHON_DISTR={ "default" | "macos-brew" } determine python system supply
+# see build/platform/python/ya.make
+PYTHON_DISTR="default"
+when ($USE_SYSTEM_PYTHON) {
+ USE_ARCADIA_PYTHON=no
+ select ($USE_SYSTEM_PYTHON) {
+ "2.7" ? {
+ _SYSTEM_PYTHON27=yes
+ PY_VERSION=2.7
+ PY_FRAMEWORK_VERSION=2.7
+ }
+ "3.4" ? {
+ _SYSTEM_PYTHON34=yes
+ PY_VERSION=3.4m
+ PY_FRAMEWORK_VERSION=3.4
+ }
+ "3.5" ? {
+ _SYSTEM_PYTHON35=yes
+ PY_VERSION=3.5m
+ PY_FRAMEWORK_VERSION=3.5
+ }
+ "3.6" ? {
+ _SYSTEM_PYTHON36=yes
+ PY_VERSION=3.6m
+ PY_FRAMEWORK_VERSION=3.6
+ }
+ "3.7" ? {
+ _SYSTEM_PYTHON37=yes
+ PY_VERSION=3.7m
+ PY_FRAMEWORK_VERSION=3.7
+ }
+ "3.8" ? {
+ _SYSTEM_PYTHON38=yes
+ PY_VERSION=3.8
+ PY_FRAMEWORK_VERSION=3.8
+ }
+ "3.9" ? {
+ _SYSTEM_PYTHON39=yes
+ PY_VERSION=3.9
+ PY_FRAMEWORK_VERSION=3.9
+ }
+ "3.10" ? {
+ _SYSTEM_PYTHON310=yes
+ PY_VERSION=3.10
+ PY_FRAMEWORK_VERSION=3.10
+ }
+ "3.11" ? {
+ _SYSTEM_PYTHON311=yes
+ PY_VERSION=3.11
+ PY_FRAMEWORK_VERSION=3.11
+ }
+ default ? {
+ FATAL_ERROR_MESSAGE+=invalid USE_SYSTEM_PYTHON value
+ }
+ }
+}
+
+when ($BUILD_PYTHON3_BIN) {
+ YMAKE_PYTHON3=${BUILD_PYTHON3_BIN}
+ YMAKE_PYTHON3_PEERDIR=
+}
+otherwise {
+ YMAKE_PYTHON3=${YMAKE_PYTHON3_RESOURCE_GLOBAL}/python3
+}
+
+# tag:python-specific
+when ($USE_ARCADIA_PYTHON == "no") {
+ SYSINCL+=build/sysincl/python.yml
+}
+
+# tag:python-specific
+PYTHON2=no
+PYTHON3=no
+
+# tag:python-specific
+when (!$ARCADIA_PYTHON_UNICODE_SIZE) {
+ when ($OS_WINDOWS) {
+ ARCADIA_PYTHON_UNICODE_SIZE=2
+ }
+ otherwise {
+ ARCADIA_PYTHON_UNICODE_SIZE=4
+ }
+}
+
+YMAKE_PYTHON3_PEERDIR=build/platform/python/ymake_python3
+macro NO_YMAKE_PYTHON3() {
+ SET(YMAKE_PYTHON3_PEERDIR)
+}
+
+# tag:python-specific tag:deprecated tag:internal
+module _PY2_PROGRAM: _BASE_PY_PROGRAM {
+ SET(MODULE_LANG PY2)
+
+ # Looks like we cannot avoid copy-paste util ymake supports multiple inheritance
+ # We need to attach coverage.extractor to every py_program target, except pytest targets
+ ADD_YTEST($MODULE_PREFIX$REALPRJNAME coverage.extractor)
+}
+
+# tag:python-specific tag:deprecated
+### @usage: PY2_PROGRAM([progname]) # deprecated
+###
+### Deprecated. Use PY3_PROGRAM instead.
+### Python 2.x binary program. Links all Python 2.x libraries and Python 2.x interpreter into itself to form regular executable.
+### If name is not specified it will be generated from the name of the containing project directory.
+### This only compatible with PYTHON2-tagged modules and selects those from multimodules.
+###
+### Documentation: https://wiki.yandex-team.ru/devtools/commandsandvars/py_srcs/
+module PY2_PROGRAM: _PY2_PROGRAM {
+ .RESTRICTED=STYLE_PYTHON
+ when ($FAIL_PY2 == "yes") {
+ _OK=no
+ }
+ elsewhen ($OPENSOURCE != "yes") {
+ PEERDIR+=build/rules/py2_deprecation
+ }
+ ASSERT(_OK You are using deprecated Python2-only code (PY2_PROGRAM). Please consider rewriting to Python 3.)
+}
+
+# tag:python-specific
+### @usage: NO_EXTENDED_SOURCE_SEARCH()
+###
+### Prevent module using in extended python source search.
+### Use the macro if module contains python2-only files (or other python sources which shouldn't be imported by python3 interpreter)
+### which resides in the same directories with python 3 useful code. contrib/python/future is a example.
+### Anyway, preferred way is to move such files into separate dir and don't use this macro at all.
+###
+### Also see: https://docs.yandex-team.ru/ya-make/manual/python/vars#y_python_extended_source_search for details
+macro NO_EXTENDED_SOURCE_SEARCH() {
+ SET(NO_EXTENDED_SOURCE_SEARCH yes)
+}
+
+# tag:python-specific
+### @usage: PY3_PROGRAM([progname])
+###
+### Python 3.x binary program. Links all Python 3.x libraries and Python 3.x interpreter into itself to form regular executable.
+### If name is not specified it will be generated from the name of the containing project directory.
+### This only compatible with PYTHON3-tagged modules and selects those from multimodules.
+###
+### Documentation: https://wiki.yandex-team.ru/devtools/commandsandvars/py_srcs/
+multimodule PY3_PROGRAM {
+ module PY3_BIN: PY3_PROGRAM_BIN {
+ .PEERDIRSELF=PY3_BIN_LIB
+ .IGNORED=RESOURCE RESOURCE_FILES PEERDIR TASKLET_REG RUN_ANTLR4_PYTHON BUILDWITH_CYTHON_CPP _BUILDWITH_CYTHON_CPP_DEP _BUILDWITH_CYTHON_CPP_H BUILDWITH_CYTHON_C _BUILDWITH_CYTHON_C_DEP _BUILDWITH_CYTHON_C_H _BUILDWITH_CYTHON_C_API_H
+ # Notify pybuild to skip almost all PY_SRCS arguments except MAIN
+ ENABLE(PROCESS_PY_MAIN_ONLY)
+ _PY_PROGRAM()
+ NO_CLANG_TIDY()
+ }
+
+ module PY3_BIN_LIB: PY3_LIBRARY {
+ .IGNORED=RESTRICT_LICENSES
+ # Notify pybuild to skip all python main function definitions
+ ENABLE(IGNORE_PY_MAIN)
+ _REQUIRE_EXPLICIT_LICENSE()
+ NO_CLANG_TIDY()
+ }
+}
+
+# tag:python-specific tag:test
+STYLE_PYTHON_VALUE=no
+STYLE_PYTHON_PYPROJECT_VALUE=
+### @usage: STYLE_PYTHON([pyproject])
+###
+### Check python3 sources for style issues using black.
+macro STYLE_PYTHON(pyproject...) {
+ SET(STYLE_PYTHON_VALUE yes)
+ SET(STYLE_PYTHON_PYPROJECT_VALUE ${pyproject})
+}
+
+# tag:python-specific tag:test
+### @usage: NO_DOCTESTS()
+###
+### Disable doctests in PY[|3|23_]TEST
+macro NO_DOCTESTS() {
+ ENV(YA_PYTEST_DISABLE_DOCTEST="yes")
+}
+
+# tag:python-specific tag:test
+### @usage: _BASE_PYTEST # internal
+###
+### Base logic of Python 2.x py.test modules: common module properties and dependencies.
+module _BASE_PYTEST: _BASE_PY_PROGRAM {
+ .NODE_TYPE=Program
+ .FINAL_TARGET=no
+ .ALLOWED=YT_SPEC NO_DOCTESTS
+ when ($USE_ARCADIA_PYTHON == "yes") {
+ PEERDIR+=library/python/pytest
+ }
+ when ($USE_ARCADIA_PYTHON == "no") {
+ MODULE_SUFFIX=.pkg.fake
+ PEERDIR+=library/python/pytest/empty
+ }
+
+ SET_APPEND(_MAKEFILE_INCLUDE_LIKE_DEPS canondata/result.json)
+}
+
+# tag:python-specific tag:deprecated tag:test
+### @usage: PYTEST_BIN() #deprecated
+###
+### Same as PY2TEST. Don't use this, use PY2TEST instead.
+module PYTEST_BIN: _BASE_PYTEST {
+ .NODE_TYPE=Program
+ .DEFAULT_NAME_GENERATOR=FullPath
+ .ARGS_PARSER=Base
+ SETUP_PYTEST_BIN()
+}
+
+# tag:python-specific tag:test
+### @usage: PY2TEST([name])
+###
+### The test module for Python 2.x based on py.test
+###
+### This module is compatible only with PYTHON2-tagged modules and selects peers from multimodules accordingly.
+### This module is compatible with non-Arcadia Python builds.
+###
+### Documentation: https://wiki.yandex-team.ru/yatool/test/#python
+### Documentation about the Arcadia test system: https://wiki.yandex-team.ru/yatool/test/
+module PY2TEST: PYTEST_BIN {
+ .RESTRICTED=STYLE_PYTHON
+ .DEFAULT_NAME_GENERATOR=FullPath
+ .ARGS_PARSER=Base
+ when ($FAIL_PY2 == "yes") {
+ _OK=no
+ }
+ elsewhen ($OPENSOURCE != "yes") {
+ PEERDIR+=build/rules/py2_deprecation
+ }
+ SET(MODULE_LANG PY2)
+ ASSERT(_OK You are using deprecated Python2-only code (PY2TEST). Please consider rewriting to Python 3.)
+}
+
+# tag:python-specific tag:deprecated tag:test
+### @usage: PY3TEST_BIN() #deprecated
+###
+### Same as PY3TEST. Don't use this, use PY3TEST instead.
+module PY3TEST_BIN: _BASE_PY3_PROGRAM {
+ .NODE_TYPE=Program
+ .FINAL_TARGET=no
+ .ALLOWED=YT_SPEC NO_DOCTESTS
+ .DEFAULT_NAME_GENERATOR=FullPath
+ .ARGS_PARSER=Base
+ SET_APPEND(_MAKEFILE_INCLUDE_LIKE_DEPS canondata/result.json)
+ SET(MODULE_LANG PY3)
+ SETUP_PYTEST_BIN()
+ PEERDIR+=library/python/pytest
+}
+
+# tag:python-specific tag:test
+### Disable submodules with the specified name(s).
+### Unlike EXCLUDE_TAGS this variable:
+### - affects all projects in the build;
+### - filter by module name and ignore MODULE_TAG.
+EXCLUDE_SUBMODULES=PY3TEST_LIBRARY
+
+# tag:python-specific tag:test
+### @usage: PY3TEST([name])
+###
+### The test module for Python 3.x based on py.test
+###
+### This module is compatible only with PYTHON3-tagged modules and selects peers from multimodules accordingly.
+### This module is only compatible with Arcadia Python build (to avoid tests duplication from Python2/3-tests). For non-Arcadia python use PYTEST.
+###
+### Documentation: https://wiki.yandex-team.ru/yatool/test/#testynapytest
+### Documentation about the Arcadia test system: https://wiki.yandex-team.ru/yatool/test/
+multimodule PY3TEST {
+ module PY3TEST_PROGRAM: PY3TEST_BIN {
+ .IGNORED=RUN_ANTLR4_PYTHON
+ .FINAL_TARGET=yes
+ }
+
+ module PY3TEST_LIBRARY: PY3_LIBRARY {
+ PEERDIR+=library/python/pytest
+ _REQUIRE_EXPLICIT_LICENSE()
+ }
+}
+
+# tag:python-specific
+### @usage: PY_ANY_MODULE(name major_ver [minor_ver] [EXPORTS symlist_file] [PREFIX prefix])
+###
+### The Python external module for any versio of Arcadia or system Python.
+### 1. major_ver and minor_ver must be integers.
+### 2. The resulting .so will have the prefix "lib".
+### 3. Processing EXPORTS and PREFIX is the same as for DLL module
+### This is native DLL, so it will select C++ version from PROTO_LIBRARY.
+###
+### Note: Use PYTHON2_MODULE()/PYTHON3_MODULE() in order to PEERDIR proper version of PY23_NATIVE_LIBRARY.
+### Do not PEERDIR any PY*_LIBRARY: this will link Python in and render artifact unusable as Python module.
+###
+### Documentation: https://wiki.yandex-team.ru/devtools/commandsandvars/py_srcs/
+module PY_ANY_MODULE: DLL_UNIT {
+ .SEM=CPP_DYN_LIBRARY_SEM
+ when ($MSVC != "yes" && $DARWIN != "yes") {
+ LDFLAGS+= -Wl,-Bsymbolic
+ }
+
+ when ($USE_ARCADIA_PYTHON == "no") {
+ when ($USE_SYSTEM_PYTHON) {
+ PEERDIR+=build/platform/python
+ }
+ otherwise {
+ when ($MSVC == "yes" || $CYGWIN == "yes") {
+ LDFLAGS+=$PYTHON_LIBRARIES
+ }
+ }
+ }
+
+ # This by now replicates ymake's behavior. We'll get rid of SONAME setting in ymake and fix this code altogether
+ SONAME=${pre=$MODULE_PREFIX;suf=$MODULE_SUFFIX:REALPRJNAME}
+ when ($MODULE_VERSION) {
+ LINK_DYN_LIB_FLAGS=--soname ${output;pre=$MODULE_PREFIX;suf=$MODULE_SUFFIX$MODULE_VERSION:REALPRJNAME}
+ }
+ _SONAME=$SONAME$MODULE_VERSION
+
+ # -bundle
+ when ($DARWIN == "yes") {
+ LDFLAGS+=-flat_namespace
+ }
+
+ when ($MSVC == "yes" || $CYGWIN == "yes") {
+ MODULE_PREFIX=
+ MODULE_SUFFIX=.pyd
+ }
+ otherwise {
+ MODULE_PREFIX=
+ MODULE_SUFFIX=.so
+ }
+ .RESTRICTED=USE_PYTHON2 USE_PYTHON3 PY_SRCS PY_MAIN
+}
+
+# tag:python-specific
+### @usage: PY2MODULE(name major_ver [minor_ver] [EXPORTS symlist_file] [PREFIX prefix])
+###
+### The Python external module for Python2 and any system Python
+### 1. major_ver and minor_ver must be integers.
+### 2. The resulting .so will have the prefix "lib".
+### 3. Processing EXPORTS and PREFIX is the same as for DLL module
+### This is native DLL, so it will select C++ version from PROTO_LIBRARY.
+###
+### Note: this module will always PEERDIR Python2 version of PY23_NATIVE_LIBRARY.
+### Do not PEERDIR PY2_LIBRARY or PY23_LIBRARY: this will link Python in and render artifact unusable as Python module.
+###
+### Documentation: https://wiki.yandex-team.ru/devtools/commandsandvars/py_srcs/
+module PY2MODULE: PY_ANY_MODULE {
+ PYTHON2_MODULE()
+ SET(MODULE_LANG PY2)
+ .RESTRICTED=PYTHON3_MODULE PYTHON3_ADDINCL
+}
+
+# tag:python-specific
+### @usage: PY3MODULE(name major_ver [minor_ver] [EXPORTS symlist_file] [PREFIX prefix])
+###
+### The Python external module for Python3 and any system Python
+### 1. major_ver and minor_ver must be integers.
+### 2. The resulting .so will have the prefix "lib".
+### 3. Processing EXPORTS and PREFIX is the same as for DLL module
+### This is native DLL, so it will select C++ version from PROTO_LIBRARY.
+###
+### Note: this module will always PEERDIR Python3 version of PY23_NATIVE_LIBRARY.
+### Do not PEERDIR PY3_LIBRARY or PY23_LIBRARY: this will link Python in and render artifact unusable as Python module.
+###
+### Documentation: https://wiki.yandex-team.ru/devtools/commandsandvars/py_srcs/
+module PY3MODULE: PY_ANY_MODULE {
+ PYTHON3_MODULE()
+ SET(MODULE_LANG PY3)
+ .RESTRICTED=PYTHON2_MODULE PYTHON2_ADDINCL
+}
+
+# tag:python-specific
+### @usage: PYTHON2_MODULE()
+###
+### Use in PY_ANY_MODULE to set it up for Python 2.x.
+macro PYTHON2_MODULE() {
+ when ($USE_ARCADIA_PYTHON == "yes" && $MSVC == "yes" || $IS_CROSS_TOOLS == "yes") {
+ PEERDIR+=contrib/tools/python/lib
+ }
+ SET(ANTLR_PYTHON Python2)
+ PYTHON2_ADDINCL()
+}
+
+# tag:python-specific
+### @usage: PYTHON3_MODULE()
+###
+### Use in PY_ANY_MODULE to set it up for Python 3.x.
+macro PYTHON3_MODULE() {
+ when ($USE_ARCADIA_PYTHON == "yes" && $MSVC == "yes" || $IS_CROSS_TOOLS == "yes") {
+ PEERDIR+=contrib/tools/python3/lib
+ }
+
+ SET(ANTLR_PYTHON Python3)
+ PYTHON3_ADDINCL()
+}
+
+# tag:python-specific
+module _PY_PACKAGE: UNION {
+ .EXTS=.py
+ .ALLOWED=GRPC USE_SKIFF
+ .IGNORED=GENERATE_ENUM_SERIALIZATION GENERATE_ENUM_SERIALIZATION_WITH_HEADER
+ ENABLE(PY_PROTOS_FOR)
+ SET(PEERDIR_TAGS PY_PROTO)
+ SET(DONT_RESOLVE_INCLUDES no)
+}
+
+# tag:python-specific tag:deprecated tag:internal
+### @usage: PY_PACKAGE(name) # internal, deprecated
+###
+### This is module created via PY_PROTOS_FOR() macro
+module PY_PACKAGE: _PY_PACKAGE {
+ .ALIASES=SRCS=SRCS
+ .FINAL_TARGET=yes
+}
+
+# tag:python-specific
+PY_NAMESPACE_VALUE=
+
+# tag:python-specific
+### @usage: PY_NAMESPACE(prefix)
+###
+### Sets default Python namespace for all python sources in the module.
+### Especially suitable in PROTO_LIBRARY where Python sources are generated and there is no PY_SRCS to place NAMESPACE parameter.
+macro PY_NAMESPACE(Arg) {
+ SET(PY_NAMESPACE_VALUE $Arg)
+}
+
+# tag:python-specific tag:deprecated
+### @usage: PY2_LIBRARY() # deprecated
+###
+### Deprecated. Use PY23_LIBRARY or PY3_LIBRARY instead.
+### Python 2.x binary built library. Builds sources from PY_SRCS to data suitable for PY2_PROGRAM.
+### Adds dependencies to Python 2.x runtime library from Arcadia.
+### This module is only compatible with PYTHON2-tagged modules and selects those from multimodules.
+### This module is only compatible with Arcadia Python build.
+###
+### Documentation: https://wiki.yandex-team.ru/devtools/commandsandvars/py_srcs/
+module PY2_LIBRARY: _LIBRARY {
+ _ARCADIA_PYTHON_ADDINCL()
+
+ when ($NO_PYTHON_INCLS != "yes") {
+ PEERDIR+=contrib/libs/python
+ }
+ when ($MSVC == "yes" || $CYGWIN == "yes") {
+ MODULE_PREFIX=py
+ }
+ otherwise {
+ MODULE_PREFIX=libpy
+ }
+ .ALLOWED=FORK_TESTS
+ .IGNORED=GENERATE_ENUM_SERIALIZATION GENERATE_ENUM_SERIALIZATION_WITH_HEADER USE_PYTHON2
+ .RESTRICTED=PYTHON3_ADDINCL USE_PYTHON3 PYTHON2_ADDINCL OPTIMIZE_PY_PROTOS NO_OPTIMIZE_PY_PROTOS STYLE_PYTHON
+ USE_GLOBAL_CMD=yes
+
+ when ($PY_PROTO_MYPY_ENABLED == "yes") {
+ PY_PROTO_MYPY_SUFFIX=_pb2.pyi
+ PY_PROTO_MYPY_PLUGIN=$PY_PROTO_MYPY_PLUGIN_BASE ${output;hide;noauto;norel;nopath;noext;suf=_pb2.pyi:File}
+ PY_PROTO_MYPY_PLUGIN_INTERNAL=$PY_PROTO_MYPY_PLUGIN_BASE ${output;hide;noauto;norel;nopath;noext;suf=__int___pb2.pyi:File} ${hide;kv:"ext_out_name_for_${nopath;noext;suf=__int___pb2.pyi:File} ${nopath;noext;suf=_pb2.pyi:File}"})
+ }
+ SET(MODULE_LANG PY2)
+ ADD_CLANG_TIDY()
+}
+
+
+# tag:python-specific
+### @usage: PY3_LIBRARY()
+###
+### Python 3.x binary library. Builds sources from PY_SRCS to data suitable for PY2_PROGRAM
+### Adds dependencies to Python 2.x runtime library from Arcadia.
+### This module is only compatible with PYTHON3-tagged modules and selects those from multimodules.
+### This module is only compatible with Arcadia Python build.
+###
+### Documentation: https://wiki.yandex-team.ru/devtools/commandsandvars/py_srcs/
+module PY3_LIBRARY: _LIBRARY {
+ _ARCADIA_PYTHON3_ADDINCL()
+
+ when ($NO_PYTHON_INCLS != "yes") {
+ PEERDIR+=contrib/libs/python
+ }
+ when ($MSVC == "yes" || $CYGWIN == "yes") {
+ MODULE_PREFIX=py
+ }
+ otherwise {
+ MODULE_PREFIX=libpy
+ }
+ .ALLOWED=FORK_TESTS
+ .IGNORED=GENERATE_ENUM_SERIALIZATION GENERATE_ENUM_SERIALIZATION_WITH_HEADER
+ .RESTRICTED=PYTHON3_ADDINCL USE_PYTHON3 PYTHON2_ADDINCL USE_PYTHON2 OPTIMIZE_PY_PROTOS NO_OPTIMIZE_PY_PROTOS
+ USE_GLOBAL_CMD=yes
+
+ RUN_CYTHON_SCRIPT=$YMAKE_PYTHON3 $CYTHON_SCRIPT
+ RUN_CYTHON_SCRIPT_H=$YMAKE_PYTHON3 $CYTHON_SCRIPT
+ PYTHON_TYPE_FOR_CYTHON=PY3
+ ANTLR_PYTHON=Python3
+
+ when ($PY_PROTO_MYPY_ENABLED == "yes") {
+ PY_PROTO_MYPY_SUFFIX=_pb2.pyi
+ PY_PROTO_MYPY_PLUGIN=$PY_PROTO_MYPY_PLUGIN_BASE ${output;hide;noauto;norel;nopath;noext;suf=_pb2.pyi:File}
+ PY_PROTO_MYPY_PLUGIN_INTERNAL=$PY_PROTO_MYPY_PLUGIN_BASE ${output;hide;noauto;norel;nopath;noext;suf=__int___pb2.pyi:File} ${hide;kv:"ext_out_name_for_${nopath;noext;suf=__int___pb2.pyi:File} ${nopath;noext;suf=_pb2.pyi:File}"})
+ }
+ SET(MODULE_LANG PY3)
+ ADD_CLANG_TIDY()
+}
+
+
+# tag:python-specific
+### @usage: _BASE_PY_PROGRAM #internal
+###
+### The base module for all Python 2.x binary programs. Adds linking logic, relevant module properties and
+### dependency on Python 2.x interpreter. Also adds import tests on all sources including PEERDIR'ed libraries.
+### Links all Python 2.x libraries and Python 2.x interpreter into itself to form regular executable.
+### This only compatible with PYTHON2-tagged modules and selects those from multimodules.
+###
+### Documentation: https://wiki.yandex-team.ru/devtools/commandsandvars/py_srcs/
+module _BASE_PY_PROGRAM: _BASE_PROGRAM {
+ .CMD=PY_PROGRAM_LINK_EXE
+ _ARCADIA_PYTHON_ADDINCL()
+
+ when ($SANITIZER_TYPE && $SANITIZER_TYPE != "no") {
+ NO_CHECK_IMPORTS_FOR_VALUE=
+ }
+ ADD_CHECK_PY_IMPORTS()
+
+ when ($NO_PYTHON_INCLS != "yes") {
+ PEERDIR += contrib/libs/python
+ }
+ when ($USE_ARCADIA_PYTHON == "yes") {
+ PEERDIR += library/python/runtime/main
+ PEERDIR += contrib/deprecated/python/subprocess32
+ when ($PYTHON_SQLITE3 != "no") {
+ PEERDIR += contrib/tools/python/src/Modules/_sqlite
+ }
+ }
+ when ($PYTHON_COVERAGE == "yes") {
+ PEERDIR+=library/python/coverage
+ }
+
+ when ($ARCH_PPC64LE == "yes") {
+ _MY_ALLOCATOR=SYSTEM
+ }
+ otherwise {
+ _MY_ALLOCATOR=J
+ }
+ ALLOCATOR($_MY_ALLOCATOR)
+ STRIP()
+
+ when ($BUILD_TYPE == "DEBUG") {
+ NO_STRIP=yes
+ }
+ when ($SANITIZER_TYPE && $SANITIZER_TYPE != "no") {
+ NO_STRIP=yes
+ }
+ .IGNORED=GENERATE_ENUM_SERIALIZATION GENERATE_ENUM_SERIALIZATION_WITH_HEADER USE_PYTHON2
+ .RESTRICTED=PYTHON3_ADDINCL USE_PYTHON3 PYTHON2_ADDINCL OPTIMIZE_PY_PROTOS NO_OPTIMIZE_PY_PROTOS
+ SET(MODULE_LANG PY2)
+}
+
+# tag:python-specific tag:codenav
+when ($CODENAVIGATION && $NOCODENAVIGATION != "yes") {
+ PY3_PROGRAM_LINK_EXE=$LINK_EXE ${kv;hide:"py3yndex $TARGET"}
+}
+otherwise {
+ PY3_PROGRAM_LINK_EXE=$LINK_EXE
+}
+
+# tag:python-specific
+### @usage: _BASE_PY_PROGRAM #internal
+###
+### The base module for all Python 3.x binary programs. Adds linking logic, relevant module properties and
+### dependency on Python 3.x interpreter. Also adds import tests on all sources including libraries.
+### Links all Python 3.x libraries and Python 3.x interpreter into itself to form regular executable.
+### This only compatible with PYTHON3-tagged modules and selects those from multimodules
+###
+### Documentation: https://wiki.yandex-team.ru/devtools/commandsandvars/py_srcs/
+module _BASE_PY3_PROGRAM: _BASE_PROGRAM {
+ .CMD=PY3_PROGRAM_LINK_EXE
+ _ARCADIA_PYTHON3_ADDINCL()
+ RUN_CYTHON_SCRIPT=$YMAKE_PYTHON3 $CYTHON_SCRIPT
+ RUN_CYTHON_SCRIPT_H=$YMAKE_PYTHON3 $CYTHON_SCRIPT
+ PYTHON_TYPE_FOR_CYTHON=PY3
+ PEERDIR(library/python/runtime_py3/main)
+ when ($PYTHON_SQLITE3 != "no") {
+ PEERDIR += contrib/tools/python3/src/Modules/_sqlite
+ }
+
+ when ($SANITIZER_TYPE && $SANITIZER_TYPE != "no") {
+ NO_CHECK_IMPORTS_FOR_VALUE=
+ }
+ ADD_CHECK_PY_IMPORTS()
+
+ when ($ARCH_PPC64LE == "yes") {
+ _MY_ALLOCATOR=SYSTEM
+ }
+ otherwise {
+ _MY_ALLOCATOR=J
+ }
+ ALLOCATOR($_MY_ALLOCATOR)
+ STRIP()
+
+ when ($NO_PYTHON_INCLS != "yes") {
+ PEERDIR+=contrib/libs/python
+ }
+ when ($BUILD_TYPE == "DEBUG") {
+ NO_STRIP=yes
+ }
+ when ($SANITIZER_TYPE && $SANITIZER_TYPE != "no") {
+ NO_STRIP=yes
+ }
+ when ($PYTHON_COVERAGE == "yes") {
+ PEERDIR+=library/python/coverage
+ }
+ when ($CODENAVIGATION && $NOCODENAVIGATION != "yes") {
+ PEERDIR += contrib/python/six
+ }
+ .IGNORED=GENERATE_ENUM_SERIALIZATION GENERATE_ENUM_SERIALIZATION_WITH_HEADER
+ .RESTRICTED=PYTHON3_ADDINCL USE_PYTHON3 PYTHON2_ADDINCL USE_PYTHON2
+ SET(MODULE_LANG PY3)
+ SET(ANTLR_PYTHON Python3)
+}
+
+# tag:python-specific
+### @usage: PY3_PROGRAM_BIN([progname])
+### Use instead of PY3_PROGRAM only if ya.make with PY3_PROGRAM() included in another ya.make
+### In all other cases use PY3_PROGRAM
+module PY3_PROGRAM_BIN: _BASE_PY3_PROGRAM {
+ # Look's like we cannot avoid copy-paste util ymake supports multiple inheritance
+ # We need to attach coverage.extractor to every py_program target, except pytest targets
+ ADD_YTEST($MODULE_PREFIX$REALPRJNAME coverage.extractor)
+}
+
+# tag:python-specific tag:internal
+NO_PYTHON_INCLS=no
+### @usage: NO_PYTHON_INCLUDES() # internal
+###
+### Disable dependencies on libraries providing Python headers.
+### This is only used in Python libraries themselves to avoid PEERDIR loops.
+macro NO_PYTHON_INCLUDES() {
+ ENABLE(NO_PYTHON_INCLS)
+}
+
+# tag:python-specific
+### @usage: PYTHON2_ADDINCL()
+###
+### This macro adds include path for Python headers (Python 2.x variant) without PEERDIR.
+### This should be used in 2 cases only:
+### - In PY2MODULE since it compiles into .so and uses external Python runtime;
+### - In system Python libraries themselves since proper PEERDIR there may create a loop;
+### In all other cases use USE_PYTHON2 macro instead.
+###
+### Never use this macro in PY2_PROGRAM, PY2_LIBRARY and PY23_LIBRARY: they have everything needed by default.
+###
+### Documentation: https://wiki.yandex-team.ru/devtools/commandsandvars/py_srcs
+macro PYTHON2_ADDINCL() {
+ _PYTHON_ADDINCL()
+ SET(MODULE_TAG PY2_NATIVE)
+ SET(PEERDIR_TAGS CPP_PROTO CPP_FBS PY2_NATIVE YQL_UDF_STATIC __EMPTY__ DLL_LIB)
+}
+
+# tag:python-specific tag:internal
+### @usage: _ARCADIA_PYTHON_ADDINCL() # internal
+### This macro sets up Python headers for modules with Arcadia python (e.g. PY2_LIBRARY) and configures module as Python 2.x.
+macro _ARCADIA_PYTHON_ADDINCL() {
+ _PYTHON_ADDINCL()
+ SET(MODULE_TAG PY2)
+ SET(PEERDIR_TAGS PY2 PY2_NATIVE PY_PROTO PY2_FBS YQL_UDF_STATIC __EMPTY__ DLL_LIB)
+}
+
+# tag:python-specific tag:internal
+### @usage: _PYTHON_ADDINCL() # internal
+### This macro sets up Python 2.x headers for both Arcadia and non-Arcadia python.
+macro _PYTHON_ADDINCL() {
+ SET(PYTHON2 yes)
+ SET(PYTHON3 no)
+ when ($USE_ARCADIA_PYTHON == "yes") {
+ ADDINCL+=GLOBAL contrib/libs/python/Include
+ CFLAGS+=-DARCADIA_PYTHON_UNICODE_SIZE=$ARCADIA_PYTHON_UNICODE_SIZE
+ }
+ otherwise {
+ when ($USE_SYSTEM_PYTHON) {
+ PEERDIR+=build/platform/python
+ }
+ otherwise {
+ CFLAGS+=$PYTHON_INCLUDE
+ }
+ }
+}
+
+# tag:python-specific
+### @usage: PYTHON3_ADDINCL()
+###
+### This macro adds include path for Python headers (Python 3.x variant).
+### This should be used in 2 cases only:
+### - In PY2MODULE since it compiles into .so and uses external Python runtime;
+### - In system Python libraries themselves since peerdir there may create a loop;
+### In all other cases use USE_PYTHON3() macro instead.
+###
+### Never use this macro in PY3_PROGRAM and PY3_LIBRARY and PY23_LIBRARY: they have everything by default.
+###
+### Documentation: https://wiki.yandex-team.ru/devtools/commandsandvars/py_srcs
+macro PYTHON3_ADDINCL() {
+ _PYTHON3_ADDINCL()
+ SET(MODULE_TAG PY3_NATIVE)
+ SET(PEERDIR_TAGS CPP_PROTO CPP_FBS PY3_NATIVE YQL_UDF_STATIC __EMPTY__ DLL_LIB)
+}
+
+# tag:python-specific tag:internal
+### @usage: _ARCADIA_PYTHON3_ADDINCL() # internal
+###
+### This macro sets up Python3 headers for modules with Arcadia python (e.g. PY3_LIBRARY) and configures module as Python 3.x.
+macro _ARCADIA_PYTHON3_ADDINCL() {
+ _PYTHON3_ADDINCL()
+ SET(MODULE_TAG PY3)
+ SET(MODULE_LANG PY3)
+ SET(PEERDIR_TAGS PY3 PY3_BIN_LIB PY3TEST_LIBRARY PY3_NATIVE PY3_PROTO PY3_FBS YQL_UDF_STATIC __EMPTY__ DLL_LIB)
+}
+
+# tag:python-specific tag:internal
+### @usage: _PYTHON_ADDINCL() # internal
+###
+### This macro sets up Python 3.x headers for both Arcadia and non-Arcadia python.
+macro _PYTHON3_ADDINCL() {
+ SET(PYTHON3 yes)
+ SET(PYTHON2 no)
+ when ($USE_ARCADIA_PYTHON == "yes") {
+ CFLAGS+=-DUSE_PYTHON3
+ ADDINCL+=GLOBAL contrib/libs/python/Include
+ }
+ otherwise {
+ when ($USE_SYSTEM_PYTHON) {
+ PEERDIR+=build/platform/python
+ }
+ otherwise {
+ CFLAGS+=$PYTHON_INCLUDE
+ }
+ }
+}
+
+# tag:python-specific
+### @usage: USE_PYTHON2()
+###
+### This adds Python 2.x runtime library to your LIBRARY and makes it Python2-compatible.
+### Compatibility means proper PEERDIRs, ADDINCLs and variant selection on PEERDIRs to multimodules.
+###
+### If you'd like to use #include <Python.h> with Python2 specify USE_PYTHON2 or better make it PY2_LIBRARY.
+### If you'd like to use #include <Python.h> with Python3 specify USE_PYTHON3 or better make it PY3_LIBRARY.
+### If you'd like to use #include <Python.h> with both Python2 and Python3 convert your LIBRARY to PY23_LIBRARY.
+###
+### @see: [PY2_LIBRARY](#module_PY2_LIBRARY), [PY3_LIBRARY](#module_PY3_LIBRARY), [PY23_LIBRARY](#multimodule_PY23_LIBRARY)
+macro USE_PYTHON2() {
+ _ARCADIA_PYTHON_ADDINCL()
+ SET(PEERDIR_TAGS PY2 PY2_NATIVE CPP_PROTO CPP_FBS YQL_UDF_STATIC __EMPTY__ DLL_LIB)
+ PEERDIR(contrib/libs/python)
+}
+
+# tag:python-specific
+### @usage: USE_PYTHON3()
+###
+### This adds Python3 library to your LIBRARY and makes it Python3-compatible.
+### Compatibility means proper PEERDIRs, ADDINCLs and variant selection on PEERDIRs to multimodules.
+###
+### If you'd like to use #include <Python.h> with Python3 specify USE_PYTHON3 or better make it PY3_LIBRARY.
+### If you'd like to use #include <Python.h> with Python2 specify USE_PYTHON2 or better make it PY2_LIBRARY.
+### If you'd like to use #include <Python.h> with both Python2 and Python3 convert your LIBRARY to PY23_LIBRARY.
+###
+### @see: [PY2_LIBRARY](#module_PY2_LIBRARY), [PY3_LIBRARY](#module_PY3_LIBRARY), [PY23_LIBRARY](#multimodule_PY23_LIBRARY)
+macro USE_PYTHON3() {
+ _ARCADIA_PYTHON3_ADDINCL()
+ SET(PEERDIR_TAGS PY3 PY3_BIN_LIB PY3TEST_LIBRARY PY3_NATIVE CPP_PROTO CPP_FBS YQL_UDF_STATIC __EMPTY__ DLL_LIB)
+ PEERDIR(contrib/libs/python)
+
+ when ($USE_ARCADIA_PYTHON == "yes") {
+ PEERDIR+=library/python/runtime_py3
+ }
+}
+
+# tag:python-specific tag:coverage
+### @usage: NO_PYTHON_COVERAGE()
+###
+### Disable python coverage for module
+macro NO_PYTHON_COVERAGE() {
+ DISABLE(PYTHON_COVERAGE)
+}
+
+# tag:python-specific tag:coverage tag:cython
+### @usage: NO_CYTHON_COVERAGE()
+###
+### Disable cython and cythonized python coverage (CYTHONIZE_PY)
+### Implies NO_CLANG_COVERAGE() - right now, we can't disable instrumentation for .py.cpp files, but enable for .cpp
+macro NO_CYTHON_COVERAGE() {
+ DISABLE(CYTHON_COVERAGE)
+ NO_CLANG_COVERAGE()
+}
+
+# tag:python-specific
+### @usage: PY_SRCS({| CYTHON_C} { | TOP_LEVEL | NAMESPACE ns} Files...)
+###
+### Build specified Python sources according to Arcadia binary Python build. Basically creates precompiled and source resources keyed with module paths.
+### The resources eventually are linked into final program and can be accessed as regular Python modules.
+### This custom loader linked into the program will add them to sys.meta_path.
+###
+### PY_SRCS also support .proto, .ev, .pyx and .swg files. The .proto and .ev are compiled to .py-code by protoc and than handled as usual .py files.
+### .pyx and .swg lead to C/C++ Python extensions generation, that are automatically registered in Python as built-in modules.
+###
+### By default .pyx files are built as C++-extensions. Use CYTHON_C to build them as C (similar to BUILDWITH_CYTHON_C, but with the ability to specify namespace).
+###
+### __init__.py never required, but if present (and specified in PY_SRCS), it will be imported when you import package modules with __init__.py Oh.
+###
+### @example
+###
+### PY2_LIBRARY(mymodule)
+### PY_SRCS(a.py sub/dir/b.py e.proto sub/dir/f.proto c.pyx sub/dir/d.pyx g.swg sub/dir/h.swg)
+### END()
+###
+### PY_SRCS honors Python2 and Python3 differences and adjusts itself to Python version of a current module.
+### PY_SRCS can be used in any Arcadia Python build modules like PY*_LIBRARY, PY*_PROGRAM, PY*TEST.
+### PY_SRCS in LIBRARY or PROGRAM effectively converts these into PY2_LIBRARY and PY2_PROGRAM respectively.
+### It is strongly advised to make this conversion explicit. Never use PY_SRCS in a LIBRARY if you plan to use it from external Python extension module.
+###
+### Documentation: https://wiki.yandex-team.ru/arcadia/python/pysrcs/#modulipylibrarypy3libraryimakrospysrcs
+macro PY_SRCS() {
+ DEFAULT(MODULE_TAG PY2)
+ DEFAULT(PYTHON2 yes)
+ DEFAULT(PYTHON3 no)
+}
+
+# tag:python-specific
+_ALL_PY_FILES=
+
+# tag:python-specific
+macro _ALL_PY_SRCS2(TOP_LEVEL?"TOP_LEVEL":"", RECURSIVE?"/**":"", ONLY_TEST_FILES?"test_*.py":"*.py", ONLY_TEST_FILES2?"*_test.py":"***", NO_TEST_FILES?"**/test_*.py **/*_test.py":"", NAMESPACE[], REST[], REST2[], EAT_TAIL[]) {
+ _GLOB(_ALL_PY_FILES ${suf=${RECURSIVE}/${ONLY_TEST_FILES}:REST} ${suf=${RECURSIVE}/${ONLY_TEST_FILES2}:REST2} ${suf=${RECURSIVE}/ya.make:REST} EXCLUDE ya.make ${NO_TEST_FILES})
+}
+
+# tag:python-specific
+### @usage: ALL_PY_SRCS([RECURSIVE] [NO_TEST_FILES] { | TOP_LEVEL | NAMESPACE ns} [Dirs...])
+###
+### Puts all .py-files from given Dirs (relative to projects') into PY_SRCS of the current module.
+### If Dirs is ommitted project directory is used
+###
+### `RECURSIVE` makes lookup recursive with resprect to Dirs
+### `NO_TEST_FILES` excludes files `test_*.py` and `*_test.py` those are normally subject to `TEST_SRCS`
+### `TOP_LEVEL` and `NAMESPACE` are forwarded to `PY_SRCS`
+###
+### Note: Only one such macro per module is allowed
+### Note: Macro is designed to reject any ya.make files in Dirs except current one
+###
+### @see [PY_SRCS()](#macro_PY_SRCS)
+macro ALL_PY_SRCS(TOP_LEVEL?"TOP_LEVEL":"", NAMESPACE="", RECURSIVE?"RECURSIVE":"", NO_TEST_FILES?"NO_TEST_FILES":"", Files...) {
+ _ALL_PY_SRCS2(${pre=NAMESPACE :NAMESPACE} ${TOP_LEVEL} ${RECURSIVE} ${NO_TEST_FILES} REST .${pre=/:Files})
+ PY_SRCS(_MR ${pre=NAMESPACE :NAMESPACE} ${TOP_LEVEL} $_ALL_PY_FILES)
+}
+
+# tag:python-specific
+### @usage: ALL_PYTEST_SRCS([RECURSIVE] [Dirs...])
+###
+### Puts all .py-files from given Dirs (relative to projects') into TEST_SRCS of the current module.
+### If Dirs is omitted project directory is used
+###
+### `RECURSIVE` makes lookup recursive with respect to Dirs
+### `ONLY_TEST_FILES` includes only files `test_*.py` and `*_test.py`, others are normally subject to `PY_SRCS`
+###
+### Note: Only one such macro per module is allowed
+### Note: Macro is designed to reject any ya.make files in Dirs except current one
+###
+### @see [TEST_SRCS()](#macro_TEST_SRCS)
+macro ALL_PYTEST_SRCS(TOP_LEVEL?"TOP_LEVEL":"", NAMESPACE="", RECURSIVE?"RECURSIVE":"", ONLY_TEST_FILES?"ONLY_TEST_FILES ONLY_TEST_FILES2 REST2":"EAT_TAIL", Files...) {
+ _ALL_PY_SRCS2(${pre=NAMESPACE :NAMESPACE} ${TOP_LEVEL} ${RECURSIVE} REST .${pre=/:Files} ${ONLY_TEST_FILES} .${pre=/:Files})
+ TEST_SRCS(_MR $_ALL_PY_FILES)
+}
+
+# tag:python-specific
+_PY_EXTRA_LINT_FILES_VALUE=
+### @usage: PY_EXTRA_LINT_FILES(files...)
+###
+### Add extra Python files for linting. This macro allows adding
+### Python files which has no .py extension.
+macro PY_EXTRA_LINT_FILES(FILES...) {
+ SET_APPEND(_PY_EXTRA_LINT_FILES_VALUE $FILES)
+}
+
+# tag:python-specific
+### @usage: PY23_LIBRARY([name])
+###
+### Build PY2_LIBRARY or PY3_LIBRARY depending on incoming PEERDIR.
+### Direct build or build by RECURSE creates both variants.
+### This multimodule doesn't define any final targets, so use from DEPENDS or BUNDLE is not allowed.
+###
+### Documentation: https://wiki.yandex-team.ru/arcadia/python/pysrcs
+multimodule PY23_LIBRARY {
+ module PY2: PY2_LIBRARY {
+ .RESTRICTED=RUN_ANTLR4_PYTHON
+ OBJ_SUF=.py2
+ }
+ module PY3: PY3_LIBRARY {
+ .RESTRICTED=RUN_ANTLR4_PYTHON
+ RUN_CYTHON_SCRIPT_H=$YMAKE_PYTHON $CYTHON_SCRIPT
+ when ($MSVC == "yes" || $CYGWIN == "yes") {
+ MODULE_PREFIX=py3
+ }
+ otherwise {
+ MODULE_PREFIX=libpy3
+ }
+ OBJ_SUF=.py3
+ }
+}
+
+# tag:python-specific
+### @usage: PY23_NATIVE_LIBRARY([name])
+###
+### Build LIBRARY compatible with either Python 2.x or Python 3.x depending on incoming PEERDIR.
+###
+### This multimodule doesn't depend on Arcadia Python binary build. It is intended only for C++ code and cannot contain PY_SRCS and USE_PYTHON2 macros.
+### Use these multimodule instead of PY23_LIBRARY if the C++ extension defined in it will be used in PY2MODULE.
+### While it doesn't bring Arcadia Python dependency itself, it is still compatible with Arcadia Python build and can be PEERDIR-ed from PY2_LIBRARY and alikes.
+### Proper version will be selected according to Python version of the module PEERDIR comes from.
+###
+### This mulrtimodule doesn't define any final targets so cannot be used from DEPENDS or BUNDLE macros.
+###
+### For more information read https://wiki.yandex-team.ru/arcadia/python/pysrcs/#pysrcssrcsipy23nativelibrary
+###
+### @see [LIBRARY()](#module_LIBRARY), [PY2MODULE()](#module_PY2MODULE)
+multimodule PY23_NATIVE_LIBRARY {
+ module PY2: LIBRARY {
+ .RESTRICTED=PY_SRCS USE_PYTHON2 USE_PYTHON3 PYTHON3_ADDINCL RUN_ANTLR4_PYTHON
+ OBJ_SUF=.py2
+ PYTHON2_ADDINCL()
+ SET(MODULE_LANG PY2)
+ }
+ module PY3: LIBRARY {
+ .RESTRICTED=PY_SRCS USE_PYTHON2 USE_PYTHON3 RUN_ANTLR4_PYTHON
+ .ALIASES=PYTHON2_ADDINCL=PYTHON3_ADDINCL
+ .SEM=CPP_LIBRARY_SEM
+ .GLOBAL_SEM=CPP_OBJ_LIBRARY_SEM
+ PYTHON3_ADDINCL()
+ SET(MODULE_LANG PY3)
+ when ($MSVC == "yes" || $CYGWIN == "yes") {
+ MODULE_PREFIX=py3c
+ }
+ otherwise {
+ MODULE_PREFIX=libpy3c
+ }
+ OBJ_SUF=.py3
+ }
+}
+
+# tag:python-specific
+multimodule PY23_TEST {
+ module PY2 : PYTEST_BIN {
+ .RESTRICTED=RUN_ANTLR4_PYTHON
+ MODULE_PREFIX=py2_
+ OBJ_SUF=.py2
+ CANONIZE_SUB_PATH=py2test
+ RUN_CYTHON_SCRIPT_H=$YMAKE_PYTHON $CYTHON_SCRIPT
+ }
+ module PY3TEST_PROGRAM: PY3TEST_BIN {
+ .FINAL_TARGET=yes
+ .RESTRICTED=RUN_ANTLR4_PYTHON
+ OBJ_SUF=.py3
+ CANONIZE_SUB_PATH=py3test
+ RUN_CYTHON_SCRIPT_H=$YMAKE_PYTHON $CYTHON_SCRIPT
+ }
+
+ module PY3TEST_LIBRARY: PY3_LIBRARY {
+ .RESTRICTED=RUN_ANTLR4_PYTHON
+ PEERDIR+=library/python/pytest
+ _REQUIRE_EXPLICIT_LICENSE()
+ RUN_CYTHON_SCRIPT_H=$YMAKE_PYTHON $CYTHON_SCRIPT
+ }
+}