我使用这个Makefile
来构建我的树外内核模块。 (该模块只包含一个源文件。)我想使用比默认情况下更多的警告标志。问题是标准的Linux标题(如#include <linux/module.h>
)也会被检查警告,因此会输出大量的警告。如何修改此Makefile以便不检查标准Linux标头的警告?
# to build the module: make module=mymodulename
# to clean: make clean
obj-m += $(module).o
# extra warning flags
ccflags-y := -fdiagnostics-show-option -Wall -Wextra -Wdouble-promotion -Wformat=2 -Winit-self -Wmissing-include-dirs -Wswitch-default -Wswitch-enum -Wunused -Wstrict-overflow=5 -Wno-div-by-zero -Wtrampolines -Wfloat-equal -Wundef -Wno-endif-labels -Wshadow -Wunsafe-loop-optimizations -Wsync-nand -Wbad-function-cast -Wcast-qual -Wcast-align -Wwrite-strings -Wconversion -Wjump-misses-init -Wlogical-op -Waggregate-return -Wstrict-prototypes -Wold-style-definition -Wmissing-noreturn -Wmissing-format-attribute -Wnormalized=nfc -Wpacked -Wpadded -Wredundant-decls -Wnested-externs -Wunreachable-code -Winline -Winvalid-pch -Wdisabled-optimization -Wmissing-prototypes -Wmissing-declarations -Woverlength-strings -Wunsuffixed-float-constants
# disable some warning flags
ccflags-y += -Wno-declaration-after-statement -Wno-missing-prototypes -Wno-missing-declarations -Wno-cast-qual -Wno-sign-conversion -Wno-conversion
# enable some extra warning flags
KBUILD_ENABLE_EXTRA_GCC_CHECKS := 3
# increase verbosity
KBUILD_VERBOSE := 1
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD)
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
答案 0 :(得分:0)
一般来说,对于编译器,标头是源文件的 part 。它被预处理器粘贴在那里。因此,很难为源文件启用警告,但不包括它包含的标头。 (我知道MSVC为此提供了一些#pragma
,不确定GCC是否具有相似的功能。)
由于您的模块看起来相当小,您可以自己进行必要的声明,不包含标题。这实际上取决于您使用的标题的数量。
例如,要使用printf()
而不实际包含<stdio.h>
:
int printf( const char * format, ... );
int main()
{
printf( "Hello, %s.\n", "world" );
return 0;
}
当然,你的声明必须与你正在避免的标题相匹配,否则你会在链接时遇到麻烦。
答案 1 :(得分:0)
感谢nos的评论。诊断实用程序的工作。
请注意,应将忽略的警告用作原始警告。
因此标记-Wno-declaration-after-statement
应该变成:
#pragma GCC diagnostic ignored "-Wdeclaration-after-statement"
以下是基本用法。
#pragma GCC diagnostic error "-Wuninitialized"
foo(a); /* error is given for this one */
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wuninitialized"
foo(b); /* no diagnostic for this one */
#pragma GCC diagnostic pop
foo(c); /* error is given for this one */
#pragma GCC diagnostic pop
foo(d); /* depends on command-line options */