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.
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
Tôi nghĩ là vậy. – ugoren