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