Ejecutar Makefile en pip install

Tengo algunas definiciones de búfer de protocolo que deben comstackrse en la fuente de Python como parte del proceso de pip install . He subclasificado el comando setuptools.command.install en setup.py pero creo que está intentando ejecutar el Makefile después de instalar el paquete para que no se reconozcan las fonts.

No puedo encontrar información sobre lo que sucede durante la instalación de un pip. ¿Alguien puede arrojar algo de luz?

setup.py:

 import subprocess import sys from setuptools import setup from setuptools.command.install import install class Install(install): """Customized setuptools install command - builds protos on install.""" def run(self): protoc_command = ["make", "python"] if subprocess.call(protoc_command) != 0: sys.exit(-1) install.run(self) setup( name='myprotos', version='0.0.1', description='Protocol Buffers.', install_requires=[], cmdclass={ 'install': Install, } ) 

Salida de $ pip install -vvv . :

 Processing /path/to/myprotos Running setup.py (path:/private/var/folders/3t/4qwkfyr903d0b7db7by2kj6r0000gn/T/pip-jpgCby-build/setup.py) egg_info for package from file:///path/to/myprotos Running command python setup.py egg_info running egg_info creating pip-egg-info/myprotos.egg-info writing pip-egg-info/myprotos.egg-info/PKG-INFO writing top-level names to pip-egg-info/myprotos.egg-info/top_level.txt writing dependency_links to pip-egg-info/myprotos.egg-info/dependency_links.txt writing manifest file 'pip-egg-info/myprotos.egg-info/SOURCES.txt' reading manifest file 'pip-egg-info/myprotos.egg-info/SOURCES.txt' writing manifest file 'pip-egg-info/myprotos.egg-info/SOURCES.txt' Source in /private/var/folders/3t/4qwkfyr903d0b7db7by2kj6r0000gn/T/pip-jpgCby-build has version 0.0.1, which satisfies requirement myprotos==0.0.1 from file:///path/to/myprotos Building wheels for collected packages: myprotos Running setup.py bdist_wheel for myprotos: started Destination directory: /var/folders/3t/4qwkfyr903d0b7db7by2kj6r0000gn/T/tmpD7dfGKpip-wheel- Running command /usr/local/opt/python/bin/python2.7 -u -c "import setuptools, tokenize;__file__='/private/var/folders/3t/4qwkfyr903d0b7db7by2kj6r0000gn/T/pip-jpgCby-build/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" bdist_wheel -d /var/folders/3t/4qwkfyr903d0b7db7by2kj6r0000gn/T/tmpD7dfGKpip-wheel- --python-tag cp27 running bdist_wheel running build installing to build/bdist.macosx-10.12-x86_64/wheel running install # THIS IS MY MAKEFILE RUNNING Grabbing github.com/google/protobuf... Building Python protos... # MAKEFILE COMPLETE running install_egg_info running egg_info creating myprotos.egg-info writing myprotos.egg-info/PKG-INFO writing top-level names to myprotos.egg-info/top_level.txt writing dependency_links to myprotos.egg-info/dependency_links.txt writing manifest file 'myprotos.egg-info/SOURCES.txt' reading manifest file 'myprotos.egg-info/SOURCES.txt' writing manifest file 'myprotos.egg-info/SOURCES.txt' Copying myprotos.egg-info to build/bdist.macosx-10.12-x86_64/wheel/myprotos-0.0.1-py2.7.egg-info running install_scripts creating build/bdist.macosx-10.12-x86_64/wheel/myprotos-0.0.1.dist-info/WHEEL Running setup.py bdist_wheel for myprotos: finished with status 'done' Stored in directory: /Users/jds/Library/Caches/pip/wheels/92/0b/37/b5a50146994bc0b6774407139f01d648ba3a9b4853d2719c51 Removing source in /private/var/folders/3t/4qwkfyr903d0b7db7by2kj6r0000gn/T/pip-jpgCby-build Successfully built myprotos Installing collected packages: myprotos Found existing installation: myprotos 0.0.1 Uninstalling myprotos-0.0.1: Removing file or directory /usr/local/lib/python2.7/site-packages/myprotos-0.0.1.dist-info/DESCRIPTION.rst Removing file or directory /usr/local/lib/python2.7/site-packages/myprotos-0.0.1.dist-info/INSTALLER Removing file or directory /usr/local/lib/python2.7/site-packages/myprotos-0.0.1.dist-info/METADATA Removing file or directory /usr/local/lib/python2.7/site-packages/myprotos-0.0.1.dist-info/RECORD Removing file or directory /usr/local/lib/python2.7/site-packages/myprotos-0.0.1.dist-info/WHEEL Removing file or directory /usr/local/lib/python2.7/site-packages/myprotos-0.0.1.dist-info/metadata.json Removing file or directory /usr/local/lib/python2.7/site-packages/myprotos-0.0.1.dist-info/top_level.txt Successfully uninstalled myprotos-0.0.1 Successfully installed myprotos-0.0.1 Cleaning up... 

¿Debería mi Makefile ejecutarse temprano en el proceso para generar los archivos de origen? ¿Los archivos deben estar allí antes de que se ejecute egg_info por ejemplo?

Si ejecuto manualmente el Makefile y luego instalo el paquete, entonces funciona.


Actualizar

Aquí está la estructura de mi proyecto:

 myprotos ├── Makefile ├── README.md ├── document.proto ├── myprotos # Generated by Makefile │ ├── __init__.py # Generated by Makefile │ └── proto_pb2.py # Generated by Makefile └── setup.py 

Aquí está la sección del Makefile que genera la fuente de Python a partir de las definiciones del Buffer de Potocol:

 python: protoc deps # the protoc and deps command above just downloads # the `protoc` binary to a local bin directory @echo "Building Python protos..." @mkdir -p "${PYTHON_OUT}" @touch "${PYTHON_OUT}"/__init__.py @printf "__all__ = ['proto_pb2']" > "${PYTHON_OUT}"/__init__.py @PATH="${LOCAL_BINARY_PATH}:$$PATH" protoc \ --proto_path="${BASE}" \ --proto_path="${GOPATH}/src/github.com/google/protobuf/src" \ --python_out="${PYTHON_OUT}/" \ ${PROTOS} 

OK, hay tres cosas que necesitas cambiar aquí:

  1. Agregue Makefile y document.proto a un nuevo archivo MANIFEST.in .

     Makefile document.proto 

    Si lo hace, el archivo .zip creado por python setup.py sdist (que también se carga en PyPI) contendrá esos archivos.

  2. python setup.py build ejecutar su comando make durante la python setup.py build , no durante la install :

     import sys from setuptools import setup from setuptools.command.build import build class Build(build): """Customized setuptools build command - builds protos on build.""" def run(self): protoc_command = ["make", "python"] if subprocess.call(protoc_command) != 0: sys.exit(-1) build.run(self) setup( ... cmdclass={ 'build': Build, } ) 
  3. Por último, debe indicar a setuptools que instale el paquete resultante en la install definiendo un packages atributos en setup() :

     setup( ... packages=['myprotos'] )