¿Qué son Makefile.am y Makefile.in?
autotools automake (4)
Makefile.am - un archivo de entrada de usuario para hacer automake
configure.in - un archivo de entrada de usuario para autoconf
autoconf genera configure desde configure.in
automake gererates Makefile.in de Makefile.am
configure genera Makefile desde Makefile.in
Por ejemplo:
$]
configure.in Makefile.in
$] sudo autoconf
configure configure.in Makefile.in ...
$] sudo ./configure
Makefile Makefile.in
Estos dos archivos se ven principalmente en proyectos de código abierto.
¿Para qué sirven y cómo funcionan?
Makefile.am
es un archivo definido por el programador y es utilizado por automake
para generar el archivo Makefile.in
(la .am
significa un uto m ake). La secuencia de comandos de configure
normalmente se ve en los archivos fuente usa el Makefile.in
para generar un Makefile
.
El script de configure
sí mismo se genera a partir de un archivo definido por el programador denominado configure.ac
o configure.in
(en desuso). Prefiero .ac
(para un uto c onf) ya que lo diferencia de los archivos Makefile.in
generados y de esa manera puedo tener reglas como make dist-clean
que ejecuta rm -f *.in
. Dado que es un archivo generado, normalmente no se almacena en un sistema de revisión como Git, SVN, Mercurial o CVS, en lugar del archivo .ac
.
Lea más sobre GNU Autotools . Lea primero sobre make
y Makefile
, luego aprenda sobre automake
, autoconf
, libtool
, etc.
DESARROLLADOR ejecuta estos:
1) autoconf : crea un script de configuración que se puede enviar (que el instalador ejecutará para hacer el Makefile )
2) automake - crea Makefile.in que se puede enviar (que la configuración se leerá más adelante para hacer el Makefile )
INSTALADOR ejecuta estos:
1) ./ configure - crea el Makefile (desde Makefile.in ).
2) make : crea la aplicación (desde el Makefile que se acaba de crear).
3) sudo make install - instala la aplicación - Por defecto, los archivos se instalan (a menudo) en / usr / local.
ENTRADAS -> PROGRAMAS -> SALIDAS:
DESARROLLADOR ejecuta estos:
configure.in -> autoconf -> configure (script) <---- ¡Nota! configure.in se deprecia.
configure.ac -> autoconf -> configure (script) <---- Ahora use configure.ac / (*. ac = a uto c onf)
Makefile.am -> automake -> Makefile.in / (*. Am = a uto m ake)
INSTALADOR ejecuta estos:
Makefile.in -> configure -> Makefile (*. In = in put file)
Makefile -> make -> (el nuevo software en sus descargas o directorio temporal)
Makefile -> make install -> (coloca el nuevo software en el directorio del sistema)
" Autoconf es un paquete extensible de macros M4 que produce scripts de shell para configurar automáticamente los paquetes de código fuente del software. Estos scripts pueden adaptar los paquetes a muchos tipos de sistemas similares a UNIX sin la intervención manual del usuario. Autoconf crea un script de configuración para un paquete desde un archivo de plantilla que enumera las características del sistema operativo que el paquete puede usar, en forma de llamadas de macro M4 ".
" Automake es una herramienta para generar automáticamente archivos Makefile.in que cumplen con los estándares de codificación GNU. Automake requiere el uso de Autoconf".
Manuales:
Datos interesantes:
El principal configure.ac que se usa para crear LibreOffice tiene más de 12k líneas de código (pero también hay otros 57 archivos configure.ac en subcarpetas).
De esto mi configuración generada es más de 41k líneas de código.
Mientras que Makefile.in y Makefile son solo 493 líneas de código. (Pero, también hay 768 más Makefile.in''s en subcarpetas).
Ejemplo simple
Adaptado descaradamente de: http://www.gnu.org/software/automake/manual/html_node/Creating-amhello.html y probado en Ubuntu 14.04 Automake 1.14.1.
Makefile.am
SUBDIRS = src
dist_doc_DATA = README.md
README.md
Some doc.
configurar.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;
}
Uso
autoreconf --install
mkdir build
cd build
../configure
make
sudo make install
autoconf_hello_world
sudo make uninstall
Esto produce:
Hello world from automake_hello_world 1.0
Notas
autoreconf --install
genera varios archivos de plantilla que deben ser rastreados por Git, incluidoMakefile.in
. Solo necesita ejecutarse la primera vez.make install
instalación:- el binario a
/usr/local/bin
-
README.md
a/usr/local/share/doc/automake_hello_world
- el binario a
En GitHub para que lo pruebes.