Makefile запускает процессы в фоновом режиме - PullRequest
9 голосов
/ 06 октября 2011

У меня есть это в моем Makefile:

run:
     for x in *.bin ; do ./$$x ; done

так, что он запускает все исполняемые файлы один за другим. Я хочу сделать это:

run:
     for x in *.bin ; do ./$$x &; done

, чтобы он запускал каждый исполняемый файл и помещал его в фоновый режим. Я получаю синтаксическую ошибку для приведенного выше утверждения, когда ставлю амперсанд.

Я не хочу вызывать make как make &, поскольку он будет запускать процессы в фоновом режиме, но по-прежнему один за другим, тогда как я хочу, чтобы отдельные исполняемые файлы выполнялись в фоновом режиме, чтобы в любой момент у меня было несколько исполняемых файлов. Бег.

Заранее спасибо.

Ответы [ 3 ]

13 голосов
/ 06 октября 2011

Попробуйте выполнить через подоболочку:

run:
     for x in *.bin ; do (./$$x &); done

Может быть, make -j - лучший вариант. Попробуйте Makefile, который выглядит примерно так:

BINS = $(shell echo *.bin)

.PHONY: $(BINS)
run: $(BINS)

*.bin:
    ./$@

И затем выполнить с make -j <jobs>, где <jobs> - количество одновременно выполняемых заданий.

5 голосов
/ 06 октября 2011

Синтаксическая ошибка, которую вы получаете, является синтаксической ошибкой оболочки, а не проблемой с синтаксисом make. Амперсанд на самом деле является разделителем / разделителем команд , как и точка с запятой; Таким образом, способ выражения для цикла for вы хотите:

run:
        for x in *.bin ; do ./$$x & done

Однако, как уже отмечали другие, там, где это практично, обычно более гибко выражать вещи напрямую, как создавать зависимости, а не сложные фрагменты оболочки и циклы оболочки.

3 голосов
/ 06 октября 2011

Попробуйте:

run:
    for x in *.bin ; do (./$$x &) ; done

() запускает команду в подоболочке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...