Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

无法缓存C++编译之后的文件 #53

Open
frankfif opened this issue Feb 3, 2023 · 2 comments
Open

无法缓存C++编译之后的文件 #53

frankfif opened this issue Feb 3, 2023 · 2 comments

Comments

@frankfif
Copy link

frankfif commented Feb 3, 2023

经过测试发现,将gcc编译之后的文件缓存至yadcc-cache没有问题,但是无法缓存g++编译之后的文件,并且使用YADCC_WARN_ON_NONCACHEABLE=1,这个参数也没有任何效果。

@0x804d8000
Copy link
Collaborator

应该跟https://github.com/Tencent/yadcc/blob/master/yadcc/daemon/cloud/remote_task/cxx_compilation_task.cc#L46 有关,为了降低客户机负载,对这些宏的检查挪到了编译机。如果代码中出现了这些宏的话就会不缓存。

YADCC_WARN_ON_NONCACHEABLE检测不到这个case,后续我会更新一下文档(其实最好是从编译机回传相关信息,后续有时间再看看)。另外有个regression是YADCC_IGNORE_TIMESTAMP_MACROS失效了,回头得改下协议。

如果宏出现在头文件,建议避免,因为这是个正确性问题,所以各类编译缓存对这些宏都会比较保守。如果出现在.cc,其他文件应该还是可以缓存的。

为了确认这一问题,可以加编译参数-E并观察输出是不是有类似的宏的使用。


另外,有一个特殊处理,就是如果编译参数有-D__DATE__="redacted" -D__TIMESTAMP__="redacted" -D__TIME__="redacted",会特判这个case允许缓存,可以加在编译参数试一下。

这个我印象里其实是个UB,但是bazel默认会有这个参数,为了强制代码不要依赖这些宏(印象里好像是为了reproducible build)。腾讯广告内部的blade配置也加了类似的参数。你也可以看看你的环境里需不需要采用这种方式。

注:只要代码中实际没出现这些宏,这个参数加与不加不会有区别。这个更多的是一种用于确保编码规范的措施。

@frankfif
Copy link
Author

frankfif commented Feb 6, 2023

谢谢,从业务代码中,我看到包含__DATE__、TIMESTAMPTIME__这类的宏定义在头文件中,因此缓存没有生效,麻烦后续修改一下YADCC_IGNORE_TIMESTAMP_MACROS就可以了,经过测试,增加编译参数:-D__DATE="redacted" -D__TIMESTAMP_="redacted" -D__TIME__="redacted",是可以正常缓存的。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants