¿Regla de patrón Makefile para ninguna extensión?


Tengo un montón de aplicaciones que se construyen con el mismo tipo de make rule:

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 construir cualquier archivo puede usar esta regla).

¿Hay de todos modos para especificar una regla que ¿cubrir todas las reglas de compilación $(apps)?

Author: Andrew Tomazos, 2013-03-30

3 answers

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

$(apps) : % : %.o $(objects)
    $(link)
 26
Author: Beta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-30 12:49:56
%: %.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)
 7
Author: Maxim Egorushkin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-30 12:51:21

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

Los patrones estáticos se basan en la presencia de una raíz para emparejar y construir una cadena de dependencias. más o menos de la misma manera que las reglas implícitas (que se utilizan para los objetivos que no tienen ninguna recipie.)

Veo lo que estaba tratando de lograr, haciendo una regla genérica que satisfará todas las comprobaciones de destino para el objeto y el enlace en su codificar.

Algo como esto:

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

Para que se invoque para todas las aplicaciones en diferentes escenarios

Dado que no desea agregar una extensión (esto se convierte en la raíz de algunos problemas ) el problema con esto es que el objetivo también se reflejará en la dependencia, ya que no habrá forma 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.

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

 0
Author: nsd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-30 20:39:38