Automake - como manter a árvore de origem limpa?

10

Eu tenho um projeto que usa as ferramentas automáticas do GNU para se construir. Estou tentando modificar para que as ferramentas automáticas gerem todos os arquivos de controle sem versão em um diretório separado, para que eu possa manter a árvore de origem limpa dos arquivos temporários. Alguém tem alguma idéia de como fazer isso?

vorad
fonte
6
Basta fazer uma compilação fora da árvore: stackoverflow.com/questions/1311231/… ainda resta algum resíduo, infelizmente. Experimente o CMake algum dia.
Vitor Py
3
Esse dia chegou, levei menos de uma hora para mudar daquele feio autconf para o cmake, que parece muito mais limpo.
vorad 01/07/11
11
O CMake é muito mais limpo que o autoconf: na verdade, uma compilação fora da árvore é a maneira mais comum de fazer uma compilação do CMake. Boa escolha :)
Vitor Py
Como é comum ter um Makefile na parte superior da árvore de origem que controla o processo de compilação com o cmake? Digamos que o make execute o mkdir -p build && cd build && cmake .. && make e assim por diante (diferentes alvos, talvez como make test etc.).
vorad 01/07/11
Incomum. O CMake deve gerar makefiles, e não o contrário! Procure um livro chamado Mastering CMake ou nos processos de criação do VTK ou KDE para exemplos reais de palavras. Uma grande vantagem do CMake está no topo da marca: ele também pode criar seu software usando o Visual Studio vcproj, nmake Makefiles, XCode etc. O KDE usa um shell script ('kdebuild') para iniciar os processos de compilação - talvez você queira uma olhada nisso.
Vitor Py

Respostas:

2

O pacote autotools possui muitos caminhos e nomes relativos codificados por um bom motivo. Sua melhor opção é resumir a saída e identificá-la como ignorada em seu controle de revisão, por exemplo .cvsignore, em .hgignoreou como svn:ignoreatributo. Alguns RCS permitem especificar recursivamente curingas.

aquaherd
fonte
4
Não há uma única boa razão para ter esses caminhos relativos codificados, exceto o estilo de programação unix da década de 1970.
Lothar
2

Solução: faça uma compilação fora da fonte

  • Conforme sugerido nos comentários, você pode fazer uma compilação fora da fonte.
  • O princípio é: crie outro diretório, uma "árvore de construção", execute o script configure a partir desse diretório (com caminho relativo ou absoluto).

Exemplo com verificação automatizada

Por exemplo, isso buscará e criará o hello GNU e verificará se a árvore de origem não foi alterada nem um pouquinho.

Preparação da árvore de origem

Esta parte busca e prepara os diretórios.

{
wget -S http://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz
tar zxvf hello-2.10.tar.gz
mv hello-2.10 hello-2.10-pristine
tar zxvf hello-2.10.tar.gz
diff -urq hello-2.10 hello-2.10-pristine && echo "Before build, directories are identical."
cd hello-2.10
}

Parte genérica: reutilize isso no seu projeto

Esta parte pode ser usada com outros projetos baseados em autoconf. Basta entrar no seu projeto antes de executar. Cuidado: isso funciona rm, se jogar com variantes tenha cuidado, você é responsável em qualquer caso.

export MYPREFIX="${PWD}.installtree"
(
set -eu # abort on error
ls configure # make sure it aborts if not in correct directory
export SRCTREE="${PWD}"
export BUILDTREE="${PWD}.buildtree"
rm -rf "$BUILDTREE" "$MYPREFIX"
mkdir "$BUILDTREE" "$MYPREFIX"
cd "$BUILDTREE"
"${SRCTREE}"/configure --prefix="${MYPREFIX?}"
time make -k || time make
time make install
)

Verificar parte

Isso verifica se a compilação está perfeitamente fora da fonte.

{
ls "$MYPREFIX"/bin/hello && echo "Okay, build generated the target."
cd "$MYPREFIX"/..
diff -urq hello-2.10 hello-2.10-pristine && echo "No change at all. Perfect out-of-source build success."
}

Aqui ele mostra isso:

/tmp/hello-2.10.installtree/bin/hello
Okay, build generated the target.
No change at all. Perfect out-of-source build success.

Bônus: instalação não raiz

A --prefix="${MYPREFIX?}"parte acima é opcional. Ele permite fazer um "make install" local à sua conta. Se você quiser o "sudo make install" tradicional em todo o sistema, poderá removê-lo --prefix="${MYPREFIX?}".

Stéphane Gourichon
fonte