diff --git a/go/tools/builders/env.go b/go/tools/builders/env.go index 7942f92fa0..544847ad1e 100644 --- a/go/tools/builders/env.go +++ b/go/tools/builders/env.go @@ -33,7 +33,7 @@ import ( var ( // cgoEnvVars is the list of all cgo environment variable - cgoEnvVars = []string{"CGO_CFLAGS", "CGO_CXXFLAGS", "CGO_CPPFLAGS", "CGO_LDFLAGS"} + cgoAbsEnvVars = []string{"CGO_CFLAGS", "CGO_CXXFLAGS", "CGO_CPPFLAGS"} // cgoAbsEnvFlags are all the flags that need absolute path in cgoEnvVars cgoAbsEnvFlags = []string{"-I", "-L", "-isysroot", "-isystem", "-iquote", "-include", "-gcc-toolchain", "--sysroot", "-resource-dir", "-fsanitize-blacklist", "-fsanitize-ignorelist"} // cgoAbsPlaceholder is placed in front of flag values that must be absolutized @@ -594,3 +594,40 @@ func useResponseFile(path string, argLen int) bool { } return false } + +// The go build system collects the CGO_LDFLAGS from manifests (_go_.o) and uses them in the user module linking. +// In some cases, such as when using the distributed Bazel executor, these paths may not exist (different build agents uses different sandboxing paths). +// It is better to use flags with absolute paths in the -extldflags option (in this case, they will not be saved inside the manifest). +func splitAbsEnvVar(originVar string, absArs []string) (string, string, error) { + var absolute []string + var nonAbsolute []string + absNext := false + splited, err := splitQuoted(originVar) + if err != nil { + return "", "", err + } + for i := range splited { + if absNext { + absolute = append(absolute, splited[i]) + absNext = false + continue + } + isAbsolute := false + for _, f := range absArs { + if !strings.HasPrefix(splited[i], f) { + continue + } + isAbsolute = true + absolute = append(absolute, splited[i]) + possibleValue := splited[i][len(f):] + if len(possibleValue) == 0 { + absNext = true + } + break + } + if !isAbsolute { + nonAbsolute = append(nonAbsolute, splited[i]) + } + } + return strings.Join(absolute, " "), strings.Join(nonAbsolute, " "), nil +} diff --git a/go/tools/builders/stdlib.go b/go/tools/builders/stdlib.go index 5731447090..0052e910b3 100644 --- a/go/tools/builders/stdlib.go +++ b/go/tools/builders/stdlib.go @@ -154,11 +154,23 @@ You may need to use the flags --cpu=x64_windows --compiler=mingw-gcc.`) break } } + absoluteLdFlags, nonAbsoluteLdFlags, err := splitAbsEnvVar(os.Getenv("CGO_LDFLAGS"), cgoAbsEnvFlags) + if err != nil { + return fmt.Errorf("error splitting cgo ldflags: %v", err) + } + os.Setenv("CGO_LDFLAGS", nonAbsoluteLdFlags) + if len(absoluteLdFlags) > 0 { + ldflags = append(ldflags, "-extldflags") + splitFlags := strings.Split(absoluteLdFlags, " ") + absArgs(splitFlags, cgoAbsEnvFlags) + ldflags = append(ldflags, splitFlags...) + } + installArgs = append(installArgs, "-gcflags="+allSlug+strings.Join(gcflags, " ")) installArgs = append(installArgs, "-ldflags="+allSlug+strings.Join(ldflags, " ")) installArgs = append(installArgs, "-asmflags="+allSlug+strings.Join(asmflags, " ")) - if err := absCCCompiler(cgoEnvVars, cgoAbsEnvFlags); err != nil { + if err := absCCCompiler(cgoAbsEnvVars, cgoAbsEnvFlags); err != nil { return fmt.Errorf("error modifying cgo environment to absolute path: %v", err) } diff --git a/go/tools/builders/stdliblist.go b/go/tools/builders/stdliblist.go index 2648d2486d..acd54ccd0d 100644 --- a/go/tools/builders/stdliblist.go +++ b/go/tools/builders/stdliblist.go @@ -257,7 +257,7 @@ func stdliblist(args []string) error { } os.Setenv("CC", quotePathIfNeeded(abs(ccEnv))) - if err := absCCCompiler(cgoEnvVars, cgoAbsEnvFlags); err != nil { + if err := absCCCompiler(cgoAbsEnvVars, cgoAbsEnvFlags); err != nil { return fmt.Errorf("error modifying cgo environment to absolute path: %v", err) }