
Most of the time spent compiling is spent optimizing and linking binary code. Most errors occur at the syntax or semantic (type) layers. Go's compiler is importable as a normal package, so we can do fast syntax and type checking for the 10 platforms we build on. This currently takes ~6 minutes of CPU time (parallelized). This makes presubmit cross builds superfluous, since it should catch most cross-build breaks (generally Unix and 64-bit assumptions). Example output: $ time go run test/typecheck/main.go type-checking: linux/amd64, windows/386, darwin/amd64, linux/arm, linux/386, windows/amd64, linux/arm64, linux/ppc64le, linux/s390x, darwin/386 ERROR(windows/amd64) pkg/proxy/ipvs/proxier.go:1708:27: ENXIO not declared by package unix ERROR(windows/386) pkg/proxy/ipvs/proxier.go:1708:27: ENXIO not declared by package unix real 0m45.083s user 6m15.504s sys 1m14.000s
24 lines
1.0 KiB
Plaintext
24 lines
1.0 KiB
Plaintext
Typecheck does cross-platform typechecking of source code for all Go build
|
|
platforms.
|
|
|
|
The primary benefit is speed: a full Kubernetes cross-build takes 20 minutes
|
|
and >40GB of RAM, while this takes under 2 minutes and <8GB of RAM.
|
|
|
|
It uses Go's built-in parsing and typechecking libraries (go/parser and
|
|
go/types), which unfortunately are not what the go compiler uses. Occasional
|
|
mismatches will occur, but overall they correspond closely.
|
|
|
|
Failures can be ignored if they don't block the build:
|
|
|
|
Things go/types errors on that go build doesn't:
|
|
True errors (according to the spec):
|
|
These should be fixed whenever possible. Ignore if a fix isn't possible
|
|
or is in progress (e.g., vendored code).
|
|
- unused variables in closures
|
|
False errors:
|
|
These should be ignored and reported upstream if applicable.
|
|
- type checking mismatches between staging and generated types
|
|
Things go build fails on that we don't:
|
|
Please send examples of this to rmmh@ and extend this list.
|
|
- CGo errors, including syntax and linker errors.
|