2011-10-26 18 views
7

Il mio server CentOS 5.5 ha installato sia Python 2.4 che Python 2.7 (su /opt/python2.7.2). Nel mio ~/.bash_profile ho due alias indicando il mio Python 2.7 installare e mia PATH configurato come:make ignora il mio alias bash Python

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

C'è anche un link simbolico che ho creato così:

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

Ho un Makefile che ha la linee seguenti:

 
pythonbuild: 
     python setup.py build 

Con mia sorpresa ho trovato che Python 2.4 viene invocato e non Python 2.7.

devo specificare esplicitamente python2.7:

 
pythonbuild: 
     python2.7 setup.py build 

sono alias bash ignorati dai make? Sto indovinando make utilizza PATH per individuare il primo eseguibile python (che si verifica essere Python 2.4) invece?

risposta

6

Da 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). 

Mentre si potrebbe essere in grado di usare qualcosa come SHELL=/bin/bash -O expand_aliases nel vostro Makefile, credo che mantenere un esplicito dipendono ency sul più recente Python nel tuo Makefile è molto meglio di mantenere la dipendenza nascosta nel tuo utente~/.bash_profile file.

Invece, mettere PYTHON=/opt/python2.7/bin/python nella vostra Makefile, e allora si può solo utilizzare:

pythonbuild: 
    $(PYTHON) setup.py build 

nelle regole.

La parte migliore è che si può facilmente cambiare il quale interprete Python si utilizza sulla riga di comando:

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

Se si distribuisce in un altro sito, esso è solo una linea nella Makefile che ha bisogno di essere aggiornato.

1

alias sono tipicamente utilizzati solo per le shell interattive

nota solo quello, penso che make non sempre invocare il guscio La cosa migliore è essere espliciti sui percorsi che si desidera utilizzare

1

Soluzione con grep e awk:

Il vantaggio di questa soluzione è che se cambio l'alias in ~/.bash_profil o ~/.bashrc, viene adottata automaticamente dal mio makefile pure.

Descrizione:

voglio usare il LCW alias nel mio makefile, che è definito come nel mio file ~/.bashrc.

.bashrc

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

uso inoltre la definizione di una varialble come presentato nelle altre soluzioni, ma ho letto direttamente il suo valore dal bashrc usando grep e awk.

makefile

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

.PHONY: std 
std: 
    $(LCW) 

Come si vede l'alias LCW è chiamato dal comando $(LCW) dal makefile.

Nota:

La mia soluzione presuppone che l'alias del bashrc è definito all'interno di '' caratteri.

+0

Apprezzato e manterrà questa tecnica in cerca. – Kev