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.

  1. 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.
  2. 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 $@


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow