|
| ||||||||
Como escrever um Makefile.amEste documento foi deliberadamente traduzido do Capítulo 9 do manual do automake-1.7.2 e uma cópia do original pode ser encontrada em http://www.gnu.org/manual/automake-1.7.2. Esta tradução está submetida aos mesmos direitos de licença GPL do manual original; uma cópia da licença pode ser encontrada em http://www.gnu.org/licenses/gpl.html. 9.1 Construindo um programaPara construir um programa você precisa dizer ao Automake
quais fontes o constituem e quais bibliotecas devem ser ligadas
à ele. Esta seção também cobre a compilação condicional de fontes do programa. A maioria dos comentários sobre esse assunto também se aplica às bibliotecas (veja seção 9.2 Construindo uma Biblioteca) e bibliotecas construídas através do Libtool (veja seção 9.3 Construindo uma Biblioteca Compartilhada). 9.1.1 Definindo fontes do programaEm um diretório contendo fontes constituem um programa
(diferentemente de uma biblioteca ou de um script), a primitiva
'PROGRAMS' é usada.
Os programas podem ser instalados em bindir,
sbindir, libexecdir, pkglibdir,
ou não devem ser instalados (noinst).
Eles também
podem ser compilados apenas em verificações
(make check), sendo necessário usar nesse
caso o prefixo check. Por exemplo: bin_PROGRAMS = hello Neste caso, o arquivo 'Makefile.in´
resultante irá conter código para gerar um programa
chamado hello. Associado a cada programa existem diversas variáveis
auxiliares declaradas após a declaração do nome do
programa. Todas essas variáveis são opcionais, e possuem
valores padrão razoáveis. Cada variável, seu uso,
e seu valor padrão estão descritos abaixo; usaremos o
exemplo "hello" nos
exemplos que se seguem. A variável hello_SOURCES é usada para especificar quais arquivos fontes constituem o executável final: hello_SOURCES = hello.c
version.c getopt.c getopt1.c getopt.h system.h Isto faz com que cada arquivo `.c' listado seja compilado com a extensão `.o' correspondente. Todos eles são ligados para produzir o executável `hello'. Se `hello_SOURCES' não for especificado, então é assumido `hello.c'; isto é, o padrão é compilar um único arquivo C cujo nome base é o nome do programa propriamente dito. (Este é um péssimo valor padrão, mas precisa ser mantido por razões históricas.) Múltiplos programas podem ser compilados em um único diretório. Múltiplos programas podem compartilhar o mesmo arquivo fonte, que deve ser listado em cada definição `_SOURCES'. Arquivos de cabeçalho listados em uma definição `_SOURCES' serão incluídos na distribuição mas ignorados para todos os efeitos. Caso isso não seja óbvio para o seu programa, você não deve incluir o cabeçalho gerado pelo `configure' em uma declaração `_SOURCES'; este arquivo não deve fazer parte da distribuição. Arquivos Lex (`.l') e Yacc (`.y') também podem ser listados. 9.1.2 Ligando o programaSe você necessitar ligar à bibliotecas que
não são encontradas pelo `configure', você pode
usar a declaração LDADD.
Essa variável é usada especificar objetos ou
bibliotecas adicionais para fazer parte da ligação;
não é apropriado para se declarar parâmetros
específicos ao linker: deve-se usar AM_LDFLAGS para esta finalidade. Às vezes, múltiplos programas são
construídos em um mesmo diretório mas não
compartilham os mesmos requisitos de tempo de ligação.
Neste caso, você pode usar a variável `prog_LDADD'
(onde o
prog é o nome do
programa da mesma forma que em declarações `_PROGRAMS', e geralmente
são escritos em minúsculas) para sobrescrever a
variável global LDADD.
Se essa variável existe para um determinado programa,
então ele não será ligado usando o LDADD global. Por exemplo, no GNU cpio, pax, cpio e mt são ligados à biblioteca `libcpio.a'. Entretanto, rmt é construído no mesmo diretório, e não necessita de tal ligação. Ainda, mt e o rmtsrc/Makefile.am' é alguma coisa como: bin_PROGRAMS = cpio pax @MT@ `prog_LDADD' é
inapropriado para enviar parâmetros específicos ao linker
(exceto `-l', `-L', `-dlopen' e `-dlpreopen'). Então, use
a variável `prog_LDFLAGS' para esta
finalidade. Ocasionalmente é também útil garantir que uma determinada construção depende de outra. Isto pode ser feito usando a variável `prog_DEPENDENCIES'. Cada programa depende dos conteúdo dessa variável, mas nenhuma interpretação adicional é feita. Se o `prog_DEPENDENCIES'
não for declarado, ele é atribuído pelo Automake.
O valor atribuído automaticamente será o
conteúdo de `prog_LDADD',
com a maioria das configurações provindas de
substituições do configure, com as opções `-l',
`-L', `-dlopen' e `-dlpreopen' removidas. As
únicas substituições do configure mantidas
são
`@LIBOBJS@' e 9.1.3 Compilação condicionalVocê não pode pôr uma substituição
do configure (p.e., `@FOO@')
em uma definição `_SOURCES'.
A razão
para isso é um pouco complexa para se explicar, mas bastar dizer
que
simplesmente não funciona. O Automake irá gerar um erro
se
você tentar fazer isso. Felizmente há outras duas maneiras conseguir o mesmo
resultado.
Um é usar substituições do configure nas
declarações `_LDADD'
e a outra é usar uma condicional do Automake. 9.1.3.1 Compilação condicional usando substituições em _LDADDAutomake deve saber de todos os arquivos fonte que poderiam se
tornar parte de um programa, mesmo que alguns sejam opcionais para
compilações específicas. Todos os arquivos
compilados de forma opcional devem ser listados na
declaração `EXTRA_'
apropriada. Por exemplo, se `hello-linux.c'
ou `hello-generic.c'
fossem condicionalmente incluídos em hello, o `Makefile.am' conteria: bin_PROGRAMS = hello Você pode então criar a substituição de @HELLO_SYSTEM@ no `configure.in' da seguinte
maneira: ... Neste caso, HELLO_SYSTEM
deve ser substituído por `hello-linux.o'
ou por `hello-bsd.o', e
adicionado a hello_DEPENDENCIES
e a hello_LDADD a fim ser
compilado e ligado. 9.1.3.2 Compilação condicional usando condicionais
Automake
| ||||||||