¿Qué son Makefile.am y Makefile.in?

335

Estos dos archivos se ven principalmente en proyectos de código abierto.

¿Para qué son y cómo funcionan?

Máscara
fuente

Respuestas:

381

Makefile.ames un archivo definido por el programador y es utilizado por automakepara generar el Makefile.inarchivo ( .amsignifica un uto m ake). El configurescript que se ve típicamente en los tarballs de origen usará el Makefile.inpara generar a Makefile.

El configurescript en sí se genera a partir de un archivo definido por el programador llamado configure.aco configure.in(en desuso). Prefiero .ac(para un uto c onf) ya que lo diferencia de los Makefile.inarchivos generados y de esa manera puedo tener reglas como las make dist-cleanque se ejecutan 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, sino que el .acarchivo sí lo estaría.

Lea más sobre GNU Autotools . Lea sobre makey Makefileen primer lugar, a continuación, aprender sobre automake, autoconf, libtool, etc.

Sean AO Harney
fuente
3
¿Qué significa .in?
Utku
10
La .inextensión significa que es una entrada para configuremasajear, no un archivo final que debería usarse (por ejemplo, con make). Si tiene curiosidad de por qué esto parece "ridículamente complicado", intente leer: stackoverflow.com/a/26832773/939557 En estos días con GitHub, etc., convirtiéndose en un canal de distribución común, algunos de los supuestos de autoconf se están desmoronando: la gente está obteniendo la fuente directamente desde la herramienta de control de código fuente, en lugar de usar un tarball de distribución de fuente creado por mantenedores.
MadScientist
53

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.

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;
}

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 --installgenera varios archivos de plantilla que Git debe rastrear, incluidos Makefile.in. Solo necesita ejecutarse la primera vez.

  • make install instala:

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

En GitHub para que lo pruebes.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
fuente
1
¿Por qué debería uno mantener los archivos generados bajo VCS (esto puede ser no solo Git BTW)?
Victor Yarema
@VictorYarema ¡Olvidé por qué llegué a esa conclusión! Avísame si lo descubres.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
19

DESARROLLADOR corre autoconfy automake:

1) autoconf : crea un script de configuración
que se puede enviar (que el instalador ejecutará más adelante para crear el Makefile )

2) automake : crea un archivo de datos Makefile.in
que se puede enviar (que configure luego se leerá para crear el Makefile )


Instalador se ejecuta configure, makey 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


MAPA DE ENTRADA / SALIDA

La notación a continuación es aproximadamente: entradas -> programas -> salidas

DESARROLLADOR ejecuta estos:

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

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

INSTALADOR ejecuta estos:

Makefile.in -> Configurar -> Makefile (. * En = en el archivo de venta)

Makefile -> make ----------> (coloca un nuevo software en sus descargas o directorio temporal)
Makefile -> make install -> (coloca un nuevo software en los directorios del sistema)


" autoconf es un paquete extensible de macros M4 que produce scripts de shell para configurar automáticamente paquetes de código fuente de software. Estos scripts pueden adaptar los paquetes a muchos tipos de sistemas similares a UNIX sin intervención manual del usuario. Autoconf crea un script de configuración para un paquete a partir de 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:

Tutoriales en línea gratuitos:


Ejemplo:

El archivo configure.ac principal utilizado para compilar LibreOffice tiene más de 12k líneas de código (pero también hay otros 57 archivos configure.ac en subcarpetas).

A partir de esto, mi configuración generada es de más de 41k líneas de código.

Y aunque Makefile.in y Makefile son solo 493 líneas de código. (Pero también hay 768 Makefile.in más en subcarpetas).

Vista elíptica
fuente
16

referencia :

Makefile.am: un archivo de entrada del usuario para automatizar

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 ej .:

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

fuente
Entonces Makefile.in debería estar en el archivo tar.gz cuando hagas dist, ¿verdad?
Kemin Zhou