Saya belajar cara menggunakan makedan membuat file, jadi saya menulis file kecil ini:
%.markdown: %.html
pandoc -o $< $@
Tetapi ketika saya berlari make, yang saya dapatkan hanyalah make: *** No targets. Stop.Apa yang terjadi?
Saya belajar cara menggunakan makedan membuat file, jadi saya menulis file kecil ini:
%.markdown: %.html
pandoc -o $< $@
Tetapi ketika saya berlari make, yang saya dapatkan hanyalah make: *** No targets. Stop.Apa yang terjadi?
Jawaban:
Masalah Anda adalah yang maketidak tahu tentang target Anda.
Anda dapat menjalankan Makefile di atas dengan make stackoverflow.markdownmisalnya dan itu akan berhasil.
make hanya saja, bagaimanapun, akan gagal, karena Anda hanya menentukan cara membuat target Anda, tetapi bukan yang mana.
Sebagai leiaz menunjukkan aturan pola di atas disebut aturan implisit .
SRC = $(wildcard *.html)
TAR = $(SRC:.html=.markdown)
.PHONY: all clean
all: $(TAR)
%.markdown: %.html
pandoc -o $< $@
clean:
rm -f $(TAR)
SRCdapatkan semua file sumber (yang diakhiri .html) melalui Makefile's wildcard.
TAR menggantikan setiap file sumber yang terdaftar SRCdengan target yang berakhir dengan .markdownbukannya .html.
.PHONY mencantumkan target non-fisik yang selalu ketinggalan zaman dan karenanya selalu dieksekusi - ini sering alldan clean.
The Targetall memiliki sebagai ketergantungan (file tercantum di sisi kanan :) semua *.markdownfile. Ini berarti semua target ini dieksekusi.
%.markdown: %.html
pandoc -o $< $@
Cuplikan ini mengatakan: Setiap target yang diakhiri .markdownbergantung pada file dengan nama yang sama, kecuali bahwa dependensi diakhiri dengan .html. The wildcard% harus dilihat sebagai *seperti di shell. Namun, %di sisi kanan, dibandingkan dengan pertandingan di sisi kiri. Sumber .
Perhatikan bahwa urutan spasi putih di depan pandocadalah a TAB, karena makemendefinisikannya sebagai standar.
Akhirnya, cleantarget palsu menggambarkan cara membersihkan sistem Anda dari file yang Anda buat dengan Makefile ini. Dalam hal ini, ia menghapus semua target (file-file yang dinamai *.markdown.
makefilemembuat file dari awal atau hanya memperbarui file yang ada? Karena ketika saya menghapus file yang dihasilkan, itu berhenti bekerja. Saya tahu pertanyaan konyol, tapi ini Newfoundland bagi saya ^^ "
Aturan pola adalah aturan implisit.
Anda tidak memiliki target yang ditentukan di Makefile Anda. Anda dapat menentukan target pada baris perintah: make something.markdownakan menggunakan resep untuk membuat something.markdowndari something.html.
Atau Anda dapat menambahkan aturan Makefile Anda menentukan target default.
all: file1.markdown file2.markdown
Atau dengan wildcard:
all: *.markdown
Saat Anda menjalankan hanya make, target pertama dari aturan pertama adalah tujuan default . Tidak perlu dipanggil all.
Jadi di atas, target allmemiliki semua file yang ingin Anda buat sebagai prasyarat, jadi ketika Anda make all, itu akan membuat semua file yang terdaftar.
pandocperintah. Make terkenal pilih-pilih soal tab dan bukan spasi.