Estoy aprendiendo cómo usar makey makefiles, así que escribí este pequeño archivo:
%.markdown: %.html
pandoc -o $< $@
Pero cuando corro make, todo lo que obtengo es make: *** No targets. Stop.¿Qué está pasando?
Estoy aprendiendo cómo usar makey makefiles, así que escribí este pequeño archivo:
%.markdown: %.html
pandoc -o $< $@
Pero cuando corro make, todo lo que obtengo es make: *** No targets. Stop.¿Qué está pasando?
Respuestas:
Tu problema es que makeno conoce tus objetivos.
Puede ejecutar su Makefile anterior con, make stackoverflow.markdownpor ejemplo, y funcionará.
make solo, sin embargo, fallará, ya que solo especificó cómo crear sus objetivos, pero no cuáles.
Como señala Leiaz, la regla de patrón anterior se llama una regla implícita .
SRC = $(wildcard *.html)
TAR = $(SRC:.html=.markdown)
.PHONY: all clean
all: $(TAR)
%.markdown: %.html
pandoc -o $< $@
clean:
rm -f $(TAR)
SRCobtener todos los archivos fuente (los que terminan en .html) a través de Makefile's wildcard.
TAR sustituye cada archivo de origen enumerado SRCcon un destino que termina en .markdownlugar de .html.
.PHONY enumera objetivos no físicos que siempre están desactualizados y, por lo tanto, siempre se ejecutan; estos son a menudo ally clean.
El destinoall tiene como dependencia (archivos enumerados en el lado derecho de :) todos los *.markdownarchivos. Esto significa que todos estos objetivos se ejecutan.
%.markdown: %.html
pandoc -o $< $@
Este fragmento dice: cada destino que termina en .markdowndepende de un archivo con el mismo nombre, excepto que la dependencia termina en .html. El comodín% debe ser visto como un *shell. El %en el lado derecho, sin embargo, se compara con el partido en el lado izquierdo. Fuente .
Tenga en cuenta que la secuencia de espacios en blanco enfrente de pandoces a TAB, ya makeque define eso como un estándar.
Finalmente, el cleanobjetivo falso muestra cómo limpiar su sistema de los archivos que ha creado con este Makefile. En este caso, está eliminando todos los destinos (aquellos archivos que fueron nombrados *.markdown.
makefilecrear archivos desde cero o solo actualiza los archivos existentes? Porque cuando elimino los archivos generados, deja de funcionar. Pregunta tonta, lo sé, pero esto es Terranova para mí ^^ "
Las reglas de patrón son reglas implícitas.
No tienes objetivos definidos en tu Makefile. Se puede especificar el destino en la línea de comandos: make something.markdownutilizará la receta para crear something.markdowna partir something.html.
O puede agregar a su Makefile una regla que especifique objetivos predeterminados.
all: file1.markdown file2.markdown
all: *.markdown
Cuando ejecuta solo make, el primer objetivo de la primera regla es el objetivo predeterminado . No necesita ser llamado all.
Entonces, el objetivo alltiene todos los archivos que desea crear como requisitos previos, por lo que cuando lo haga make all, creará todos los archivos enumerados.
pandoccomando. Make es notablemente exigente con aquellos que son una pestaña y no espacios.