Tự động - làm thế nào để giữ cho cây nguồn sạch?


10

Tôi có một dự án sử dụng autotools GNU để tự xây dựng. Tôi đang cố gắng sửa đổi để autotools tạo ra tất cả các tệp điều khiển không được phiên bản trong một thư mục riêng để tôi có thể giữ cho cây nguồn sạch các tệp tạm thời. Bất cứ ai có bất kỳ ý tưởng làm thế nào để làm điều này?


6
Chỉ cần thực hiện một bản dựng ngoài cây: stackoverflow.com/questions/1311231/, nó vẫn để lại một số dư lượng, thật không may. Hãy thử CMake một ngày nào đó.
Vitor Py

3
Ngày đó đã đến, tôi chỉ mất chưa đầy một giờ để chuyển từ tự động xấu xí đó sang cmake mà dường như sạch sẽ hơn rất nhiều.
vorad

1
CMake sạch hơn autoconf: trên thực tế, xây dựng ngoài cây là cách phổ biến nhất để thực hiện xây dựng CMake. Lựa chọn tốt :)
Vitor Py

Làm thế nào thông thường để có một Makefile ở đầu cây nguồn điều khiển quá trình xây dựng với cmake? Say make sẽ chạy mkdir -p build && cd build && cmake .. && make v.v (các mục tiêu khác nhau có thể giống như thực hiện thử nghiệm, v.v.).
vorad

Không phổ biến. CMake nên tạo tệp tạo tệp, không phải cách khác! Hãy tìm một cuốn sách có tên Mastering CMake hoặc tại các quy trình xây dựng VTK hoặc KDE để biết các ví dụ từ thực. Một lợi thế lớn của CMake là đứng đầu về sản phẩm: nó cũng có thể xây dựng phần mềm của bạn bằng Visual Studio vcproj, nmake Makefiles, XCode, v.v. KDE sử dụng tập lệnh shell ('kdebuild') để bắt đầu quá trình xây dựng - có thể bạn muốn thực hiện nhìn vào nó
Vitor Py

Câu trả lời:


2

Gói autotools có rất nhiều đường dẫn và tên tương đối được mã hóa cứng trong đó vì một lý do chính đáng. Lựa chọn tốt nhất của bạn là để tổng hợp tình hình đầu ra và tag chúng như bỏ qua trong kiểm soát sửa đổi của bạn, ví dụ như trong .cvsignore, .hgignorehoặc như svn:ignoreattibute. Một số RCS cho phép bạn thậm chí chỉ định đệ quy các ký tự đại diện.


4
Không có một lý do chính đáng nào để có các đường dẫn tương đối được mã hóa cứng này, đây là phong cách lập trình unix của những năm 1970.
Lothar

2

Giải pháp: thực hiện xây dựng ngoài nguồn

  • Theo đề xuất trong các bình luận, bạn có thể thực hiện xây dựng ngoài nguồn.
  • Nguyên tắc là: tạo một thư mục khác, "cây xây dựng", chạy tập lệnh cấu hình từ thư mục đó (với đường dẫn tương đối hoặc tuyệt đối).

Ví dụ với kiểm tra tự động

Ví dụ, điều này sẽ tìm nạp và xây dựng GNU hello và kiểm tra xem cây nguồn không bị thay đổi một chút nào.

Chuẩn bị cây nguồn

Phần này tìm nạp và chuẩn bị các thư mục.

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

Phần chung: tái sử dụng trong dự án của bạn

Phần này có thể được sử dụng với các dự án dựa trên autoconf khác. Chỉ cần cd vào dự án của bạn trước khi chạy. Cẩn thận: điều này chạy rm, nếu chơi với các biến thể hãy cẩn thận, bạn có trách nhiệm trong mọi trường hợp.

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
)

Kiểm tra một phần

Điều này kiểm tra nếu bản dựng hoàn toàn không có nguồn.

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

Ở đây nó xuất ra điều này:

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

Phần thưởng: cài đặt không root

Phần --prefix="${MYPREFIX?}"trên là tùy chọn. Nó cho phép thực hiện "thực hiện cài đặt" cục bộ cho tài khoản của bạn. Nếu bạn muốn "sudo make install" truyền thống đến vị trí toàn hệ thống, bạn có thể xóa --prefix="${MYPREFIX?}".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.