Kesalahan "Tidak ada target" menggunakan Make

12

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?

ahmed
sumber
Apakah spasi atau tab di depan pandocperintah. Make terkenal pilih-pilih soal tab dan bukan spasi.
slm
@slm: itu tab. Saya membaca di suatu tempat bahwa Windows 'EOL tidak kompatibel, jadi saya dikonversi ke seluruh file ke EOL yang kompatibel dengan Unix.
ahmed

Jawaban:

17

Masalah:

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 .

Makefile:

SRC = $(wildcard *.html)
TAR = $(SRC:.html=.markdown)

.PHONY: all clean

all: $(TAR)

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

clean:
    rm -f $(TAR)

Penjelasan:

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.

polym
sumber
1
Jawaban yang bagus dan ini adalah tautan lain yang saya temukan ketika mencoba memahaminya lebih lanjut: fungsi wildcard , referensi substitusi , dan target palsu .
ahmed
Satu pertanyaan lagi: dapatkah 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 ^^ "
ahmed
1
Maksud Anda jika tidak ada file .markdown, maka akan dibuat? ya itu harus melakukan itu sejauh yang saya tahu
polym
1
Baik-baik saja maka. Saya akan melakukan penggalian lagi. Terima kasih atas jawaban Anda, terima kasih untuk Anda Saya berada di jalan yang benar sekarang
:)
1
Hanya ingin mengucapkan terima kasih atas jawaban yang bagus. Cara yang telah Anda jelaskan sangat mudah untuk memahami alasan di balik perintah tidak bekerja dan instruksi yang sangat rinci tentang cara melanjutkan. Terima kasih lagi.
zanona
5

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.

Leiaz
sumber