5
Hiện tại tôi đang gặp phải vấn đề với Makefile của mình do đánh giá biến số thực hiện. Tôi đã giảm độ phức tạp, chỉ còn lại những yếu tố thiết yếu tạo ra vấn đề.Mở rộng/đánh giá biến Makefile
- $ (DANH SÁCH) được đánh giá là danh sách tệp khi Makefile được đọc.
- Trong thời gian step1 một trong các tệp đó sẽ bị xóa.
- Khi sử dụng biến trong bước2, nó không được đánh giá lại và do đó không hợp lệ nữa dẫn đến lỗi trong lệnh sao chép.
- Sẽ thật tuyệt nếu biến được đánh giá tại thời điểm được sử dụng, tại đây trong thời gian step2.
Bất kỳ ý tưởng nào giải quyết hoặc khắc phục sự cố này?
Makefile:
LIST=$(wildcard src/*.txt)
all: step1 step2
step1:
@echo "---------- step1 ----------"
@echo $(LIST)
rm src/q1.txt
ls src
step2:
@echo "---------- step2 ----------"
@echo $(LIST)
cp $(LIST) ./dst
Thực hiện khai thác gỗ:
$ make
---------- step1 ----------
src/q1.txt src/q2.txt
rm src/q1.txt
ls src
q2.txt
---------- step2 ----------
src/q1.txt src/q2.txt
cp src/q1.txt src/q2.txt ./dst
cp: cannot stat `src/q1.txt': No such file or directory
make: *** [step2] Error 1
Lý do hoạt động này là chuỗi "src/*. Txt" được đặt nguyên văn vào các lệnh 'echo' và' cp', trong đó shell mở rộng lại cho mỗi lệnh (thay vì 'make' đã mở rộng '$ (ký tự đại diện)'). –
vì biến được mở rộng khi công thức được gọi (nó được sử dụng "=" để mở rộng hoãn lại không ": =" để mở rộng ngay lập tức hoặc đơn giản) mà bạn mong đợi tệp makefile ban đầu hoạt động. Đây là vấn đề: vì hiệu quả GNU làm cho lưu trữ nội dung của các thư mục khi nó đi. Vì vậy, nếu bạn thay đổi cấu trúc thư mục theo cách mà bạn không nhận ra, bạn có thể vào các tình huống này, nơi ý tưởng của thực hiện về những tệp tồn tại không phù hợp với thực tế. – MadScientist