{"id":13968,"date":"2022-06-08T18:17:36","date_gmt":"2022-06-08T18:17:36","guid":{"rendered":"https:\/\/profi-tutorials.de\/linux\/?p=13968"},"modified":"2022-06-08T18:17:36","modified_gmt":"2022-06-08T18:17:36","slug":"befehl-make","status":"publish","type":"post","link":"https:\/\/profi-tutorials.de\/linux\/administration\/befehl-make\/","title":{"rendered":"Der Befehl make"},"content":{"rendered":"<p>In diesem Beitrag lernen Sie den Befehl make sowie die dazugeh&ouml;rigen sogenannten Makefiles kennen. Unter UNIX \/ Linux wird make als Werkzeug zum Aufl&ouml;sen der Abh&auml;ngigkeiten in Build-Prozessen und dem automatischen Rekompilieren von aktualisierten Teilen eingesetzt. &nbsp;Es existieren verschiedene Implementierungen, welche jedoch nicht vollst&auml;ndig kompatibel zueinander sind &ndash; dieser Beitrag konzentriert sich daher nur auf die GNU-Implementierung von make.<\/p>\n<h2 id=\"t-1653405923425\">Installation<\/h2>\n<p><strong>make <\/strong>ist im gleichnamigen Paket <strong>&ldquo;make&rdquo;<\/strong> enthalten und wird folgenderma&szlig;en mithilfe des Paketmanagers <strong>apt <\/strong>installiert:<\/p>\n<pre>apt-get install make<\/pre>\n<p>N&auml;here Informationen zur Paketverwaltung mit <strong>apt <\/strong>erfahren Sie <a href=\"https:\/\/profi-tutorials.de\/linux\/installation\/paket-verwaltung-apt\/\" target=\"_blank\" style=\"outline: none;\" rel=\"noopener\">in unserem dedizierten Beitrag dazu<\/a>.<\/p>\n<h2 id=\"t-1653405923426\">Allgemeine Syntax<\/h2>\n<p>Die allgemeine <a class=\"glossaryLink cmtt_Allgemein cmtt_Informatik\" aria-describedby=\"tt\" data-cmtooltip=\"&lt;div class=glossaryItemTitle&gt;Syntax&lt;\/div&gt;&lt;div class=glossaryItemBody&gt;&#8203;Im  Allgemeinen wird unter Syntax ein Regel&#8203;system verstanden, welches zur  Kombination elementarer Zeichen zu zusammengesetzten &#8203;Zeichen in (...)&lt;\/div&gt;\" href=\"https:\/\/profi-tutorials.de\/linux\/glossar\/syntax\/\" target=\"_blank\" data-mobile-support=\"0\" data-gt-translate-attributes='[{\"attribute\":\"data-cmtooltip\", \"format\":\"html\"}]' tabindex=\"0\" role=\"link\">Syntax<\/a> von <strong>make <\/strong>lautet folgenderma&szlig;en:<\/p>\n<pre>make [Optionen] [Targets]<\/pre>\n<h2 id=\"t-1653405923427\">Makefiles<\/h2>\n<p>Makefiles beschreiben mithilfe von Regeln, wie sogenannte <strong>&ldquo;Targets&rdquo;<\/strong> (Ziele) erstellt werden k&ouml;nnen. Meist sind Targets Namen von Dateien, die von einem Programm generiert werden &ndash; beispielsweise ausf&uuml;hrbare Dateien. Alternativ k&ouml;nnen Targets jedoch auch auszuf&uuml;hrende Aktionen, wie etwa das &ldquo;Aufr&auml;umen&rdquo; (&ldquo;clean&rdquo;), beschreiben. Ein Target kann dabei auch von anderen Targets oder Dateien abh&auml;ngen. Beispielhaft k&ouml;nnte ein Target, in Rahmen dessen ein Programm kompiliert werden soll, etwa den zu kompilierenden Quellcode als Abh&auml;ngigkeit haben.<\/p>\n<p>Eine einfache Regel hat den folgenden Aufbau:<\/p>\n[Target]: [Abh&auml;ngigkeit(en)]\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [Rezept]\n<\/p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &hellip;<\/p>\n<p>Der <strong>Name des Targets<\/strong> steht direkt am Anfang der Regel. Hinter einem <strong>Doppelpunkt &ldquo;:&rdquo;<\/strong> k&ouml;nnen dann die <strong>Abh&auml;ngigkeiten <\/strong>dieses Targets, jeweils mit Leerzeichen voneinander getrennt, aufgelistet werden. Das <strong>Rezept <\/strong>beschreibt schlie&szlig;lich die von <strong>make <\/strong>auszuf&uuml;hrenden Aktionen in Form von einem oder mehreren Befehlen. Die Befehle k&ouml;nnen auf einer Zeile, oder untereinander auf mehreren Zeilen stehen. Wichtig ist jedoch, dass jede Rezept-Zeile mit einem Tab beginnen muss.<\/p>\n<p>Der Dateiname einer Makefile sollte stets <strong>&ldquo;Makefile&rdquo;<\/strong> oder <strong>&ldquo;makefile&rdquo;<\/strong> sein. Sobald eine geeignete Makefile im Arbeitsverzeichnis bereitsteht, k&ouml;nnen alle n&ouml;tigen Neukompilierungen bzw. Aktualisierungen von Targets (nach &Auml;nderungen an Quelldateien) mithilfe des folgenden Befehlsaufrufs durchgef&uuml;hrt werden:<\/p>\n<pre>make<\/pre>\n<p>Das <strong>make<\/strong>-Programm entscheidet anhand der Makefile und der letzten &Auml;nderungszeitpunkte der Dateien, welche Dateien aktualisiert werden m&uuml;ssen. Ein Target wird aktualisiert, wenn mindestens eine Abh&auml;ngigkeit sich seit der letzten Aktualisierung ge&auml;ndert hat, oder wenn das Target noch nicht existiert. Die in der Makefile hinterlegten Befehle werden dann zum Aktualisieren der ausgew&auml;hlten Targets ausgef&uuml;hrt.<\/p>\n<h2 id=\"t-1654245933411\">Wichtige Optionen<\/h2>\n<p>Einige der wichtigsten Optionen von <strong>make <\/strong>werden im Folgenden kurz vorgestellt.<\/p>\n<h3 id=\"t-1654245933412\">-B &ndash; Alle Targets aktualisieren<\/h3>\n<p>Die <strong>Option -B<\/strong> f&uuml;hrt unbedingt zur Aktualisierung aller Targets:<\/p>\n<pre>make -B [Targets]<\/pre>\n<h3 id=\"t-1654245933413\">-f &ndash; Makefile spezifizieren<\/h3>\n<p>Mithilfe der <strong>Option -f<\/strong> ist die &Uuml;bergabe einer Datei, die als Makefile verwendet werden soll, m&ouml;glich:<\/p>\n<pre>make -f [Datei] [Targets]<\/pre>\n<h3 id=\"t-1654245933414\">-q &ndash; &ldquo;Question&rdquo;-Modus<\/h3>\n<p>Wird die <strong>Option -q<\/strong> verwendet, so f&uuml;hrt <strong>make <\/strong>keine Befehle aus und schreibt auch nichts in den Standard-Output <strong>stdout<\/strong>. Stattdessen gibt <strong>make<\/strong> lediglich den <strong>Exit-Code 0<\/strong> zur&uuml;ck, wenn alle spezifizierten Targets aktuell sind, andernfalls einen Exit-Code ungleich 0 (siehe auch <a href=\"#tve-jump-18128bdfffc\" jump-animation=\"smooth\" style=\"outline: none;\">Exit-Codes<\/a>):<\/p>\n<pre>make -q [Targets]<\/pre>\n<h2 id=\"tve-jump-18128bdfffc\">Exit-Codes<\/h2>\n<p>Der folgenden Tabelle sind die <strong>Exit-Codes<\/strong> sowie die jeweils mit ihnen angezeigten <strong>Status <\/strong>des Befehls <strong>make <\/strong>zu entnehmen:<\/p>\n<table data-rows=\"4\" data-cols=\"2\" data-v=\"middle\">\n<thead>\n<tr>\n<th style=\"\"><strong>Exit-Code<\/strong><\/th>\n<th style=\"\">Status<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td data-th=\"Exit-Code\" style=\"\">0<\/td>\n<td data-th=\"Status\" style=\"\">Alle Makefiles konnten erfolgreich geparst werden und keines der aktualisierten Targets ist fehlgeschlagen.<\/td>\n<\/tr>\n<tr>\n<td data-th=\"Exit-Code\" style=\"\">1<\/td>\n<td data-th=\"Status\" style=\"\">Wird ausgegeben, wenn die Option -q verwendet wurde und make festgestellt hat, dass ein Target aktualisiert werden muss.<\/td>\n<\/tr>\n<tr>\n<td data-th=\"Exit-Code\" style=\"\">2<\/td>\n<td data-th=\"Status\" style=\"\">Ein Fehler ist aufgetreten<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"text-align: center;\">Abonniere JETZT unseren Newsletter!<\/p>\n<p style=\"text-align: center;\">Verpasse nie wieder <strong>neue<\/strong> Beitr&auml;ge und <strong>exklusive Insider-Only-Inhalte!<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In diesem Beitrag lernen Sie den Befehl make sowie die dazugeh\u00f6rigen sogenannten Makefiles kennen. Unter UNIX \/ Linux wird make als Werkzeug zum Aufl\u00f6sen der Abh\u00e4ngigkeiten in Build-Prozessen und dem automatischen Rekompilieren von aktualisierten Teilen eingesetzt. &nbsp;Es existieren verschiedene Implementierungen, welche jedoch nicht vollst\u00e4ndig kompatibel zueinander sind &#8211; dieser Beitrag konzentriert sich daher nur auf [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":13971,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_seopress_robots_primary_cat":"none","_seopress_titles_title":"%%post_title%% %%sep%% %%sitetitle%%","_seopress_titles_desc":"In diesem Beitrag lernen Sie den Befehl make und die sogenannten Makefiles kennen. Unter UNIX \/ Linux werden damit Abh\u00e4ngigkeiten in Build-Prozessen aufgel\u00f6st.","_seopress_robots_index":"","footnotes":""},"categories":[8],"tags":[],"class_list":["post-13968","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administration"],"_links":{"self":[{"href":"https:\/\/profi-tutorials.de\/linux\/wp-json\/wp\/v2\/posts\/13968","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/profi-tutorials.de\/linux\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/profi-tutorials.de\/linux\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/profi-tutorials.de\/linux\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/profi-tutorials.de\/linux\/wp-json\/wp\/v2\/comments?post=13968"}],"version-history":[{"count":50,"href":"https:\/\/profi-tutorials.de\/linux\/wp-json\/wp\/v2\/posts\/13968\/revisions"}],"predecessor-version":[{"id":14045,"href":"https:\/\/profi-tutorials.de\/linux\/wp-json\/wp\/v2\/posts\/13968\/revisions\/14045"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/profi-tutorials.de\/linux\/wp-json\/wp\/v2\/media\/13971"}],"wp:attachment":[{"href":"https:\/\/profi-tutorials.de\/linux\/wp-json\/wp\/v2\/media?parent=13968"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/profi-tutorials.de\/linux\/wp-json\/wp\/v2\/categories?post=13968"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/profi-tutorials.de\/linux\/wp-json\/wp\/v2\/tags?post=13968"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}