Error "Sin objetivo" al usar Make

12

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?

ahmed
fuente
Son esos espacios o una pestaña delante del pandoccomando. Make es notablemente exigente con aquellos que son una pestaña y no espacios.
slm
@slm: es una pestaña. Leí en alguna parte que la EOL de Windows no es compatible, así que convertí a un archivo completo a EOL compatible con Unix.
ahmed

Respuestas:

17

Problema:

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 .

Makefile:

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

.PHONY: all clean

all: $(TAR)

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

clean:
    rm -f $(TAR)

Explicación:

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.

polimero
fuente
1
Gran respuesta y estos son otros enlaces que encontré al intentar comprenderlo mejor: función comodín , referencias de sustitución y objetivos falsos .
ahmed
Una pregunta más por favor: ¿puede 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í ^^ "
ahmed
1
¿quiere decir que si no hay archivos .markdown, se crearán? sí, debería hacerlo hasta donde yo sé
2014
1
Bien entonces. Voy a cavar un poco más. Gracias por sus respuestas, gracias a usted estoy en el camino correcto ahora
:)
1
Solo quería agradecerte por la gran respuesta. La forma en que ha explicado es muy fácil de entender, la razón detrás del comando no estaba funcionando y las instrucciones muy detalladas sobre cómo proceder. Gracias de nuevo.
zanona
5

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

O con un comodín:

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.

Leiaz
fuente