Automake - wie hält man den Quellbaum sauber?

10

Ich habe ein Projekt, das GNU-Autotools verwendet, um sich selbst zu erstellen. Ich versuche zu ändern, dass Autotools alle nicht versionierten Steuerdateien in einem separaten Verzeichnis generiert, damit ich den Quellbaum frei von temporären Dateien halten kann. Hat jemand eine Idee, wie man das macht?

vorad
quelle
6
Führen Sie einfach einen Out-of-Tree-Build durch: stackoverflow.com/questions/1311231/… es bleiben leider noch einige Rückstände zurück. Probieren Sie CMake eines Tages aus.
Vitor Py
3
Dieser Tag ist gekommen, ich habe weniger als eine Stunde gebraucht, um von diesem hässlichen Autconf zu cmake zu wechseln, das viel sauberer zu sein scheint.
vorad
1
CMake ist viel sauberer als Autoconf: Tatsächlich ist ein Out-of-Tree-Build die häufigste Methode, um einen CMake-Build durchzuführen. Gute Wahl :)
Vitor Py
Wie üblich ist es, oben im Quellbaum ein Makefile zu haben, das den Erstellungsprozess mit cmake steuert? Sagen Sie make laufen mkdir -p build && cd build && cmake .. && make und so weiter (verschiedene Ziele vielleicht wie Make - Test etc.).
vorad
Ungewöhnlich. CMake sollte Makefiles generieren, nicht umgekehrt! Suchen Sie nach einem Buch mit dem Titel Mastering CMake oder nach VTK- oder KDE-Erstellungsprozessen, um Beispiele für echte Wörter zu erhalten. Ein großer Vorteil von CMake ist, dass es über make liegt: Es kann Ihre Software auch mit Visual Studio vcproj, nmake Makefiles, XCode usw. erstellen. KDE verwendet ein Shell-Skript ('kdebuild'), um die Build-Prozesse zu starten - vielleicht möchten Sie es nehmen ein Blick darauf.
Vitor Py

Antworten:

2

Das Autotools-Paket enthält aus gutem Grund viele fest codierte relative Pfade und Namen. Ihre beste Möglichkeit ist die Ausgabe zusammenzufassen und sie zu markieren , wie in Ihrer Revisionskontrolle ignoriert, zB in .cvsignore, .hgignoreoder als svn:ignoreattibute. In einigen RCS können Sie sogar rekursiv Platzhalter angeben.

Aquaherd
quelle
4
Es gibt keinen guten Grund, diese fest codierten relativen Pfade zu haben, außer dem Unix-Programmierstil der 1970er Jahre.
Lothar
2

Lösung: Erstellen Sie einen Out-of-Source-Build

  • Wie in den Kommentaren vorgeschlagen, können Sie einen Out-of-Source-Build durchführen.
  • Das Prinzip lautet: Erstellen Sie ein anderes Verzeichnis, einen "Build-Baum", und führen Sie das Konfigurationsskript in diesem Verzeichnis aus (mit relativem oder absolutem Pfad).

Beispiel mit automatisierter Prüfung

Dadurch wird beispielsweise GNU Hallo abgerufen und erstellt und überprüft, ob der Quellbaum nicht geringfügig geändert wurde.

Vorbereitung des Quellbaums

Dieser Teil ruft die Verzeichnisse ab und bereitet sie vor.

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

Allgemeiner Teil: Verwenden Sie diesen in Ihrem Projekt wieder

Dieser Teil kann mit anderen autoconf-basierten Projekten verwendet werden. CD einfach in Ihr Projekt, bevor Sie es ausführen. Achtung: Dies läuft rm, wenn Sie vorsichtig mit Varianten spielen, sind Sie auf jeden Fall verantwortlich.

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
)

Teil prüfen

Dadurch wird überprüft, ob der Build vollständig außerhalb der Quelle liegt.

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

Hier gibt es Folgendes aus:

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

Bonus: Nicht-Root-Installation

Der --prefix="${MYPREFIX?}"obige Teil ist optional. Es ermöglicht eine "make install", die lokal für Ihr Konto ist. Wenn Sie eine herkömmliche "sudo make install" an einem systemweiten Speicherort wünschen, können Sie diese entfernen --prefix="${MYPREFIX?}".

Stéphane Gourichon
quelle