2012-04-16 17 views
7

Potrzebuję kilka dowiązań symbolicznych w moim projekcie.Czy zależność od dowiązania symbolicznego jest możliwa w pliku Makefile?

Od, foldery img i theme muszą być oznaczone symbolami w contrib/openlayers. Folder contrib/openlayers powinien również zostać utworzony automatycznie.

.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] 

Ale ta reguła próbuje utworzyć dowiązania symboliczne za każdym razem. (Umieściłem -f flagę na ln, więc ponownie tworzy dowiązania symboliczne za każdym razem.)

Odpowiedz

3

Oczywiście, to może działać. Tworzenie traktuje wszystko jak plik, w tym dowiązanie symboliczne. Sprawdza, czy plik istnieje (ponieważ nie podano żadnych wymagań wstępnych, nie ma porównania datownika). W przypadku dowiązania symbolicznego naprawdę sprawdza on niezależnie od tego, do czego prowadzi łącze, oczywiście nie sam link.

Nie pokazujesz, co się dzieje, kiedy to robisz, ale na podstawie twojego opisu dzieje się jedna z dwóch rzeczy: albo (a) katalog contrib/openlayers nie istnieje, więc polecenie ln generuje błąd, a nie tworząc dowiązanie symboliczne, więc oczywiście make spróbuje odtworzyć go przy następnym uruchomieniu, lub (b) twoje dowiązanie symboliczne jest tworzone niepoprawnie i wskazuje na nic, co oznacza, że ​​gdy spróbujesz sprawdzić, czy istnieje, to się nie powiedzie i sprawi, że spróbuje odtwórz to.

Jeśli na przykład Twój katalog src jest rodzajem twojego katalogu contrib, twoje linki symlink są po prostu błędne; dostaniesz:

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

Albo, gdy jądro próbuje go rozwiązać:

contrib/openlayers/src/openlayers/theme 

Jest wysoce prawdopodobne, że to, co chcesz. Proponuję użyć czegoś takiego:

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

Następnie sprawdź, czy dowiązanie symboliczne, po utworzeniu, faktycznie wskazuje, gdzie chcesz iść.

+0

Masz rację, dowiązania symboliczne zostały zerwane. –

12

Jeśli kiedykolwiek napotkasz ten problem, mimo że twoje dowiązanie symboliczne wskazuje poprawnie na istniejący plik: pamiętaj również, że "make" wygląda na mtime pliku docelowego dowiązania symbolicznego, a nie w mtime samego dowiązania symbolicznego.

Dlatego, jeśli reguła wywołująca "ln -s" ma jakąkolwiek zależność, która jest nowsza niż plik wskazywany przez dowiązania symboliczne, to "make" musi ponownie uruchamiać polecenia w tej regule za każdym razem. Będzie to robić wielokrotnie, ponieważ tworzenie dowiązania symbolicznego wskazującego plik nie powoduje aktualizacji mtime tego pliku.

Możesz skorzystać z polecenia "dotknij", aby mieć pewność, że miejsce docelowe twojego linku ma nowszą datę mtime niż zależność.

+1

Dobra uwaga! Pomógł mi zrozumieć, dlaczego moja reguła nadal chce utworzyć link (http://stackoverflow.com/a/19213369/1510289) –

Powiązane problemy