2011-10-26 10 views
7

Mi servidor CentOS 5.5 tiene instalados Python 2.4 y Python 2.7 (al /opt/python2.7.2). En mi ~/.bash_profile tengo dos alias apuntando a mi Python 2.7 instalar y mi PATH configurado como:make ignora mi alias python bash

 
alias python=/opt/python2.7.2/bin/python 
alias python2.7=/opt/python2.7.2/bin/python 
PATH=$PATH:/opt/python2.7/bin 

También hay un enlace simbólico creé así:

 
ln -sf /opt/python2.7.2/bin/python /usr/bin/python2.7 

Tengo un Makefile que tiene la las siguientes líneas:

 
pythonbuild: 
     python setup.py build 

Para mi sorpresa, encontré que se está invocando Python 2.4 y no Python 2.7.

tengo que especificar explícitamente python2.7:

 
pythonbuild: 
     python2.7 setup.py build 

son alias de bash ignorados por make? Supongo que make usa PATH para localizar el primer ejecutable python (que pasa a ser Python 2.4) en su lugar?

Respuesta

6

De bash(1):

Aliases are not expanded when the shell is not interactive, 
    unless the expand_aliases shell option is set using shopt 
    (see the description of shopt under SHELL BUILTIN COMMANDS 
    below). 

Si bien es posible que pueda usar algo como SHELL=/bin/bash -O expand_aliases en su Makefile, creo que depende mantener una explícita Ency sobre el Python más nuevo en su Makefile es mucho mejor que mantener la dependencia oculta en su usuario~/.bash_profile archivo.

lugar, poner en su PYTHON=/opt/python2.7/bin/pythonMakefile, y a continuación, puedes utilizar:

pythonbuild: 
    $(PYTHON) setup.py build 

en las reglas.

La mejor parte es que usted puede cambiar fácilmente qué intérprete de Python se utiliza en la línea de comandos:

make PYTHON=/tmp/python-beta/bin/python pythonbuild 

Si implementa a otro sitio, es sólo uno línea en el Makefile que necesita estar actualizado.

1

alias son típicamente sólo son utilizadas por los proyectiles interactivos

Nota sólo eso, creo que make no siempre invocan la cáscara Su mejor apuesta es ser explícito acerca de los caminos que desea utilizar

1

Solución con grep y awk:

La ventaja de esta solución es que si cambio el alias en el directorio ~/.bash_profil o ~/.bashrc, se adopta automáticamente por mi makefile también.

Descripción:

Quiero usar el alias de lcw en mi makefile, que se define como en mi archivo ~/.bashrc.

Bashrc

... 
alias lcw='/mnt/disk7/LCW/productiveVersion/lcw.out' 
... 

utilizo también la definición de un Varialble como se presenta en las otras soluciones, pero he leído directamente su valor desde el .bashrc usando grep y awk.

makefile

LCW= $(shell grep alias\ lcw= ~/.bashrc | awk -F"'" '{print $$2}') 

.PHONY: std 
std: 
    $(LCW) 

Como se puede ver el alias lcw es llamado por el comando $(LCW) del makefile.

Nota:

Mi solución supone que el alias en el .bashrc se define dentro de '' caracteres.

+0

Apreciado y mantendrá esta técnica en la búsqueda. – Kev