我们一直在bug跟踪器中遇到仅针对Clang的问题,例如:
- cmd/cgo/internal/testsanitizers: TestMSAN/msan8 fails with clang16.0.6 #64616
- runtime/cgo: build fails with GOARCH=arm GOARM=5 CC=clang #65290
- cmd/cgo: building with clang 13 errors out with
unknown warning group '-Wunaligned-access'
#64943 - cmd/go: TestScript/cgo_stale_precompiled fails with Clang 14.0.6 #64423
- cmd/link: coverage analysis fail when using CGO & LLVM/clang 12 #58848
- cmd/cgo/internal/testtls:
signal arrived during external code execution
on Windows with clang 14.0.6 #64400 - cmd/cgo: Wrong types in compiler errors with clang 14 #53013
由于解决某些问题可能涉及实施诸如调整CFLAGS或包含特定编译器选项(如-Wno-something)的解决方法,因此确定我们目标的最低编译器版本将是有益的。了解这些更改是否可能对cgo程序产生不利影响,尤其是那些依赖于最早要求的版本的程序,这一点至关重要。考虑到cgo指令不仅必须与clang兼容,还必须与gcc兼容,这一考虑因素就更加重要了。
此外,还有关于扩展clang在操作系统上的支持的请求,特别是关于Windows support的问题。有一个#64563文档介绍了如何添加一个带有最近Clang工具链的Linux LUCI构建器。
在查看cgo wiki和MinimumRequirements#cgo时,没有提到Clang支持或指定的最低要求版本。
如果我们以一致的方式积极追求Clang支持,也许以某种方式开始记录支持会有所帮助。
在为#43605做出的决定中,同意将最低GCC版本记录为4.6。我们可以考虑根据类似的时间范围(约2011年)指定相应的clang版本,例如3.0。
cc @golang/runtime
6条答案
按热度按时间k7fdbhmy1#
CLang在Windows上的支持很糟糕。主要与不支持的链接器标志(
lld-link
)以及使用双破折号而不是单破折号或斜杠有关。bvhaajcl2#
@golang/release, how difficult is it to test against multiple Clang versions? Do we actually have test coverage back to GCC 4.6?
deikduxw3#
如果可以以这种方式打包clang,我们只需下载并解压缩它,然后通过设置一些环境变量指向bin目录,以便我们的构建使用它,那么在LUCI上这可能是非常直接的。
0tdrvxhp4#
我记得llvm的网站有一个脚本可以自动安装特定版本的工具链,这可能会有所帮助:https://apt.llvm.org/#llvmsh
0s0u357o5#
我认为我们希望避免在构建过程中从更广泛的网络运行shell脚本。😅话虽如此,事实证明在CIPD中设置一个clang发布相对容易。我已经设置了一个构建器,所以我们来看看它是否有效。(请查看https://go.dev/cl/559255。)上传新clang版本的过程是手动的,但相当简单。它只包含几个命令和非常直接的配置CL。
xj3cbfub6#
我们团队简要讨论过这个问题,我认为,除非有特殊原因排除特定的clang版本(比如我们对gcc的做法,因为cgo生成的某些pragmas),我认为我们的政策可能只是在各个版本上尽力而为,但总体上是支持的。此外,我们将努力保持对clang新版本的更新。新的LUCI clang构建器基于clang 15,在时间上进一步升级可能会遇到一些问题(我们的构建器镜像上的glibc太旧了),但它们是可以解决的。
所以我猜从具体的政策来看,我提议如下文本:
"clang通常支持与cgo一起使用。然而,Go项目不针对大多数或所有版本的clang进行测试,而是专注于仅针对最近版本的clang进行测试。如果您在使用clang和cgo时遇到问题,请提交一个问题。对于修复Go构建与旧版本clang的问题的补丁,一般来说是受欢迎的,只要它们不引入显著的长期维护负担。Go项目保留在未来设置clang的最低所需版本的权利。"
顺便说一下,我们也可以将这段文字应用到gcc上,因为事实也是我们没有针对每个gcc版本进行测试。唯一的区别是我们确实设置了一个最低所需版本。