Automake: come mantenere pulito l'albero di origine?


10

Ho un progetto che usa gli autotools GNU per costruirsi. Sto cercando di modificare in modo che gli autotools generino tutti i file di controllo senza versione in una directory separata in modo da poter mantenere l'albero dei sorgenti pulito dai file temporanei. Qualcuno ha qualche idea su come farlo?


6
Basta fare una build fuori dall'albero: stackoverflow.com/questions/1311231/… purtroppo lascia ancora dei residui. Prova CMake un giorno.
Vitor Py,

3
Quel giorno è arrivato, mi ci è voluta meno di un'ora per passare da quel brutto autconf a cmake che sembra molto più pulito.
Vorad,

1
CMake è molto più pulito di autoconf: in effetti, una build out of tree è il modo più comune di fare una build CMake. Buona scelta :)
Vitor Py l'

Com'è normale avere un Makefile nella parte superiore dell'albero dei sorgenti che controlla il processo di compilazione con cmake? Supponiamo che make eseguirà mkdir -p build && cd build && cmake .. && make e così via (obiettivi diversi come il test, ecc.).
Vorad,

Raro. CMake dovrebbe generare makefile, non viceversa! Cerca un libro chiamato Mastering CMake o sui processi di costruzione di VTK o KDE per esempi di parole reali. Un grande vantaggio di CMake è in cima a make: può anche creare il tuo software usando Visual Studio vcproj, nmake Makefiles, XCode ecc. KDE usa uno script di shell ('kdebuild') per avviare i processi di compilazione - forse vuoi prendere uno sguardo a questo.
Vitor Py,

Risposte:


2

Il pacchetto autotools ha molti percorsi e nomi relativi codificati per una buona ragione. La soluzione migliore è quella di riassumere l'output e contrassegnarle come ignorati nel controllo di revisione, ad esempio in .cvsignore, .hgignoreo come svn:ignoreattibute. Alcuni RCS consentono persino di specificare i caratteri jolly in modo ricorsivo.


4
Non c'è una sola buona ragione per avere questi percorsi relativi codificati in modo difficile, a parte questo è lo stile di programmazione unix degli anni Settanta.
Lothar,

2

Soluzione: crea una build out-of-source

  • Come suggerito nei commenti, è possibile eseguire una build non di origine.
  • Il principio è: creare un'altra directory, un "albero di costruzione", eseguire lo script di configurazione da quella directory (con percorso relativo o assoluto).

Esempio con controllo automatico

Ad esempio, questo prenderà e genererà ciao GNU e verificherà che l'albero dei sorgenti non sia cambiato un po '.

Preparazione dell'albero della fonte

Questa parte recupera e prepara le directory.

{
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 generica: riutilizzala nel tuo progetto

Questa parte può essere utilizzata con altri progetti basati su autoconf. Inserisci il cd nel tuo progetto prima di eseguirlo. Attenzione: questo funziona rm, se si gioca con le varianti fare attenzione, si è responsabili in ogni 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
)

Controlla la parte

Questo controlla se build è perfettamente out-of-source.

{
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."
}

Qui emette questo:

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

Bonus: installazione non root

La --prefix="${MYPREFIX?}"parte sopra è facoltativa. Permette di fare un "make install" che è locale al tuo account. Se si desidera "sudo make install" tradizionale in una posizione a livello di sistema, è possibile rimuoverlo --prefix="${MYPREFIX?}".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.