2013-03-17 22 views
6

Voglio copiare un file su un server usando scp. Ma voglio usare il mio nome di cartella corrente nel mio makefile come variabile.Come ottenere il nome base della cartella corrente come variabile in un makefile?

So che ho ottenuto il mio percorso corrente utilizzando $(CURDIR) ma il mio percorso locale non è lo stesso sul mio server remoto.

E.g. il mio percorso è /Users/obstschale/Documents/Lab2/ e voglio copiare Lab2.tar a [email protected]:/home/path/Lab2/.

copy2server: 
    echo $(CURDIR) 
    scp Lab2.tar [email protected]:/home/path/{folder} 

probabilmente devo tubo $(CURDIR) in qualcosa e trovare la mia ultima cartella.

Aggiornamento: $(CURDIR) è la variabile giusta. $(CURID) è quello sbagliato almeno non ha funzionato per me.

+0

percorso completo: http://stackoverflow.com/questions/3050231/how-can-i-capture-the-current-directory-as-an-absolute-pathname-in-a-make-variab –

risposta

12

non ho avuto fortuna con la sintassi backtick nel makefile (GNU Make 3.81) come Sylvain descrive. Se non funziona neanche per te, utilizzare

$(shell basename $(CURDIR)) 

invece di

`basename $(CURDIR)` 
+0

questo funziona per me :) Ma se faccio 'Folder = $ (shell basename $ (CURDIR)); echo $ Folder' stamperà 'vecchio'. Cosa c'è che non va? –

+0

$ (cartella) invece di $ cartella. ;-) – firefrorefiddle

+0

Questo ha funzionato per me mentre la soluzione di Sylvain non è stata – nebffa

3

È possibile utilizzare il comando di shell basename per estrarre l'ultima parte componente di $(CURDIR).

copyserver: 
    folder=`basename "$(CURDIR)"`; scp Lab2.tar [email protected]:/home/path/${folder} 
+0

Questo ha bisogno di un '$' davanti a '{folder}'. – destenson

2

Se stai cercando di togliere il cognome cartella nel percorso fuori, ci sono una serie di costruito in funzioni makefile. Vedi http://www.chemie.fu-berlin.de/chemnet/use/info/make/make_8.html#SEC74 per una rapida panoramica delle operazioni sui file.

copytoserver: 
    scp Lab2.tar [email protected]:/home/path/$(notdir $(CURDIR)) 

La voce chiave di questo è naturalmente $(notdir $(CURDIR)). Come hai scoperto, lo $(CURDIR) contiene il percorso della directory in cui è stato eseguito il makefile, senza il '/' finale. La funzione notdir rimuove tutto fino a includere l'ultimo '/' in un nome file. Questo finisce per spogliare tutto tranne la directory finale.

Se $(CURDIR) ha ancora il finale '/', si può striscia che fuori così la funzione di notdir farà ciò che si vuole in questo modo:

$(notdir $(patsubst %/,%,$(CURDIR))) 

Nota che la spaziatura in questo caso è di fondamentale importanza, mettendo un spazio prima o dopo una qualsiasi delle virgole inserirà uno spazio quando esegue la sostituzione del modello avido.

2

Ho provato questa regola:

test: 
    @echo $(CURDIR)   # e.g. /tmp/foobar/blafoor/baz 
    @echo $(notdir $(CURDIR)) # gives "baz" here. 

che ha funzionato bene per me.

forse questo non è destinato a lavorare, perché notdir dovrebbe

estrarre la parte non-directory di ciascun nome di file.

+0

Funziona anche per me :), grazie! – smac89

Problemi correlati