2012-04-16 9 views
7

Ho bisogno di un paio di collegamenti simbolici nel mio progetto.La dipendenza da un collegamento simbolico è possibile in un Makefile?

Da src/openlayers, le cartelle img e theme devono essere simulate in contrib/openlayers. La cartella contrib/openlayers dovrebbe anche essere creata automaticamente.

.PHONY: run 
run: contrib/openlayers/theme contrib/openlayers/img 
    ../bin/pserve development.ini --reload 

contrib/openlayers/theme: 
    ln -s src/openlayers/theme [email protected] 

contrib/openlayers/img: 
    ln -s src/openlayers/img [email protected] 

Ma questa regola tenta di creare collegamenti simbolici ogni volta. (Metto il flag -f su ln, quindi ricrea ogni volta i collegamenti simbolici.)

risposta

3

Certo, questo può funzionare. Crea tratta tutto come un file, incluso un link simbolico. Verificherà se il file esiste (dal momento che non vengono elencati i prerequisiti, non esiste un confronto tra gli indicatori di data e ora). Nel caso di un link simbolico, è in realtà il controllo su qualsiasi punto del link, naturalmente, non sul link stesso.

Non si mostra cosa succede quando lo si fa, ma in base alla descrizione si verifica una delle due cose: o (a) la directory contrib/openlayers non esiste, quindi il comando ln genera un errore e non creando il link simbolico, quindi ovviamente make cercherà di ricrearlo la prossima volta che viene eseguito, o (b) il tuo link simbolico viene creato in modo errato e non punta a nulla, il che significa quando make prova a vedere se esiste fallisce e make proverà a ricrearlo.

Se, ad esempio, la directory src è un fratello della directory contrib, i collegamenti simbolici sono errati; si otterrà:

contrib/openlayers/theme -> src/openlayers/theme 

Oppure, quando il kernel cerca di risolvere è:

contrib/openlayers/src/openlayers/theme 

E 'altamente improbabile che è quello che vuoi. Vi suggerisco di usare qualcosa di simile:

contrib/openlayers/theme: 
     mkdir -p contrib/openlayers 
     ln -s ../../src/openlayers/theme contrib/openlayers/theme 

quindi verificare che il link simbolico, una volta creato, fa in realtà dove si vuole andare.

+0

Hai ragione, i collegamenti simbolici erano interrotti. –

12

Nel caso in cui mai si esegue in questo problema nonostante il tuo link simbolico che punta correttamente a un file esistente: anche tenere a mente che "fanno" guarda alla mtime del file di destinazione del link simbolico, e non a il mtime del link simbolico stesso.

Pertanto, se la regola che definisce "ln -s" ha una dipendenza che è recente rispetto al file il vostro link simbolici punti a, quindi "fare" deve eseguire di nuovo i comandi che regola ogni volta. Lo farà ancora e ancora perché la creazione di un collegamento simbolico che punta a un file non aggiorna il mtime di quel file.

Potrebbe essere possibile utilizzare il comando "touch" per garantire che la destinazione del collegamento abbia un tempo più recente della dipendenza.

+1

Buon punto! Mi ha aiutato a capire perché la mia regola continuava a voler creare il collegamento (http://stackoverflow.com/a/19213369/1510289) –

Problemi correlati