Estoy aprendiendo cómo usar make
y 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 make
y 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 make
no conoce tus objetivos.
Puede ejecutar su Makefile anterior con, make stackoverflow.markdown
por 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)
SRC
obtener todos los archivos fuente (los que terminan en .html
) a través de Makefile's wildcard
.
TAR sustituye cada archivo de origen enumerado SRC
con un destino que termina en .markdown
lugar de .html
.
.PHONY enumera objetivos no físicos que siempre están desactualizados y, por lo tanto, siempre se ejecutan; estos son a menudo all
y clean
.
El destinoall
tiene como dependencia (archivos enumerados en el lado derecho de :
) todos los *.markdown
archivos. Esto significa que todos estos objetivos se ejecutan.
%.markdown: %.html
pandoc -o $< $@
Este fragmento dice: cada destino que termina en .markdown
depende 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 pandoc
es a TAB, ya make
que define eso como un estándar.
Finalmente, el clean
objetivo 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
.
makefile
crear 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.markdown
utilizará la receta para crear something.markdown
a 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 all
tiene todos los archivos que desea crear como requisitos previos, por lo que cuando lo haga make all
, creará todos los archivos enumerados.
pandoc
comando. Make es notablemente exigente con aquellos que son una pestaña y no espacios.