2012-01-27 29 views
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 

Trả lời

7

Không sử dụng chức năng đại diện.

LIST = src/*.txt 

all: step1 step2 

step1: 
    @echo "---------- step1 ----------" 
    @echo $(LIST) 
    rm src/q1.txt 
    ls src 

step2: 
    @echo "---------- step2 ----------" 
    @echo $(LIST) 
    cp $(LIST) ./dst 
+2

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)'). –

+3

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

Các vấn đề liên quan