error: macro "__TIME__" might prevent reproducible builds [-Werror=date-time]

原创 2018年04月16日 16:22:53

1.问题    

在进行内核模块编译的时候突然提示如下错误:

/work/kernel/module.c:136:86: error: macro "__TIME__" might prevent reproducible builds [-Werror=date-time]
MODULE_DESCRIPTION("compiled by GCC " __VERSION__ " build on " __TIME__ " " __DATE__);
/work/dte/src/kernel/module.c:136:86: error: macro "__DATE__" might prevent reproducible builds [-Werror=date-time]

 1.1开发环境

                开发环境如下图所示

2.定位

首先看到错误日志就能确认在内核模块中引用了如下代码“MODULE_DESCRIPTION("compiled by GCC " __VERSION__ " build on " __TIME__  " " __DATE__);”

在4.9(含)的gcc版本中添加了-Wdate-time告警,如果在内核模块代码中使用了__DATE__, __TIME__, or __TIMESTAMP__这几个宏,会产生这几种错误;

点击打开链接

[PATCH 7/7] Makefile: Build with -Werror=date-time if the compilersupports it

From: Josh Triplett 
Date: Mon Dec 23 2013 - 16:56:19 EST


GCC 4.9 and newer have a new warning -Wdate-time, which warns on any use
of __DATE__, __TIME__, or __TIMESTAMP__, which would make the build
non-deterministic. Now that the kernel does not use any of those
macros, turn on -Werror=date-time if available, to keep it that way.

The kernel already (optionally) records this information at build time
in a single place; other kernel code should not duplicate that.

Signed-off-by: Josh Triplett <josh@xxxxxxxxxxxxxxxx>
---
Makefile | 3 +++
1 file changed, 3 insertions(+)

diff --git a/Makefile b/Makefile
index 14d592c..188eea7 100644
--- a/Makefile
+++ b/Makefile
@@ -668,6 +668,9 @@ KBUILD_CFLAGS += $(call cc-option,-Werror=implicit-int)
# require functions to have arguments in prototypes, not empty 'int foo()'
KBUILD_CFLAGS += $(call cc-option,-Werror=strict-prototypes)

+# Prohibit date/time macros, which would make the build non-deterministic
+KBUILD_CFLAGS += $(call cc-option,-Werror=date-time)
+
# use the deterministic mode of AR if available
KBUILD_ARFLAGS := $(call ar-option,D)

-- 
1.8.5.2

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

3.解决方法

    解决方法有如下几种,可根据需求进行选择

    第一种解决方法 在makefile中添加如下选项

    EXTRA_CFLAGS += -Wno-error=date-time

    EXTRA_CFLAGS +=-Wno-date-time
    注意:在第二段定位中已经说到只有在4.9以及之后的gcc版本中才有这两个选项,如果你在gcc版本小于4.9的系统上编译,比如在centos7.2系统中,centos中默认的gcc版本是4.8.5,编译时就会报"cc1: 错误:-Werror=date-time:没有选项 -Wdate-time"错误,所以这种解决方法如果只是使用4.9以上的gcc版本是没有问题的;
    第二种解决方法
    修改/lib/modules/'uname -r'/build/Makefile文件,我的是/lib/modules/4.4.0-116-generic/build/Makefile

    将KBUILD_CFLAGS   += $(call cc-option,-Werror=date-time)这一行注释掉

    

    注意:这种方法虽然解决了这个问题,但是修改了系统本身的属性,不太推荐

    第三种解决方法

    这一种方法也是我比较推荐的方法,修改内核模块的makefile文件,添加一行

    ccflags-y+=$(shell if [ $(call cc-version) -ge 0490 ] ; then echo "-Wno-error=date-time -Wno-date-time"; fi ;)

    在linux内核的最顶层目录也就是根目录下面的Makefile文件中,有一个变量"KBUILD_CFLAGS",这个$(KBUILD_CFLAGS)中存放的是传递给gcc编译器的编译选项,如果被编译的文件在被gcc编译时,没有特殊的要求的话就会使用$(KBUILD_CFLAGS)中的编译选项。

    但是如果被gcc编译的文件有特殊的编译选项要求的话,使用如下的方式来指定编译选项:
    ccflags-y,是指定给$(CC)的编译选项;
    asflags-y,是指定给$(AS)的编译选项;
    ldflags-y,是指定给$(LD)的编译选项;

    




解决macro "__TIME__" might prevent reproducible builds [-Werror=date-time]错误

在编译驱动的时候,出现错误macro "__TIME__" might prevent reproducible builds [-Werror=date-time],只需在相应的Makefile中添...
  • mike8825
  • mike8825
  • 2016-07-28 18:47:13
  • 6306

Linux 驱动编译报错:error: macro "__DATE__" might prevent reproducible builds [-Werror=date-time]

编译驱动时遇到这个错误提示,表示当前编译环境中将关于 DATE 以及 TIME 的警告也作为错误来进行处理的。有如下几种方法可以参考: 1. 在编译驱动的相应 Makefile 中增加一行:CFLA...
  • JAZZSOLDIER
  • JAZZSOLDIER
  • 2017-07-17 11:32:18
  • 2097

error: macro "__DATE__" might prevent reproducible builds 以及部分其他gcc选项

gcc选项: error: macro "__DATE__" might prevent reproducible builds或 error: macro "__TIME__" might pr...
  • gzxx2007sddx
  • gzxx2007sddx
  • 2017-05-25 09:49:59
  • 1094

第二部分 s3c2440 移植linux内核 添加网卡支持 yaffs2文件系统支持

三、内核的移植 1、移植内核 首先,下载源码包:https://www.kernel.org/ 现在时间为2014年12月20日其主界面截图为: 在此,就在下较新的稳定的版本作为尝试。在这里有个...
  • woshidahuaidan2011
  • woshidahuaidan2011
  • 2016-05-21 15:22:05
  • 6976

rtl8188cus编译

1.make 后会出现这个错误, home/chen/rtl8188/888cus/os_dep/linux/usb_intf.c:1580:52: error: macro "__TIME__" ...
  • mcusun2000
  • mcusun2000
  • 2016-03-28 22:33:05
  • 548

Linux编译Ralink无线网卡驱动

0x00 自行下载网卡驱动,一般购买无线网卡会附赠驱动。 0x01 修改config.mk文件,一般在os/linux/config.mk下。 将“HAS_WPA_SUPPLICANT=n”改...
  • taotieren
  • taotieren
  • 2016-08-04 13:26:35
  • 1928

如何在软件里显示编译时间?__DATE__和__TIME__

2009-05-20 16:21 不管是什么软件,如果持续的做,都会有“版本管理”的问题。 对于软件的版本号,通常有主版本号和次版本号之分,这些都可以通过宏定义,版本变的时候手动修改。 但有的时...
  • gaojinshan
  • gaojinshan
  • 2012-08-08 14:14:41
  • 2825

编译的日期 和时间__DATE__ __TIME__

转自:http://biancheng.dnbcw.info/c/277439.html 文章是转载的,附上自己测试的代码,by:purple尘 #include int main() { ...
  • csCrazybing
  • csCrazybing
  • 2016-06-21 22:23:50
  • 3880

Ubuntu 64bit 12.04 error: "_FORTIFY_SOURCE" redefined [-Werror]

Check this error this morning,solution as following words http://blog.sina.com.cn/s/blog_643e8386...
  • xumercury
  • xumercury
  • 2012-07-14 11:23:26
  • 6680

c++报错:in expansion of macro

in expansion of macro宏错了。
  • u010029439
  • u010029439
  • 2018-03-01 16:16:14
  • 247
收藏助手
不良信息举报
您举报文章:error: macro "__TIME__" might prevent reproducible builds [-Werror=date-time]
举报原因:
原因补充:

(最多只允许输入30个字)