การหลบหนีใน makefile


88

ฉันพยายามทำสิ่งนี้ใน makefile และมันล้มเหลวอย่างมาก:

M_ARCH := $(shell g++ -dumpmachine | awk '{split($1,a,"-");print a[1]}')

คุณรู้ไหมว่าทำไม? ฉันเดาว่ามันเกี่ยวข้องกับการหลบหนี แต่อะไรและที่ไหน?


5
ไม่ล้มเหลวได้อย่างไร มีข้อความแสดงข้อผิดพลาดอะไรบ้าง? คุณคาดหวังให้มันทำอะไร?

คำตอบ:


164

มันคือเครื่องหมายดอลลาร์ใน makefiles คุณจะต้องพิมพ์$$เพื่อรับเครื่องหมายดอลลาร์เดียว:

M_ARCH := $(shell g++ -dumpmachine | awk '{split($$1,a,"-");print a[1]}')

133
ใช่ทำให้เป็นการเสียเงินทั้งหมด: คุณต้องใส่สอง$เพื่อให้ได้หนึ่ง
P Shved

8
@PavelShved ฉันไม่เคยจ่ายเงินเลยสักครั้ง :)
Trevor Hickey

สำหรับใครก็ตามที่พบคำตอบนี้เป็นส่วนหนึ่งของการค้นหานอกจากนี้ยังมีปัญหาเกี่ยวกับอักขระ "#" ที่ใช้เป็นจุดเริ่มต้นของความคิดเห็น สำหรับสิ่งเหล่านี้คุณควรหลีกเลี่ยงด้วยแบ็กสแลช: "\ #"
Jim Monte

16

ทำให้ค่อนข้างน่าเบื่อเมื่อคุณลงไป นี่คือเวอร์ชันที่ไม่ใช่ Awk ที่ทำสิ่งเดียวกัน:

space := $() #

M_ARCH := $(firstword $(subst -,$(space),$(shell g++ -dumpmachine)))

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