Jakieś ciekawe zastosowania plików Makefile do udostępniania?

"make" jest nie tylko przydatny do budowania Twojego projektu programistycznego, ale wydaje się, że jest niewystarczająco używany w innych obszarach.

Na przykład, wiele skryptów powłoki można przepisać jako pliki Makefile, aby umożliwić równoległe działanie niezależnych części (z" make-jXX"), aby wszystkie rdzenie CPU były zajęte, z wyraźnie zadeklarowanymi zależnościami jako dodatkową korzyścią w przypadku, gdy kiedykolwiek rozważysz zmianę kolejności zadań z efektami ubocznymi w skrypcie powłoki.

Czy macie jakieś ciekawe historie z nietypowe zastosowania make / Makefiles do udostępniania? Czy używasz jakiegoś innego narzędzia jako taniego harmonogramu pracy?

Author: mjy, 2008-12-27

7 answers

Równoległość Make ' A jest szczególnie przydatna w skryptach powłoki. Powiedz, że chcesz uzyskać "uptime" całego zestawu hostów (lub zasadniczo wykonać dowolną powolną operację). Można to zrobić w pętli:

cat hosts | while read host; do echo "$host: $(ssh $host uptime)"; done
To działa, ale jest powolne. Można to porównać przez wywołanie podpowiedzi:
cat hosts | while read host; do (echo "$host: $(ssh $host uptime)")&; done

Ale teraz nie masz kontroli nad liczbą pojawiających się wątków, a CTRL-C nie będzie czysto przerywać wszystkich wątków.

Oto rozwiązanie Make: zapisz to do pliku (np. showuptimes) i oznacz jako wykonywalne:

#!/usr/bin/make -f

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

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

.PHONY: ${hosts} all

Teraz uruchomiony cat hosts | ./showuptimes wyświetli czas uptimes jeden po drugim. cat hosts | ./showuptimes -j uruchomi je wszystkie równolegle. Wywołujący ma bezpośrednią kontrolę nad stopniem równoległości (-j) lub może ją określić pośrednio poprzez obciążenie systemu (-l).

 19
Author: jturner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-20 14:39:32

Oprócz oczywistych zastosowań w programowaniu, widziałem pliki Makefile używane do wykonywania powtarzalnych zadań na serwerach do zarządzania ustawieniami systemowymi, takimi jak tworzenie użytkowników/grup, aktualizacje/aktualizacje pakietów i kopiowanie plików konfiguracyjnych na miejsce. Widziałem (i używałem) rake ' a do tego w środowiskach opartych na Rubim.

Najbardziej skomplikowanym przykładem, o którym słyszałem, jest ISConf , Narzędzie do zarządzania konfiguracją. Słyszałem o tym od Luke ' a Kaniesa, autora Puppet , na jego blog .

 3
Author: jtimberman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-30 08:42:55

W zależności od odmiany 'make', możesz przepłynąć przez zależności zadań za pomocą wykonywalnych plików makefiles vs skryptów powłoki .. np. w scenariuszu, w którym jeden skrypt init musi uruchomić 10 usług ... jeden po drugim (tzn. usługa dwa potrzebuje usługi jeden być w górę i żyje przed uruchomieniem), jego łatwo zrobić za pomocą makefile.

Korzysta z tego wiele pakietów GNU/Linux, np. debian / rules i inne. Więc tak, jeśli zrobione poprawnie, make jest tak samo dobry w uruchamianiu programów, jak to jest jak budowanie ich.

Problem w tym, że nie każdy ma zainstalowany łańcuch narzędzi do budowania.. tak więc skrypty powłoki lub pliki wsadowe pozostają przenośnym (stąd' poprawnym') podejściem.

 2
Author: Tim Post,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-30 08:51:31

Prawdopodobnie oznacza to, że moja wyobraźnia jest niewystarczająca, ale trudno jest uzyskać wystarczającą elastyczność w pliku makefile do takiego użycia. "Oczywistym" sposobem, aby to osiągnąć, jest podanie wartości makr w wierszu poleceń ' make'.

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

To jest bardziej gadatliwe niż prosty skrypt powłoki - i tracisz łatwą możliwość używania rozszerzenia nazw plików powłoki. Obejście tego problemu to:

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

Zaproponowałbym więc pytanie o Dlaczego nie użyć #!/bin / make na górze makefiles jako dziwne użycie (wykonywalnych) plików Makefile, ale celem nie było robienie niezwykłych rzeczy (tylko nudne stare Kompilacje oprogramowania); po prostu użycie nietypowego mechanizmu wywoływania dla make.

Używając tej techniki, można uprościć wywołanie do:

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

To jeszcze bardziej gadatliwe niż:

script *[io]*

Przypuszczam, że script można by napisać do wywołania make. Wszystko zależy. Nie jestem przekonany, czy da się na tym zyskać wystarczająco dużo przebiegu; P

 1
Author: Jonathan Leffler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:15:10

Moja praca używa ciekawego: zależności nie istnieją, więc zawsze wszystko odbudowuje.

Równie dobrze mogłem użyć pliku wsadowego.

 0
Author: Joshua,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-29 04:22:35

Make są również używane do napędzania procesu ........ dowiedziałem się o tym niedawno , nie tylko indywidualna instalacja lub zarządzanie budową, ale cały proces. Wcześniej myślałem, że make ma być używany tylko do kompilacji projektów, ale tam, gdzie istnieje możliwość zależności lub łańcucha działań , które muszą być wykonane, make może być używany ... ostatnio widziałem kod, który zarządza wszystkim dla procesu aż do dostawy/wdrożenia, w tym przetwarzanie danych-aktualizacja ( 24 godziny +).... dobra rzecz:)

 0
Author: nsd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-18 06:24:41

Make może być również używany jako narzędzie synchronizacji. Na przykład:

#!/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)

Ten plik Makefile tworzy pusty plik .last_sync, który jest używany do rejestrowania ostatniego czasu synchronizacji lokalnego repozytorium ze zdalnym. Za każdym razem, gdy ten skrypt jest uruchamiany, Make sprawdzi, czy któryś z plików wymienionych w FILES nie został zmodyfikowany od ostatniego uruchomienia synchronizacji, skopiuje je na serwer, a następnie zaktualizuje znacznik czasu na .last_sync. Kluczem jest zmienna automatyczna $?, która przechowuje listę ze wszystkich warunków wstępnych, które są nowsze niż cel reguły.

 0
Author: John Gowers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-15 13:41:49