Make ile “Hedef yok” hatası


12

Nasıl kullanacağımı makeve makefiles öğreniyorum , bu yüzden bu küçük dosyayı yazdım:

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

Ama koştuğumda make, elde ettiğim tek şey make: *** No targets. Stop.Neler oluyor?


Bu boşluklar veya pandockomutun önündeki bir sekme . Make, boşluk değil, sekme olanlar hakkında çok seçici.
slm

@slm: bir sekme. Windows EOL'nin uyumlu olmadığı bir yerde okudum, bu yüzden tüm dosyayı Unix uyumlu EOL'ye dönüştürdüm.
Ahmed

Yanıtlar:


17

Sorun:

Sorun şu ki, bu makehedeflerinizi bilmiyor.

Yukarıdaki Makefile'inizi make stackoverflow.markdownörneğin ile çalıştırabilirsiniz ve çalışacaktır.

make ancak yalnızca hedeflerinizi nasıl oluşturacağınızı belirttiğiniz için hangisini değil, başarısız olur.

As leiaz noktası dışarı yukarıdaki desen kural olarak adlandırılır örtülü kural .

Makefile:

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

.PHONY: all clean

all: $(TAR)

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

clean:
    rm -f $(TAR)

Açıklama:

SRCget'in tüm kaynak dosyaları (ile biten .html) Makefile's aracılığıyla wildcard.

TAR yerine listelenen her kaynak dosyayı SRCbir hedef ile biten ile .markdownyerine .html.

PHONY , her zaman güncel olmayan ve bu nedenle her zaman yürütülen fiziksel olmayan hedefleri listeler - bunlar genellikle allve clean.

Hedefall bağımlılık (dosyalar sağ tarafında listelenen sahiptir :tümü) *.markdowndosyaları. Bu, tüm bu hedeflerin yürütüldüğü anlamına gelir.

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

Bu snippet şöyle diyor: ile biten her hedef .markdown, bağımlılığın bitmesi dışında aynı ada sahip bir dosyaya bağlıdır .html. Joker% bir şekilde görülecek olan *kabuk gibi. %Sağ tarafta ise sol tarafta maçın karşılaştırılır. Kaynak .

Not arasında boşluk dizisi Infront olduğu pandocbir TAByana, makebir standart olarak tanımladığı.

Son olarak, sahte cleanhedef sisteminizi bu Makefile ile oluşturduğunuz dosyalardan nasıl temizleyeceğinizi gösterir. Bu durumda, tüm hedefleri (adlandırılmış dosyaları) siler *.markdown.


1
Harika bir cevap ve bunlar daha fazla anlamaya çalışırken bulduğum diğer bağlantılar: joker karakter işlevi , ikame referansları ve sahte hedefler .
Ahmed

Bir soru daha lütfen: makefilesıfırdan dosya oluşturabilir veya sadece mevcut dosyaları güncelleyebilir mi? Çünkü oluşturulan dosyaları sildiğimde çalışmayı durdurur. Aptalca soru biliyorum, ama bu bana Newfoundland ^^ "
ahmed

1
yani .markdown dosyası yoksa, bunlar oluşturulacak mı? evet bunu bildiğim kadarıyla yapmalı
polym

1
Tamam o zaman. Biraz daha kazarım. Cevaplarınız için teşekkürler, teşekkürler, şimdi doğru yoldayım
ahmed

1
Sadece harika cevap için teşekkür etmek istedim. Açıkladığınız yol, komutun arkasındaki nedenin işe yaramadığını ve nasıl devam edileceğine dair çok ayrıntılı talimatları anlamak çok kolaydır. Tekrar teşekkürler.
zanona

5

Örüntü kuralları örtük kurallardır.

Makefile'nizde tanımlanmış hedefiniz yok. Komut satırında hedef belirtebilirsiniz: make something.markdownoluşturmak için tarifi kullanacaktır something.markdowndan something.html.

Veya Makefile'nize varsayılan hedefleri belirten bir kural ekleyebilirsiniz.

all: file1.markdown file2.markdown

Veya bir joker karakterle:

all: *.markdown

Sadece çalıştırdığınızda make, ilk kural ilk hedefi varsayılan hedeftir . Çağrılması gerekmez all.

Yukarıda, hedef allolarak önkoşul olarak yapmak istediğiniz tüm dosyalar bulunur, böylece siz make alllistelendiğiniz tüm dosyaları yapar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.