Go Build
约 3 分钟阅读
- Go package guidelines
- Common Flags:
-trimpath -ldflags '-s -w -extldflags "-static"'
References
- GoArmGitHubgolang/go/wiki/GoArm
- go-os-arch.md
- PortingPolicyGitHubgolang/go/wiki/PortingPolicy
- Installing Go from source
- c-shared
- runtime: c-shared builds fail with musllibc golang/go#13492GitHub Issuegolang/go#13492尽量避免 cgo · 重复代码尽量 生成 · 不会下载源码到 了 - #31529 · c-shared 不支持 musl - golang/go#13492 · json omitempty 不支持 struct golang/go#11939笔记:Golang
- windows c-shared requires TDM-GCC
- Cannot dlclose, offload c-shared golang/go#11100GitHub Issuegolang/go#11100 (Related to VM)
- aarch64 -> arm64
aarch64is common in Linux environments.- Use
arm64for GOARCH.
Environment Variables
| Env | Note | macOS |
|---|---|---|
GOENV | ~/Library/Application Support/go/env | |
GOCACHE | ~/Library/Caches/go-build | |
GOMODCACHE | ~/go/pkg/mod | |
GOTOOLDIR | ||
GOMOD | go.mod location | |
GOWORK | ||
GOMAXPROCS | Max Thread | |
GOGC | 100 (off to disable) | |
GOOS | ||
GOARCH |
Flags and Options
# List all cross-compilation targets
go tool dist list
# Include cgo support status
go tool dist list -json
# Remove mod cache
go clean -modcacheBuild Modes (-buildmode)
| Mode | Description |
|---|---|
archive | build non-main, .a |
c-archive | main+imports, cgo //export |
c-shared | main+imports, cgo //export |
default | main+non-main, exec, .a |
exe | main+imports, exec, ignores non-main packages |
pie | main+imports, exec, pie |
plugin | main+imports, plugin, ignores non-main packages |
shared | non-main, for -linkshared (deprecated/broken) |
Linker Flags (-ldflags)
| Flag | Description |
|---|---|
-w | disable DWARF generation |
-s | disable symbol table |
-X 'pkg.Var=Value' | add string definition |
-linkmode=external | |
-extldflags "$LDFLAGS" |
GC Flags (-gcflags)
| Flag | Description |
|---|---|
-N | Disable optimizations |
-l | Disable inlining |
Common Flags
| Flag | Description |
|---|---|
-modcacherw | New mod cache rw - allows rm -rf |
-trimpath | Remove environment paths, reproducible builds |
-ldflags "$GOLDFLAGS" | |
-mod=readonly | Don't update go.mod |
-buildmode=pie |
Custom Version Variables
Inject version info at build time:
package main
var Version = "dev"
var CommitTime = ""
var CommitID = ""
var BuildTime = ""DEF_FLAGS="
-X 'wener.me/tools/build.Version=$(git describe --tags --abbrev=0)'
-X 'wener.me/tools/build.CommitID=$(git rev-parse --short HEAD)'
-X 'wener.me/tools/build.CommitTime=$(git log -1 --format=%cd --date=iso8601)'
-X 'wener.me/tools/build.BuildTime=$(date --iso-8601=seconds)'
"
go build -o bin/cli -ldflags "$DEF_FLAGS" ./cmd/cliBuild Constraints (Tags)
//go:build tag
//+build tag1,tag2
// Complex constraints
//go:build (linux && 386) || (darwin && !cgo)
package maingo build -tags "tag1 tag2"Build constraints documentationGo 包cmd/go不支持 Git 子目录 - #34055 · 已接受,实现中 · 私有模块目前不好使用 Not Ready · 本地开发 + CI/CD 都会遇到很多问题 · 考虑 monorepo + replace · 考虑 vendor · https://golang.org/ref/modGo笔记:Golang 模块
Cross Compilation
# Example cross compilation commands
CC=i586-mingw32-gcc GOOS=windows GOARCH=386 CGO_ENABLED=1 \
go build -v -o myprogram.exe -ldflags="-extld=$CC"
CC=x86_64-pc-linux-gcc GOOS=linux GOARCH=amd64 CGO_ENABLED=1 \
go build -v -o myprogram -ldflags="-extld=$CC"Docker Builder
Using prometheus/golang-builderGitHubprometheus/golang-builder for multi-arch builds.
docker pull quay.io/prometheus/golang-builder:arm
docker run --rm -it --entrypoint bash \
--name go-builder quay.io/prometheus/golang-builder:armArchitecture Levels (GOAMD64)
go 1.18 新增 GOAMD64 环境变量
- v1 - 默认
- v2 - CMPXCHG16B, LAHF, SAHF, POPCNT, SSE3, SSE4.1, SSE4.2, SSSE3
- 2009: Nehalem, Jaguar, Intel Atom Silvermont, QEMU
- amdv2
- v3 - AVX, AVX2, BMI1, BMI2, F16C, FMA, LZCNT, MOVBE, OSXSAVE
- 2015 - Haswell, Excavator
- amdv3
- v4 - AVX512F, AVX512BW, AVX512CD, AVX512DQ, AVX512VL
- 2017: Skylake-X, Skylake-SP
- 2022: Zen 4
- amdv4
- 参考
- GOAMD64
- Microarchitecture levelsWikipediaX86-64
# Check support
grep -oE 'avx2|bmi1|bmi2|f16|fma' /proc/cpuinfo | sort -uFAQ
unrecognized command-line option '-marm': CheckCCpath.arm-none-eabi-gcc: error: unrecognized command-line option '-pthread': Usearm-linux-eabior manage empty pthread lib.loadinternal: cannot find runtime/cgo: EnsureCGO_ENABLED=1.FATAL: kernel too old: Check target kernel version support in GCC.
关联信息
反向链接、本文链接的其他页面和外部资料。
反向链接
- Go Version笔记 · GOAMD64 · GOAMD64
Go-Release-Cycle · 一年两个版本 - 2 月,8 月 · bugfix backports 一个版本 · security backports 两个版本 · 参考 · golang/proposal · golang/go/projects/1
参考资料
GitHub5 条
- golang/go/wiki/GoArmgithub.com/golang/go/wiki/GoArm
- golang/go/wiki/PortingPolicygithub.com/golang/go/wiki/PortingPolicy
- golang/go#11100github.com/golang/go/issues/11100
- golang/go#13492github.com/golang/go/issues/13492
- prometheus/golang-buildergithub.com/prometheus/golang-builder
Wikipedia1 条
- X86-64Wikipedia:X86-64
依赖包1 条
- cmd/gopkg.go.dev/cmd/go
其他外链4 条
- gist.github.com/asukakenji/f15ba7e588ac42795f421b48b8aede63gist.github.com/asukakenji/f15ba7e588ac42795f421b48b8aede63
- go.dev/doc/install/sourcego.dev/doc/install/source
- go.dev/wiki/MinimumRequirementsgo.dev/wiki/MinimumRequirements
- wiki.archlinux.org/title/Go_package_guidelineswiki.archlinux.org/title/Go_package_guidelines