зробіть: виконайте дію за кожною передумовою

Я хотів би створити правило, подібне до цього в моєму файлі Makefile:

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

але test_A і test_B є частиною змінної $ (TESTS) .

Отже, чи можна зробити дію (тут: викликати програму) для кожної передумови у GNU/make?

Примітка. Як мені зробити правило makefile, виконуючи його передумови ? не повністю вирішує цю проблему, оскільки потрібен log ( make log ).

6

1 Відповіді

По суті, ви хочете петлі над передумовами. Очевидним способом зробити це є пробивання до оболонки:

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

Або ви можете написати цикл як цикл GNU Make foreach , хоча ви повинні бути обережними, щоб команди, які виходять з тіла циклу, з'являються на окремих рядках (через define ) або закінчуються термінатором оболонки (тобто, напівтона, що легше):

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

Нарешті, у цьому випадку ви могли б написати це більш стисліше та більш незрозуміло, як заміну картини на кожен елемент, який буде перекручений:

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

(Я впевнений, що ви можете додати перенаправлення виводу та змінну $ (TESTS) , якщо це необхідно).

17
додано
Якщо це команда для вашого правила log , то $ (shell ...) - це щось підриває речі: команди для правила будуть порожніми, а test _? буде виконуватися як побічний продукт для виявлення команд (а не відбувається шляхом виконання команд). Філософсько неправильно, і - більш практично - неможливо продовжити, щоб спіймати невдачу одного з ваших сценаріїв test _? . (Але тим не менш видається, що ви хочете, щоб ця відповідь була прийнята ...)
додано Автор John Marshall, джерело
Чи не буде цей цикл двічі, один раз для test_A, а один раз для test_B? У мене є аналогічне питання, і робити веде себе дуже дивно.
додано Автор Jaseem, джерело
Дякуємо за вашу відповідь, це підтверджує те, що я закінчив: $ (foreach test, $ ^, $ (shell ./$(test) >> $ @))
додано Автор CJlano, джерело