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.

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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow