.PHONY semua aturan di GNU membuat file?

17

Apakah saya salah dalam penafsiran saya bahwa pada dasarnya saya hanya harus mengutamakan sebelum semua membuat aturan:

.PHONY: all of my rules

all:
    echo "Executing all ..."

of:
    echo "Executing of ..."

my:
    echo "Executing my ..."

rules:
    echo "Executing rules ..."

Apakah pernah ada kasus di mana Anda tidak ingin mengikuti 'formula' ini?

http://www.gnu.org/software/make/manual/make.html#Phony-Target

tarabyte
sumber

Jawaban:

23

Panduan gaya Makefile Clark Grubb merekomendasikan bahwa:

  • Semua target palsu harus dideklarasikan dengan menjadikannya prasyarat dari .PHONY.
  • tambahkan setiap target palsu sebagai prasyarat. PHONY tepat sebelum deklarasi target, daripada mencantumkan semua target palsu di satu tempat.
  • Tidak ada target file yang harus menjadi prasyarat dari .PHONY.
  • target palsu tidak boleh menjadi prasyarat target file.

Sebagai contoh Anda, ini berarti:

.PHONY: all
all:
    echo "Executing all ..."

.PHONY: of
of:
    echo "Executing of ..."

.PHONY: my
my:
    echo "Executing my ..."

.PHONY: rules
rules:
    echo "Executing rules ..."

Beberapa PHONYtarget diperbolehkan; lihat juga pertanyaan Stack Overflow ini: "Apakah mungkin memiliki beberapa target .PHONY dalam file make gnu?"

Selain itu, walaupun hal ini tidak disebutkan secara langsung dalam pertanyaan Anda, Anda harus berhati-hati untuk tidak memiliki PHONYtarget dengan nama yang sama dari input aktual atau file perantara dalam proyek Anda. Misalnya, jika proyek Anda secara hipotetis memiliki file kode sumber bernama rules(tanpa akhiran), dimasukkannya string itu dalam PHONYtarget dapat mematahkan makeperilaku yang diharapkan .

bnewbold
sumber
1
bagian luar biasa pada panduan gaya. Terima kasih.
tarabyte
2

Saya pikir ini adalah praktik yang baik untuk diikuti tetapi memecah-mecahnya dan meletakkan fragmen-fragmennya bahkan setelah resep aturan lengkap juga bekerja pada gmake saya (3,81):

Misalnya:

#Makefile
all:
   @echo hello world
.PHONY: all

CMD:

$ touch all
$ make all    #this would be a no-op if all weren't a phoney target
  hello world 
PSkocik
sumber