Automake - jak utrzymać drzewo źródłowe w czystości?


10

Mam projekt, który używa autotoolów GNU do budowania samego siebie. Usiłuję zmodyfikować, aby autotools generował wszystkie niesterowane pliki kontrolne w osobnym katalogu, aby utrzymać drzewo źródłowe w czystości plików tymczasowych. Czy ktoś ma jakieś pomysły, jak to zrobić?


6
Po prostu zrób kompilację z drzewa: stackoverflow.com/questions/1311231/... , niestety, nadal pozostawia trochę pozostałości. Daj CM Wypróbuj pewnego dnia.
Vitor Py

3
Ten dzień nadszedł, zajęło mi niecałą godzinę przejście z tego brzydkiego autconf na cmake, który wydaje się znacznie czystszy.
vorad

1
CMake jest znacznie czystszy niż autoconf: w rzeczywistości kompilacja bez drzewa jest najczęstszym sposobem wykonywania kompilacji CMake. Dobry wybór :)
Vitor Py

Jak zwykle jest mieć plik Makefile na górze drzewa źródłowego, który kontroluje proces kompilacji za pomocą cmake? Powiedzmy, że make uruchomi mkdir -p build && cd build && cmake .. && make i tak dalej (różne cele mogą na przykład zrobić test itp.).
vorad

Rzadki. CMake powinien generować pliki makefile, a nie na odwrót! Znajdź książkę o nazwie Mastering CMake lub w procesach budowania VTK lub KDE, aby znaleźć przykłady prawdziwych słów. Wielką zaletą CMake jest to, że jest nad marką: może również budować oprogramowanie przy użyciu Visual Studio vcproj, nmake Makefiles, XCode itp. KDE używa skryptu powłoki („kdebuild”) do uruchamiania procesów kompilacji - być może chcesz wziąć spojrzenie na to.
Vitor Py

Odpowiedzi:


2

Nie bez powodu pakiet autotools zawiera wiele zakodowanych ścieżek względnych i nazw. Najlepszym rozwiązaniem jest, aby podsumować wyjście i oznaczyć je jako ignorowane w kontroli wersji, np .cvsignore, .hgignorelub jako svn:ignoreattibute. Niektóre RCS pozwalają nawet rekurencyjnie określać symbole wieloznaczne.


4
Nie ma jednego dobrego powodu, aby mieć te zakodowane ścieżki względne inne niż jest to styl programowania z lat 70. XX wieku.
Lothar

2

Rozwiązanie: wykonaj kompilację spoza źródła

  • Jak sugerowano w komentarzach, możesz wykonać kompilację spoza źródła.
  • Zasada jest taka: utwórz inny katalog, „drzewo kompilacji”, uruchom skrypt konfiguracyjny z tego katalogu (ze ścieżką względną lub bezwzględną).

Przykład z automatycznym sprawdzaniem

Na przykład, to pobierze i zbuduje GNU hello i sprawdzi, czy drzewo źródłowe nie zostało nieznacznie zmienione.

Przygotowanie drzewa źródłowego

Ta część pobiera i przygotowuje katalogi.

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

Część ogólna: użyj tego ponownie w swoim projekcie

Ta część może być używana z innymi projektami opartymi na autoconf. Po prostu włóż płytę CD do swojego projektu przed uruchomieniem. Uwaga: to działa rm, jeśli grasz wariantami, bądź ostrożny, w każdym przypadku jesteś odpowiedzialny.

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
)

Sprawdź część

To sprawdza, czy kompilacja jest całkowicie poza źródłem.

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

Tutaj wyprowadza to:

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

Bonus: instalacja użytkownika innego niż root

--prefix="${MYPREFIX?}"Powyżej część jest opcjonalna. Pozwala wykonać „make install” lokalnie dla twojego konta. Jeśli chcesz tradycyjne „sudo make install” w lokalizacji systemowej, możesz je usunąć --prefix="${MYPREFIX?}".

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.