Automake - bagaimana cara menjaga pohon sumber bersih?

10

Saya punya proyek yang menggunakan autotool GNU untuk membangunnya sendiri. Saya mencoba untuk memodifikasi sehingga autotools menghasilkan semua file kontrol yang tidak berversi dalam direktori terpisah sehingga saya dapat menjaga pohon sumber bersih dari file sementara. Adakah yang tahu bagaimana melakukan ini?

vorad
sumber
6
Lakukan saja build out-of-tree: stackoverflow.com/questions/1311231/... sayangnya masih menyisakan sedikit residu. Cobalah CMake suatu hari.
Vitor Py
3
Hari itu telah tiba, saya membutuhkan waktu kurang dari satu jam untuk beralih dari autconf yang jelek ke cmake yang tampaknya jauh lebih bersih.
vorad
1
CMake jauh lebih bersih daripada autoconf: pada kenyataannya, out of tree build adalah cara paling umum untuk melakukan build CMake. Pilihan bagus :)
Vitor Py
Bagaimana biasanya memiliki Makefile di bagian atas pohon sumber yang mengontrol proses pembuatan dengan cmake? Katakanlah make akan menjalankan mkdir -p build && cd build && cmake .. && make dan seterusnya (target yang berbeda mungkin seperti make test dll).
vorad
Luar biasa. CMake harus menghasilkan makefile, bukan sebaliknya! Cari buku berjudul Mastering CMake atau di proses pembangunan VTK atau KDE untuk contoh kata nyata. Sebuah keuntungan besar dari CMake adalah di atas make: ia juga dapat membangun perangkat lunak Anda menggunakan Visual Studio vcproj, nmake Makefiles, XCode dll. KDE menggunakan skrip shell ('kdebuild') untuk memulai proses membangun - mungkin Anda ingin mengambil lihat itu.
Vitor Py

Jawaban:

2

Paket autotools memiliki banyak jalur relatif berkode keras dan nama di dalamnya untuk alasan yang baik. Pilihan terbaik Anda adalah meringkas output dan menandainya sebagai diabaikan di kontrol revisi Anda, misalnya di .cvsignore, .hgignoreatau sebagai svn:ignoreattibute. Beberapa RCS bahkan memungkinkan Anda menentukan wildcard secara rekursif.

aquaherd
sumber
4
Tidak ada alasan yang baik untuk memiliki jalur relatif berkode keras ini selain ini adalah gaya pemrograman unix tahun 1970-an.
Lothar
2

Solusi: buat bangunan di luar sumber

  • Seperti yang disarankan dalam komentar, Anda dapat melakukan pembuatan di luar sumber.
  • Prinsipnya adalah: buat direktori lain, "build tree", jalankan skrip configure dari direktori itu (dengan jalur relatif atau absolut).

Contoh dengan cek otomatis

Sebagai contoh, ini akan mengambil dan membangun GNU halo dan memeriksa bahwa pohon sumber tidak diubah sedikit pun.

Persiapan pohon sumber

Bagian ini mengambil dan menyiapkan direktori.

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

Bagian umum: gunakan kembali itu dalam proyek Anda

Bagian ini dapat digunakan dengan proyek berbasis autoconf lainnya. Cukup masukkan ke dalam proyek Anda sebelum menjalankan. Hati-hati: ini berjalan rm, jika bermain dengan varian hati-hati, Anda bertanggung jawab dalam hal apa pun.

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
)

Periksa bagian

Ini memeriksa apakah build benar-benar di luar sumber.

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

Ini dia output ini:

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

Bonus: instalasi non-root

Bagian di --prefix="${MYPREFIX?}"atas adalah opsional. Hal ini memungkinkan untuk melakukan "make install" yang bersifat lokal ke akun Anda. Jika Anda ingin "sudo make install" tradisional ke lokasi seluruh sistem, Anda dapat menghapus --prefix="${MYPREFIX?}".

Stéphane Gourichon
sumber