2011-10-27 20 views
5

me gustaría construir una regla como ésta en mi Makefile:hacer: ejecutar una acción para cada requisito

log: test_A test_B 
    ./test_A >> [email protected] 
    ./test_B >> [email protected] 

pero test_A y test_B son parte de una variable $(TESTS).

Entonces, ¿es posible hacer una acción (aquí: llamar al programa) para cada prerrequisito en GNU/make?

Nota: How do I make a makefile rule execute its prerequisites? no resuelve completamente este problema, ya que se requiere el objetivo log (make log).

Respuesta

15

Esencialmente desea recorrer los requisitos previos. La manera obvia de hacerlo es a despejar a la cáscara:

log: test_A test_B 
     for f in $^; do ./$$f; done 

O se podría escribir el bucle como GNU Make foreach bucle, aunque hay que tener cuidado de que los comandos que resultan del cuerpo del bucle aparecer en líneas separadas (a través de define) o están terminados con un terminador de la cáscara (es decir, un punto y coma, que es más fácil):

log: test_A test_B 
     $(foreach f,$^,./$(f);) 

por último, en este caso se podría escribir de forma más sucinta y más oscuramente como una sustitución de patrón en cada elemento a bucle:

log: test_A test_B 
     $(patsubst %,./%;,$^) 

(. Estoy seguro de que puede añadir la redirección de la salida y $(TESTS) variables según el caso)

+1

Gracias por su respuesta, se confirma lo que terminó con: '$ (prueba foreach, $ ^, $ (shell ./$(test) >> $ @)) ' – CJlano

+1

Si esos son los comandos para su regla _log_, entonces' $ (shell ...) 'está subvirtiendo cosas: los comandos para la regla estarán vacíos , y las ejecuciones 'test_?' ocurrirán como un subproducto de descifrar los comandos (en lugar de suceder al ejecutar los comandos). Filosóficamente incorrecto, y más práctico, imposible de extender para detectar el error de uno de tus scripts 'test_?'. (Sin embargo, parece que desea marcar esta respuesta como aceptada ...) –

+0

¿No hace este ciclo dos veces, una para test_A y una para test_B? Tengo un problema similar y el comportamiento es muy extraño. – Jaseem

Cuestiones relacionadas