2013-08-22 18 views
5

Tôi đang xây dựng một bộ mô-đun hạt nhân Linux bằng cách sử dụng mã nguồn được chia sẻ. Từ những gì tôi hiểu, Makefile phải được đặt tên là "Makefile" vì vậy tôi phải sử dụng cùng một Makefile để xây dựng hai mô-đun khác nhau. Làm thế nào tôi có thể xây dựng hai mô-đun khác nhau, trong cùng một Makefile, với cùng một mã nguồn, nhưng với hai tùy chọn xây dựng khác nhau?Trong số các mô-đun hạt nhân: Nhiều mô-đun, một tệp Đơn, cùng một tệp nguồn, các tùy chọn xây dựng khác nhau

Ví dụ: mô-đun của tôi được gọi là module1 và module2. Vì vậy, tôi có dòng sau để định nghĩa chúng:

obj-m := module1.o module2.o 

Trong số các file khác, cả hai module1 và module2 cần phải sử dụng các tập tin cùng một nguồn code.c, nhưng được xây dựng với build tùy chọn khác nhau. Vì vậy, nói ví dụ, các Makefile chứa các dòng sau:

module1-objs = module1_code.o other_code.o 
module2-objs = module2_code.o other_code.o 

Tôi muốn module1_code.omodule2_code.o được xây dựng từ code.c, nhưng với các tùy chọn khác nhau. Cụ thể, tôi muốn một số module1_code.o có macro được xác định -DPREPROCEFFOR_FLAG=1module2_code.o được tạo mà không có macro. Từ những gì tôi hiểu, hệ thống Makefiles được sử dụng trong Linux ngầm cho rằng đối với một tệp đối tượng gọi là "code.o", tệp nguồn được gọi là "code.c", vậy làm thế nào tôi có thể đạt được điều này? Là có thể? Có cách nào tốt hơn để làm điều này?

+0

Bạn có thể đặt tên cho tệp makefile của mình thành bất kỳ thứ gì bạn muốn. sẽ chỉ tìm kiếm [tên tệp nhất định] (http://www.gnu.org/software/make/manual/make.html#Makefile-Arguments) theo mặc định. Đối với bất kỳ tên nào khác, bạn cần sử dụng đối số '-f'. –

+0

Nếu bạn đưa ra một quy tắc cụ thể cho tệp đối tượng của bạn với điều kiện tiên quyết của tệp nguồn có liên quan và quy tắc để tạo mục tiêu, hãy sử dụng quy tắc mặc định mà bạn đã đề cập. Vì vậy, 'module1_code.o: code.c; '. –

Trả lời

5

Bạn có một vấn đề ở đây, bởi vì bạn rõ ràng có code.c được biên soạn khác nhau khi -DPREPROCEFFOR_FLAG=1 được xác định, nhưng khi nó đã được biên dịch vào code.o, thực hiện sẽ không quan tâm đến cờ tiền xử lý hoặc bất cứ điều gì vì code.o sẽ đã được cập nhật.

Bạn cần một cách để xây dựng code.c cho các tệp đối tượng khác nhau với các cờ C khác nhau. Có lẽ một cách sạch để làm điều này (không có cơ hội với O= cho ra các module cây), nhưng đây là innelegant tôi chưa giải pháp hiệu quả cho thời điểm này:

my_modules: 
    cp code.c code_noflags.c 
    cp code.c code_withflags.c 
    make -C $$KDIR M=$$PWD modules 
    rm code_noflags.c code_withflags.c 

# module objects 
obj-m := module1.o module2.o 

# module1 specifics 
module1-y := code_withflags.o 
CFLAGS_code_withflags.o := -DPREPROCEFFOR_FLAG=1 

# module2 specifics 
module2-y := code_noflags.o 

Chỉ cần gọi:

$ make KDIR=/path/to/kernel 

Bạn có thể xác minh cờ tiền xử lý được chuyển đến tập tin nguồn cho các đối tượng đúng với:

$ make KDIR=/path/to/kernel V=1 | grep PREPRO 

Bạn cũng có thể có hai thư mục riêng biệt cho mỗi mô-đun, nếu đây là possi ble, và có một liên kết tượng trưng code.c trong mỗi cái trỏ đến số thực phổ biến code.c. Tuy nhiên, điều này vẫn còn hackish và không cảm thấy đúng.

+1

Giải pháp A (có khả năng không thích hợp) sẽ tạo ra một liên kết sim tới mã.c, tức là code-link.c, và sau đó biên dịch tệp liên kết với cờ thay thế. –

2

Một giải pháp đơn giản là, tiếp tục từ Makefile của bạn

obj-m := module1.o module2.o 

module1-objs = module1_code.o other_code.o 
module2-objs = module2_code.o other_code.o 

thêm hai file nguồn hơn, module1_code.c và module2_code.c.

Sau đó module1_code.c chỉ trông giống như:

#define PREPROCEFFOR_FLAG 1 
#include "code.c" 

và module2_code.c là:

#include "code.c" 

Hoặc nếu bạn thích, thay đổi tên trong Makefile và các file nguồn để các thứ hai bao gồm mà không có một định nghĩa là không cần thiết. Ngoài ra, bạn có thể làm cho hai tệp nguồn không có gì ngoài việc bao gồm và sử dụng biến số CFLAGS_module1_code.o để thêm tùy chọn -D... vào trình biên dịch nếu bạn muốn.

này tương tự như những gì xảy ra trong hạt nhân ở thượng nguồn với arch/x86/boot/video-vesa.carch/x86/realmode/rm/video-vesa.c, vv, nơi mà các tập tin realmode chỉ chứa:

#include "../../boot/video-vesa.c" 

và mã video vesa.c kết thúc nhận được biên soạn hai lần với nhau cờ biên dịch. Bạn có thể sử dụng tùy chọn O=... để xây dựng hạt nhân để giữ một cây nguồn sạch và xây dựng trong một cây đối tượng riêng biệt.

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