make: voer een actie uit voor elke vereiste

Ik zou graag een regel als deze in mijn Makefile willen bouwen:

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

maar test_A en test_B maken deel uit van een variabele $ (TESTS) .

Dus, is het mogelijk om een ​​actie uit te voeren (hier: het programma bellen) voor elke vereiste in GNU/make?

Opmerking: Hoe maak ik een makefile-regel die zijn eerste vereisten uitvoert? ? lost dit probleem niet volledig op, omdat het doel log vereist is ( make log ).

6

1 antwoord

In essentie wil je de voorwaarden overbruggen. De voor de hand liggende manier om dit te doen is door naar de shell te schoppen:

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

Of je zou de lus kunnen schrijven als een GNU Maak voor elke lus, hoewel je erop moet letten dat de commando's die resulteren uit de body van de lus verschijnen op afzonderlijke regels (via define ) of worden beëindigd met een shell-terminator (di een puntkomma, wat eenvoudiger is):

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

Eindelijk, in dit geval zou je het beknopter en duisterder kunnen schrijven als een patroonvervanging op elk item dat moet worden overgelust:

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

(Ik weet zeker dat u de uitvoeromleiding en $ (TESTS) -variabele kunt toevoegen zoals van toepassing.)

17
toegevoegd
Als dat de opdrachten zijn voor uw log -regel, dan is $ (shell ...) een soort van het ondermijnen van dingen: de opdrachten voor de regel zijn leeg en de test _? uitvoeringen zullen gebeuren als een bijproduct van het uitzoeken van de commando's (in plaats van het gebeuren door het uitvoeren van de commando's). Filosofisch fout, en - praktisch gezien - onmogelijk om uit te breiden om het falen van een van je test _? scripts te vangen. (Maar toch lijkt het erop dat u dit antwoord als geaccepteerd wilt markeren ...)
toegevoegd de auteur John Marshall, de bron
Zal deze lus niet tweemaal, eenmaal voor test_A en één keer voor test_B? Ik heb een soortgelijk probleem en merk gedraagt ​​zich erg vreemd.
toegevoegd de auteur Jaseem, de bron
Bedankt voor uw antwoord, het bevestigt wat ik heb achtergelaten: $ (foreach test, $ ^, $ (shell ./$ttest) >> $ @))
toegevoegd de auteur CJlano, de bron