Cosa sono Makefile.am e Makefile.in?


335

Questi due file si trovano principalmente nei progetti open source.

A cosa servono e come funzionano?

Risposte:


381

Makefile.amè un file definito dal programmatore ed è utilizzato da automakeper generare il Makefile.infile di (i .amsta per un uto m Ake). Lo configurescript visto in genere nei tarball di origine utilizzerà il Makefile.inper generare un Makefile.

Lo configurescript stesso viene generato da un file definito dal programmatore denominato configure.aco configure.in(deprecato). Preferisco .ac(per un uto c onf) poiché lo differenzia dai Makefile.infile generati e in questo modo posso avere regole come quella make dist-cleanche gira rm -f *.in. Poiché si tratta di un file generato, in genere non viene archiviato in un sistema di revisione come Git, SVN, Mercurial o CVS, piuttosto .acsarebbe il file.

Maggiori informazioni su GNU Autotools . Leggi makee Makefileprima, poi conoscere automake, autoconf, libtool, etc.


3
Cosa significa .in?
Utku,

10
L' .inestensione significa che è un input per il configuremassaggio, non un file finale che dovrebbe essere usato (ad es. Con make). Se sei curioso di sapere perché questo sembra "ridicolmente" complicato, prova a leggere: stackoverflow.com/a/26832773/939557 In questi giorni con GitHub, ecc. Che sta diventando un canale di distribuzione comune alcuni dei presupposti di autoconf si stanno rompendo: le persone stanno ottenendo l'origine direttamente dallo strumento di controllo del codice sorgente, anziché utilizzare un tarball di distribuzione dell'origine creato dai manutentori.
MadScientist,

53

Semplice esempio

Adattato senza vergogna da: http://www.gnu.org/software/automake/manual/html_node/Creating-amhello.html e testato su 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], [bug-automake@gnu.org])
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;
}

uso

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

Questo produce:

Hello world from automake_hello_world 1.0

Appunti

  • autoreconf --installgenera diversi file modello che dovrebbero essere tracciati da Git, incluso Makefile.in. Deve essere eseguito solo la prima volta.

  • make install installa:

    • il binario a /usr/local/bin
    • README.md per /usr/local/share/doc/automake_hello_world

Su GitHub per farti provare.


1
Perché si dovrebbero mantenere i file generati sotto VCS (questo non può essere solo Git BTW)?
Victor Yarema,

@VictorYarema Ho dimenticato perché ho raggiunto quella conclusione! Fammi sapere se lo scopri.
Ciro Santilli 18 冠状 病 六四 事件 法轮功

19

DEVELOPER funziona autoconfe automake:

1) autoconf - crea shippable configure sceneggiatura
(che il programma di installazione in seguito eseguito per rendere il Makefile )

2) automake : crea Makefile.in shippable file di dati
(che configura leggerà in seguito per creare il Makefile )


L'INSTALLATORE funziona configure , makee 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


MAPPA INGRESSO / USCITA

La notazione di seguito è approssimativamente: input -> programmi -> output

DEVELOPER esegue questi:

configure.ac -> autoconf -> configure (script) --- (*. ac = a uto c onf)
configure.in -> autoconf -> configure (script) --- ( configure.indeprecato. Usa configure.ac)

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

INSTALLER esegue questi:

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

Makefile -> make ----------> (inserisce nuovo software nei download o nella directory temporanea)
Makefile -> make install -> (inserisce nuovo software nelle directory di sistema)


" autoconf è un pacchetto estensibile di macro M4 che producono script di shell per configurare automaticamente i pacchetti di codice sorgente del software. Questi script possono adattare i pacchetti a molti tipi di sistemi simili a UNIX senza intervento manuale dell'utente. Autoconf crea uno script di configurazione per un pacchetto da un file modello che elenca le funzionalità del sistema operativo che il pacchetto può utilizzare, sotto forma di chiamate macro M4. "

" automake è uno strumento per generare automaticamente file Makefile.in conformi agli standard di codifica GNU. Automake richiede l'uso di Autoconf."

manuali:

Tutorial online gratuiti:


Esempio:

Il principale configure.ac usato per costruire LibreOffice è oltre 12k righe di codice (ma ci sono anche altri 57 file configure.ac nelle sottocartelle.)

Da ciò la mia configurazione generata è di oltre 41k righe di codice.

E mentre Makefile.in e Makefile sono entrambi solo 493 righe di codice. (Ma ci sono anche 768 più Makefile.in nelle sottocartelle.)


16

riferimento :

Makefile.am - un file di input dell'utente per automake

configure.in - un file di input dell'utente per autoconf


autoconf genera configure da configure.in

automake gererates Makefile.in da Makefile.am

configure genera Makefile da Makefile.in

Ad esempio:

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

Quindi Makefile.in dovrebbe essere nel file tar.gz quando fai dist, giusto?
Kemin Zhou,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.