2023-04-25 18:04:18 +02:00
""" Copyright 2020-2022 The MediaPipe Authors.
2020-08-13 03:57:56 +02:00
Licensed under the Apache License , Version 2.0 ( the " License " ) ;
you may not use this file except in compliance with the License .
You may obtain a copy of the License at
http : / / www . apache . org / licenses / LICENSE - 2.0
Unless required by applicable law or agreed to in writing , software
distributed under the License is distributed on an " AS IS " BASIS ,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
See the License for the specific language governing permissions and
limitations under the License .
Setup for MediaPipe package with setuptools .
"""
import glob
import os
2020-12-10 04:13:05 +01:00
import platform
2020-08-13 03:57:56 +02:00
import posixpath
2020-08-30 05:41:10 +02:00
import re
2023-06-15 18:23:15 +02:00
import shlex
2020-08-13 03:57:56 +02:00
import shutil
import subprocess
import sys
import setuptools
2022-09-06 23:29:51 +02:00
from setuptools . command import build_ext
from setuptools . command import build_py
from setuptools . command import install
2020-08-13 03:57:56 +02:00
2021-12-10 23:03:51 +01:00
__version__ = ' dev '
2023-05-25 08:53:00 +02:00
MP_DISABLE_GPU = os . environ . get ( ' MEDIAPIPE_DISABLE_GPU ' ) != ' 0 '
2020-12-10 04:13:05 +01:00
IS_WINDOWS = ( platform . system ( ) == ' Windows ' )
2023-04-04 00:12:06 +02:00
IS_MAC = ( platform . system ( ) == ' Darwin ' )
2020-08-13 03:57:56 +02:00
MP_ROOT_PATH = os . path . dirname ( os . path . abspath ( __file__ ) )
2020-08-30 05:41:10 +02:00
MP_DIR_INIT_PY = os . path . join ( MP_ROOT_PATH , ' mediapipe/__init__.py ' )
MP_THIRD_PARTY_BUILD = os . path . join ( MP_ROOT_PATH , ' third_party/BUILD ' )
2022-09-06 23:29:51 +02:00
MP_ROOT_INIT_PY = os . path . join ( MP_ROOT_PATH , ' __init__.py ' )
2020-08-13 03:57:56 +02:00
2023-06-15 18:23:15 +02:00
GPU_OPTIONS_DISBALED = [ ' --define=MEDIAPIPE_DISABLE_GPU=1 ' ]
GPU_OPTIONS_ENBALED = [
' --copt=-DTFLITE_GPU_EXTRA_GLES_DEPS ' ,
' --copt=-DMEDIAPIPE_OMIT_EGL_WINDOW_BIT ' ,
' --copt=-DMESA_EGL_NO_X11_HEADERS ' ,
' --copt=-DEGL_NO_X11 ' ,
]
GPU_OPTIONS = GPU_OPTIONS_DISBALED if MP_DISABLE_GPU else GPU_OPTIONS_ENBALED
2020-08-13 03:57:56 +02:00
2020-12-10 04:13:05 +01:00
def _normalize_path ( path ) :
return path . replace ( ' \\ ' , ' / ' ) if IS_WINDOWS else path
def _get_backup_file ( path ) :
return path + ' .backup '
2020-08-13 03:57:56 +02:00
def _parse_requirements ( path ) :
with open ( os . path . join ( MP_ROOT_PATH , path ) ) as f :
return [
line . rstrip ( )
for line in f
if not ( line . isspace ( ) or line . startswith ( ' # ' ) )
]
2020-08-30 05:41:10 +02:00
def _get_long_description ( ) :
2020-11-05 01:02:35 +01:00
# Fix the image urls.
2020-08-30 05:41:10 +02:00
return re . sub (
r ' (docs/images/|docs/images/mobile/)([A-Za-z0-9_]* \ .(png|gif)) ' ,
r ' https://github.com/google/mediapipe/blob/master/ \ g<1> \ g<2>?raw=true ' ,
2020-12-10 04:13:05 +01:00
open ( os . path . join ( MP_ROOT_PATH , ' README.md ' ) ,
' rb ' ) . read ( ) . decode ( ' utf-8 ' ) )
2020-08-30 05:41:10 +02:00
2020-08-13 03:57:56 +02:00
def _check_bazel ( ) :
""" Check Bazel binary as well as its version. """
2021-12-10 23:03:51 +01:00
if not shutil . which ( ' bazel ' ) :
2020-08-13 03:57:56 +02:00
sys . stderr . write ( ' could not find bazel executable. Please install bazel to '
' build the MediaPipe Python package. ' )
sys . exit ( - 1 )
try :
bazel_version_info = subprocess . check_output ( [ ' bazel ' , ' --version ' ] )
2021-05-05 03:30:15 +02:00
except subprocess . CalledProcessError as e :
sys . stderr . write ( ' fail to get bazel version by $ bazel --version: ' +
str ( e . output ) )
sys . exit ( - 1 )
2020-08-13 03:57:56 +02:00
bazel_version_info = bazel_version_info . decode ( ' UTF-8 ' ) . strip ( )
version = bazel_version_info . split ( ' bazel ' ) [ 1 ] . split ( ' - ' ) [ 0 ]
version_segments = version . split ( ' . ' )
# Treat "0.24" as "0.24.0"
if len ( version_segments ) == 2 :
version_segments . append ( ' 0 ' )
for seg in version_segments :
if not seg . isdigit ( ) :
sys . stderr . write ( ' invalid bazel version number: %s \n ' % version_segments )
sys . exit ( - 1 )
bazel_version = int ( ' ' . join ( [ ' %03d ' % int ( seg ) for seg in version_segments ] ) )
2020-11-05 01:02:35 +01:00
if bazel_version < 3004000 :
2020-08-13 03:57:56 +02:00
sys . stderr . write (
' the current bazel version is older than the minimum version that MediaPipe can support. Please upgrade bazel. '
)
2020-11-05 01:02:35 +01:00
sys . exit ( - 1 )
2020-08-13 03:57:56 +02:00
2020-12-10 04:13:05 +01:00
def _modify_opencv_cmake_rule ( link_opencv ) :
""" Modify opencv_cmake rule to build the static opencv libraries. """
# Ask the opencv_cmake rule to build the static opencv libraries for the
# mediapipe python package. By doing this, we can avoid copying the opencv
# .so file into the package.
# On Windows, the opencv_cmake rule may need Visual Studio to compile OpenCV
# from source. For simplicity, we continue to link the prebuilt version of
# the OpenCV library through "@windows_opencv//:opencv".
if not link_opencv and not IS_WINDOWS :
content = open ( MP_THIRD_PARTY_BUILD ,
' r ' ) . read ( ) . replace ( ' OPENCV_SHARED_LIBS = True ' ,
' OPENCV_SHARED_LIBS = False ' )
shutil . move ( MP_THIRD_PARTY_BUILD , _get_backup_file ( MP_THIRD_PARTY_BUILD ) )
build_file = open ( MP_THIRD_PARTY_BUILD , ' w ' )
build_file . write ( content )
build_file . close ( )
2022-09-06 23:29:51 +02:00
def _add_mp_init_files ( ) :
""" Add __init__.py to mediapipe root directories to make the subdirectories indexable. """
open ( MP_ROOT_INIT_PY , ' w ' ) . close ( )
# Save the original mediapipe/__init__.py file.
shutil . copyfile ( MP_DIR_INIT_PY , _get_backup_file ( MP_DIR_INIT_PY ) )
mp_dir_init_file = open ( MP_DIR_INIT_PY , ' a ' )
mp_dir_init_file . writelines ( [
' \n ' , ' from mediapipe.python import * \n ' ,
2022-11-02 22:06:14 +01:00
' import mediapipe.python.solutions as solutions \n ' ,
' import mediapipe.tasks.python as tasks \n ' , ' \n \n ' , ' del framework \n ' ,
' del gpu \n ' , ' del modules \n ' , ' del python \n ' , ' del mediapipe \n ' ,
' del util \n ' , ' __version__ = \' {} \' ' . format ( __version__ ) , ' \n '
2022-09-06 23:29:51 +02:00
] )
mp_dir_init_file . close ( )
2020-08-13 03:57:56 +02:00
2020-08-30 05:41:10 +02:00
2022-11-04 17:45:33 +01:00
def _copy_to_build_lib_dir ( build_lib , file ) :
""" Copy a file from bazel-bin to the build lib dir. """
dst = os . path . join ( build_lib + ' / ' , file )
dst_dir = os . path . dirname ( dst )
if not os . path . exists ( dst_dir ) :
os . makedirs ( dst_dir )
shutil . copyfile ( os . path . join ( ' bazel-bin/ ' , file ) , dst )
2023-06-15 18:23:15 +02:00
def _invoke_shell_command ( shell_commands ) :
""" Invokes shell command from the list of arguments. """
print ( ' Invoking: ' , shlex . join ( shell_commands ) )
try :
subprocess . run ( shell_commands , check = True )
except subprocess . CalledProcessError as e :
print ( e )
sys . exit ( e . returncode )
2022-09-06 23:29:51 +02:00
class GeneratePyProtos ( build_ext . build_ext ) :
""" Generate MediaPipe Python protobuf files by Protocol Compiler. """
2020-08-30 05:41:10 +02:00
2020-08-13 03:57:56 +02:00
def run ( self ) :
if ' PROTOC ' in os . environ and os . path . exists ( os . environ [ ' PROTOC ' ] ) :
self . _protoc = os . environ [ ' PROTOC ' ]
else :
2021-12-10 23:03:51 +01:00
self . _protoc = shutil . which ( ' protoc ' )
2020-08-13 03:57:56 +02:00
if self . _protoc is None :
sys . stderr . write (
' protoc is not found. Please run \' apt install -y protobuf '
' -compiler \' (linux) or \' brew install protobuf \' (macos) to install '
' protobuf compiler binary. ' )
sys . exit ( - 1 )
2022-09-06 23:29:51 +02:00
# Add __init__.py to mediapipe proto directories to make the py protos
# indexable.
proto_dirs = [ ' mediapipe/calculators ' ] + [
x [ 0 ] for x in os . walk ( ' mediapipe/modules ' )
] + [ x [ 0 ] for x in os . walk ( ' mediapipe/tasks/cc ' ) ]
for proto_dir in proto_dirs :
self . _add_empty_init_file (
os . path . abspath (
os . path . join ( MP_ROOT_PATH , self . build_lib , proto_dir ,
' __init__.py ' ) ) )
# Build framework and calculator py protos.
2020-11-05 01:02:35 +01:00
for pattern in [
' mediapipe/framework/**/*.proto ' , ' mediapipe/calculators/**/*.proto ' ,
2020-12-10 04:13:05 +01:00
' mediapipe/gpu/**/*.proto ' , ' mediapipe/modules/**/*.proto ' ,
2022-09-06 23:29:51 +02:00
' mediapipe/tasks/cc/**/*.proto ' , ' mediapipe/util/**/*.proto '
2020-11-05 01:02:35 +01:00
] :
for proto_file in glob . glob ( pattern , recursive = True ) :
# Ignore test protos.
if proto_file . endswith ( ' test.proto ' ) :
continue
2021-03-25 23:01:44 +01:00
# Ignore tensorflow protos in mediapipe/calculators/tensorflow.
2022-09-06 23:29:51 +02:00
if ' tensorflow ' in proto_file :
2020-11-05 01:02:35 +01:00
continue
# Ignore testdata dir.
2022-09-06 23:29:51 +02:00
if ' testdata ' in proto_file :
2020-11-05 01:02:35 +01:00
continue
2022-09-06 23:29:51 +02:00
self . _add_empty_init_file (
os . path . abspath (
os . path . join ( MP_ROOT_PATH , self . build_lib ,
os . path . dirname ( proto_file ) , ' __init__.py ' ) ) )
2020-11-05 01:02:35 +01:00
self . _generate_proto ( proto_file )
2020-08-13 03:57:56 +02:00
2022-09-06 23:29:51 +02:00
def _add_empty_init_file ( self , init_file ) :
init_py_dir = os . path . dirname ( init_file )
if not os . path . exists ( init_py_dir ) :
os . makedirs ( init_py_dir )
if not os . path . exists ( init_file ) :
open ( init_file , ' w ' ) . close ( )
2021-12-10 23:03:51 +01:00
2020-08-13 03:57:56 +02:00
def _generate_proto ( self , source ) :
""" Invokes the Protocol Compiler to generate a _pb2.py. """
2022-09-06 23:29:51 +02:00
output = os . path . join ( self . build_lib , source . replace ( ' .proto ' , ' _pb2.py ' ) )
if not os . path . exists ( output ) :
sys . stderr . write ( ' generating proto file: %s \n ' % output )
protoc_command = [
self . _protoc , ' -I. ' ,
' --python_out= ' + os . path . abspath ( self . build_lib ) , source
]
2023-06-15 18:23:15 +02:00
_invoke_shell_command ( protoc_command )
2020-08-13 03:57:56 +02:00
2022-09-06 23:29:51 +02:00
class BuildModules ( build_ext . build_ext ) :
""" Build binary graphs and download external files of various MediaPipe modules. """
2021-12-10 23:03:51 +01:00
user_options = build_ext . build_ext . user_options + [
( ' link-opencv ' , None , ' if true, build opencv from source. ' ) ,
]
boolean_options = build_ext . build_ext . boolean_options + [ ' link-opencv ' ]
def initialize_options ( self ) :
self . link_opencv = False
build_ext . build_ext . initialize_options ( self )
def finalize_options ( self ) :
build_ext . build_ext . finalize_options ( self )
2020-08-13 03:57:56 +02:00
def run ( self ) :
_check_bazel ( )
2022-09-06 23:29:51 +02:00
external_files = [
' face_detection/face_detection_full_range_sparse.tflite ' ,
' face_detection/face_detection_short_range.tflite ' ,
' face_landmark/face_landmark.tflite ' ,
' face_landmark/face_landmark_with_attention.tflite ' ,
' hand_landmark/hand_landmark_full.tflite ' ,
' hand_landmark/hand_landmark_lite.tflite ' ,
' holistic_landmark/hand_recrop.tflite ' ,
' iris_landmark/iris_landmark.tflite ' ,
' palm_detection/palm_detection_full.tflite ' ,
' palm_detection/palm_detection_lite.tflite ' ,
' pose_detection/pose_detection.tflite ' ,
' pose_landmark/pose_landmark_full.tflite ' ,
' selfie_segmentation/selfie_segmentation.tflite ' ,
' selfie_segmentation/selfie_segmentation_landscape.tflite ' ,
]
for elem in external_files :
external_file = os . path . join ( ' mediapipe/modules/ ' , elem )
sys . stderr . write ( ' downloading file: %s \n ' % external_file )
self . _download_external_file ( external_file )
2020-11-05 01:02:35 +01:00
binary_graphs = [
2021-06-24 23:10:25 +02:00
' face_detection/face_detection_short_range_cpu ' ,
' face_detection/face_detection_full_range_cpu ' ,
2020-11-05 01:02:35 +01:00
' face_landmark/face_landmark_front_cpu ' ,
' hand_landmark/hand_landmark_tracking_cpu ' ,
2021-02-27 09:21:16 +01:00
' holistic_landmark/holistic_landmark_cpu ' , ' objectron/objectron_cpu ' ,
2021-06-03 22:13:30 +02:00
' pose_landmark/pose_landmark_cpu ' ,
' selfie_segmentation/selfie_segmentation_cpu '
2020-11-05 01:02:35 +01:00
]
2022-09-06 23:29:51 +02:00
for elem in binary_graphs :
binary_graph = os . path . join ( ' mediapipe/modules/ ' , elem )
sys . stderr . write ( ' generating binarypb: %s \n ' % binary_graph )
2020-08-13 03:57:56 +02:00
self . _generate_binary_graph ( binary_graph )
2022-09-06 23:29:51 +02:00
def _download_external_file ( self , external_file ) :
""" Download an external file from GCS via Bazel. """
fetch_model_command = [
' bazel ' ,
' build ' ,
external_file ,
]
2023-06-15 18:23:15 +02:00
_invoke_shell_command ( fetch_model_command )
2022-11-04 17:45:33 +01:00
_copy_to_build_lib_dir ( self . build_lib , external_file )
2022-09-06 23:29:51 +02:00
def _generate_binary_graph ( self , binary_graph_target ) :
2020-08-13 03:57:56 +02:00
""" Generate binary graph for a particular MediaPipe binary graph target. """
bazel_command = [
' bazel ' ,
' build ' ,
' --compilation_mode=opt ' ,
2021-06-24 23:10:25 +02:00
' --copt=-DNDEBUG ' ,
2020-12-10 04:13:05 +01:00
' --action_env=PYTHON_BIN_PATH= ' + _normalize_path ( sys . executable ) ,
2022-09-06 23:29:51 +02:00
binary_graph_target ,
2023-06-15 18:23:15 +02:00
] + GPU_OPTIONS
2023-05-25 08:53:00 +02:00
2020-12-10 04:13:05 +01:00
if not self . link_opencv and not IS_WINDOWS :
bazel_command . append ( ' --define=OPENCV=source ' )
2023-06-07 00:29:21 +02:00
2023-06-15 18:23:15 +02:00
_invoke_shell_command ( bazel_command )
2022-11-04 17:45:33 +01:00
_copy_to_build_lib_dir ( self . build_lib , binary_graph_target + ' .binarypb ' )
2022-09-06 23:29:51 +02:00
2022-11-04 17:45:33 +01:00
class GenerateMetadataSchema ( build_ext . build_ext ) :
""" Generate metadata python schema files. """
def run ( self ) :
2023-05-09 21:00:13 +02:00
for target in [
' image_segmenter_metadata_schema_py ' ,
' metadata_schema_py ' ,
' object_detector_metadata_schema_py ' ,
' schema_py ' ,
] :
2023-05-17 07:25:40 +02:00
2022-11-04 17:45:33 +01:00
bazel_command = [
' bazel ' ,
' build ' ,
' --compilation_mode=opt ' ,
' --action_env=PYTHON_BIN_PATH= ' + _normalize_path ( sys . executable ) ,
' //mediapipe/tasks/metadata: ' + target ,
2023-06-15 18:23:15 +02:00
] + GPU_OPTIONS
2023-05-25 08:53:00 +02:00
2023-06-15 18:23:15 +02:00
_invoke_shell_command ( bazel_command )
2022-11-04 17:45:33 +01:00
_copy_to_build_lib_dir (
self . build_lib ,
' mediapipe/tasks/metadata/ ' + target + ' _generated.py ' )
2023-05-10 03:42:28 +02:00
for schema_file in [
' mediapipe/tasks/metadata/metadata_schema.fbs ' ,
' mediapipe/tasks/metadata/object_detector_metadata_schema.fbs ' ,
' mediapipe/tasks/metadata/image_segmenter_metadata_schema.fbs ' ,
] :
2022-11-11 02:46:57 +01:00
shutil . copyfile ( schema_file ,
os . path . join ( self . build_lib + ' / ' , schema_file ) )
2020-08-13 03:57:56 +02:00
class BazelExtension ( setuptools . Extension ) :
""" A C/C++ extension that is defined as a Bazel BUILD target. """
def __init__ ( self , bazel_target , target_name = ' ' ) :
self . bazel_target = bazel_target
self . relpath , self . target_name = (
posixpath . relpath ( bazel_target , ' // ' ) . split ( ' : ' ) )
if target_name :
self . target_name = target_name
ext_name = os . path . join (
self . relpath . replace ( posixpath . sep , os . path . sep ) , self . target_name )
setuptools . Extension . __init__ ( self , ext_name , sources = [ ] )
2021-12-10 23:03:51 +01:00
class BuildExtension ( build_ext . build_ext ) :
2020-08-13 03:57:56 +02:00
""" A command that runs Bazel to build a C/C++ extension. """
2020-08-30 05:41:10 +02:00
user_options = build_ext . build_ext . user_options + [
( ' link-opencv ' , None , ' if true, build opencv from source. ' ) ,
]
boolean_options = build_ext . build_ext . boolean_options + [ ' link-opencv ' ]
def initialize_options ( self ) :
self . link_opencv = False
build_ext . build_ext . initialize_options ( self )
def finalize_options ( self ) :
build_ext . build_ext . finalize_options ( self )
2020-08-13 03:57:56 +02:00
def run ( self ) :
_check_bazel ( )
2023-04-04 00:12:06 +02:00
if IS_MAC :
for ext in self . extensions :
target_name = self . get_ext_fullpath ( ext . name )
# Build x86
2023-05-18 00:47:36 +02:00
self . _build_binary (
ext ,
[ ' --cpu=darwin ' , ' --ios_multi_cpus=i386,x86_64,armv7,arm64 ' ] ,
)
2023-04-04 00:12:06 +02:00
x86_name = self . get_ext_fullpath ( ext . name )
# Build Arm64
ext . name = ext . name + ' .arm64 '
self . _build_binary (
ext ,
[ ' --cpu=darwin_arm64 ' , ' --ios_multi_cpus=i386,x86_64,armv7,arm64 ' ] ,
)
arm64_name = self . get_ext_fullpath ( ext . name )
# Merge architectures
lipo_command = [
' lipo ' ,
' -create ' ,
' -output ' ,
target_name ,
x86_name ,
arm64_name ,
]
2023-06-15 18:23:15 +02:00
_invoke_shell_command ( lipo_command )
2023-04-08 01:57:15 +02:00
else :
for ext in self . extensions :
self . _build_binary ( ext )
2020-08-13 03:57:56 +02:00
build_ext . build_ext . run ( self )
2023-04-04 00:12:06 +02:00
def _build_binary ( self , ext , extra_args = None ) :
2020-08-13 03:57:56 +02:00
if not os . path . exists ( self . build_temp ) :
os . makedirs ( self . build_temp )
2020-12-10 04:13:05 +01:00
bazel_command = [
2020-08-13 03:57:56 +02:00
' bazel ' ,
' build ' ,
' --compilation_mode=opt ' ,
2021-06-24 23:10:25 +02:00
' --copt=-DNDEBUG ' ,
2020-12-10 04:13:05 +01:00
' --action_env=PYTHON_BIN_PATH= ' + _normalize_path ( sys . executable ) ,
2020-08-13 03:57:56 +02:00
str ( ext . bazel_target + ' .so ' ) ,
2023-06-15 18:23:15 +02:00
] + GPU_OPTIONS
2023-05-31 01:16:07 +02:00
2023-04-04 00:12:06 +02:00
if extra_args :
bazel_command + = extra_args
2020-12-10 04:13:05 +01:00
if not self . link_opencv and not IS_WINDOWS :
bazel_command . append ( ' --define=OPENCV=source ' )
2023-06-07 00:29:21 +02:00
2023-06-15 18:23:15 +02:00
_invoke_shell_command ( bazel_command )
2020-08-13 03:57:56 +02:00
ext_bazel_bin_path = os . path . join ( ' bazel-bin ' , ext . relpath ,
ext . target_name + ' .so ' )
ext_dest_path = self . get_ext_fullpath ( ext . name )
ext_dest_dir = os . path . dirname ( ext_dest_path )
if not os . path . exists ( ext_dest_dir ) :
os . makedirs ( ext_dest_dir )
shutil . copyfile ( ext_bazel_bin_path , ext_dest_path )
2020-12-10 04:13:05 +01:00
if IS_WINDOWS :
for opencv_dll in glob . glob (
os . path . join ( ' bazel-bin ' , ext . relpath , ' *opencv*.dll ' ) ) :
2020-12-16 05:29:11 +01:00
shutil . copy ( opencv_dll , ext_dest_dir )
2020-08-13 03:57:56 +02:00
2021-12-10 23:03:51 +01:00
class BuildPy ( build_py . build_py ) :
""" Build command that generates protos, builds binary graphs and extension, builds python source, and performs a cleanup afterwards. """
2020-08-13 03:57:56 +02:00
2021-12-10 23:03:51 +01:00
user_options = build_py . build_py . user_options + [
2020-08-30 05:41:10 +02:00
( ' link-opencv ' , None , ' if true, use the installed opencv library. ' ) ,
]
2021-12-10 23:03:51 +01:00
boolean_options = build_py . build_py . boolean_options + [ ' link-opencv ' ]
2020-08-30 05:41:10 +02:00
def initialize_options ( self ) :
self . link_opencv = False
2021-12-10 23:03:51 +01:00
build_py . build_py . initialize_options ( self )
2020-08-30 05:41:10 +02:00
def finalize_options ( self ) :
2021-12-10 23:03:51 +01:00
build_py . build_py . finalize_options ( self )
2020-08-30 05:41:10 +02:00
2020-08-13 03:57:56 +02:00
def run ( self ) :
2020-12-10 04:13:05 +01:00
_modify_opencv_cmake_rule ( self . link_opencv )
2022-09-06 23:29:51 +02:00
_add_mp_init_files ( )
build_modules_obj = self . distribution . get_command_obj ( ' build_modules ' )
build_modules_obj . link_opencv = self . link_opencv
2020-08-30 05:41:10 +02:00
build_ext_obj = self . distribution . get_command_obj ( ' build_ext ' )
build_ext_obj . link_opencv = self . link_opencv
2022-09-06 23:29:51 +02:00
self . run_command ( ' gen_protos ' )
2022-11-04 17:45:33 +01:00
self . run_command ( ' generate_metadata_schema ' )
2022-09-06 23:29:51 +02:00
self . run_command ( ' build_modules ' )
2020-08-13 03:57:56 +02:00
self . run_command ( ' build_ext ' )
2021-12-10 23:03:51 +01:00
build_py . build_py . run ( self )
2022-09-06 23:29:51 +02:00
self . run_command ( ' restore ' )
2020-08-13 03:57:56 +02:00
class Install ( install . install ) :
2021-12-10 23:03:51 +01:00
""" Install command that generates protos, builds binary graphs and extension, builds python source, and performs a cleanup afterwards. """
2020-08-13 03:57:56 +02:00
2020-08-30 05:41:10 +02:00
user_options = install . install . user_options + [
( ' link-opencv ' , None , ' if true, use the installed opencv library. ' ) ,
]
boolean_options = install . install . boolean_options + [ ' link-opencv ' ]
def initialize_options ( self ) :
self . link_opencv = False
install . install . initialize_options ( self )
def finalize_options ( self ) :
install . install . finalize_options ( self )
2020-08-13 03:57:56 +02:00
def run ( self ) :
2022-09-06 23:29:51 +02:00
build_py_obj = self . distribution . get_command_obj ( ' build_py ' )
build_py_obj . link_opencv = self . link_opencv
2020-08-13 03:57:56 +02:00
install . install . run ( self )
2022-09-06 23:29:51 +02:00
class Restore ( setuptools . Command ) :
""" Restore the modified mediapipe source files. """
2020-08-13 03:57:56 +02:00
2021-12-10 23:03:51 +01:00
user_options = [ ]
def initialize_options ( self ) :
pass
def finalize_options ( self ) :
pass
2020-08-13 03:57:56 +02:00
def run ( self ) :
2020-08-30 05:41:10 +02:00
# Restore the original init file from the backup.
2020-12-10 04:13:05 +01:00
if os . path . exists ( _get_backup_file ( MP_DIR_INIT_PY ) ) :
2020-08-30 05:41:10 +02:00
os . remove ( MP_DIR_INIT_PY )
2020-12-10 04:13:05 +01:00
shutil . move ( _get_backup_file ( MP_DIR_INIT_PY ) , MP_DIR_INIT_PY )
2020-08-30 05:41:10 +02:00
# Restore the original BUILD file from the backup.
2020-12-10 04:13:05 +01:00
if os . path . exists ( _get_backup_file ( MP_THIRD_PARTY_BUILD ) ) :
2020-08-30 05:41:10 +02:00
os . remove ( MP_THIRD_PARTY_BUILD )
2020-12-10 04:13:05 +01:00
shutil . move ( _get_backup_file ( MP_THIRD_PARTY_BUILD ) , MP_THIRD_PARTY_BUILD )
2022-09-06 23:29:51 +02:00
os . remove ( MP_ROOT_INIT_PY )
2020-08-13 03:57:56 +02:00
setuptools . setup (
name = ' mediapipe ' ,
version = __version__ ,
url = ' https://github.com/google/mediapipe ' ,
description = ' MediaPipe is the simplest way for researchers and developers to build world-class ML solutions and applications for mobile, edge, cloud and the web. ' ,
2021-06-24 23:10:25 +02:00
author = ' The MediaPipe Authors ' ,
2020-08-13 03:57:56 +02:00
author_email = ' mediapipe@google.com ' ,
2020-08-30 05:41:10 +02:00
long_description = _get_long_description ( ) ,
2020-08-13 03:57:56 +02:00
long_description_content_type = ' text/markdown ' ,
2022-11-04 17:45:33 +01:00
packages = setuptools . find_packages (
exclude = [ ' mediapipe.examples.desktop.* ' , ' mediapipe.model_maker.* ' ] ) ,
2020-08-13 03:57:56 +02:00
install_requires = _parse_requirements ( ' requirements.txt ' ) ,
cmdclass = {
2021-12-10 23:03:51 +01:00
' build_py ' : BuildPy ,
2022-09-06 23:29:51 +02:00
' build_modules ' : BuildModules ,
2021-12-10 23:03:51 +01:00
' build_ext ' : BuildExtension ,
2022-11-04 17:45:33 +01:00
' generate_metadata_schema ' : GenerateMetadataSchema ,
' gen_protos ' : GeneratePyProtos ,
2020-08-13 03:57:56 +02:00
' install ' : Install ,
2022-09-06 23:29:51 +02:00
' restore ' : Restore ,
2020-08-13 03:57:56 +02:00
} ,
ext_modules = [
BazelExtension ( ' //mediapipe/python:_framework_bindings ' ) ,
2022-11-04 17:45:33 +01:00
BazelExtension (
' //mediapipe/tasks/cc/metadata/python:_pywrap_metadata_version ' ) ,
BazelExtension (
' //mediapipe/tasks/python/metadata/flatbuffers_lib:_pywrap_flatbuffers '
) ,
2020-08-13 03:57:56 +02:00
] ,
zip_safe = False ,
include_package_data = True ,
classifiers = [
' Development Status :: 3 - Alpha ' ,
' Intended Audience :: Developers ' ,
' Intended Audience :: Education ' ,
' Intended Audience :: Science/Research ' ,
' License :: OSI Approved :: Apache Software License ' ,
' Operating System :: MacOS :: MacOS X ' ,
2020-12-10 04:13:05 +01:00
' Operating System :: Microsoft :: Windows ' ,
2020-08-13 03:57:56 +02:00
' Operating System :: POSIX :: Linux ' ,
' Programming Language :: Python :: 3.8 ' ,
2021-05-10 21:19:00 +02:00
' Programming Language :: Python :: 3.9 ' ,
2021-12-10 23:03:51 +01:00
' Programming Language :: Python :: 3.10 ' ,
2022-12-21 20:08:01 +01:00
' Programming Language :: Python :: 3.11 ' ,
2020-08-13 03:57:56 +02:00
' Programming Language :: Python :: 3 :: Only ' ,
' Topic :: Scientific/Engineering ' ,
' Topic :: Scientific/Engineering :: Artificial Intelligence ' ,
' Topic :: Software Development ' ,
' Topic :: Software Development :: Libraries ' ,
' Topic :: Software Development :: Libraries :: Python Modules ' ,
] ,
license = ' Apache 2.0 ' ,
keywords = ' mediapipe ' ,
)