Slide 51 de 53

Construindo para outra plataforma

Uma máquina, três plataformas
$ hive build main.hive
Compiled main.hive -> main (1s)

$ hive build main.hive --target linux/arm64
Compiled main.hive -> main-linux-arm64 (2s)

$ hive build main.hive --target=windows/amd64
Compiled main.hive -> main-windows-amd64.exe (2s)
As três formas de dizer não
$ hive build main.hive --target linux/sparc
hive: `--target linux/sparc` is not a platform the Go toolchain builds for. A target is a `goos/goarch` pair — `linux/arm64`, `darwin/arm64`, `windows/amd64` — and `go tool dist list` names every one it knows.

$ hive build main.hive --target
hive: `--target` was given no platform to build for. It takes a `goos/goarch` pair — `hive build <entrypoint.hive> --target linux/arm64`.

$ hive check main.hive --target linux/arm64
hive: `--target` is a flag of `hive build`. `check` builds nothing for another platform.
Como o último passo é a toolchain do Go, um programa Hive é construído para outra plataforma do jeito que qualquer programa Go é — dizendo à toolchain qual é ela. hive build recebe um --target, e nada mais recebe.Um target é um par goos/goarch, e o par é verificado antes de qualquer coisa ser compilada. `go tool dist list` nomeia toda plataforma que a toolchain conhece, e uma que ele não nomeia é recusada ali mesmo em vez de dez segundos depois, por um build falhando em uma linguagem que você não escreveu. A lista é perguntada em vez de guardada em algum lugar, então uma plataforma que o Go aprender amanhã não exige mudança nenhuma aqui. E uma plataforma que não existe é um erro no que foi digitado, então é reportada como tal — ao lado dos outros erros de linha de comando, e não contra uma linha de um programa que não tem nada de errado.O que sai diz para que serve. Um build local de main.hive é main, e um build cruzado é main-linux-arm64: dois arquivos que não podem rodar nos mesmos lugares não podem atender pelo mesmo nome, e um build cruzado que substituísse silenciosamente o local só seria descoberto ao rodá-lo. O .exe segue o target e não a máquina, então --target windows/amd64 escreve main-windows-amd64.exe de qualquer lugar.CGO_ENABLED=0 acompanha um build cruzado e somente um. Tudo de que o runtime é feito é Go, então nenhum programa Hive precisa de um compilador C — e um compilador C cruzado é a única coisa que não se pode presumir em uma máquina que tem a toolchain do Go. Um build para a própria máquina em que roda não recebe ambiente nenhum, e é portanto byte a byte o build que sempre foi.--target é uma flag do build, e só do build. check e emit não compilam nada; test e container são sobre esta máquina; e cada um dos quatro recusa a flag em vez de aceitá-la e ignorá-la silenciosamente. run é a exceção que confirma a regra: tudo depois do entrypoint ali pertence ao programa que está sendo rodado, então um --target escrito depois dele é repassado direto, sem ser lido.