[英]Makefile warning flags Linux kernel module
我正在使用這個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
一般來說,對於編譯器來說,頭文件是源文件的一部分。 它已被預處理器粘貼在那里。 因此,很難為源文件啟用警告,而不是為它包含的標頭啟用警告。 (我知道 MSVC 為此提供了一些#pragma
s,不確定 GCC 是否有類似的功能。)
由於您的模塊看起來相當小,您可以自己進行必要的聲明而不包括標題。 這實際上取決於您使用的標頭數量。
例如,要使用printf()
而不實際包含<stdio.h>
:
int printf( const char * format, ... );
int main()
{
printf( "Hello, %s.\n", "world" );
return 0;
}
當然,您的聲明必須與您要避免的標題中的聲明相匹配,否則您將在鏈接時遇到麻煩。
感謝nos的評論。 診斷 Pragma 工作。
請注意,忽略的警告應用作原始警告。 所以標志-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 */
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.