2012-05-03 23 views
5

Trong hướng dẫn:Hàm eval có thể được sử dụng trong makefile như thế nào?

Hàm eval là rất đặc biệt: nó cho phép bạn xác định cấu trúc makefile mới mà không phải là hằng số; đó là kết quả của việc đánh giá các biến và chức năng khác. Đối số cho hàm eval được mở rộng, sau đó kết quả của việc mở rộng đó được phân tích cú pháp như cú pháp makefile .

Điều quan trọng là nhận ra rằng đối số eval được mở rộng hai lần; trước tiên bởi hàm eval, sau đó kết quả của việc mở rộng đó được mở rộng lại khi chúng được phân tích cú pháp dưới dạng cú pháp makefile. Điều này có nghĩa là bạn có thể cần cung cấp thêm cấp thoát cho ký tự “$” khi sử dụng eval.

"mở rộng hai lần" gây nhầm lẫn cho tôi.

ví dụ, tôi tạo ra một makefile:

define func 
    tmp = $(OBJPATH)/$(strip $1) 
    objs += $$(tmp) 
    $$(tmp) : $2 
     gcc $$^ -o [email protected] 
endef 

all : foo 

$(eval $(call func, foo, 1.c))  

cách sẽ hàm eval được mở rộng?

+0

"Chức năng eval sẽ được mở rộng như thế nào?" Bạn đã thử chưa? – Beta

Trả lời

15

Cách dễ nhất để hiểu nó là để thay thế cho eval với thông tin:

$(info $(call func, foo, 1.c)) 

Điều đó sẽ hiển thị như đầu ra là kết quả của việc mở rộng đầu tiên, vì vậy bạn có thể xem những gì làm sẽ thực sự được phân tích cú pháp. Bạn đã không cung cấp các giá trị cho biến OBJPATH, nhưng nếu nó là obj ví dụ sau đó trong trường hợp của bạn việc mở rộng đầu tiên (của hàm gọi) kết quả trong:

tmp = obj/foo 
objs += $(tmp) 
$(tmp) : 1.c 
    gcc $^ -o [email protected] 

Sau đó, làm cho phân tích cú pháp sẽ đánh giá này, và trong quá trình nó sẽ mở rộng lại, vì vậy những thứ như $(tmp) được mở rộng.

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