O que são Makefile.am e Makefile.in?

335

Esses dois arquivos são vistos principalmente em projetos de código aberto.

Para que servem e como funcionam?

mascarar
fonte

Respostas:

381

Makefile.amé um arquivo definido pelo programador e é usado automakepara gerar o Makefile.inarquivo (o que .amsignifica um uto m ake). O configurescript normalmente visto em tarballs de origem usará o Makefile.inpara gerar a Makefile.

O configurescript em si é gerado a partir de um arquivo definido pelo programador chamado configure.acou configure.in(obsoleto). Eu prefiro .ac(para um uto c onf), pois o diferencia dos Makefile.inarquivos gerados e, dessa forma, posso ter regras como a make dist-cleanque é executada rm -f *.in. Como é um arquivo gerado, normalmente não é armazenado em um sistema de revisão como Git, SVN, Mercurial ou CVS, mas o .acarquivo seria.

Leia mais sobre o GNU Autotools . Leia sobre makee Makefileem primeiro lugar, em seguida, aprender sobre automake, autoconf, libtool, etc.

Sean AO Harney
fonte
3
O que .insignifica?
Utku
10
A .inextensão significa que é uma entrada para configuremassagear, não um arquivo final que deve ser usado (por exemplo, com make). Se você está curioso para saber por que isso parece "ridiculamente" complicado, tente ler: stackoverflow.com/a/26832773/939557 Atualmente, com o GitHub, etc., tornando-se um canal de distribuição comum, algumas das suposições do autoconf estão quebrando: as pessoas estão obtendo a fonte diretamente da ferramenta de controle do código-fonte, em vez de usar um tarball de distribuição de origem criado pelos mantenedores.
Cientista louco
53

Exemplo simples

Adaptado descaradamente de: http://www.gnu.org/software/automake/manual/html_node/Creating-amhello.html e testado no 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

Isso gera:

Hello world from automake_hello_world 1.0

Notas

  • autoreconf --installgera vários arquivos de modelo que devem ser rastreados pelo Git, inclusive Makefile.in. Ele só precisa ser executado na primeira vez.

  • make install instala:

    • o binário para /usr/local/bin
    • README.md para /usr/local/share/doc/automake_hello_world

No GitHub, você pode experimentar.

Ciro Santilli adicionou uma nova foto
fonte
11
Por que manter arquivos gerados no VCS (isso pode não ser apenas o Git BTW)?
Victor Yarema
@VictorYarema Esqueci por que cheguei a essa conclusão! Deixe-me saber se você descobrir.
Ciro Santilli escreveu
19

O DEVELOPER é executado autoconfe automake:

1) autoconf - cria um script de configuração expedível
(que o instalador executará posteriormente para criar o Makefile )

2) automake - cria o arquivo de dados Makefile.in que pode ser entregue
(o qual configura posteriormente será lido para criar o Makefile )


Installer é executado configure, makee 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 / SAÍDA

A notação abaixo é mais ou menos: entradas -> programas -> saídas

DEVELOPER executa estes:

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)

O INSTALLER executa estes:

Makefile.in -> Configurar -> Makefile (. * Em = no arquivo de put)

Makefile -> make ----------> (coloca um novo software em seus downloads ou diretório temporário)
Makefile -> make install -> (coloca um novo software nos diretórios do sistema)


" autoconf é um pacote extensível de macros M4 que produzem scripts shell para configurar automaticamente pacotes de código-fonte de software. Esses scripts podem adaptar os pacotes a vários tipos de sistemas UNIX sem intervenção manual do usuário. O Autoconf cria um script de configuração para um pacote a partir de um arquivo de modelo que lista os recursos do sistema operacional que o pacote pode usar, na forma de chamadas de macro M4. "

" automake é uma ferramenta para gerar automaticamente arquivos Makefile.in em conformidade com os Padrões de Codificação GNU. Automake requer o uso do Autoconf."

Manuais:

Tutoriais online gratuitos:


Exemplo:

O principal configure.ac usado para compilar o LibreOffice tem mais de 12k linhas de código (mas também existem 57 outros arquivos configure.ac em subpastas.)

A partir disso, o meu configure gerado tem mais de 41k linhas de código.

E enquanto o Makefile.in e o Makefile são apenas 493 linhas de código. (Mas também existem 768 outros Makefile.in em subpastas.)

Vista elíptica
fonte
16

referência :

Makefile.am - um arquivo de entrada do usuário para automatizar

configure.in - um arquivo de entrada do usuário para autoconf


O autoconf gera o configure a partir do configure.in

automake gera o Makefile.in de Makefile.am

configure gera Makefile a partir de Makefile.in

Por exemplo:

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

fonte
Então Makefile.in deve estar no arquivo tar.gz quando você faz dist, certo?
Kemin Zhou