Tôi có một bộ thư mục, một số trong đó chứa tệp tạo tệp và một số tệp tạo tệp có clean
mục tiêu. Trong thư mục cha, tôi có một tập lệnh đơn giản:
#!/bin/bash
for f in *; do
if [[ -d $f && -f $f/makefile ]]; then
echo "Making clean in $f..."
make -f $f/makefile clean
fi
done
Điều này thực hiện một điều kỳ lạ khi nó chạm vào một thư mục với tệp thực hiện mà không có mục tiêu "sạch" (được xác định). Ví dụ, đưa ra hai thư mục, one
và two
, có chứa;
một / làm cho
clean:
-rm *.x
hai / makefile
clean:
Trong trường hợp thứ hai, "sạch" có mặt mà không có chỉ thị, vì vậy nếu bạn chạy "làm sạch" trong two
bạn sẽ nhận được:
make: Nothing to be done for `clean'.
Nếu không có "sạch":
make: *** No rule to make target `clean'. Stop.
Tuy nhiên, đối với vấn đề tôi sắp mô tả, kết quả là như nhau cho dù mục tiêu có mặt nhưng không xác định hoặc chỉ không hiện diện. Chạy clean.sh
từ thư mục cha mẹ;
Making clean in one...
rm *.x
rm: cannot remove `*.x': No such file or directory
make: [clean] Error 1 (ignored)
Vì vậy, one
không cần làm sạch. Không có vấn đề lớn, điều này là như mong đợi. Nhưng sau đó:
Making clean in two...
cat clean.sh >clean
chmod a+x clean
Tại sao cat clean.sh>clean
vv? Lưu ý tôi đã tạo một ví dụ tối thiểu chính xác như được hiển thị ở trên - không có tệp hoặc thư mục nào khác xung quanh (chỉ là Clean.sh, thư mục một & hai, và các tệp thực hiện rất tối thiểu). Nhưng sau khi Clean.sh chạy, make
đã sao chép clean.sh > clean
và thực hiện nó. Nếu tôi sau đó chạy sạch. Một lần nữa:
Making clean in one...
make: `clean' is up to date.
Making clean in two...
make: `clean' is up to date.
Press any key to continue...
Một cái gì đó thậm chí còn kỳ quặc hơn, bởi vì bây giờ nó hoàn toàn không sử dụng các tệp tạo tệp được chỉ định - nó đang sử dụng một số mục tiêu bí ẩn "cập nhật".
Tôi đã nhận thấy một hiện tượng có lẽ liên quan: nếu loại bỏ một trong các mệnh đề kiểm tra trong sạch. Như thế này:
# if [[ -d $f && -f $f/makefile ]]; then
if [[ -d $f ]]; then
Và tạo một thư mục three
không có tệp thực hiện, một phần của đầu ra bao gồm:
Making clean in three...
make: three/makefile: No such file or directory
make: *** No rule to make target `three/makefile'. Stop.
Rằng tôi không có tập tin hoặc thư mục như vậy, nhưng tại sao make
sau đó lại tiếp tục tìm kiếm một mục tiêu với tên đó? Trang người đàn ông có vẻ khá đơn giản:
tập tin -f, --file = tập tin, --makefile = TẬP_TIN
Use file as a makefile.
make -npf /dev/null
(hoặcgmake
tùy thuộc vào hệ thống) có thể được sử dụng để kết xuất cơ sở dữ liệu các quy tắc ngầm cho phiên bản chính xác đó. Đã giúp tôi đôi khi.