Uczę się, jak używać make
i makefile, więc napisałem ten mały plik:
%.markdown: %.html
pandoc -o $< $@
Ale kiedy biegam make
, wszystko co dostaję to make: *** No targets. Stop.
Co się dzieje?
Uczę się, jak używać make
i makefile, więc napisałem ten mały plik:
%.markdown: %.html
pandoc -o $< $@
Ale kiedy biegam make
, wszystko co dostaję to make: *** No targets. Stop.
Co się dzieje?
Odpowiedzi:
Problem polega na tym, make
że nie wiesz o swoich celach.
Możesz make stackoverflow.markdown
na przykład uruchomić powyższy Makefile i będzie działać.
make
tylko się nie powiedzie, ponieważ określiłeś tylko, jak utworzyć swoje cele, ale nie które.
Jak wskazuje punkt Leiaz, powyższa reguła wzorcowa nazywana jest regułą domyślną .
SRC = $(wildcard *.html)
TAR = $(SRC:.html=.markdown)
.PHONY: all clean
all: $(TAR)
%.markdown: %.html
pandoc -o $< $@
clean:
rm -f $(TAR)
SRC
get to wszystkie pliki źródłowe (te kończące się na .html
) przez Makefile's wildcard
.
TAR zastępuje każdy plik źródłowy wymieniony w SRC
celu celem kończącym się na .markdown
zamiast .html
.
.PHONY wymienia niefizyczne cele, które są zawsze nieaktualne i dlatego są zawsze wykonywane - są to często all
i clean
.
Celall
ma za zależnościami (pliki na liście po prawej stronie :
) wszystkich *.markdown
plików. Oznacza to, że wszystkie te cele są wykonywane.
%.markdown: %.html
pandoc -o $< $@
Ten fragment mówi: Każdy cel kończący się na .markdown
jest zależny od pliku o tej samej nazwie, z tą różnicą, że kończy się zależność .html
. Symbol wieloznaczny%
należy traktować *
jak skorupę. %
Po prawej stronie, jest jednak w porównaniu do meczu na lewej stronie. Źródło .
Zauważ, że sekwencja białych znaków przed pandoc
jest TAB, ponieważ make
definiuje to jako standard.
Wreszcie fałszywy clean
cel przedstawia sposób czyszczenia systemu z plików utworzonych za pomocą tego pliku Makefile. W tym przypadku usuwa wszystkie cele (te pliki, które zostały nazwane *.markdown
.
makefile
tworzyć pliki od zera, czy aktualizuje tylko istniejące pliki? Ponieważ po usunięciu wygenerowanych plików przestaje działać. Głupie pytanie, wiem, ale to dla mnie Nowa Fundlandia ^^ "
Reguły wzorców są regułami niejawnymi.
Nie masz zdefiniowanych celów w swoim Makefile. Możesz określić cel w wierszu poleceń: make something.markdown
użyje przepis do tworzenia something.markdown
z something.html
.
Lub możesz dodać do swojego pliku Makefile regułę określającą domyślne cele.
all: file1.markdown file2.markdown
all: *.markdown
Po uruchomieniu po prostu make
, pierwszym celem pierwszej reguły jest domyślnym cel . Nie trzeba go nazywać all
.
Tak więc powyżej cel all
zawiera wszystkie pliki, które chcesz utworzyć jako warunki wstępne, więc kiedy make all
to zrobisz, wszystkie wymienione pliki.
pandoc
poleceniem. Make jest notorycznie wybredny, jeśli chodzi o tabulatory, a nie spacje.