Set-StrictMode -Version Latest $scriptPath = Split-Path -Parent $MyInvocation.MyCommand.Path Set-Location (Join-Path $scriptPath '..') $binDir = "bin" if (-not (Test-Path -Path $binDir)) { New-Item -ItemType Directory -Path $binDir } $gitCommit = git rev-list -1 HEAD $gitTag = git rev-list --tags --max-count=1 # Add an array of common OSes and architectures $targets = @( # "darwin:amd64", # "darwin:arm64", # "linux:amd64", # "linux:arm64", # "linux:386", # "freebsd:amd64", # "freebsd:arm64", "windows:amd64" ) Get-ChildItem -Directory "cmd" | ForEach-Object { $b = $_.Name foreach ($target in $targets) { $os_arch = $target -split ":" $os = $os_arch[0] $arch = $os_arch[1] $binaryName = "$b-$os-$arch" if ($os -eq "windows") { $binaryName += ".exe" } Write-Host -NoNewline "Building $b for $os/$arch..." if (-not [string]::IsNullOrEmpty($gitTag)) { $gitVersion = git describe --tags $gitTag $env:GOOS = $os $env:GOARCH = $arch & go build -mod=vendor -ldflags="-s -w -X main.GitCommit=$gitCommit -X main.GitVersion=$gitVersion" -o "bin/$binaryName" -a "cmd/$b/main.go" } else { $env:GOOS = $os $env:GOARCH = $arch & go build -mod=vendor -ldflags="-s -w -X main.GitCommit=$gitCommit" -o "bin/$binaryName" -a "cmd/$b/main.go" } Write-Host "done" } }