2012-06-18 27 views
13

Tôi đã nhận thấy rằng các hạt gần đây (bắt đầu từ 2.16.24?) Không thích nếu CFLAGS được thay đổi trong tệp Kbuild mô-đun bên ngoài. Nếu CFLAGS được thay đổi bạn sẽ được cấp các lỗi sau bởi hệ thống Linux kernel Kbuild:Biên dịch mô-đun hạt nhân và KBUILD_NOPEDANTIC

scripts/Makefile.build:46: *** CFLAGS was changed in "/some/path". Fix it to use EXTRA_CFLAGS. Stop. 

Từ here:

module bên ngoài có trong một vài trường hợp modifed gcc tùy chọn bằng cách sửa đổi CFLAGS. Điều này chưa bao giờ được ghi lại và là một thực tiễn không tốt.

Bổ sung email từ LKML.

Tại sao ý tưởng tồi? Điều gì là hợp lý?

Trả lời

1

Tạo các tệp makefiles của Linux CFLAGS theo cách phù hợp với hạt nhân.
Ghi đè CFLAGS có nghĩa là bạn thêm một số cờ và có thể xóa một số cờ. Một số cờ đã loại bỏ có thể quan trọng cho việc biên dịch chính xác.

+0

Nếu tôi hiểu CFLAGS là cờ toàn bộ hạt nhân được biên dịch và do đó không nên thay đổi. Điều này có nghĩa là hệ thống kernel KBuild sẽ biên dịch mô-đun bên ngoài của tôi với CFLAGS + EXTRA_CFLAGS. Chính xác? – dimba

+0

Tôi nghĩ là vậy. – ugoren

9

Trước hết, có thể đáng nói đến là EXTRA_CFLAGS đã không còn được dùng nữa và được thay thế bằng ccflags-y. Bạn có thể đọc về ý định của ccflags-y trong Documentation/kbuild/makefiles.txt, phần 3.7.

Về cơ bản, biến này cho phép bạn chắp thêm cài đặt vào tập hợp cờ biên dịch C, trong phạm vi của tệp mà nó chỉ được gán. Bạn không được phép thay đổi cờ toàn cầu, vì rằng có thể có tác động toàn cầu vượt ra ngoài makefile của riêng bạn, được coi là thực hành không tốt. Kiểm tra mà bạn đề cập đến xác minh rằng thực sự, cờ toàn cầu không bị thay đổi bởi các tệp makefiles được bao gồm.

Điều thú vị là hãy kiểm tra cách ccflags-y, trước đây được gọi là EXTRA_CFLAGS, sẽ được sử dụng trong quá trình xây dựng. Tracing một số điểm liên quan (nhưng không phải tất cả, bởi vì đó là trái như một bài tập cho người đọc ;-)) cho thấy như sau:

EXTRA_CFLAGS vẫn có thể được sử dụng, theo scripts/Makefile.lib

1 # Backward compatibility 
2 asflags-y += $(EXTRA_AFLAGS) 
3 ccflags-y += $(EXTRA_CFLAGS) 

Các tập tin tương tự cho thấy cách ccflags-y kết thúc trong những lá cờ C biên soạn (và cũng có thể cho bạn thấy rằng bạn có một biến theo ý của bạn, được gọi là CFLAGS_<filename>.o):

104 orig_c_flags = $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(KBUILD_SUBDIR_CCFLAGS) \ 
105     $(ccflags-y) $(CFLAGS_$(basetarget).o) 
106 _c_flags  = $(filter-out $(CFLAGS_REMOVE_$(basetarget).o), $(orig_c_flags)) 
... 
133 __c_flags  = $(_c_flags) 
... 
147 c_flags  = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(LINUXINCLUDE)  \ 
148     $(__c_flags) $(modkern_cflags)       \ 
149     -D"KBUILD_STR(s)=\#s" $(basename_flags) $(modname_flags) 

Sau đó, trong scripts/Makefile.build, các comp quy tắc ilation được định nghĩa:

234 cmd_cc_o_c = $(CC) $(c_flags) -c -o [email protected] $< 

Lưu ý rằng đây là tất cả đệ quy mở rộng biến, sử dụng = và không :=, có nghĩa là giá trị của riêng bạn ccflags-y được đưa vào cờ C khi bạn xác định nó trong makefile của riêng bạn.

Cuối cùng khoảng KBUILD_NOPEDANTIC, bạn đề cập đến trong tiêu đề chứ không phải trong câu hỏi thực tế.Xét nghiệm này cho giá trị thay đổi của CFLAGS có thể bị vô hiệu hóa bằng cách cho KBUILD_NOPEDANTIC bất kỳ giá trị - xem scripts/Makefile.build

47 ifeq ($(KBUILD_NOPEDANTIC),) 
48   ifneq ("$(save-cflags)","$(CFLAGS)") 
49     $(error CFLAGS was changed in "$(kbuild-file)". Fix it to use ccflags-y) 
50   endif 
51 endif 

Các tập tin tham chiếu trong câu trả lời này đã được lấy ra tất cả các ngày hôm nay.

Bây giờ ... không phải là một chuyên gia trong lĩnh vực này và nhìn sâu hơn vào makefiles sau khi viết toàn bộ câu chuyện này xuống, có một điều mà tôi cũng không hiểu. Dường như với tôi rằng CFLAGS không được sử dụng trong hệ thống xây dựng (không ngầm, cũng không rõ ràng), nhưng KBUILD_CFLAGS là. Vì vậy, tôi tự hỏi liệu việc kiểm tra thay đổi này trong CFLAGS có thực sự là một kiểm tra thay đổi trong số KBUILD_CFLAGS thay thế hay không.

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