2011-05-18 12 views
7

Mam kilka widżetów oznaczonych jako config.xml w ich root in a directory layout.Znajdowanie zależności między plikami Makefile

Plik GNUmake, który mam tutaj, jest w stanie je zbudować. Chociaż jeśli zaktualizuję foldery, zależności nie będą śledzone. Nie chcę oczywiście polegać na czystym celu, więc jak mogę śledzić zawartość każdego folderu?

WGTS := $(shell find -name 'config.xml' | while read wgtdir; do echo `dirname $$wgtdir`.wgt; done) 
all: $(WGTS) 
%.wgt: 
    @cd $* && zip -q -r ../$(shell basename $*).wgt . 
    @echo Created [email protected] 
clean: 
    rm -f $(WGTS) 

mam nadzieję coś takiego:

%.wgt: $(shell find $* -type f) 

będzie działać, ale tak nie jest. Help.

+0

Więc ... chcesz, aby 'foo.wgt' było zależne od wszystkiego w' foo/'? – Beta

+0

To prawda ... – hendry

Odpowiedz

4

Łącząc Beta's idea z kopalni:

 
WGTS := $(shell find -name config.xml) 
WGTS := $(WGTS:/config.xml=.wgt) 
WGTS_d := $(WGTS:.wgt=.wgt.d) 

all: $(WGTS) 
clean: 
    rm -f $(WGTS) $(WGTS_d) 

-include $(WGTS_d) 

define WGT_RULE 
$(1): $(shell find $(1:.wgt=)) 
$(1:.wgt=)/%: 
    @ 
endef 
$(foreach targ,$(WGTS),$(eval $(call WGT_RULE,$(targ)))) 
%.wgt: 
    @echo Creating [email protected] 
    @(echo -n "[email protected]: "; find $* -type f | tr '\n' ' ') > [email protected] 
    @cd $* && zip -q -r ../$(shell basename $*).wgt . 

Przykład:

 
$ mkdir -p foo bar/nested 
$ touch {foo,bar/nested}/config.xml 
$ make 
Creating bar/nested.wgt 
Creating foo.wgt 
$ make 
make: Nothing to be done for `all'. 
$ touch foo/a 
$ make 
Creating foo.wgt 
$ rm foo/a 
$ make 
Creating foo.wgt 
$ make 
make: Nothing to be done for `all'. 

Jedynym potencjalnym problemem tutaj jest obojętne zasada, która pozwala dokonać ignorować cele nie wie jak zbudować które są zagnieżdżone wewnątrz katalogów. (foo/a w moim przykładzie.) Jeśli są to rzeczywiste cele, które sprawiają, że trzeba wiedzieć, jak budować, definicja duplikatu receptury może stanowić problem.

+0

Potrzebuję go do uwzględnienia nowych plików dodanych. nie bardzo rozumiem potrzebę wypisania tego .wgt.d rzecz, to wygląda dla mnie jak cruft. W pliku config.xml nie będzie przypadku pliku config.xml. :) – hendry

+0

@hendry: Zapisywanie plików zależności pozwala po prostu uwzględnić je w kolejnych uruchomieniach bez konieczności regenerowania wszystkich tych informacji. W większości przypadków działa dobrze (i jest powszechnie używany do generowania zależności C-source od nagłówków); ale nie radzi sobie z dodawaniem plików z obiektami docelowymi, które zależą tylko od stanu systemu plików. –

+0

@thomas Ten Makefile może uwzględniać dodawanie oraz usuwanie plików, jednak nie mogę go dostosować do konta dla dowolnej struktury katalogów, której moje widżety znajdują się w http://tests.wacapps.net/?p=wac2tests;a= blob; f = samples/Makefile; Myślę, że jeśli zrozumiemy http://www.gnu.org/s/hello/manual/make/Secondary-Expansion.html, znajdziemy odpowiedź: – hendry

1

Prawdopodobnie najlepszym sposobem na to jest stworzenie wstępnych list wyraźnie, wcześniej:

define WGT_RULE 
$(1).wgt: $(wildcard $(1)/*) 
endef 

$(foreach targ,$(WGTS),$(eval $(call WGT_RULE,$(targ)))) 

Jest też inny sposób to bardzo mądry (wyrażenie, które sprawia, że ​​dobry programista ostrożny). Wiele lat temu wymyśliłem leworęczny kaftan, który traktował katalog jako warunek wstępny. Zobaczę, czy uda mi się wykopać stare zeszyty, jeśli powyższe nie jest wystarczająco dobre.

EDYCJA:
Przykro nam, nie brałem pod uwagę podkatalogów. Oto kompletny plik Makefile (pominięto regułę clean), który powinien wystarczyć.

WGTS := $(shell find -name 'config.xml' | while read wgtdir; do echo `dirname $\ 
$wgtdir`.wgt; done) 
all: $(WGTS) 

# This constructs a rule without commands ("foo.wgt: foo/bar.txt foo/baz.dat..."). 
define WGT_RULE 
$(1).wgt: $(shell find $(1)) 
endef 

# This invokes the above to create a rule for each widget. 
$(foreach targ,$(WGTS),$(eval $(call WGT_RULE,$(targ)))) 

%.wgt: 
    @cd $* && zip -q -r ../$(shell basename $*).wgt . 
    @echo Created [email protected] 
+0

Po prostu próbowałem utworzyć nowy plik w podkatalogu, a plik Makefile go nie podniósł. :(Czy istnieje sposób na uniknięcie tego WGT_RUL? Wydaje mi się, że jest to trochę zbędne, wolałbym go od "% .wgt:' Sorry to be difficult ... – hendry

+0

To nie działa: 'hendry @ x201 foo $ mkdir bar Hendry @ x201 foo $ touch bar/config.xml Hendry @ x201 foo $ uczynić znajdują się: './bar.wgt ': Nie ma takiego pliku lub katalogu Utworzony bar.wgt Hendry @ x201 foo $ uczynić Producent: Nic do zrobienia w 'all ' Hendry @ x201 foo $ vim Makefile Hendry @ x201 foo $ bar touch/foo Hendry @ x201 foo $ uczynić Producent:. Nic do zrobienia w' all'. hendry @ x201 foo $ ' – hendry

Powiązane problemy