ฉันเรียนรู้วิธีใช้make
และสร้างไฟล์ดังนั้นฉันจึงเขียนไฟล์เล็ก ๆ นี้:
%.markdown: %.html
pandoc -o $< $@
แต่เมื่อฉันวิ่งmake
สิ่งที่ฉันได้รับคือmake: *** No targets. Stop.
สิ่งที่เกิดขึ้น?
ฉันเรียนรู้วิธีใช้make
และสร้างไฟล์ดังนั้นฉันจึงเขียนไฟล์เล็ก ๆ นี้:
%.markdown: %.html
pandoc -o $< $@
แต่เมื่อฉันวิ่งmake
สิ่งที่ฉันได้รับคือmake: *** No targets. Stop.
สิ่งที่เกิดขึ้น?
คำตอบ:
คุณมีปัญหาที่make
ไม่รู้เกี่ยวกับเป้าหมายของคุณ
คุณสามารถเรียกใช้ Makefile ด้านบนของคุณด้วยmake stackoverflow.markdown
ตัวอย่างและมันจะทำงาน
make
อย่างไรก็ตามจะล้มเหลวเท่านั้นเนื่องจากคุณระบุวิธีสร้างเป้าหมายของคุณเท่านั้น
ในฐานะที่เป็นจุด leiaz ออกกฎรูปแบบดังกล่าวข้างต้นจะเรียกว่าการปกครองโดยปริยาย
SRC = $(wildcard *.html)
TAR = $(SRC:.html=.markdown)
.PHONY: all clean
all: $(TAR)
%.markdown: %.html
pandoc -o $< $@
clean:
rm -f $(TAR)
SRC
รับเป็นไฟล์ที่มาทั้งหมด (ที่ลงท้ายด้วย.html
) ผ่าน wildcard
Makefile
TAR ทดแทนแต่ละ source file ระบุไว้ในSRC
ที่มีเป้าหมายที่ลงท้ายด้วยแทน.markdown
.html
.PHONYรายการเป้าหมายที่ไม่ใช่ทางกายภาพที่มักจะออกจากวันที่และจึงจะดำเนินการเสมอ - เหล่านี้มักจะและall
clean
เป้าหมายall
ได้เป็นพึ่งพา (แฟ้มที่มีอยู่ทางด้านขวาของ:
) ทุก*.markdown
ไฟล์ นี่หมายความว่าเป้าหมายทั้งหมดจะถูกดำเนินการ
%.markdown: %.html
pandoc -o $< $@
ข้อมูลโค้ดนี้กล่าวว่าเป้าหมายของแต่ละลงท้ายด้วยขึ้นอยู่กับไฟล์ที่มีชื่อเดียวกันยกเว้นว่าการพึ่งพากำลังจะสิ้นสุดลงด้วย.markdown
สัญลักษณ์แทนคือการถูกมองว่าเป็นเหมือนในเปลือก อย่างไรก็ตามทางด้านขวาจะเปรียบเทียบกับการแข่งขันทางด้านซ้าย แหล่ง.html
%
*
%
โปรดทราบว่าลำดับช่องว่างที่อยู่ด้านหน้าpandoc
เป็น a TABเนื่องจากmake
กำหนดว่าเป็นมาตรฐาน
ท้ายที่สุดclean
เป้าหมายปลอมแสดงวิธีทำความสะอาดระบบของคุณจากไฟล์ที่คุณสร้างด้วย Makefile นี้ ในกรณีนี้ก็ลบเป้าหมายทั้งหมด *.markdown
(แฟ้มที่ถูกตั้งชื่อ
makefile
สร้างไฟล์ตั้งแต่เริ่มต้นหรืออัพเดทเฉพาะไฟล์ที่มีอยู่ได้หรือไม่ เพราะเมื่อฉันลบไฟล์ที่สร้างมันจะหยุดทำงาน คำถามโง่ฉันรู้ แต่นี้เป็นนิวฟันด์แลนด์ให้ฉัน ^^"
คุณไม่มีเป้าหมายที่กำหนดไว้ใน Makefile ของคุณ คุณสามารถระบุเป้าหมายในบรรทัดคำสั่งนี้make something.markdown
จะใช้สูตรในการสร้างจากsomething.markdown
something.html
หรือคุณสามารถเพิ่มกฎการ Makefile ของคุณเพื่อระบุเป้าหมายเริ่มต้น
all: file1.markdown file2.markdown
หรือด้วยไวด์การ์ด:
all: *.markdown
เมื่อคุณเรียกใช้เพียงmake
, เป้าหมายแรกของกฎข้อแรกคือเป้าหมายเริ่มต้น all
มันไม่จำเป็นที่จะเรียกว่า
ดังนั้นข้างต้นเป้าหมายall
มีไฟล์ทั้งหมดที่คุณต้องการให้เป็นข้อกำหนดเบื้องต้นดังนั้นเมื่อคุณmake all
มันจะทำให้ไฟล์ทั้งหมดที่ระบุไว้
pandoc
คำสั่ง ทำให้เป็นที่รู้จักกันอย่างพิถีพิถันเกี่ยวกับสิ่งที่เป็นแท็บ