Pergunta

Copiei libtool em árvore de código do meu programa para distribuí-lo com o programa. Mas quando eu executar 'make distclean' libtool é eliminado com o resto do resto dos arquivos gerados. Como faço para impedir que isso aconteça?

Eu tentei colocar EXTRA_DIST = libtool em Makefile.am, mas que não funciona.

Aqui é basicamente o que meus configure.ac parece.

AC_PREREQ(2.53)
AC_INIT( [program], [0.16], [program] )
AC_CONFIG_SRCDIR([src/c/program.c])
AC_CONFIG_HEADER([config.h])
AC_CONFIG_AUX_DIR(build-aux)
AM_INIT_AUTOMAKE( [-Wall -Werror foreign] )

m4_include(ax_pkg_swig.m4)

# Checks for programs.
AC_PROG_CC
AC_PROG_LIBTOOL
AC_ENABLE_SHARED
AC_PROG_SWIG

# Checks for libraries.

# Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS([stdlib.h string.h unistd.h])

# Checks for typedefs, structures, and compiler characteristics.
AC_TYPE_SIZE_T

# Checks for library functions.
AC_REPLACE_FNMATCH
AC_FUNC_MALLOC
AC_FUNC_STAT
AC_CHECK_FUNCS([regcomp strdup strtoull])

AC_CONFIG_FILES([
    Makefile
    src/c/Makefile
    src/perl/Makefile
    src/verilog/Makefile
])
AC_OUTPUT
Foi útil?

Solução

Você não é suposto cópia libtool no diretório do seu programa com a mão. Você corre libtoolize em seu script de inicialização, que lida com isso para você. Acho que ele está fazendo mais do que apenas copiar libtool para você, como informando automake que não deve excluir o arquivo. Aqui está um script de inicialização de exemplo:

#!/bin/sh
aclocal -I config &&
    libtoolize --force --copy &&
    autoheader &&
    automake --add-missing --copy --foreign &&
    autoconf &&
    ./configure -C "$@"

Este script é tradicionalmente chamado quer bootstrap ou autogen.sh. Estes nomes não são universais, apenas quase. Apenas alguns dias atrás, me deparei com um projeto usando bootstrap.sh, por exemplo.

Em grande medida o nome do script é uma questão de moda e estilo. Não é inteiramente superficial, porque parte do estilo moderno é um movimento longe de correr configure no final do script. bootstrap é o mais recente nome, então um script nomeado que é menos provável de ser executado configure no final. Capítulo 8 do Autobook implica que este é o caso, também, mas eu 've se deparar contra-exemplos. (Isto é, projetos com um script autogen.sh que não chama configure, e projetos com um script bootstrap que fazer.)

Para mim, a questão de se incluir o passo configure no final vem para baixo a como típico casos de uso de seu projeto são. Se quase todos a necessidade de inicializar árvore de construção do seu projeto aceitará as bandeiras configure padrão definidos no script bootstrap, ou talvez adicionar uma ou duas mais simples, é bom para configure executado automaticamente. É melhor para torná-lo uma etapa manual separada se um monte de gente vai precisar fazer personalização pesado. Um exemplo é quando um monte de seus usuários são cross-compilar seu projeto. As maneiras de pedir configure para fazer isso são bem conhecidos, ao passo que alguém teria que ler o código do seu script bootstrap para descobrir como obter as opções passaram ao comando configure incorporado.

Você quase certamente tem que personalizar esse script para as necessidades do seu projeto. A coisa mais importante para deixar como está é a ordem das operações. Os Autotools são sensíveis a isso. Você pode ter que mudar as bandeiras dadas as ordens; o -I config no comando aclocal não é universal, por exemplo. Você é ainda mais propensos a necessidade de adicionar etapas ao processo, seja em torno desses passos comuns, ou talvez mesmo intercalados com eles.

Quanto o autoreconf opção , eu ainda não se tornar um fã. Acho que a sua built-in suposições quebrar em todos os meus projetos, de alguma forma. Se o seu projecto é um projecto de estilo GNU bog-padrão, pode funcionar para você.

A propósito, a macro AC_PROG_LIBTOOL é obsoleto . Você deve estar usando LT_INIT vez.

Outras dicas

Na verdade, você não precisa chamar tudo o que aclocal e libtoolize e autoheader e ...

Apenas chamada

$ autoreconf -i

e autoreconf será executado aclocal, libtoolize (se existem macros libtool em configure.ac), automake (se configure.ac envolve automake) e autoconf. Todos os respectivos arquivos que precisam ser adicionados à sua árvore de origem serão copiados lá, entre eles ltmain.sh.2

Eu costumo acrescentar alguma verbosidade (-v) e, em vez de apenas copiar os arquivos, eu ligar simbolicamente eles, resultando em meu chamado padrão de

$ autoreconf -vis

O arquivo "libtool" gerado por uma corrida "configure" é específico para o sistema do configure corrida aconteceu em e assim vai, naturalmente, ser limpo novamente por "fazer distclean".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top