Was sind Makefile.am und Makefile.in?

335

Diese beiden Dateien werden hauptsächlich in Open Source-Projekten angezeigt.

Wofür sind sie und wie arbeiten sie?

Maske
quelle

Antworten:

381

Makefile.amist eine vom Programmierer definierte Datei und wird von verwendet automake, um die Makefile.inDatei zu generieren (die .amsteht für ein uto m ake). Das configureSkript, das normalerweise in Quell-Tarballs angezeigt wird, verwendet das Makefile.in, um ein zu generierenMakefile .

Das configureSkript selbst wird aus einer vom Programmierer definierten Datei mit dem Namen entweder configure.acoder configure.in(veraltet) generiert . Ich bevorzuge .ac(für ein uto c onf), da es es von den generierten Makefile.inDateien unterscheidet und auf diese Weise Regeln haben kann, wie z. B. make dist-cleanwelche ausgeführt werden rm -f *.in. Da es sich um eine generierte Datei handelt, wird sie normalerweise nicht in einem Revisionssystem wie Git, SVN, Mercurial oder CVS gespeichert, sondern in der.ac gespeichert Datei.

Lesen Sie mehr über GNU Autotools . Lesen Sie mehr über makeund Makefilezuerst, dann lernen automake, autoconf, libtooletc.

Sean AO Harney
quelle
3
Wofür steht .in?
Utku
10
Die .inErweiterung bedeutet, dass es sich um eine Eingabe für configuredie Massage handelt und nicht um eine endgültige Datei, die verwendet werden sollte (z make. B. mit ). Wenn Sie neugierig sind, warum dies "lächerlich" kompliziert erscheint, lesen Sie: stackoverflow.com/a/26832773/939557 Heutzutage, da GitHub usw. zu einem gemeinsamen Vertriebskanal wird, brechen einige der Annahmen von autoconf zusammen: Menschen erhalten die Quelle direkt aus dem Quellcode-Steuerungs-Tool, anstatt einen von Betreuern erstellten Quellverteilungs-Tarball zu verwenden.
MadScientist
53

Einfaches Beispiel

Schamlos angepasst von: http://www.gnu.org/software/automake/manual/html_node/Creating-amhello.html und getestet unter Ubuntu 14.04 Automake 1.14.1.

Makefile.am

SUBDIRS = src
dist_doc_DATA = README.md

README.md

Some doc.

configure.ac

AC_INIT([automake_hello_world], [1.0], [[email protected]])
AM_INIT_AUTOMAKE([-Wall -Werror foreign])
AC_PROG_CC
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([
 Makefile
 src/Makefile
])
AC_OUTPUT

src / Makefile.am

bin_PROGRAMS = autotools_hello_world
autotools_hello_world_SOURCES = main.c

src / main.c

#include <config.h>
#include <stdio.h>

int main (void) {
  puts ("Hello world from " PACKAGE_STRING);
  return 0;
}

Verwendungszweck

autoreconf --install
mkdir build
cd build
../configure
make
sudo make install
autoconf_hello_world
sudo make uninstall

Dies gibt aus:

Hello world from automake_hello_world 1.0

Anmerkungen

  • autoreconf --installgeneriert mehrere Vorlagendateien, die von Git verfolgt werden sollen, einschließlich Makefile.in. Es muss nur beim ersten Mal ausgeführt werden.

  • make install installiert:

    • die binäre zu /usr/local/bin
    • README.md zu /usr/local/share/doc/automake_hello_world

Auf GitHub können Sie es ausprobieren.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
quelle
1
Warum sollte man generierte Dateien unter VCS behalten (dies kann nicht nur Git BTW sein)?
Victor Yarema
@ VictorYarema Ich habe vergessen, warum ich zu diesem Schluss gekommen bin! Lassen Sie mich wissen, wenn Sie es herausfinden.
Ciro Santilli 法轮功 冠状 病 六四 事件 18
19

DEVELOPER läuft autoconfund automake:

1) autoconf - erstellt shippable configure Skript
(die das Installationsprogramm wird später ausgeführt werden, um das machen Makefile )

2) auto - erstellt shippable Makefile.in Datendatei
(die configure später lesen , um das machen Makefile )


ERRICHTER läuft configure, makeund sudo make install:

./configure       # Creates  Makefile        (from     Makefile.in).  
make              # Creates  the application (from the Makefile just created).  

sudo make install # Installs the application 
                  #   Often, by default its files are installed into /usr/local


EINGANGS- / AUSGANGSKARTE

Die folgende Notation lautet ungefähr: Eingänge -> Programme -> Ausgänge

DEVELOPER führt diese aus:

configure.ac -> autoconf -> configure (script) --- (*. ac = a uto c onf)
configure.in -> autoconf -> configure (script) --- ( configure.inabgeschrieben. Verwenden Sie configure.ac)

Makefile.am -> automake -> Makefile.in ----------- (*. Am = a uto m ake)

INSTALLER führt diese aus:

Makefile.in -> configure -> Makefile (*. In = in put file)

Makefile -> make ----------> (legt neue Software in Ihren Downloads oder im temporären Verzeichnis ab)
Makefile -> make install -> (legt neue Software in Systemverzeichnissen ab)


" autoconf ist ein erweiterbares Paket von M4-Makros, die Shell-Skripte zum automatischen Konfigurieren von Software-Quellcode-Paketen erstellen. Diese Skripte können die Pakete ohne manuellen Benutzereingriff an viele Arten von UNIX-ähnlichen Systemen anpassen. Autoconf erstellt ein Konfigurationsskript für ein Paket aus a Vorlagendatei, in der die Betriebssystemfunktionen aufgeführt sind, die das Paket in Form von M4-Makroaufrufen verwenden kann. "

" automake ist ein Tool zum automatischen Generieren von Makefile.in-Dateien, die den GNU-Codierungsstandards entsprechen. Automake erfordert die Verwendung von Autoconf."

Anleitungen:

Kostenlose Online-Tutorials:


Beispiel:

Der Haupt configure.ac die zum Erstellen von LibreOffice verwendet wird, besteht aus mehr als 12.000 Codezeilen (es befinden sich jedoch auch 57 andere configure.ac-Dateien in Unterordnern.)

Daraus meine generierte Konfiguration ergibt sich eine über 41.000 Codezeilen.

Und während Makefile.in und Makefile nur 493 Codezeilen sind. (Aber es gibt auch 768 weitere Makefile.ins in Unterordnern.)

Elliptische Ansicht
quelle
16

Referenz :

Makefile.am - eine Benutzereingabedatei, die automatisch erstellt werden soll

configure.in - eine Benutzereingabedatei für die automatische Konfiguration


autoconf generiert configure aus configure.in

automake erstellt Makefile.in von Makefile.am

configure generiert Makefile aus Makefile.in

Zum Beispiel:

$]
configure.in Makefile.in
$] sudo autoconf
configure configure.in Makefile.in ... 
$] sudo ./configure
Makefile Makefile.in

quelle
Makefile.in sollte sich also in der tar.gz-Datei befinden, wenn Sie dist machen, oder?
Kemin Zhou