ข้อผิดพลาด“ ไม่มีเป้าหมาย” โดยใช้ Make


12

ฉันเรียนรู้วิธีใช้makeและสร้างไฟล์ดังนั้นฉันจึงเขียนไฟล์เล็ก ๆ นี้:

%.markdown: %.html
    pandoc -o $< $@

แต่เมื่อฉันวิ่งmakeสิ่งที่ฉันได้รับคือmake: *** No targets. Stop.สิ่งที่เกิดขึ้น?


มีช่องว่างเหล่านั้นหรือแท็บด้านหน้าpandocคำสั่ง ทำให้เป็นที่รู้จักกันอย่างพิถีพิถันเกี่ยวกับสิ่งที่เป็นแท็บ
slm

@slm: เป็นแท็บ ฉันอ่านบางที่ว่า EOL ของ Windows ไม่สามารถทำงานร่วมกันได้ดังนั้นฉันจึงแปลงไฟล์ทั้งหมดเป็น EOL ที่รองรับ Unix
ahmed

คำตอบ:


17

ปัญหา:

คุณมีปัญหาที่makeไม่รู้เกี่ยวกับเป้าหมายของคุณ

คุณสามารถเรียกใช้ Makefile ด้านบนของคุณด้วยmake stackoverflow.markdownตัวอย่างและมันจะทำงาน

make อย่างไรก็ตามจะล้มเหลวเท่านั้นเนื่องจากคุณระบุวิธีสร้างเป้าหมายของคุณเท่านั้น

ในฐานะที่เป็นจุด leiaz ออกกฎรูปแบบดังกล่าวข้างต้นจะเรียกว่าการปกครองโดยปริยาย

Makefile:

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(แฟ้มที่ถูกตั้งชื่อ


1
คำตอบที่ดีและสิ่งเหล่านี้มีการเชื่อมโยงอื่น ๆ ที่ผมพบเมื่อพยายามที่จะเข้าใจต่อมันฟังก์ชั่นสัญลักษณ์แทน , การอ้างอิงทดแทนและเป้าหมายของปลอม
ahmed

คำถามอีกข้อหนึ่งโปรด: สามารถmakefileสร้างไฟล์ตั้งแต่เริ่มต้นหรืออัพเดทเฉพาะไฟล์ที่มีอยู่ได้หรือไม่ เพราะเมื่อฉันลบไฟล์ที่สร้างมันจะหยุดทำงาน คำถามโง่ฉันรู้ แต่นี้เป็นนิวฟันด์แลนด์ให้ฉัน ^^"
อาเหม็ด

1
คุณหมายถึงถ้าไม่มีไฟล์. markdown ไฟล์เหล่านั้นจะถูกสร้างขึ้นหรือไม่ ใช่มันควรทำเท่าที่ฉันรู้
polym

1
เอาล่ะแล้ว ฉันจะขุดอีกหน่อย ขอบคุณสำหรับคำตอบของคุณ, ขอบคุณคุณฉันกำลังถูกวิธีแล้ว
:)

1
แค่อยากจะขอบคุณสำหรับคำตอบที่ยอดเยี่ยม วิธีที่คุณอธิบายนั้นง่ายต่อการเข้าใจเหตุผลหลังคำสั่งไม่ทำงานและคำแนะนำโดยละเอียดเกี่ยวกับวิธีดำเนินการ ขอบคุณอีกครั้ง.
zanona

5

กฎรูปแบบเป็นกฎโดยนัย

คุณไม่มีเป้าหมายที่กำหนดไว้ใน Makefile ของคุณ คุณสามารถระบุเป้าหมายในบรรทัดคำสั่งนี้make something.markdownจะใช้สูตรในการสร้างจากsomething.markdownsomething.html

หรือคุณสามารถเพิ่มกฎการ Makefile ของคุณเพื่อระบุเป้าหมายเริ่มต้น

all: file1.markdown file2.markdown

หรือด้วยไวด์การ์ด:

all: *.markdown

เมื่อคุณเรียกใช้เพียงmake, เป้าหมายแรกของกฎข้อแรกคือเป้าหมายเริ่มต้น allมันไม่จำเป็นที่จะเรียกว่า

ดังนั้นข้างต้นเป้าหมายallมีไฟล์ทั้งหมดที่คุณต้องการให้เป็นข้อกำหนดเบื้องต้นดังนั้นเมื่อคุณmake allมันจะทำให้ไฟล์ทั้งหมดที่ระบุไว้

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