He estado trabajando en hacer más fácil para los desarrolladores compilar e instalar Membase, y hoy he aprendido un poco más de magia automake. Soy uno de esos desarrolladores que no quieren pasar mucho tiempo trabajando en el sistema de compilación, quiero pasar mi tiempo trabajando en el código. Al mismo tiempo no quiero hacer trabajo manual innecesario y aburrido que el sistema de compilación debería hacer por mí.
Partes de Membase se implementan en Python, y he estado tratando de averiguar cómo instalar esas piezas. No me gusta desordenar el directorio /bin con archivos de "biblioteca", así que necesitaba una manera de empaquetar mejor los bits de Python. He estado usando un script de envoltura que establece la variable PYTHONPATH antes, pero nunca he tratado de integrar eso en un makefile generado por automake.
Como siempre empecé pidiendo ayuda a google, pero no terminé con un ejemplo bueno y fácil así que terminé leyendo el manual de automake. Resulta que es bastante fácil de hacer exactamente lo que quiero, así que decidí compartir los conocimientos en una entrada del blog :-)
No queremos codificar la ruta a nuestro binario en cualquier lugar, así que lo primero que tenemos que hacer es actualizar configure.ac para generar también nuestro script de envoltura:
AC_CONFIG_FILES(Makefile python_wrapper)
Tengo múltiples programas implementados con Python, y no quiero crear una tonelada de envoltorios, por lo que mi python_wrapper.in se parece:
¡#! /bin/sh
if test -z "${PYTHONPATH}"; then
PYTHONPATH=@libdir@/python
si no
PYTHONPATH=@libdir@/python:${PYTHONPATH}
fi
export PYTHONPATH
exec @libdir@/python/nombre base $0
.py "$@"
Esto significa que si instalo este script como /opt/membase/bin/stats, intentará ejecutar /opt/membase/lib/python/stats.py con los mismos argumentos. Así que vamos a seguir adelante y añadir una regla a Makefile.am para generar los scripts con los nombres correctos:
PYTHON_TOOLS=stats
${PYTHON_TOOLS}: python_wrapper
cp $< $@
BUILT_SOURCES += ${PYTHON_TOOLS}
CLEANFILES+= ${PYTHON_TOOLS}
bin_SCRIPTS+= ${PYTHON_TOOLS}
Ahora tenemos el script wrapper en su lugar, y hemos generado todos los scripts para iniciar nuestros programas. Lo siguiente sería crear el directorio de destino para los bits de python, e instalarlos todos allí. Para ello tenemos que crear una variable que termina con "dir" para contener el nombre del directorio. Llamemos a nuestro "pythonlibdir" y pongámoslo en un subdirectorio llamado python del libdir especificado:
pythonlibdir=$(libdir)/python
Por último, tenemos que enumerar todos los archivos que queremos que vayan allí:
pythonlib_DATA=
mc_bin_client.py
mc_bin_server.py
memcacheConstants.py
pythonlib_SCRIPTS=
stats.py
La razón por la que uso pythonlib_SCRIPTS para el último es porque quiero que el bit de ejecución se establezca en el archivo.