utilizar programacion make ejecutar como comando clean makefile gnu-make

programacion - ¿Regla de patrón de makefile para ninguna extensión?



makefile linux c (3)

Esto parece un trabajo para una regla de patrón estático :

$(apps) : % : %.o $(objects) $(link)

Tengo un montón de aplicaciones que se construyen con el mismo tipo de regla de creación:

apps = foo bar baz all: $(apps) foo: foo.o $(objects) $(link) bar: bar.o $(objects) $(link) baz: baz.o $(objects) $(link)

Si tuvieran una extensión (por ejemplo .x ) podría hacer una regla de patrón como:

%.x: %.o $(objects) $(link)

y no tendría que escribir una nueva regla para cada aplicación.

Pero no tienen una extensión, y estoy bastante seguro de que:

%: %.o $(objects) $(link)

no funcionará (porque especifica que para compilar cualquier archivo puede usar esta regla).

¿Hay alguna forma de especificar una regla que cubra todas las reglas de compilación de $(apps) ?


no es una respuesta a lo que está buscando, sino una razón que podría explicar por qué ese nivel de código genérico podría no dar buenos resultados. ....

los patrones estáticos dependen de la presencia de un vástago para unir y construir una cadena de dependencia. más o menos de la misma manera que las reglas implícitas (que se utilizan para los objetivos que no tienen ninguna receta).

Veo lo que intentabas conseguir, creando una regla genérica que satisfaga todas las comprobaciones de objetivos para objetos y enlaces en tu código.

algo como esto ::

% : % : $(rule1) echo / generic code ;

para que sea invocado para todas las aplicaciones en diferentes escenarios

Como no desea agregar una extensión (esto se convierte en la raíz de algunos problemas), el problema es que el objetivo se reflejará también en la dependencia, ya que no habrá manera de diferenciar las dependencias de los objetivos.

Por lo tanto, si lo intentaste, creo que llegarás aquí ...

$ make -nf mk.t mk.t:18: *** mixed implicit and static pattern rules. Stop.

:), intentaré esto mañana de nuevo para ver si puedo hacer que esto funcione de una manera genérica real. Buena pregunta sin embargo.


%: %.o $(objects) $(link)

Lo anterior debería funcionar.

Puede limitar el alcance de la regla convirtiéndola en una regla de patrón estático , de modo que solo se considere para su lista de objetivos:

$(apps) : % : %.o $(objects) # only consider this for $(apps) targets $(link)