Makefile警告标志Linux内核模块

时间:2015-01-23 11:40:13

标签: linux gcc linux-kernel makefile

我使用这个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

2 个答案:

答案 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"

您可以参考GCC Diagnostic Pragmas

以下是基本用法。

#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 */