请选择 进入手机版 | 继续访问电脑版

【开发日常】【Makefile】编译时如何将警告(warning)视为错误(error)?

[复制链接]
唐少琼 发表于 2021-1-1 10:31:57 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
我们有时会遇到内核编译时告诫(warning)被视为错误(error)等问题

在内核源码中,移植外部驱动模块,出现报错:
  1. error: unused variable ‘xxx’ [-Werror=unused-variable]...error: defined but not used [-Werror=unused-variable]...error: 'ret' may be used uninitialized in this function [-Werror=maybe-uninitialized]...
复制代码
但是上述这些信息,在另一个内核中编译,只是报告诫:
  1. warning: unused variable 'core_id' [-Wunused-variable]...warning: defined but not used [-Werror=unused-variable]...warning: 'ret' may be used uninitialized in this function [-Werror=maybe-uninitialized]...
复制代码
为什么有的内核编译时告诫被视为错误?

出现上述现象的原因和GCC编译选项有关:
选 项含 义-pedantic允许发出ANSI C尺度所列的全部告诫信息-pedantic-error允许发出ANSI C尺度所列的全部错误信息-w关闭所有告警-Wall允许发出Gcc提供的所有有用的报警信息-werror把所有的告警信息转化为错误信息,并在告警发生时终止编译过程其中的-Werror选项,会把所有的告警信息转化为错误信息,并在告警发生时终止编译过程。
  做一个简朴的试验,验证-Werror选项的作用

参考链接中的内容,写一个最简朴的KO模块:
【开辟日常】【module】Linux写一个简朴的ko模块
然后模仿做一个简朴的warning(未使用的变量):
  1. static int hello_init(void){    int a=1;    printk("Hello, World !\n");    return 0;}
复制代码
执行Makefile编译KO,提示告警:
  1. zhugeyifan@83-28:~/test/ko_module_demo$ makemake -C /lib/modules/4.15.0-126-generic/build M=/home1/zhugeyifan/test/ko_module_demo modulesmake[1]: Entering directory '/usr/src/linux-headers-4.15.0-126-generic'  CC [M]  /home1/zhugeyifan/test/ko_module_demo/hello_world.o/home1/zhugeyifan/test/ko_module_demo/hello_world.c: In function ‘hello_init’:/home1/zhugeyifan/test/ko_module_demo/hello_world.c:6:9: warning: unused variable ‘a’ [-Wunused-variable]     int a=1;           ^  Building modules, stage 2.  MODPOST 1 modules  CC      /home1/zhugeyifan/test/ko_module_demo/hello_world.mod.o  LD [M]  /home1/zhugeyifan/test/ko_module_demo/hello_world.komake[1]: Leaving directory '/usr/src/linux-headers-4.15.0-126-generic'
复制代码
再实验在Makefile中添加-Werror选项:
  1. ccflags-y += -Werror
复制代码
再次执行Makefile编译,看到报错:
  1. zhugeyifan@83-28:~/test/ko_module_demo$ makemake -C /lib/modules/4.15.0-126-generic/build M=/home1/zhugeyifan/test/ko_module_demo modulesmake[1]: Entering directory '/usr/src/linux-headers-4.15.0-126-generic'  CC [M]  /home1/zhugeyifan/test/ko_module_demo/hello_world.o/home1/zhugeyifan/test/ko_module_demo/hello_world.c: In function ‘hello_init’:/home1/zhugeyifan/test/ko_module_demo/hello_world.c:6:9: error: unused variable ‘a’ [-Werror=unused-variable]     int a=1;           ^cc1: all warnings being treated as errorsscripts/Makefile.build:337: recipe for target '/home1/zhugeyifan/test/ko_module_demo/hello_world.o' failedmake[2]: *** [/home1/zhugeyifan/test/ko_module_demo/hello_world.o] Error 1Makefile:1587: recipe for target '_module_/home1/zhugeyifan/test/ko_module_demo' failedmake[1]: *** [_module_/home1/zhugeyifan/test/ko_module_demo] Error 2make[1]: Leaving directory '/usr/src/linux-headers-4.15.0-126-generic'Makefile:31: recipe for target 'all' failedmake: *** [all] Error 2
复制代码
至此,可以得出一个结论:在Makefile中添加-Werror,可以将告警信息转化为错误信息,并在告警发生时终止编译过程。
那假如想要让整个内核都带上-Werror选项,需要怎么做?(如何让内核编译时所有告警信息转化为错误信息,并在告警发生时终止编译过程。)
  如何让整个内核都带上-Werror选项?

修改根目次下的Makefile,找到如下语句:
  1. KBUILD_CFLAGS   := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \                   -fno-strict-aliasing -fno-common \                   -Werror-implicit-function-declaration \                   -Wno-format-security \                   -std=gnu89
复制代码
在内里添加上-Werror选项,然后再执行Makefile,可以观察到所有的warning都酿成了error,而且直接退出编译。
  Ps:这里有个注意事项,“KBUILD_CFLAGS:=”的意思是如果未界说,则执行背面的赋值利用。所以在这个之前最好不要利用KBUILD_CFLAGS参数,否则大概会导致一些其他错误。如果在这段话之后,使用“KBUILD_CFLAGS+=”利用,就不会有影响。
实际应用中,我们大概只是希望把一部门warning,酿成error,是我们的代码更加的符合规范,那需要怎么做?
  内核编译时,如何只让一部门warning编译报错?

可以让Wrerror加上详细的参数,比方:-Werror-xxx,使其只转换一部门的warning。
  1. KBUILD_CFLAGS   += -Werror-implicit-function-declarationKBUILD_CFLAGS   += -Werror=unknown-warning-optionKBUILD_CFLAGS   += -Werror-implicit-intKBUILD_CFLAGS   += -Werror-strict-prototypesKBUILD_CFLAGS   += -Werror-date-timeKBUILD_CFLAGS   += -Werror-incompatible-pointer-typesKBUILD_CFLAGS   += -Werror-designated-init...
复制代码
如何使内核编译时不将warning视为error?

其实就是上述问题的反向利用。
有多种方式:
1.在Makefile中去除-Werror选项。

第一种方式适用于比较简朴的Makefile。就像上面的例子,把Makefile里添加的-Werror去掉就行了!
但是内核代码里,全局搜索Werror会找到许多,一个一个去除太贫苦了!
这时候使用“-w”选项更适合
  2.在Makefile中添加-w选项

-w选项是关闭所有告警,这个同样是在内核的根目次下的Makefile中做:
  1. KBUILD_CFLAGS   := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \                   -fno-strict-aliasing -fno-common \                   -Werror-implicit-function-declaration \                   -Wno-format-security \                   -std=gnu89
复制代码
在KBUILD_CFLAGS中添加"-w"参数,再次执行Makefile。
固然,有时候我们是希望只去除一部门的warning转error利用。
  3.只去除一部门的warning转error利用

这时候可以通过下面的参数:
  1. KBUILD_CFLAGS   += -Wno-unused-variableKBUILD_CFLAGS   += -Wno-sign-compareKBUILD_CFLAGS   += -Wno-pointer-signKBUILD_CFLAGS   += -Wno-unused-functionKBUILD_CFLAGS   += -Wno-unused-parameterKBUILD_CFLAGS   += -Wno-unused-variableKBUILD_CFLAGS   += -Wno-implicit-function-declarationKBUILD_CFLAGS   += -Wno-unused-result
复制代码
比如上面第一个例子,报错信息是
  1. /home1/zhugeyifan/test/ko_module_demo/hello_world.c:6:9: error: unused variable ‘a’ [-Werror=unused-variable]那就添加标记如下:KBUILD_CFLAGS   += -Wno-unused-variable
复制代码
这个标记的意思是:-W,去除unused-variable报错(no-unused-variable)
  有没有什么办法不修改Makefile,同样实现不将告诫视为错误?

可以在执行makefile时,从外部传参:
  1. make KBUILD_CFLAGS+=-w
复制代码
这样也能实现。不过就是有个隐患,它似乎会将Makefile中的KBUILD_CFLAGS其他参数覆盖掉,如同我上面提到的:
  1. KBUILD_CFLAGS   := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \                   -fno-strict-aliasing -fno-common \                   -Werror-implicit-function-declaration \                   -Wno-format-security \                   -std=gnu89
复制代码
  Ps:这里有个注意事项,“KBUILD_CFLAGS:=”的意思是如果未界说,则执行背面的赋值利用。所以在这个之前最好不要利用KBUILD_CFLAGS参数,否则大概会导致一些其他错误。如果在这段话之后,使用“KBUILD_CFLAGS+=”利用,就不会有影响。
  








来源:https://blog.csdn.net/Ivan804638781/article/details/111996770
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )