взаимоисключающее планирование работы в GNU сделать? - PullRequest
4 голосов
/ 23 февраля 2009

Используя GNU make, возможно ли создать набор целей, которые никогда не будут запланированы в одно и то же время при использовании параметра "--jobs"?

Справочная информация:

Чтобы сделать это немного более конкретным, рассмотрим make-файл вида

p1: ...deps... # no parallelization conflicts (can run at the same time as p*, e*)
        ...rules...

p2: ...deps... # no parallelization conflicts (can run at the same time as p*, e*)
        ...rules...

p3: ...deps... # no parallelization conflicts (can run at the same time as p*, e*)
        ...rules...

e1: ...deps... # cannot run at same time as any other e*
        ...rules...

e2: ...deps... # cannot run at same time as any other e*
        ...rules...

e3: ...deps... # cannot run at same time as any other e*
        ...rules...

Главное, что мне нужно сделать, это убедиться, что e1, e2 и e3 никогда не обрабатываются одновременно, потому что они выполняют некоторую работу на встроенном устройстве с ограниченными ресурсами. Они терпят крах, если несколько из них выполняются одновременно. p1, p2 и p3 могут выполняться параллельно с чем угодно, включая любую работу e *.

Обратите внимание, что у настоящего make-файла есть несколько тысяч целей с деревом зависимостей глубиной около 10 уровней, поэтому я надеюсь, что есть способ сделать это, чтобы (a) не требовалось запускать make поочередно и (b) сохранять Преимущества кодирования дерева зависимостей в make-файле.

Ответы [ 2 ]

6 голосов
/ 23 февраля 2009

Один из вариантов для вас - использовать «flock» для запуска правил «e» под эксклюзивной блокировкой. Смотрите man flock (1) для подробностей. Например, вместо

e2: deps
    my_cmd foo bar

Вы можете иметь

e2: deps
    flock .embedded-device-lock -c my_cmd foo bar

В таком случае происходит то, что все "e" цели запускаются командой make параллельно (возможно), но фактические команды будут выполняться последовательно.

2 голосов
/ 23 февраля 2009

Это не идеальное решение, но вы можете использовать предварительное условие только для заказа, чтобы наложить определенный порядок на цели e *:

e1: ...deps...
    ...commands...
e2: ...deps... | e1
    ...commands...
e3: ...deps... | e2 e1
    ...commands...

Предпосылки после символа трубы '|' только для заказа: они не заставляют, скажем, e3 быть обновленным, если e1 или e2 изменились, но они требуют, чтобы все команды для e1 и e2 закончили выполняться до того, как команды для e3 запущены.

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

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