|
|
@ -184,6 +184,17 @@ func (b *Build) TmpDir() string {
|
|
|
|
// binary. Builds are cached by path and env, so each build only happens once
|
|
|
|
// binary. Builds are cached by path and env, so each build only happens once
|
|
|
|
// per process execution.
|
|
|
|
// per process execution.
|
|
|
|
func (b *Build) BuildGoBinary(path string, env map[string]string) (string, error) {
|
|
|
|
func (b *Build) BuildGoBinary(path string, env map[string]string) (string, error) {
|
|
|
|
|
|
|
|
return b.BuildGoBinaryWithTags(path, env, nil)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// BuildGoBinaryWithTags builds the Go binary at path and returns the
|
|
|
|
|
|
|
|
// path to the binary. Builds are cached by path, env and tags, so
|
|
|
|
|
|
|
|
// each build only happens once per process execution.
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// The passed in tags override gocross's automatic selection of build
|
|
|
|
|
|
|
|
// tags, so you will have to figure out and specify all the tags
|
|
|
|
|
|
|
|
// relevant to your build.
|
|
|
|
|
|
|
|
func (b *Build) BuildGoBinaryWithTags(path string, env map[string]string, tags []string) (string, error) {
|
|
|
|
err := b.Once("init-go", func() error {
|
|
|
|
err := b.Once("init-go", func() error {
|
|
|
|
log.Printf("Initializing Go toolchain")
|
|
|
|
log.Printf("Initializing Go toolchain")
|
|
|
|
// If the build is using a tool/go, it may need to download a toolchain
|
|
|
|
// If the build is using a tool/go, it may need to download a toolchain
|
|
|
@ -197,7 +208,7 @@ func (b *Build) BuildGoBinary(path string, env map[string]string) (string, error
|
|
|
|
return "", err
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
buildKey := []any{"go-build", path, env}
|
|
|
|
buildKey := []any{"go-build", path, env, tags}
|
|
|
|
return b.goBuilds.Do(buildKey, func() (string, error) {
|
|
|
|
return b.goBuilds.Do(buildKey, func() (string, error) {
|
|
|
|
b.goBuildLimit <- struct{}{}
|
|
|
|
b.goBuildLimit <- struct{}{}
|
|
|
|
defer func() { <-b.goBuildLimit }()
|
|
|
|
defer func() { <-b.goBuildLimit }()
|
|
|
@ -207,9 +218,17 @@ func (b *Build) BuildGoBinary(path string, env map[string]string) (string, error
|
|
|
|
envStrs = append(envStrs, k+"="+v)
|
|
|
|
envStrs = append(envStrs, k+"="+v)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
sort.Strings(envStrs)
|
|
|
|
sort.Strings(envStrs)
|
|
|
|
log.Printf("Building %s (with env %s)", path, strings.Join(envStrs, " "))
|
|
|
|
|
|
|
|
buildDir := b.TmpDir()
|
|
|
|
buildDir := b.TmpDir()
|
|
|
|
cmd := b.Command(b.Repo, b.Go, "build", "-v", "-o", buildDir, path)
|
|
|
|
args := []string{"build", "-v", "-o", buildDir}
|
|
|
|
|
|
|
|
if len(tags) > 0 {
|
|
|
|
|
|
|
|
tagsStr := strings.Join(tags, ",")
|
|
|
|
|
|
|
|
log.Printf("Building %s (with env %s, tags %s)", path, strings.Join(envStrs, " "), tagsStr)
|
|
|
|
|
|
|
|
args = append(args, "-tags="+tagsStr)
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
log.Printf("Building %s (with env %s)", path, strings.Join(envStrs, " "))
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
args = append(args, path)
|
|
|
|
|
|
|
|
cmd := b.Command(b.Repo, b.Go, args...)
|
|
|
|
for k, v := range env {
|
|
|
|
for k, v := range env {
|
|
|
|
cmd.Cmd.Env = append(cmd.Cmd.Env, k+"="+v)
|
|
|
|
cmd.Cmd.Env = append(cmd.Cmd.Env, k+"="+v)
|
|
|
|
}
|
|
|
|
}
|
|
|
|