Que sont Makefile.am et Makefile.in?

335

Ces deux fichiers sont principalement visibles dans les projets open source.

À quoi servent-ils et comment fonctionnent-ils?

Masque
la source

Réponses:

381

Makefile.amest un fichier défini programmeur et est utilisé par automakede générer le Makefile.infichier (les .amstands pour un uto m AKE). Le configurescript généralement vu dans les archives tar source utilisera le Makefile.inpour générer un fichier Makefile.

Le configurescript lui-même est généré à partir d'un fichier défini par le programmeur nommé soit configure.acou configure.in(obsolète). Je préfère .ac(pour un uto c onf) car il le différencie des Makefile.infichiers générés et de cette façon je peux avoir des règles comme celle make dist-cleanqui s'exécute rm -f *.in. Puisqu'il s'agit d'un fichier généré, il n'est généralement pas stocké dans un système de révision tel que Git, SVN, Mercurial ou CVS, mais plutôt le .acfichier.

En savoir plus sur GNU Autotools . Lisez à propos makeet d' Makefileabord, puis en savoir plus sur automake, autoconf, libtool, etc.

Sean AO Harney
la source
3
Qu'est - ce que .inveut dire?
Utku
10
L' .inextension signifie qu'elle est entrée pour configuremasser, pas un fichier final qui devrait être utilisé (par exemple avec make). Si vous êtes curieux de savoir pourquoi cela semble "ridiculement" compliqué, essayez de lire: stackoverflow.com/a/26832773/939557 De nos jours, GitHub, etc. devenant un canal de distribution commun, certaines des hypothèses d'autoconf s'effondrent: les gens obtiennent la source directement depuis l'outil de contrôle du code source, plutôt que d'utiliser un tarball de distribution source créé par les mainteneurs.
MadScientist
53

Exemple simple

Adapté sans vergogne de: http://www.gnu.org/software/automake/manual/html_node/Creating-amhello.html et testé sur 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;
}

Usage

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

Cela produit:

Hello world from automake_hello_world 1.0

Remarques

  • autoreconf --installgénère plusieurs fichiers modèles qui devraient être suivis par Git, y compris Makefile.in. Il ne doit être exécuté que la première fois.

  • make install installe:

    • le binaire à /usr/local/bin
    • README.md à /usr/local/share/doc/automake_hello_world

Sur GitHub pour que vous puissiez l'essayer.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
la source
1
Pourquoi garder les fichiers générés sous VCS (cela peut être non seulement Git BTW)?
Victor Yarema
@VictorYarema J'ai oublié pourquoi je suis arrivé à cette conclusion! Fais moi signe si tu trouves.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
19

DEVELOPER s'exécute autoconfet automake:

1) autoconf - crée un script de configuration livrable
(que le programme d'installation exécutera plus tard pour créer le Makefile )

2) automake - crée shippable Makefile.in fichier de données
(qui configure sera ensuite lu pour faire le Makefile )


INSTALLATEUR court configure, makeet 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


CARTE D'ENTRÉE / SORTIE

La notation ci-dessous est à peu près: entrées -> programmes -> sorties

LE DÉVELOPPEUR les exécute:

configure.ac -> autoconf -> configure (script) --- (*. ac = a uto c onf)
configure.in -> autoconf -> configure (script) --- ( configure.indéprécié. Utilisez configure.ac)

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

L'INSTALLATEUR les exécute:

Makefile.in -> configure -> Makefile (. * En = dans le fichier de vente)

Makefile -> make ----------> (met un nouveau logiciel dans vos téléchargements ou répertoire temporaire)
Makefile -> make install -> (met un nouveau logiciel dans les répertoires système)


" autoconf est un package extensible de macros M4 qui produit des scripts shell pour configurer automatiquement les packages de code source du logiciel. Ces scripts peuvent adapter les packages à de nombreux types de systèmes de type UNIX sans intervention manuelle de l'utilisateur. Autoconf crée un script de configuration pour un package à partir d'un fichier de modèle qui répertorie les fonctionnalités du système d'exploitation que le package peut utiliser, sous la forme d'appels de macro M4. "

" automake est un outil pour générer automatiquement des fichiers Makefile.in conformes aux normes de codage GNU. Automake nécessite l'utilisation d'Autoconf."

Manuels:

Tutoriels en ligne gratuits:


Exemple:

Le fichier configure.ac principal utilisé pour créer LibreOffice comprend plus de 12 000 lignes de code (mais il existe également 57 autres fichiers configure.ac dans les sous-dossiers.)

À partir de cela, ma configuration générée comprend plus de 41 000 lignes de code.

Et tandis que le Makefile.in et Makefile sont tous deux seulement 493 lignes de code. (Mais, il y a aussi 768 Makefile.in de plus dans les sous-dossiers.)

Vue elliptique
la source
16

référence :

Makefile.am - un fichier d'entrée utilisateur pour créer automatiquement

configure.in - un fichier d'entrée utilisateur à autoconf


autoconf génère configure depuis configure.in

automake gérère Makefile.in de Makefile.am

configure génère un Makefile à partir de Makefile.in

Par exemple:

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

la source
Donc Makefile.in devrait être dans le fichier tar.gz lorsque vous faites dist, non?
Kemin Zhou