Saya belajar cara menggunakan make
dan 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 make
dan 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 make
tidak tahu tentang target Anda.
Anda dapat menjalankan Makefile di atas dengan make stackoverflow.markdown
misalnya 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)
SRC
dapatkan semua file sumber (yang diakhiri .html
) melalui Makefile's wildcard
.
TAR menggantikan setiap file sumber yang terdaftar SRC
dengan target yang berakhir dengan .markdown
bukannya .html
.
.PHONY mencantumkan target non-fisik yang selalu ketinggalan zaman dan karenanya selalu dieksekusi - ini sering all
dan clean
.
The Targetall
memiliki sebagai ketergantungan (file tercantum di sisi kanan :
) semua *.markdown
file. Ini berarti semua target ini dieksekusi.
%.markdown: %.html
pandoc -o $< $@
Cuplikan ini mengatakan: Setiap target yang diakhiri .markdown
bergantung 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 pandoc
adalah a TAB, karena make
mendefinisikannya sebagai standar.
Akhirnya, clean
target 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
.
makefile
membuat 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.markdown
akan menggunakan resep untuk membuat something.markdown
dari 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 all
memiliki semua file yang ingin Anda buat sebagai prasyarat, jadi ketika Anda make all
, itu akan membuat semua file yang terdaftar.
pandoc
perintah. Make terkenal pilih-pilih soal tab dan bukan spasi.