382 votes

Quels sont Makefile.am et Makefile.in?

Ces deux fichiers sont principalement utilisés dans les projets open source.

À quoi servent-ils et comment fonctionnent-ils?

419voto

Sean A.O. Harney Points 8033

Makefile.am est un fichier défini par le programmeur et est utilisé par automake pour générer le fichier Makefile.in (le .am signifie automake). Le script configure généralement vu dans les sources tar est utilisé pour générer un fichier Makefile.

Le configure script lui-même est généré à partir d'un fichier défini par le programmeur nommé configure.ac ou configure.in (déprécié). Je préfère .ac (pour autoconf) car cela le différencie des fichiers Makefile.in générés, et de cette manière je peux avoir des règles telles que make dist-clean qui exécute rm -f *.in. Comme c'est un fichier généré, il n'est pas généralement stocké dans un système de révision tel que Git, SVN, Mercurial ou CVS, plutôt le fichier .ac le serait.

En savoir plus sur GNU Autotools. Lire sur make et Makefile d'abord, puis apprendre sur automake, autoconf, libtool, etc.

4 votes

Que signifie .in ?

15 votes

La extension .in signifie qu'il s'agit d'une entrée pour configure à manipuler, et non d'un fichier final devant être utilisé (par exemple, avec make). Si vous vous demandez pourquoi cela semble "ridiculement" compliqué, essayez de lire : stackoverflow.com/a/26832773/939557. Ces jours-ci, avec GitHub, etc. devenant un canal de distribution commun, certaines des hypothèses de autoconf sont en train de s'effondrer : les gens obtiennent la source directement à partir de l'outil de contrôle des codes sources, plutôt que d'utiliser un fichier tarball de distribution de source créé par les mainteneurs.

0 votes

Cela semble en contradiction avec la source d'emacs; il contient Makefile.in qui génère Makefile en utilisant "configure".

64voto

Ciro Santilli Points 3341

Exemple simple

Honteusement adapté 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], [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 
#include 

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

Utilisation

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

Ceci affiche :

Hello world from automake_hello_world 1.0

Notes

  • autoreconf --install génère plusieurs fichiers modèles qui devraient être suivis par Git, y compris Makefile.in. Il suffit de l'exécuter une seule fois.

  • make install installe :

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

Sur GitHub pour que vous puissiez l'essayer.

1 votes

Pourquoi faut-il conserver les fichiers générés sous VCS (ceci peut ne pas être seulement Git d'ailleurs) ?

0 votes

@VictorYarema J'ai oublié pourquoi j'en suis arrivé à cette conclusion! Faites-moi savoir si vous le découvrez.

1 votes

Ne devrait pas autotools_hello_world au lieu de autoconf_hello_world ? dans votre section Utilisation?

32voto

Eliptical view Points 421

Le DÉVELOPPEUR exécute autoconf et automake:

  1. autoconf - crée le script configure exécutable
    (dont l'installateur lancera plus tard pour générer le Makefile)
  1. automake - crée le fichier de données Makefile.in exécutable
    (dont configure lira plus tard pour générer le Makefile)

L'INSTALLATEUR exécute configure, make et sudo make install:

./configure       # Crée le  Makefile        (à partir de     Makefile.in).  
make              # Crée l'application (à partir du Makefile nouvellement créé).  

sudo make install # Installe l'application 
                  #   En général, par défaut ses fichiers sont installés dans /usr/local


SYNTAXE DES ENTRÉES/SORTIES

La notation ci-dessous est approximativement : entrées --> programmes --> sorties

Le DÉVELOPPEUR exécute ces commandes :

configure.ac -> autoconf -> configure (script) --- (*.ac = autoconf)
configure.in --> autoconf -> configure (script) --- (configure.in obsolète. Utiliser configure.ac)

Makefile.am -> automake -> Makefile.in ----------- (*.am = automake)

L'INSTALLATEUR exécute ces commandes :

Makefile.in -> configure -> Makefile (*.in = input file)

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


"autoconf est un ensemble extensible de macros M4 qui produisent des scripts shell pour configurer automatiquement des packages de code source 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 modèle qui liste les fonctionnalités du système d'exploitation que le package peut utiliser, sous forme d'appels de macros 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 principal configure.ac utilisé pour construire LibreOffice comporte plus de 12 000 lignes de code, (mais il y a aussi 57 autres fichiers configure.ac dans les sous-dossiers.)

Mon configure généré à partir de cela comporte plus de 41 000 lignes de code.

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

19voto

référence :

Makefile.am -- un fichier d'entrée utilisateur pour automake

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


autoconf génère configure à partir de configure.in

automake génère Makefile.in à partir de Makefile.am

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

Par exemple :

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

0 votes

Donc Makefile.in doit se trouver dans le fichier tar.gz lorsque vous exécutez make dist, n'est-ce pas?

0 votes

@KeminZhou Oui. Les non-développeurs ne sont pas censés exécuter automake. Ils devraient avoir le Makefile.in dans le paquetage tarball.

0 votes

En général, les développeurs utilisent les autotools pour générer le fichier configure à utiliser par les utilisateurs réguliers.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X