.PHONY กฎทั้งหมดใน GNU ทำไฟล์หรือไม่


18

ฉันผิดในการตีความของฉันที่ฉันควรจะวางก่อนก่อนกฎทั้งหมด:

.PHONY: all of my rules

all:
    echo "Executing all ..."

of:
    echo "Executing of ..."

my:
    echo "Executing my ..."

rules:
    echo "Executing rules ..."

เคยมีกรณีที่คุณไม่ต้องการทำตาม 'สูตร' นี้หรือไม่?

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

คำตอบ:


24

คู่มือสไตล์ Makefileของ Clark Grubb แนะนำว่า:

  • เป้าหมายปลอมทั้งหมดควรได้รับการประกาศโดยทำให้เป็นสิ่งที่จำเป็นต้องมีสำหรับ. PHONY
  • เพิ่มเป้าหมายปลอมแต่ละรายการเป็นสิ่งที่จำเป็นต้องมีก่อน. PHONY ทันทีก่อนการประกาศเป้าหมายแทนที่จะแสดงรายการเป้าหมายปลอมทั้งหมดในที่เดียว
  • ไม่มีเป้าหมายไฟล์ควรเป็นข้อกำหนดเบื้องต้นของ. PHONY
  • เป้าหมายปลอมไม่ควรเป็นข้อกำหนดเบื้องต้นของเป้าหมายไฟล์

สำหรับตัวอย่างของคุณสิ่งนี้จะหมายถึง:

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

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

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

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

PHONYอนุญาตเป้าหมายหลายเป้าหมาย ดูเพิ่มเติมได้ที่คำถาม Stack Overflow: "เป็นไปได้หรือไม่ที่จะมีเป้าหมาย. PHONY หลายรายการในไฟล์ gnu makefile"

นอกจากนี้แม้ว่าจะไม่ได้กล่าวถึงโดยตรงในคำถามของคุณคุณจะต้องระมัดระวังไม่ให้มีPHONYเป้าหมายที่มีชื่อเดียวกันของไฟล์อินพุตจริงหรือไฟล์สื่อกลางในโครงการของคุณ ตัวอย่างเช่นหากโครงการของคุณมีชื่อไฟล์ซอร์สrules(โดยไม่มีคำต่อท้าย) สมมุติว่าการรวมสตริงนั้นในPHONYเป้าหมายอาจทำให้makeเกิดพฤติกรรมที่คาดหวังได้


1
แบ่งปันที่ยอดเยี่ยมเกี่ยวกับคู่มือสไตล์ ขอขอบคุณ.
tarabyte

2

ฉันคิดว่ามันเป็นวิธีปฏิบัติที่ดีในการติดตาม แต่แยกส่วนมันและวางชิ้นส่วนแม้หลังจากสูตรการปกครองที่สมบูรณ์ก็ใช้งานได้กับ gmake ของฉัน (3.81):

เช่น:

#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 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.