อะไรคือความแตกต่างระหว่าง: = และ = ใน Makefile?


101

สำหรับการกำหนดตัวแปรใน Make ฉันเห็นตัวดำเนินการ = และ = อะไรคือความแตกต่างระหว่างพวกเขา?


7
อาจซ้ำกันของการกำหนดตัวแปร Makefile
eldarerathis

คำตอบ:


80

นี้ได้อธิบายไว้ในเอกสารยี่ห้อ GNU ในหัวข้อ6.2 สองรสชาติของตัวแปร

ในระยะสั้นตัวแปรที่กำหนดด้วย:=จะถูกขยายหนึ่งครั้ง แต่ตัวแปรที่กำหนดด้วย=จะขยายเมื่อใดก็ตามที่มีการใช้


4
มันจะถูกต้องหรือไม่ที่จะบอกว่า: = มีประสิทธิภาพมากกว่า? หรือประสิทธิภาพไม่ได้เป็นปัจจัยสำคัญกับ Makefiles?
Ungeheuer

3
@Ungeheuer นั่นไม่ใช่ปัญหาเพราะการเรียกกระบวนการ ( makeงานหลักของ) มีค่าโสหุ้ยที่ใหญ่กว่าการแก้ไขตัวแปรภายใน
Kirill Bulygin

68

มอบหมายงานง่ายๆ :=

นิพจน์การมอบหมายงานอย่างง่ายจะได้รับการประเมินเพียงครั้งเดียวในเหตุการณ์แรก ตัวอย่างเช่นถ้าCC :=${GCC} ${FLAGS}ในระหว่างการเผชิญหน้ากันครั้งแรกได้รับการประเมินไปgcc -Wแล้วในแต่ละครั้งที่เกิดขึ้นมันจะถูกแทนที่ด้วย${CC}gcc -W

การมอบหมายซ้ำ =

นิพจน์การกำหนดแบบวนซ้ำจะถูกประเมินทุกครั้งที่พบตัวแปรในโค้ด ยกตัวอย่างเช่นเช่นคำสั่งCC = ${GCC} {FLAGS}จะถูกประเมินเฉพาะเมื่อมีการกระทำที่เหมือน${CC} file.cจะถูกดำเนินการ อย่างไรก็ตามหากตัวแปรGCCถูกกำหนดใหม่เช่น GCC=c++นั้น${CC}จะถูกแปลงเป็นc++ -Wหลังจากการกำหนดใหม่

การกำหนดเงื่อนไข ?=

การกำหนดเงื่อนไขจะกำหนดค่าให้กับตัวแปรก็ต่อเมื่อไม่มีค่า

ต่อท้าย +=

สมมติว่าCC = gccแล้วผู้ประกอบการจะใช้ต่อท้ายเช่นCC += -w
นั้นCCขณะนี้มีค่าgcc -W

สำหรับข้อมูลเพิ่มเติมโปรดดูบทแนะนำเหล่านี้


"นิพจน์การมอบหมายอย่างง่ายจะได้รับการประเมินเพียงครั้งเดียวที่เกิดขึ้นครั้งแรก": เพื่อให้ชัดเจนการขยาย / การประเมินจะกระทำเมื่อกำหนดตัวแปรไม่ใช่ครั้งแรกที่ใช้
Michael Burr

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