makefile
.PHONY doel
Zoeken…
.PHONY gebruiken voor niet-bestandsdoelen
Gebruik .PHONY
om de doelen op te geven die geen bestanden zijn, bijvoorbeeld clean
of mrproper
.
Goed voorbeeld
.PHONY: clean
clean:
rm *.o temp
Slecht voorbeeld
clean:
rm *.o temp
In het goede voorbeeld make
, weet dat clean
is geen bestand, daarom zal het niet zoeken als het of niet up-to-date en zal het recept uit te voeren.
In het slechte voorbeeld zoekt make
naar een bestand met de naam clean
. Als het niet bestaat of niet up-to-date is, zal het het recept uitvoeren, maar als het bestaat en up-to-date is, wordt het recept niet uitgevoerd.
.PHONY gebruiken voor recursieve aanroepen van het commando 'make'
Recursief gebruik van make betekent make gebruiken als opdracht binnen een makefile. Deze techniek is nuttig wanneer een groot project submappen bevat die elk hun respectieve makefiles hebben. Het volgende voorbeeld zal het voordeel van het gebruik van .PHONY met recursief merk helpen begrijpen.
/main
|_ Makefile
|_ /foo
|_ Makefile
|_ ... // other files
|_ /bar
|_ Makefile
|_ ... // other files
|_ /koo
|_ Makefile
|_ ... // other files
Om makefile van subdirectory's uit te voeren vanuit het makefile van main, zou het makefile van de main looping hebben zoals hieronder getoond (er zijn andere manieren waarop dit kan worden bereikt, maar dat valt buiten het bereik van het huidige onderwerp)
SUBDIRS = foo bar koo
subdirs:
for dir in $(SUBDIRS); do \
$(MAKE) -C $$dir; \
done
Er zijn echter valkuilen met deze methode.
- Elke fout die in een submerk wordt gedetecteerd, wordt door deze regel genegeerd, dus deze blijft de rest van de mappen bouwen, zelfs als er een mislukt.
- Het vermogen van Make om parallelle uitvoering van meerdere builddoelen uit te voeren, wordt niet gebruikt, omdat slechts één regel wordt gebruikt.
Door de submappen aan te geven als .PHONY-doelen (u moet dit doen omdat de submap uiteraard altijd bestaat; anders wordt deze niet gebouwd) kunnen deze problemen worden opgelost.
SUBDIRS = foo bar koo
.PHONY: subdirs $(SUBDIRS)
subdirs: $(SUBDIRS)
$(SUBDIRS):
$(MAKE) -C $@