Skip to content

Commit

Permalink
Merge pull request #219 from prometheus/superq/single-crossbuild
Browse files Browse the repository at this point in the history
Simplify CGO crossbuilds
  • Loading branch information
SuperQ authored Mar 26, 2021
2 parents 8c080c2 + a5386c9 commit 263cfdc
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 83 deletions.
120 changes: 43 additions & 77 deletions cmd/crossbuild.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,31 +35,41 @@ import (
var (
dockerBuilderImageName = "quay.io/prometheus/golang-builder"

defaultMainPlatforms = []string{
defaultPlatforms = []string{
"aix/ppc64",
"darwin/amd64",
"darwin/arm64",
"dragonfly/amd64",
"freebsd/amd64", "freebsd/386",
"linux/amd64", "linux/386",
"netbsd/amd64", "netbsd/386",
"openbsd/amd64", "openbsd/386",
"windows/amd64", "windows/386",
"freebsd/386",
"freebsd/amd64",
"freebsd/arm64",
"freebsd/armv6",
"freebsd/armv7",
"illumos/amd64",
}
defaultARMPlatforms = []string{
"freebsd/armv6", "freebsd/armv7", "freebsd/arm64",
"linux/armv5", "linux/armv6", "linux/armv7", "linux/arm64",
"netbsd/armv6", "netbsd/armv7", "netbsd/arm64",
"openbsd/armv7", "openbsd/arm64", "darwin/arm64",
}
defaultPowerPCPlatforms = []string{
"aix/ppc64", "linux/ppc64", "linux/ppc64le",
}
defaultMIPSPlatforms = []string{
"linux/mips", "linux/mipsle",
"linux/mips64", "linux/mips64le",
}
defaultS390Platforms = []string{
"linux/386",
"linux/amd64",
"linux/arm64",
"linux/armv5",
"linux/armv6",
"linux/armv7",
"linux/mips",
"linux/mips64",
"linux/mips64le",
"linux/mipsle",
"linux/ppc64",
"linux/ppc64le",
"linux/s390x",
"netbsd/386",
"netbsd/amd64",
"netbsd/arm64",
"netbsd/armv6",
"netbsd/armv7",
"openbsd/386",
"openbsd/amd64",
"openbsd/arm64",
"openbsd/armv7",
"windows/386",
"windows/amd64",
}
)

Expand Down Expand Up @@ -112,91 +122,47 @@ func runCrossbuild() {
}

var (
mainPlatforms []string
armPlatforms []string
powerPCPlatforms []string
mipsPlatforms []string
s390xPlatforms []string
allPlatforms []string
unknownPlatforms []string

cgo = config.Go.CGo
goVersion = config.Go.Version
repoPath = config.Repository.Path
platforms = config.Crossbuild.Platforms

dockerBaseBuilderImage = fmt.Sprintf("%s:%s-base", dockerBuilderImageName, goVersion)
dockerMainBuilderImage = fmt.Sprintf("%s:%s-main", dockerBuilderImageName, goVersion)
dockerARMBuilderImage = fmt.Sprintf("%s:%s-arm", dockerBuilderImageName, goVersion)
dockerPowerPCBuilderImage = fmt.Sprintf("%s:%s-powerpc", dockerBuilderImageName, goVersion)
dockerMIPSBuilderImage = fmt.Sprintf("%s:%s-mips", dockerBuilderImageName, goVersion)
dockerS390XBuilderImage = fmt.Sprintf("%s:%s-s390x", dockerBuilderImageName, goVersion)
dockerBaseBuilderImage = fmt.Sprintf("%s:%s-base", dockerBuilderImageName, goVersion)
dockerMainBuilderImage = fmt.Sprintf("%s:%s-main", dockerBuilderImageName, goVersion)
)

var filteredPlatforms []string
for _, platform := range platforms {
var found bool
p := regexp.MustCompile(platform)
if filteredPlatforms = inSliceRE(p, defaultMainPlatforms); len(filteredPlatforms) > 0 {
found = true
mainPlatforms = append(mainPlatforms, filteredPlatforms...)
}
if filteredPlatforms = inSliceRE(p, defaultARMPlatforms); len(filteredPlatforms) > 0 {
found = true
armPlatforms = append(armPlatforms, filteredPlatforms...)
}
if filteredPlatforms = inSliceRE(p, defaultPowerPCPlatforms); len(filteredPlatforms) > 0 {
found = true
powerPCPlatforms = append(powerPCPlatforms, filteredPlatforms...)
}
if filteredPlatforms = inSliceRE(p, defaultMIPSPlatforms); len(filteredPlatforms) > 0 {
found = true
mipsPlatforms = append(mipsPlatforms, filteredPlatforms...)
}
if filteredPlatforms = inSliceRE(p, defaultS390Platforms); len(filteredPlatforms) > 0 {
found = true
s390xPlatforms = append(s390xPlatforms, filteredPlatforms...)
}
if !found {
if filteredPlatforms = inSliceRE(p, defaultPlatforms); len(filteredPlatforms) > 0 {
allPlatforms = append(allPlatforms, filteredPlatforms...)
} else {
unknownPlatforms = append(unknownPlatforms, platform)
}
}

// Remove duplicates, e.g. if linux/arm and linux/arm64 is specified, there
// would be linux/arm64 twice in the platforms without this.
mainPlatforms = removeDuplicates(mainPlatforms)
armPlatforms = removeDuplicates(armPlatforms)
powerPCPlatforms = removeDuplicates(powerPCPlatforms)
mipsPlatforms = removeDuplicates(mipsPlatforms)
s390xPlatforms = removeDuplicates(s390xPlatforms)
allPlatforms = removeDuplicates(allPlatforms)

if len(unknownPlatforms) > 0 {
warn(errors.Errorf("unknown/unhandled platforms: %s", unknownPlatforms))
}

if !cgo {
// In non-CGO, use the base image without any crossbuild toolchain
var allPlatforms []string
allPlatforms = append(allPlatforms, mainPlatforms[:]...)
allPlatforms = append(allPlatforms, armPlatforms[:]...)
allPlatforms = append(allPlatforms, powerPCPlatforms[:]...)
allPlatforms = append(allPlatforms, mipsPlatforms[:]...)
allPlatforms = append(allPlatforms, s390xPlatforms[:]...)

// In non-CGO, use the `base` image without any crossbuild toolchain.
pg := &platformGroup{"base", dockerBaseBuilderImage, allPlatforms}
if err := pg.Build(repoPath); err != nil {
fatal(errors.Wrapf(err, "The %s builder docker image exited unexpectedly", pg.Name))
}
} else {
for _, pg := range []platformGroup{
{"main", dockerMainBuilderImage, mainPlatforms},
{"ARM", dockerARMBuilderImage, armPlatforms},
{"PowerPC", dockerPowerPCBuilderImage, powerPCPlatforms},
{"MIPS", dockerMIPSBuilderImage, mipsPlatforms},
{"s390x", dockerS390XBuilderImage, s390xPlatforms},
} {
if err := pg.Build(repoPath); err != nil {
fatal(errors.Wrapf(err, "The %s builder docker image exited unexpectedly", pg.Name))
}
// In CGO, use the `main` image with crossbuild toolchain.
pg := &platformGroup{"main", dockerMainBuilderImage, allPlatforms}
if err := pg.Build(repoPath); err != nil {
fatal(errors.Wrapf(err, "The %s builder docker image exited unexpectedly", pg.Name))
}
}
}
Expand Down
7 changes: 1 addition & 6 deletions cmd/promu.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,12 +74,7 @@ func NewConfig() *Config {
config.Build.Binaries = []Binary{{Name: projInfo.Name, Path: "."}}
config.Build.Prefix = "."
config.Build.Static = true
platforms := defaultMainPlatforms
platforms = append(platforms, defaultARMPlatforms...)
platforms = append(platforms, defaultPowerPCPlatforms...)
platforms = append(platforms, defaultMIPSPlatforms...)
platforms = append(platforms, defaultS390Platforms...)
config.Crossbuild.Platforms = platforms
config.Crossbuild.Platforms = defaultPlatforms
config.Tarball.Prefix = "."
config.Go.Version = "1.12"
config.Go.CGo = false
Expand Down

0 comments on commit 263cfdc

Please sign in to comment.