2013-06-12 38 views
8

Trong khi tìm hiểu các mô-đun hạt nhân Linux tôi có thể thấy (cách xa hai nguồn) hai cách để viết Makefile. Đầu tiên là một cái gì đó như:Lập trình mô-đun hạt nhân Linux: makefile

ifneq ($(KERNELRELEASE),) 
     obj-m := module.o 
else 
default: 
     $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules 
endif 

Sau đó là ít phức tạp:

obj-m := module.o 
all: 
     $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules 

Hoặc soạn makefile dẫn đến biên soạn thành công mô-đun. Việc học của tôi đi kèm với cuốn sách LDD3 và những gì tôi đã đọc cho đến nay là cuốn sách tiếp theo:

Makefile này được đọc hai lần trên một bản dựng điển hình. Khi makefile được gọi từ dòng lệnh, nó nhận thấy rằng biến KERNELRELEASE chưa được thiết lập. Nó định vị thư mục nguồn kernel bằng cách tận dụng thực tế là liên kết tượng trưng được xây dựng trong các thư mục modules đã được cài đặt trở lại tại cây xây dựng kernel. Nếu bạn không thực sự chạy kernel mà bạn đang xây dựng, bạn có thể cung cấp tùy chọn KERNELDIR = trên dòng lệnh , đặt biến môi trường KERNELDIR hoặc viết lại dòng đặt KERNELDIR trong makefile. Sau khi tìm thấy source source của kernel, makefile gọi default: target, chạy lệnh make thứ hai (được tham số hóa trong makefile là $ (MAKE)) để gọi hệ thống xây dựng hạt nhân như được mô tả trước đây. Trong lần đọc thứ hai, các tập hợp makefile đặt ra obj-m và các tệp makefiles của hạt nhân chăm sóc thực sự xây dựng mô-đun.

Nếu makefile được đọc hai lần thì cách tiếp cận thứ hai sẽ dẫn đến đệ quy, phải không?

+5

Đệ quy (trong ngữ cảnh này) được định nghĩa là một thể hiện của Gọi thực hiện một phiên bản khác của Thực hiện. Vì vậy, cách tiếp cận thứ hai liên quan đến đệ quy. Nếu bạn đang hỏi liệu phương pháp thứ hai dẫn đến một vòng lặp vô hạn, câu trả lời là không, bởi vì thể hiện thứ hai của Make có "mô-đun" làm mục tiêu chứ không phải "tất cả". Câu trả lời đó có đáp ứng được câu hỏi của bạn không? – Beta

+1

Beta, bạn nên đăng câu trả lời đó chứ không phải là nhận xét. Tôi muốn upvote bạn. Tôi sẽ thêm rằng cả hai phương pháp tiếp cận sử dụng đệ quy để làm việc, nhưng kết quả đầu tiên làm cho nó rõ ràng hơn một chút rằng quy tắc "mặc định" hoặc "tất cả" sẽ không được gọi trên thẻ thứ hai. –

+0

@Beta, bạn có thể giải thích chi tiết hơn về cách chính xác điều này không dẫn đến đệ quy bên trong không? Có thể đăng câu trả lời của bạn và tôi sẽ upvote bạn ^^. (Xem mã nguồn của Makefile của kbuild không thể đưa tôi đến điểm mà tôi có thể tìm ra bên trong) – mesmerizingr

Trả lời

3

Khi bạn gọi hàm Makefile lần đầu tiên bằng cách nhập #make trên bảng điều khiển, bạn không chuyển bất kỳ mục tiêu nào. Vì vậy, nó sẽ gọi tên mục tiêu all: trong makefile theo mặc định.

Bên trong mục tiêu all: bạn đang chuyển mục tiêu dưới dạng mô-đun. Do đó, lần này nó sẽ tạo mô-đun thay vì đi tới mục tiêu all:.

Vì vậy, nó sẽ không phải là đệ quy vô hạn.

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