Machen Sie (Software)

In der Softwareentwicklung, Machen Sie ist ein Dienstprogramm, das automatisch rechtskräftige Programme baut und Bibliotheken aus dem Quellcode durch das Lesen von Dateien makefiles genannt haben, die angeben, wie man das Zielprogramm ableitet. Obwohl einheitliche Entwicklungsumgebungen und sprachspezifische Bearbeiter-Eigenschaften auch verwendet werden können, um den bauen Prozess in modernen Systemen zu führen, Zu machen, bleibt weit verwendet besonders in Unix.

Ursprung

Es gibt jetzt mehrere Abhängigkeitsverfolgen baut Dienstprogramme, aber Macht ist einer der weit verbreitetsten in erster Linie wegen seiner Einschließung in Unix, mit dem PWB/UNIX 1.0 anfangend, der eine Vielfalt von Werkzeugen gezeigt hat, die Softwareentwicklungsaufgaben ins Visier nehmen. Es wurde von Stuart Feldman 1977 an Glockenlaboratorien ursprünglich geschaffen. 2003 hat Dr Feldman den ACM Softwaresystempreis für den authoring dieses weit verbreiteten Werkzeugs erhalten.

Vor der Einführung von Make bauen Unix System meistens hat aus dem Betriebssystemabhängigen bestanden "machen" und "installieren" Schale-Schriften, die die Quelle ihres Programms begleiten. Das Imstandesein, die Befehle für die verschiedenen Ziele in eine einzelne Datei und das Imstandesein zu verbinden, das Abhängigkeitsverfolgen und Archiv-Berühren zu abstrahieren, waren ein wichtiger Schritt in der Richtung auf den modernen bauen Umgebungen.

Moderne Versionen

Machen Sie ist mehrere durchgegangen schreibt einschließlich mehrerer Varianten vom Kratzer um, die dasselbe Dateiformat und grundlegende algorithmische Grundsätze verwendet haben und auch mehrere ihre eigene Sondererhöhungen zur Verfügung gestellt haben. Einige von ihnen sind:

  • BSD Machen (pmake), der aus der Arbeit von Adam de Boor an einer Version dessen abgeleitet wird, Machen fähig dazu, Ziele in der Parallele zu bauen, und überlebt mit unterschiedlichen Graden der Modifizierung in FreeBSD, NetBSD und OpenBSD. Am meisten namentlich hat es conditionals und wiederholende Schleifen, die in der Syntaxanalyse-Bühne angewandt werden und an bedingt gewöhnt sein und programmatisch den makefile einschließlich der Generation von Zielen an der Durchlaufzeit bauen können.
  • GNU Macht wird oft in Verbindung mit dem GNU verwendet bauen System. Seine Abfahrten vom traditionellen Machen sind im Muster-Zusammenbringen in Abhängigkeitsgraphen am meisten bemerkenswert und bauen Ziele, sowie mehrere Funktionen, die angerufen werden können, Funktionalität wie Auflistung der Dateien im aktuellen Verzeichnis erlaubend. Es wird auch ins Xcode Entwicklungsgefolge des Apfels für den Mac OS eingeschlossen.
  • Microsoft nmake, allgemein verfügbar auf Windows. Es ist darin ziemlich grundlegend es bietet sich nur eine Teilmenge der Eigenschaften der zwei Versionen dessen Machen erwähnt oben. Der nmake des Microsofts soll mit nmake von AT&T und Glockenlaboratorien für Unix nicht verwirrt sein.

POSIX schließt Standardisierung der grundlegenden Eigenschaften und Operation des Machen Dienstprogrammes ein, und wird mit unterschiedlichen Graden der Vollständigkeit in mit Sitz in Unix Versionen dessen durchgeführt Machen. Im Allgemeinen kann einfacher makefiles zwischen verschiedenen Versionen dessen verwendet werden Machen mit dem angemessenen Erfolg. GNU Macht, und BSD Machen kann konfiguriert werden, um erst für Dateien genannt "GNUmakefile" und "BSDmakefile" beziehungsweise auszusehen, der erlaubt, makefiles zu stellen, die Durchführungsdefiniertes Verhalten in getrennten Positionen verwenden.

Verhalten

Machen Sie wird normalerweise verwendet, um rechtskräftige Programme und Bibliotheken aus dem Quellcode zu bauen. Allgemein, obwohl jeder Prozess, der mit dem Umwandeln einer Quelldatei zu einem Zielergebnis verbunden ist (durch die Durchführung willkürlicher Befehle) anwendbar ist, um Zu machen. Machen Sie zum Beispiel konnte verwendet werden, um eine mit einer Bilddatei vorgenommene Änderung zu entdecken (die Quelle), und die Transformationshandlungen könnten sein, die Datei zu einem spezifischen Format umzuwandeln, das Ergebnis in ein zufriedenes Verwaltungssystem zu kopieren, und dann E-Mail an einen vorherbestimmten Satz von Benutzern zu senden, dass die obengenannten Handlungen durchgeführt wurden.

Machen Sie wird mit einer Liste von Zieldateinamen angerufen, um als Argumente der Befehl-Linie zu bauen:

machen Sie ZIEL [ZIEL...]

</syntaxhighlight>

Ohne Argumente, Machen Sie baut das erste Ziel, das in seinem makefile erscheint, der traditionell ein symbolisches "falsches" Ziel genannt alle ist.

Machen Sie entscheidet, ob ein Ziel durch das Vergleichen von Dateimodifizierungszeiten regeneriert werden muss. Das behebt das Problem, das Gebäude von Dateien zu vermeiden, die bereits aktuell sind, aber es scheitert, wenn sich eine Datei ändert, aber seine Modifizierungszeit bleibt in der Vergangenheit. Solche Änderungen konnten durch die Wiederherstellung einer älteren Version einer Quelldatei verursacht werden, oder wenn ein Netz filesystem eine Quelle von Dateien und seiner Uhr ist oder timezone mit dem Maschinenlaufen nicht synchronisiert wird, Machen. Der Benutzer muss behandeln diese Situation durch das Zwingen eines ganzen bauen. Umgekehrt, wenn eine Quelldateimodifizierungszeit in der Zukunft ist, löst sie unnötigen Wiederaufbau aus, der Benutzer belästigen kann.

Makefiles

Machen Sie Suchen das aktuelle Verzeichnis für den makefile, um zu verwenden, z.B macht Gnu Suchdateien in der Größenordnung von einer Datei hat einen dessen genannt und führt dann das angegebene (oder Verzug) Ziel (E) von (nur) dieser Datei.

Die makefile Sprache ist der Aussageprogrammierung ähnlich. Diese Klasse der Sprache, auf der notwendige Endbedingungen beschrieben werden, aber die Ordnung, in der Handlungen genommen werden sollen, ist nicht wichtig, ist manchmal an die befehlende Programmierung verwendeten Programmierern verwirrend.

Ein Problem darin baut Automation ist die Schneiderei eines bauen Prozesses zu einer gegebenen Plattform. Zum Beispiel könnte der auf einer Plattform verwendete Bearbeiter nicht dieselben Optionen als auf einem anderen verwendete diejenige akzeptieren. Das wird dadurch nicht gut behandelt Machen. Dieses Problem wird normalerweise durch das Erzeugen der spezifischen Plattform behandelt bauen Instruktionen, die der Reihe nach dadurch bearbeitet werden, Machen. Allgemeine Werkzeuge für diesen Prozess sind Autoconf und CMake.

Regeln

Ein makefile besteht aus Regeln. Jede Regel beginnt mit einer Textabhängigkeitslinie, die ein Ziel definiert, das von einem Doppelpunkt (:) und fakultativ eine Enumeration von Bestandteilen gefolgt ist (Dateien oder andere Ziele), von dem das Ziel abhängt. Die Abhängigkeitslinie wird eingeordnet, so dass das Ziel (linke Hand des Doppelpunkts) von Bestandteilen (rechte Hand des Doppelpunkts) abhängt. Es ist üblich, Bestandteile als Vorbedingungen des Ziels zu kennzeichnen.

Zum Beispiel wird ein C. o Gegenstand-Datei von.c Dateien geschaffen, so müssen Sie.c Dateien zuerst haben (d. h. spezifisches Gegenstand-Dateiziel von einer C Quelldatei und Kopfball-Dateien abhängt). Weil sich Machen, versteht nicht, erkennt an oder unterscheidet verschiedene Arten von Dateien, das öffnet eine Möglichkeit für den menschlichen Fehler. Ein vergessener oder eine Extraabhängigkeit können nicht sofort offensichtlich sein und können auf feine Programmfehler auf die erzeugte Software hinauslaufen. Es ist möglich, makefiles zu schreiben, die diese Abhängigkeiten durch das Benennen von Drittwerkzeugen erzeugen, und einige makefile Generatoren, wie das Automachen toolchain zur Verfügung gestellt durch das GNU-Projekt, so automatisch tun können.

Nach jeder Abhängigkeitslinie kann eine Reihe von Befehl-Linien folgen, die definieren, wie man die Bestandteile (gewöhnlich Quelldateien) ins Ziel (gewöhnlich die "Produktion") umgestaltet. Wenn einige der

Bestandteile sind modifiziert worden, die Befehl-Linien werden geführt.

Machen Sie kann entscheiden, wo man durch das topologische Sortieren anfängt.

Jede Befehl-Linie muss mit einem Etikett-Charakter beginnen, als ein Befehl anerkannt zu werden. Das Etikett ist ein whitespace Charakter, aber der Raumcharakter hat dieselbe spezielle Bedeutung nicht. Das ist problematisch, da es keinen Sehunterschied zwischen einem Etikett und einer Reihe von Raumcharakteren geben kann. Dieser Aspekt der Syntax von makefiles ist häufig der Kritik unterworfen.

Jeder Befehl wird durch eine getrennte Schale oder Dolmetscher der Befehl-Linie Beispiel durchgeführt. Da Betriebssysteme verschiedene Dolmetscher der Befehl-Linie verwenden, kann das zu untragbarem makefiles führen. Zum Beispiel, GNU Machen standardmäßig führt Befehle mit/bin/sh durch, wo Befehle von Unix wie Bedienungsfeld normalerweise verwendet werden. Im Gegensatz dazu führt der nmake des Microsofts Befehle mit cmd.exe durch, wo Gruppe-Befehle wie Kopie verfügbar sind, aber nicht notwendigerweise Bedienungsfeld.

Ziel [nimmt...] ins Visier: [Bestandteil...]

[

.

. . [</syntaxhighlight>

Gewöhnlich hat jede Regel ein einzelnes einzigartiges Ziel, aber nicht vielfache Ziele.

Eine Regel kann keine definierten Befehl-Linien haben. Die Abhängigkeitslinie kann allein aus Bestandteilen bestehen, die sich auf Ziele zum Beispiel beziehen:

realclean: Reinigen Sie distclean

</syntaxhighlight>

Die Befehl-Linien einer Regel werden gewöhnlich eingeordnet, so dass sie das Ziel erzeugen. Ein Beispiel: Wenn "file.html" neuer ist, wird es zum Text umgewandelt. Der Inhalt des makefile:

file.txt: file.html

Luchs - lädt file.html> file.txt ab

</syntaxhighlight>

Die obengenannte Regel würde ausgelöst, wenn Aktualisierungen "file.txt" Machen. In der folgenden Beschwörung, Machen Sie würde normalerweise diese Regel verwenden, "file.txt" Ziel zu aktualisieren, wenn "file.html" neuer wären.

machen Sie file.txt

</syntaxhighlight>

Befehl-Linien können ein oder mehr von den folgenden drei Präfixen haben:

  • ein Bindestrich - minus (-), angebend, dass Fehler ignoriert werden
  • am Zeichen, angebend, dass der Befehl zur Standardproduktion nicht gedruckt wird, bevor es durchgeführt wird
  • ein Pluszeichen (+), der Befehl wird durchgeführt, selbst wenn Machen, wird in angerufen "führen" Weise nicht durch

Das Ignorieren von Fehlern und Echo zum Schweigen zu bringen, können über die speziellen Ziele ".IGNORE" und ".SILENT" wechselweise erhalten werden.

Der NMAKE des Microsofts hat Regeln vorherbestimmt, die aus diesen makefiles, z.B "c.obj $ (CC) $ (CFLAGS)" weggelassen werden können.

Makros

Ein makefile kann Definitionen von Makros enthalten. Makros werden gewöhnlich Variablen genannt, wenn sie einfache Schnur-Definitionen wie "CC=gcc" halten. Makros in makefiles können in den zum Machen Dienstprogramm passierten Argumenten der Befehl-Linie überritten werden. Umgebungsvariablen sind auch als Makros verfügbar.

Makros erlauben Benutzern, die Programme angerufenes und anderes kundenspezifisches Verhalten während des bauen Prozesses anzugeben. Zum Beispiel wird der Makro-"CC" oft in makefiles verwendet, um sich auf die Position eines C Bearbeiters zu beziehen, und der Benutzer könnte einen besonderen Bearbeiter angeben mögen, um zu verwenden.

Neue Makros (oder einfache "Variablen") werden mit Großbuchstaben traditionell definiert:

MAKRO-= Definition

</syntaxhighlight>

Ein Makro wird durch die Erweiterung davon verwendet. Traditionell wird das durch das Umgeben seines Namens innen getan. Eine selten verwendete, aber gleichwertige Form verwendet lockige geschweifte Klammern aber nicht Parenthese, d. h.

NEW_MACRO = $ (MAKRO-) - $ (MACRO2)

</syntaxhighlight>

Makros können aus Schale-Befehlen durch das Verwenden des Befehl-Ersatz-Maschinenbedieners zusammengesetzt werden, der durch backticks angezeigt ist.

YYYYMMDD = `Datum`

</syntaxhighlight>

Der Inhalt der Definition wird versorgt, "wie ist". Faule Einschätzung wird verwendet, bedeutend, dass Makros normalerweise nur ausgebreitet werden, wenn ihre Vergrößerungen wirklich, solcher als, wenn verwendet, in den Befehl-Linien einer Regel erforderlich sind. Ein verlängertes Beispiel:

PAKET = Paket

VERSION = `Datum + "%Y. % m%d"`

ARCHIVIEREN SIE = $ (PAKET) - $ (VERSION)

dist:

# Benachrichtigung, dass nur jetzt Makros für die Schale ausgebreitet werden, um zu dolmetschen:

# Teer - vgl Paket - `Datum + "%Y%m%d"`.tar

Teer-zcf $ (ARCHIV).tar.

</syntaxhighlight>

Die allgemeine Syntax für überwiegende Makros auf der Befehl-Linie ist:

machen Sie MAKRO-= "Wert" [MAKRO-= "Wert"...] ZIEL [ZIEL...]

</syntaxhighlight>

Makefiles kann auf einige mehrerer vorherbestimmter innerer Makros, mit zugreifen'?' und das allgemeinste zu sein.

Ziel: component1 component2

Echo-$? enthält jene Bestandteile, die Aufmerksamkeit brauchen (d. h. sie JÜNGER sind als aktuelles ZIEL).

Echo-$ bewertet zum aktuellen ZIEL-Namen aus der Zahl von denjenigen, die des Doppelpunkts verlassen sind.

</syntaxhighlight>

Nachsilbe-Regeln

Nachsilbe-Regeln haben "Ziele" mit Namen in der Form und werden verwendet, um auf der Dateierweiterung gestützte Handlungen zu starten. In den Befehl-Linien von Nachsilbe-Regeln gibt POSIX an, dass sich das innere Makro auf die Vorbedingung bezieht und sich auf das Ziel bezieht. In diesem Beispiel, das jede HTML-Datei in den Text umwandelt, ist der Schale-Wiederrichtungsjeton ein Teil der Befehl-Linie, wohingegen ein Makroverweisen zur HTML-Datei ist:

.SUFFIXES:.txt.html

# von.html bis.txt

.html.txt:

Luchs - lädt $ ab

</syntaxhighlight>

Wenn genannt, von der Befehl-Linie breitet sich das obengenannte Beispiel aus.

$ machen-n file.txt

Luchs - lädt file.html> file.txt ab

</syntaxhighlight>

Andere Elemente

Einzeilige Anmerkungen werden mit dem Kuddelmuddel-Symbol (#) angefangen.

Einige Direktiven in makefiles können anderen makefiles einschließen.

Linienverlängerung wird mit einem Charakter des umgekehrten Schrägstrichs am Ende einer Linie angezeigt.

Ziel: Bestandteil \

Bestandteil

</syntaxhighlight>

Beispiel makefiles

Makefiles werden traditionell verwendet, um Code zu kompilieren (*.c, *.cc, *.C, usw.), aber sie können auch verwendet werden, um Befehle zur Verfügung zu stellen, allgemeine Aufgaben zu automatisieren. Ein solcher makefile wird von der Befehl-Linie genannt:

machen Sie # Ohne das erste ZIEL von Läufen des Arguments

machen Sie Hilfe # Show verfügbare ZIELE

machen Sie dist # Machen ein Ausgabe-Archiv vom Strom dir

</syntaxhighlight>

Der makefile:

PAKET = Paket

VERSION = `Datum "+ %Y. % m%d %"`

RELEASE_DIR =..

RELEASE_FILE = $ (PAKET) - $ (VERSION)

# Benachrichtigung, dass der variable LOGNAME aus der Umgebung in kommt

# POSIX Schalen.

#

# Ziel: alle - Verzug-Ziel. Tut nichts.

alle:

werfen Sie "Hallo $ (LOGNAME), nichts zurück, um standardmäßig" zu tun

# sehr selten: Werfen Sie "Hallo $ {LOGNAME}, nichts zurück, um standardmäßig" zu tun

werfen Sie "Versuch zurück 'machen Hilfe'"

# Ziel: Hilfe - Anzeige kündbare Ziele.

Hilfe:

egrep "^# Ziel:" [Mm] akefile

# Ziel: Liste - Listenquelldateien

Liste:

# Wird nicht arbeiten. Jeder Befehl ist in der getrennten Schale

cd src

ls

# Richtig, Verlängerung derselben Schale

cd src; \

ls

# Ziel: Dist - Machen eine Ausgabe.

dist:

Teer - vgl $ (RELEASE_DIR) / $ (RELEASE_FILE) && \

gzip-9 $ (RELEASE_DIR) / $ (RELEASE_FILE).tar

</syntaxhighlight>

Unten ist ein sehr einfacher makefile, der standardmäßig (wird die "ganze" Regel zuerst verzeichnet), eine Quelldatei kompiliert, hat "helloworld.c" das Verwenden des gcc C Bearbeiter genannt und stellt auch ein "sauberes" Ziel zur Verfügung, um die erzeugten Dateien zu entfernen, wenn der Benutzer wünscht, anzufangen. Und sind zwei der so genannten inneren Makros (auch bekannt als automatische Variablen) und treten für den Zielnamen und "die implizite" Quelle beziehungsweise ein. Im Beispiel unten, breitet sich zur abgegrenzten Liste eines Raums der Vorbedingungen aus. Es gibt mehrere andere innere Makros.

CC = gcc

CFLAGS =-g

alle: helloworld

helloworld: helloworld.o

# fangen Befehle mit dem ETIKETT nicht Räume an

$ (CC) $ (LDFLAGS)-o $ $ ^\

helloworld.o: helloworld.c

$ (CC) $ (CFLAGS)-c-o $ $

Viele mit dem vorherbestimmten gekommene Systeme Machen Regeln und Makros, um allgemeine Aufgaben wie auf der Dateinachsilbe gestützte Kompilation anzugeben. Das erlaubt Benutzer, das wirkliche (häufig untragbar) Instruktionen dessen wegzulassen, wie man das Ziel von der Quelle (N) erzeugt. Auf solch einem System konnte der obengenannte makefile wie folgt modifiziert werden:

alle: helloworld helloworld: helloworld.o

$ (CC) $ (CFLAGS) $ (LDFLAGS)-o $ $ ^\

sauber: FRC

rm-f helloworld helloworld.o

# ist Das eine ausführliche Nachsilbe-Regel. Es kann auf Systemen weggelassen werden

#, die einfache Regeln wie das automatisch behandeln.

.c.o:

$ (CC) $ (CFLAGS)-c $

Das "helloworld.o" hängt von "helloworld.c" ab, wird jetzt dadurch automatisch behandelt Machen. In solch einem einfachen Beispiel weil hat dasjenige hier das kaum Sachen illustriert, aber die Wirkleistung von Nachsilbe-Regeln wird offensichtlich, wenn die Zahl von Quelldateien in einem Softwareprojekt anfängt zu wachsen. Ein einziger muss eine Regel für den sich verbindenden Schritt schreiben und die Gegenstand-Dateien als Vorbedingungen erklären. Machen Sie Testament dann implizit bestimmen, wie man alle Gegenstand-Dateien macht und nach Änderungen in allen Quelldateien sucht.

Einfache Nachsilbe-Regel-Arbeit gut so lange die Quelldateien hängt von einander und von anderen Dateien wie Kopfball-Dateien nicht ab. Ein anderer Weg, um den bauen Prozess zu vereinfachen, soll so genanntes Muster verwenden, das Regeln vergleicht, die mit der Bearbeiter-geholfenen Abhängigkeitsgeneration verbunden werden können. Da ein Endbeispiel, das den gcc Bearbeiter und das GNU verlangt, Macht, ist hier ein allgemeiner makefile, der alle C Dateien in einer Mappe zu den entsprechenden Gegenstand-Dateien kompiliert und sie dann mit dem rechtskräftigen Finale verbindet. Bevor Kompilation stattfindet, werden Abhängigkeiten im makefile-freundlichen Format in eine verborgene Datei ".depend" gesammelt, der dann zum makefile eingeschlossen wird.

# allgemeiner GNUMakefile

# Gerade ein Schnipsel, um aufzuhören, unter anderem durchzuführen (1) Befehle machen

#, der diese Linien nicht verstehen wird

ifneq

Dieser makefile verlangt, dass GNU Macht.

endif

PROGRAMM = foo

C_FILES: = $ (Wildcard *.c)

OBJS: = $ (patsubst %.c, %.o, $ (C_FILES))

CC = Cc

CFLAGS = - Wand - pedantischer

LDFLAGS =

alle: $ (PROGRAMM)

$ (PROGRAMM):.depend-$ (OBJS)

$ (CC) $ (CFLAGS) $ (OBJS) $ (LDFLAGS)-o $ (PROGRAMM)

hängen Sie ab:.depend

.depend: Cmd = gcc - MM-MF hängen $ (var) ab; Katze hängt>>.depend ab;

.depend:

@echo "Das Erzeugen von Abhängigkeiten..."

$ (foreach var, $ (C_FILES), $ (cmd))

@rm-f hängen ab

- schließen Sie.depend ein

# ist Das das Muster, das Regeln vergleicht. Zusätzlich zum automatischen

# treten Variablen verwendet hier, der variable $ *, der beliebigen % vergleicht, für ein

# kann in speziellen Fällen nützlich sein.

%. o: %.c

$ (CC) $ (CFLAGS)-c $

Siehe auch

  • Liste dessen baut Automationssoftware

Links


Vielsalm / Durbuy
Impressum & Datenschutz