تجميع وحدة Kernel و KBUILD_NOPEDANTIC

لقد لاحظت أن النواة الأخيرة (بدءًا من 2.16.24؟) لا تحب إذا تم تغيير CFLAGS في وحدة Kbuild الخارجية. إذا تم تغيير CFLAGS فسيتم إصدار الخطأ التالي بواسطة نظام Linux kernel Kbuild:

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

من هنا :

تحتوي الوحدات الخارجية في بعض الحالات على خيار gcc modifed       عن طريق تعديل CFLAGS. هذا لم يتم توثيقه و       كانت ممارسة سيئة.

إضافية البريد الإلكتروني من LKML.

لماذا هي فكرة سيئة؟ ما هو عقلاني؟

13

2 إجابة

أولاً ، قد يكون من الجدير بالذكر أن EXTRA_CFLAGS قد تم إيقافه منذ فترة ، ويتم استبداله ccflags-y . يمكنك القراءة عن نية ccflags-y في Documentation/kbuild/makefiles.txt ، القسم 3.7.

في الأساس، وهذا المتغير يسمح لك لإلحاق الإعدادات إلى مجموعة من الإشارات تجميع C، في نطاق الملف حيث يتم تعيينه فقط. ليس من المفترض لك بتغيير الأعلام العالمية، لأن ذلك قد </م> أن يكون لها تأثير عالمي لما بعد MAKEFILE الخاص بك، والتي تعتبر ممارسة سيئة. يتحقق التحقق الذي ذكرته من أنه في الواقع ، لم يتم تغيير العلامات العمومية بواسطة makefiles المضمنة.

من المثير للاهتمام التحقق من كيفية استخدام ccflags-y ، المعروف سابقًا باسم EXTRA_CFLAGS ، في عملية الإنشاء. تتبع بعض النقاط ذات الصلة (ولكن ليس كل شيء ، لأن تركت كممارسة للقارئ ؛-)) يبين ما يلي:

EXTRA_CFLAGS can still be used, according to scripts/Makefile.lib

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

The same file shows how ccflags-y ends up in the C compilation flags (and also shows you that you have another variable at your disposal, called CFLAGS_.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)

ثم في scripts/Makefile.build ، يتم تعريف قاعدة الترجمة:

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

لاحظ أن هذه كلها متغيرات موسعة بشكل متكرر ، باستخدام = وليس : = ، مما يعني أن قيمة ccflags-y الخاصة بك يتم إدخالها في أعلام C عند تعريفه في makefile الخاصة بك.

Finally about KBUILD_NOPEDANTIC, which you mention in the title but not in the actual question. This test for changed value of CFLAGS can be disabled by giving KBUILD_NOPEDANTIC any value -- see 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

تم استرجاع الملفات المشار إليها في هذه الإجابة اليوم.

الآن ... لا تكون خبيراً في هذا المجال وتبحث أكثر في makefiles بعد كتابة هذه القصة بأكملها ، هناك شيء لا أفهمه. يبدو لي أن CFLAGS غير مستخدم في نظام الإنشاء (ليس ضمنيًا أو صريحًا) ، ولكن KBUILD_CFLAGS هو. لذا أتساءل عما إذا كان هذا الفحص الخاص بالتغييرات في CFLAGS يجب أن يكون في الواقع إجراء فحص للتغييرات في KBUILD_CFLAGS بدلاً من ذلك.

9
وأضاف

جعل makefiles Linux CFLAGS بطريقة مناسبة لـ kernel.
إن تجاوز الشفرة CFLAGS يعني أنك تضيف بعض العلامات وقد تزيل بعض الأعلام. قد تكون بعض العلامات التي تمت إزالتها مهمة لتجميع صحيح.

1
وأضاف
إذا كنت أفهم CFLAGS هي أعلام يتم تجميع النواة كلها وبالتالي لا ينبغي تغييرها. وهذا يعني أن نظام kernel KBuild سوف يقوم بتجميع الوحدة الخارجية الخاصة بي مع CFLAGS + EXTRA_CFLAGS. صيح؟
وأضاف المؤلف dimba, مصدر
أعتقد أنه يفعل.
وأضاف المؤلف ugoren, مصدر