Ces deux fichiers sont principalement utilisés dans les projets open source.
À quoi servent-ils et comment fonctionnent-ils?
Ces deux fichiers sont principalement utilisés dans les projets open source.
À quoi servent-ils et comment fonctionnent-ils?
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.
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.
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 :
/usr/local/bin
README.md
dans /usr/local/share/doc/automake_hello_world
Sur GitHub pour que vous puissiez l'essayer.
Pourquoi faut-il conserver les fichiers générés sous VCS (ceci peut ne pas être seulement Git d'ailleurs) ?
@VictorYarema J'ai oublié pourquoi j'en suis arrivé à cette conclusion! Faites-moi savoir si vous le découvrez.
Ne devrait pas autotools_hello_world
au lieu de autoconf_hello_world
? dans votre section Utilisation?
autoconf
et automake
: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
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 :
GNU AutoTools (Le manuel définitif sur ce sujet)
m4 (utilisé par autoconf)
Tutoriels en ligne gratuits :
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.)
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
Donc Makefile.in doit se trouver dans le fichier tar.gz lorsque vous exécutez make dist, n'est-ce pas?
@KeminZhou Oui. Les non-développeurs ne sont pas censés exécuter automake
. Ils devraient avoir le Makefile.in
dans le paquetage tarball.
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.