2013-03-17 18 views
6

Chcę skopiować plik na serwer przy użyciu scp. Ale chcę użyć mojej aktualnej nazwy folderu w moim pliku Makefile jako zmiennej.Jak uzyskać nazwę pliku podstawowego folderu jako zmienną w pliku makefile?

Wiem, że otrzymuję bieżącą ścieżkę przy użyciu $(CURDIR), ale moja lokalna ścieżka nie jest taka sama na moim serwerze zdalnym.

E.g. moją ścieżką jest /Users/obstschale/Documents/Lab2/ i chcę skopiować Lab2.tar do [email protected]:/home/path/Lab2/.

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

Prawdopodobnie muszę włożyć coś do $(CURDIR) i znaleźć mój ostatni folder.

Aktualizacja: $(CURDIR) jest właściwą zmienną. $(CURID) jest zły, przynajmniej to nie dla mnie działa.

+0

pełna ścieżka: http://stackoverflow.com/questions/3050231/how-can-i-capture-the-current-directory-as-an-absolute-pathname-in-a-make-variab –

Odpowiedz

12

nie miałem szczęścia do składni grawis w makefile (GNU make 3.81), jak Sylvain opisuje. Jeśli to nie działa dla Ciebie albo użyj

$(shell basename $(CURDIR)) 

zamiast

`basename $(CURDIR)` 
+0

to działa dla mnie :) Ale jeśli robię 'Folder = $ (shell basename $ (CURDIR)); echo $ Folder' wyświetli "starszy". Co jest nie tak? –

+0

$ (Folder) zamiast folderu $. ;-) – firefrorefiddle

+0

To zadziałało, podczas gdy rozwiązanie Sylvaina nie było takie. – nebffa

3

Można użyć polecenia powłoki , aby wyodrębnić ostatnią część komponentu $(CURDIR).

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

To wymaga '$' przed '{folder}'. – destenson

2

Jeśli szukasz rozebrać ostatnią nazwę folderu na drodze na zewnątrz, istnieje szereg wbudowanych w funkcje makefile. Zobacz http://www.chemie.fu-berlin.de/chemnet/use/info/make/make_8.html#SEC74, aby uzyskać szybki przegląd operacji na plikach.

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

Kluczowym elementem tego jest oczywiście $(notdir $(CURDIR)). Jak odkryłeś, $(CURDIR) zawiera ścieżkę do katalogu, w którym został uruchomiony plik Makefile, bez końcowego "/". Funkcja notdir usuwa wszystko, włącznie z ostatnim "/" w nazwie pliku. To kończy się zrywaniem wszystkiego oprócz końcowego katalogu.

Jeśli $(CURDIR) nadal ma kończące „/”, można rozebrać że się tak funkcja notdir będą robić to, co chcesz tak:

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

Zauważ, że odstęp w tym przypadku jest niezwykle ważne, kładąc spacja przed lub po dowolnym przecinku wstawi spację, gdy zrobi zastępcze zastępstwo.

2

Próbowałem tę regułę:

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

który pracował dobrze dla mnie.

może to nie jest przeznaczone do pracy, ponieważ notdir powinien

Extract część zakaz katalogów każdej nazwy pliku.

+0

Działa również dla mnie :), dziękuję! – smac89