Akitől megkérdezzük, hogyan kell megfelelő módon felépíteni a szoftvert, az a válaszok egyikeként előállítja a Make-t. GNU / Linux rendszereken a GNU Make [1] az eredeti Make több mint 40 éve - 1976-ban - kiadott nyílt forráskódú változata. Készítsen munkát egy Makefile segítségével - egy ilyen nevű strukturált sima szövegfájl, amely a szoftverépítési folyamat építési kézikönyveként jellemezhető a legjobban. A Makefile számos címkét (ún. Célokat) és az egyes célok felépítéséhez végrehajtandó specifikus utasításokat tartalmaz.
Egyszerűen szólva a Make egy építési eszköz. Ez a Makefile feladatok receptjét követi. Lehetővé teszi, hogy automatizált módon ismételje meg a lépéseket, ahelyett, hogy gépbe írja őket (és valószínűleg hibázna gépelés közben).
Az 1. felsorolás egy példát mutat be a Makefile-re a két „e1” és „e2” céllal, valamint a két speciális „all” és „clean” céllal.”A„ make e1 ”futtatása végrehajtja az„ e1 ”célra vonatkozó utasításokat, és létrehozza az üres fájlt. A „make e2” futtatása ugyanezt teszi az „e2” célnál, és létrehozza az üres kettő fájlt. A „mindet” hívás hajtja végre az e1 cél és az e2 cél utasításait. A korábban létrehozott első és második fájl eltávolításához egyszerűen hajtsa végre a „make clean.”
1. felsorolás
mind: e1 e2e1:
érintse meg az egyiket
e2:
kettőt érint
tiszta:
rm egy kettő
Futó Make
Gyakori eset, hogy megírja a Makefile fájlt, majd csak futtatja a „make” vagy „make all” parancsot a szoftver és annak összetevőinek felépítéséhez. Az összes célpont soros sorrendben és párhuzamosítás nélkül készül. A teljes építési idő az az idő összege, amely minden egyes cél megépítéséhez szükséges.
Ez a megközelítés jól működik kis projektek esetében, de közepes és nagyobb projekteknél meglehetősen hosszú. Ez a megközelítés már nem naprakész, mivel a jelenlegi CPU-k többsége egynél több maggal van ellátva, és egyszerre több folyamat végrehajtását teszi lehetővé. Ezeket az ötleteket szem előtt tartva megvizsgáljuk, hogy az építési folyamat párhuzamos-e és hogyan. A cél az építési idő egyszerű csökkentése.
Fejlesztések
Néhány lehetőségünk van: 1) egyszerűsítjük a kódot, 2) elosztjuk az egyes feladatokat különböző számítási csomópontokra, ott felépítjük a kódot, és onnan összegyűjtjük az eredményt, 3) párhuzamosan építjük a kódot egyetlen gépre, és 4) kombinálja a 2. és a 3. lehetőséget.
Az 1. lehetőség) nem mindig könnyű. Szüksége van a megvalósított algoritmus futási idejének elemzésére és a fordítóval kapcsolatos ismeretekre, azaz.e., hogyan fordítja le a fordító a programozási nyelv utasításait processzor utasításokra.
2. lehetőség) hozzáférést igényel más számítási csomópontokhoz, például dedikált számítási csomópontokhoz, használaton kívüli vagy kevésbé használt gépekhez, virtuális gépekhez felhőszolgáltatásokból, például AWS-től, vagy bérelt számítási teljesítményhez olyan szolgáltatásoktól, mint a LoadTeam [5]. A valóságban ezt a megközelítést használják szoftvercsomagok készítésére. A Debian GNU / Linux az úgynevezett Autobuilder hálózatot [17], a RedHat / Fedors pedig a Kojit használja [18]. A Google BuildRabbit-nek hívja a rendszerét, és Aysylu Greenberg beszédében tökéletesen elmagyarázza [16]. A distcc [2] egy úgynevezett elosztott C fordító, amely lehetővé teszi, hogy párhuzamosan fordítson kódokat különböző csomópontokra és beállítsa saját build rendszerét.
A 3. lehetőség helyi szinten párhuzamosítást használ. Lehet, hogy ez az opció az Ön számára a legjobb költség-haszon arány mellett, mivel nem igényel további hardvert, mint a 2. opcióban. A Make párhuzamos futtatásának követelménye a -j opció hozzáadása a híváshoz (röviden -jobs). Ez adja meg az egyszerre futtatott feladatok számát. Az alábbi felsorolás azt kéri a Make-től, hogy 4 feladatot futtasson párhuzamosan:
2. felsorolás
$ make --jobs = 4Amdahl törvénye szerint [23] ez csaknem 50% -kal csökkenti az építési időt. Ne feledje, hogy ez a megközelítés jól működik, ha az egyes célok nem függnek egymástól; például az 5. cél kimenete nem szükséges a 3. cél felépítéséhez.
Van azonban egy mellékhatása: az állapotüzenetek kimenete minden Make célhoz tetszőlegesnek tűnik, és ezeket már nem lehet egyértelműen hozzárendelni egy célhoz. A kimeneti sorrend a munka végrehajtásának tényleges sorrendjétől függ.
Határozza meg a Végrehajtási sorrend megadását
Vannak-e olyan állítások, amelyek segítenek abban, hogy megértsék, mely célok függnek egymástól? Igen! A 3. listában szereplő Makefile példa ezt mondja:
* az „all” cél összeállításához futtassa az e1, e2 és e3 utasításokat
* Az e2 célhoz az e3 cél megépítése szükséges
Ez azt jelenti, hogy először az e1 és az e3 célokat lehet párhuzamosan felépíteni, majd e2 következik, amint elkészül az e3 építése, végül.
3. felsorolás
mind: e1 e2 e3e1:
érintse meg az egyiket
e2: e3
kettőt érint
e3:
érintse meg a hármat
tiszta:
rm egy kettő három
Vizualizálja a Készítsen függőségeket
A makefile2graph [19] projekt okos make2graph eszköze a Make függőségeket irányított aciklikus gráfként jeleníti meg. Ez segít megérteni, hogy a különböző célok hogyan függnek egymástól. A Make2graph pont formátumú grafikonleírásokat ad ki, amelyeket PNG képpé alakíthat át a Graphviz projekt dot parancsával [22]. A hívás a következő:
4. felsorolás
$ mindent csinál -Bnd | make2graph | pont -Tpng -o grafikon.pngElőször is, a Make-t az „all” céllal hívják meg, majd a „-B” opcióval feltétel nélkül felépítik az összes célt, a „-n” (rövidítve: „-dry-run”) úgy tesz, mintha az utasításokat célonként futtatnák, és „ -d ”(“ -debug ”) a hibakeresési információk megjelenítéséhez. A kimenetet a make2graph-hoz csatolják, amely kimenetét ponttá vezeti, amely létrehozza a képfájl grafikont.png PNG formátumban.
A 3. lista felépítésének függőségi grafikonja
További fordítók és build rendszerek
Mint már fentebb kifejtettük, a Make-t több mint négy évtizeddel ezelőtt fejlesztették ki. Az évek során a munkák párhuzamos végrehajtása egyre fontosabbá vált, és azóta nőtt a speciálisan tervezett fordítók és építő rendszerek száma a magasabb szintű párhuzamosság elérése érdekében. Az eszközök listája a következőket tartalmazza:
- Bazel [20]
- CMake [4]: a platformon átívelő Make rövidítése és a Make által később használt leíró fájlok létrehozása
- gyártás [12]
- Distributed Make System (DMS) [10] (úgy tűnik, hogy halott)
- dmake [13]
- LSF gyártmány [15]
- Apache Maven
- Mezon
- Ninja Build
- NMake [6]: Készítsen a Microsoft Visual Studio számára
- PyDoit [8]
- Qmake [11]
- újra [14]
- SCons [7]
- Waf [9]
Legtöbbjüket a párhuzamosítás szem előtt tartásával tervezték, és jobb eredményt kínálnak a gyártási idő tekintetében, mint a Make.
Következtetés
Mint látta, érdemes gondolkodni a párhuzamos építésen, mivel ez jelentősen lerövidíti az elkészítési időt egy bizonyos szintig. Ennek ellenére nem könnyű megvalósítani, és bizonyos buktatókkal jár [3]. Javasoljuk, hogy a párhuzamos buildekbe lépés előtt elemezze mind a kódját, mind annak összeállítási útját.
Linkek és hivatkozások
- [1] GNU Make Manual: Párhuzamos végrehajtás, https: // www.gnú.org / software / make / manual / html_node / Parallel.html
- [2] distcc: https: // github.com / distcc / distcc
- [3] John Graham-Cumming: A GNU buktatói és előnyei párhuzamossá teszik, https: // www.cmcrossroads.com / article / buktatók és előnyök-gnu-make-párhuzamosítás
- [4] CMake, https: // cmake.org /
- [5] LoadTeam, https: // www.loadteam.com /
- [6] NMake, https: // docs.microsoft.com / en-us / cpp / build / reference / nmake-reference?view = msvc-160
- [7] SCons, https: // www.scons.org /
- [8] PyDoit, https: // pydoit.org /
- [9] Waf, https: // gitlab.com / ita1024 / waf /
- [10] Distributed Make System (DMS), http: // www.nongnu.org / dms / index.html
- [11] Qmake, https: // doc.qt.io / qt-5 / qmake-manual.html
- [12] distmake, https: // sourceforge.net / projektek / distmake /
- [13] dmake, https: // docs.jóslat.com / cd / E19422-01 / 819-3697 / dmake.html
- [14] újra, https: // újra.readthedocs.io / hu / latest /
- [15] LSF Make, http: // sunray2.mit.edu / kits / platform-lsf / 7.0.6/1 / guides / kit_lsf_guide_source / print / lsf_make.pdf
- [16] Aysylu Greenberg: Elosztott építési rendszer kiépítése a Google Scale-on, GoTo Conference 2016, https: // gotocon.com / dl / goto-chicago-2016 / slide / AysyluGreenberg_BuildingADistributedBuildSystemAtGoogleScale.pdf
- [17] Debian Build System, Autobuilder hálózat, https: // www.debian.org / devel / buildd / index.en.html
- [18] koji - RPM kiépítő és nyomkövető rendszer, https: // pagure.io / koji /
- [19] makefile2graph, https: // github.com / lindenb / makefile2graph
- [20] Bazel, https: // bazel.épít/
- [21] Makefile bemutató, https: // makefiletutorial.com /
- [22] Graphviz, http: // www.graphviz.org
- [23] Amdahl törvénye, Wikipédia, https: // en.wikipédia.org / wiki / Amdahl% 27s_law