Любое интересное использование Makefiles, чтобы поделиться? - PullRequest
12 голосов
/ 27 декабря 2008

«make» полезен не только для построения вашего проекта, но и в других областях.

Например, многие сценарии оболочки могут быть переписаны как Make-файлы, чтобы позволить параллельным выполнениям независимых частей (с «make -jXX») поддерживать занятость всех ядер вашего процессора, с явно объявленными зависимостями в качестве дополнительного преимущества на случай Вы когда-нибудь задумывались о переупорядочении некоторых задач с побочными эффектами в вашем скрипте оболочки.

Есть ли у вас какие-нибудь интересные истории с необычным использованием make / Makefiles? Вы используете какую-нибудь другую утилиту в качестве дешевого планировщика заданий?

Ответы [ 7 ]

19 голосов
/ 30 декабря 2008

Параллелизм Make особенно удобен для сценариев оболочки. Скажем, вы хотите получить время безотказной работы целого набора хостов (или, по сути, выполнить любую медленную операцию). Вы можете сделать это в цикле:

cat hosts | while read host; do echo "$host: $(ssh $host uptime)"; done

Это работает, но медленно. Вы можете распараллелить это, порождая подоболочки:

cat hosts | while read host; do (echo "$host: $(ssh $host uptime)")&; done

Но теперь у вас нет контроля над тем, сколько потоков вы создаете, и CTRL-C не будет чисто прерывать все потоки.

Вот решение Make: сохраните его в файл (например, showuptimes) и отметьте как исполняемый файл:

#!/usr/bin/make -f

hosts:=$(shell cat)
all: ${hosts}

${hosts} %:
        @echo "$@: `ssh $@ uptime`"

.PHONY: ${hosts} all

Теперь запущенный cat hosts | ./showuptimes будет печатать время безотказной работы один за другим. cat hosts | ./showuptimes -j запустит их все параллельно. Вызывающая сторона имеет прямой контроль над степенью распараллеливания (-j) или может указать ее косвенно в зависимости от загрузки системы (-l).

3 голосов
/ 30 декабря 2008

Помимо очевидного использования в программировании, я видел Makefiles, используемые для выполнения повторяющихся задач на серверах для управления настройками системы, такими как создание пользователей / групп, обновления / обновления пакетов и копирование файлов конфигурации на место. Я также видел (и использовал) рейк для этого в средах на основе Ruby.

Самый сложный пример, о котором я слышал, это ISConf , инструмент управления конфигурацией. Я слышал об этом от Люка Канса, автора Puppet , на его блоге .

2 голосов
/ 30 декабря 2008

В зависимости от разновидности 'make' вы можете перемещаться по зависимостям задач, используя исполняемые файлы makefiles и сценарии оболочки .. т.е. в сценарии, когда один сценарий инициализации должен запускать 10 служб ... один за другим (т.е. service два нуждается в service one, чтобы быть активным до запуска), это легко сделать через make-файл.

Это используют многие упаковщики GNU / Linux, например, debian / rules и другие. Так что да, если все сделано правильно, make так же хорош в запуске программ, как и в их создании.

Проблема в том, что не у всех установлена ​​цепочка инструментов сборки ... поэтому сценарии оболочки или командные файлы остаются переносимым (следовательно, «правильным») подходом.

1 голос
/ 28 декабря 2008

Это, вероятно, означает, что мое воображение недостаточно, но трудно получить достаточную гибкость в make-файле для такого использования. «Очевидный» способ добиться этого - указать значения макросов в командной строке make.

make -f script.mk MACRO="list of files on which to operate"

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

make -f script.mk MACRO="$(echo *[io]*)"

Я бы предложил этот вопрос о Почему бы не использовать #! / Bin / make в верхней части make-файлов как нечетное использование (исполняемых) make-файлов, но цель не состояла в том, чтобы сделать необычное вещи (просто скучные старые сборки программного обеспечения); просто использовать необычный механизм вызова для make.

Используя технику, вы можете упростить вызов до:

script.mk MACRO="$(echo *[io]*)"

Это еще более многословно, чем:

script *[io]*

Полагаю, script может быть написано для вызова make. Все это зависит. Я не уверен, что из этого достаточно пробега; YMMV.

0 голосов
/ 15 февраля 2018

Make также может использоваться как утилита синхронизации. Например:

#!/usr/bin/make -f

FILES = *.html *.js *.css images/*.jpg subpage/*.html
LAST_SYNC = .last_sync
SCP = scp webserver.com:/home/john/public_html

.PHONY: sync

sync : $(LAST_SYNC)

$(LAST_SYNC) : $(FILES)
    $(SCP) $?
    touch $(LAST_SYNC)

Этот Makefile создает пустой файл .last_sync, который используется для записи последнего времени, когда мы синхронизировали локальный репозиторий с удаленным. Каждый раз, когда запускается этот скрипт, Make проверяет, были ли изменены какие-либо из файлов, перечисленных в FILES, с момента последнего запуска синхронизации, копирует их на сервер и затем обновляет отметку времени на .last_sync. Ключом является автоматическая переменная $?, которая содержит список всех предпосылок, которые новее, чем цель правила.

0 голосов
/ 18 апреля 2013

make также используются для управления процессом ........ я недавно узнал об этом, не только индивидуальная установка или управление сборкой, но и весь процесс. Раньше я думал, что make должен был использоваться только для компиляции проектов, но там, где когда-либо существует вероятность зависимости или цепочки действий, которые необходимо выполнить, там можно использовать make ... я недавно видел код, который управляет все для процесса до доставки / развертывания, включая обработку-обновление данных (24 часа +) .... хорошая вещь:)

0 голосов
/ 27 декабря 2008

Моя работа использует любопытную вещь: зависимости не существуют, поэтому она всегда перестраивает все.

Возможно, также использовали командный файл.

...