Tenho trabalhado para tornar mais fácil para os desenvolvedores compilar e instalar o Membase, e hoje aprendi mais um pouco da mágica do automake. Sou um daqueles desenvolvedores que não querem passar muito tempo trabalhando no sistema de compilação, quero passar meu tempo trabalhando no código. Ao mesmo tempo, não quero fazer um trabalho manual desnecessário e chato que o sistema de compilação deveria fazer por mim.
Partes do Membase são implementadas em Python, e eu estava tentando descobrir como instalar essas partes. Não gosto de bagunçar o diretório /bin com arquivos de "biblioteca", portanto, precisava de uma maneira de empacotar melhor as partes do Python. Tenho usado um script de wrapper que define a variável PYTHONPATH anteriormente, mas nunca tentei integrar isso em um makefile gerado pelo automake.
Como sempre, comecei pedindo ajuda ao Google, mas não encontrei um exemplo bom e fácil, então acabei lendo o manual do automake. Acontece que é bastante fácil fazer exatamente o que eu quero, então decidi compartilhar o conhecimento em uma postagem de blog :-)
Não queremos codificar o caminho para o nosso binário em nenhum lugar, portanto, a primeira coisa que precisamos fazer é atualizar o configure.ac para gerar também o nosso script de wrapper:
AC_CONFIG_FILES(Makefile python_wrapper)
Tenho vários programas implementados com Python e não quero criar uma tonelada de wrappers, portanto, meu python_wrapper.in tem a seguinte aparência:
#! /bin/sh
if test -z "${PYTHONPATH}"; then
PYTHONPATH=@libdir@/python
mais
PYTHONPATH=@libdir@/python:${PYTHONPATH}
fi
exportar PYTHONPATH
exec @libdir@/python/nome de base $0.py "$@"
Isso significa que, se eu instalar esse script como /opt/membase/bin/stats, ele tentará executar /opt/membase/lib/python/stats.py com os mesmos argumentos. Portanto, vamos adicionar uma regra ao Makefile.am para gerar os scripts com os nomes corretos:
PYTHON_TOOLS=stats
${PYTHON_TOOLS}: python_wrapper
cp $< $@
BUILT_SOURCES += ${PYTHON_TOOLS}
CLEANFILES+= ${PYTHON_TOOLS}
bin_SCRIPTS+= ${PYTHON_TOOLS}
Agora temos o script wrapper instalado e geramos todos os scripts para iniciar nossos programas. A próxima coisa a fazer seria criar o diretório de destino para os bits python e instalar todos eles lá. Para isso, precisamos criar uma variável que termine com "dir" para conter o nome do diretório. Vamos nomear nosso "pythonlibdir" e colocá-lo em um subdiretório chamado python do libdir especificado:
pythonlibdir=$(libdir)/python
Por fim, precisamos listar todos os arquivos que queremos colocar lá:
pythonlib_DATA=
mc_bin_client.py
mc_bin_servidor.py
memcacheConstants.py
pythonlib_SCRIPTS=
stats.py
O motivo pelo qual uso pythonlib_SCRIPTS para o último é porque quero que o bit de execução seja definido no arquivo.