On Mon, Jan 11, 2021 at 11:03 AM Alexander Zhirov <
al...@nevkontakte.com> wrote:
>
> At the moment there are at least three alternative implementations of Go that I know of (and there are probably some I don't): gccgo, tinygo and gopherjs. Of the three, only gccgo is supported by the go tool out of box. Looking at the source code, gc ang gccgo have their own implementations of the toolchain interface.
>
> The other two essentially reimplement the built system using go/build package, and, based on my experience with GopherJS, keeping up with changes to the upstream Go build tooling (modules, file embedding, etc.) is a lot of effort.
>
> Out of interest, I was investigating what would it take for GopherJS to delegate build system details to the Go tool and only provide alternative implementations of compile/link tools. For prototyping purposes -toolexec flag allows me to insert a proxy that intercepts compiler/linker invocations and invokes GopherJS as required. The nice thing is that no GopherJS-specific code needs to exist in the cmd/go codebase.
>
> I'm currently at a very early stage, but it seems to be working out. Before I spend too much time though, I'd like to probe people's opinions of a few questions:
>
> 1) Is the idea of treating cmd/compile, cmd/link (and so on) interfaces as an extension point a reasonable one? I expect that they are going to change between releases, but probably fewer than the build system as a whole.
I suspect this will give you trouble over time. When the go tool
invokes cmd/compile and cmd/link, it expects them to behave just like
the ordinary cmd/compile and cmd/link commands. For example, it
expects cmd/link to create a build ID that can be recognized by
cmd/internal/buildid. It expects to be able to pack additional
objects into archive files (see packInternal in
cmd/go/internal/work/gc.go). There may be other complex dependencies,
and certainly more will be added over time.
Ian