makefile
.PHONY-mål
Sök…
Använda .PHONY för icke-filmål
Använd .PHONY
att ange målen som inte är filer, t.ex. clean
eller mrproper
.
Bra exempel
.PHONY: clean
clean:
rm *.o temp
Dåligt exempel
clean:
rm *.o temp
I det goda exemplet make
vet att clean
inte är en fil, därför kommer det inte att söka om det är eller inte aktuellt och kommer att utföra receptet.
I det dåliga exemplet make
kommer att leta efter en fil som heter clean
. Om det inte existerar eller inte är aktuellt kommer det att utföra receptet, men om det finns och är uppdaterat kommer inte receptet att köras.
Använda .PHONY för rekursiva invokationer av 'make' -kommandot
Rekursiv användning av märke innebär att man använder märke som ett kommando inom en makefil. Denna teknik är användbar när ett stort projekt innehåller underkataloger, var och en har sina respektive makefiler. Följande exempel hjälper till att förstå fördelen med att använda .PHONY med rekursivt märke.
/main
|_ Makefile
|_ /foo
|_ Makefile
|_ ... // other files
|_ /bar
|_ Makefile
|_ ... // other files
|_ /koo
|_ Makefile
|_ ... // other files
För att köra underfilens makefil från makefilen till main, skulle huvudfilmens fil ha loopningar som visas nedan (det finns andra sätt som detta kan uppnås, men det är utanför det aktuella ämnets räckvidd)
SUBDIRS = foo bar koo
subdirs:
for dir in $(SUBDIRS); do \
$(MAKE) -C $$dir; \
done
Men det finns fallgropar med denna metod.
- Eventuella fel som upptäcks i ett undermärke ignoreras av denna regel, så det kommer att fortsätta att bygga resten av katalogerna även om en misslyckas.
- Märks förmåga att utföra Parallell exekvering av flera build-mål utnyttjas inte eftersom endast en regel används.
Genom att förklara underkatalogerna som .PHONY-mål (du måste göra detta eftersom underkatalogen uppenbarligen alltid finns; annars kommer den inte att byggas) kan dessa problem övervinnas.
SUBDIRS = foo bar koo
.PHONY: subdirs $(SUBDIRS)
subdirs: $(SUBDIRS)
$(SUBDIRS):
$(MAKE) -C $@