2013-01-12 13 views
20

Jedna reguła w moim Makefile zamienia cały katalog (res/) w plik ZIP. Oczywiście ta reguła musi zostać wykonana, gdy dowolny plik w katalogu res/ ulega zmianie. Dlatego chcę, aby reguła miała jako warunek wstępny wszystkie pliki znajdujące się pod tym katalogiem. Jak mogę wdrożyć tę regułę?Reguła Makefile, która zależy od wszystkich plików w katalogu (w tym w podkatalogach)

W Bash with the globstar option enabled można uzyskać listę wszystkich plików w tym katalogu przy użyciu wzoru wieloznacznego res/**/*. Jednak nie wydaje się działać, jeśli podasz go jako warunek wstępny w Makefile:

filename.jar: res/**/* 

Nawet po touch ing plik w res/, Pozwól nadal zgłasza

make: `filename.jar' is up to date. 

więc wyraźnie, że jest nie rozpoznaje wzoru.

Gdybym zadeklarować directory się jako warunek:

filename.jar: res 

następnie dokonać nie będzie ponownie uruchomić, gdy plik jest modyfikowany (myślę make wygląda tylko na datę modyfikacji samego katalogu, co tylko zmienia się, gdy bezpośrednie dzieci są dodawane, usuwane lub mają zmienioną nazwę).

+0

możliwe duplikat [Makefile: zależy od każdego pliku w katalogu] (http://stackoverflow.com/questions/5656913/makefile-depend-on-each-file-of-a-katalog) –

Odpowiedz

29

to:

filename.jar: $(wildcard res/**/*) 

wydaje się działać, przynajmniej na niektórych platformach.

EDIT:

Albo lepiej, po prostu przeciąć węzeł:

filename.jar: $(shell find res -type f) 
+1

Propozycja "wieloznaczna" nie działa dla mnie, ale 'find' działa. (Użyłem tylko '$ (shell find res)', aby wyzwolić go, gdy pliki zostaną usunięte.) –

+3

Zastrzeżenie: Jeśli usuniesz * jeden z plików wejściowych po słoikowaniu, make nie zauważy. Aby wykryć usunięcie plików, możesz zapisać listę w pliku podobnym do http://stackoverflow.com/questions/3236145/force-gnu-make-to-rebuild-objects-affected-by-compiler-definition/3237349 # 3237349 – slowdog

+0

@slowdog: Prawda, ale w tym celu (archiwum ZIP) nie sądzę, żeby to miało znaczenie. – Beta

Powiązane problemy