Skip to content

Commit 83819e7

Browse files
bennyscetbunArielleA
authored andcommitted
turn relative path to absolute path in environment's cgo's flags (bazel-contrib#1536)
1 parent 7ec4438 commit 83819e7

File tree

4 files changed

+36
-20
lines changed

4 files changed

+36
-20
lines changed

go/tools/builders/asm.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ func run(args []string) error {
5252
// Build source with the assembler.
5353
goargs := goenv.goTool("asm", toolArgs...)
5454
goargs = append(goargs, source)
55-
absArgs(goargs, []string{"I", "o", "trimpath"})
55+
absArgs(goargs, []string{"-I", "-o", "-trimpath"})
5656
return goenv.runCommand(goargs)
5757
}
5858

go/tools/builders/compile.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ func run(args []string) error {
118118
for _, f := range files {
119119
goargs = append(goargs, f.filename)
120120
}
121-
absArgs(goargs, []string{"I", "o", "trimpath"})
121+
absArgs(goargs, []string{"-I", "-o", "-trimpath"})
122122
return goenv.runCommand(goargs)
123123
}
124124

go/tools/builders/env.go

+28-18
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,13 @@ import (
2727
"strings"
2828
)
2929

30+
var (
31+
// cgoEnvVars is the list of all cgo environment variable
32+
cgoEnvVars = []string{"CGO_CFLAGS", "CGO_CXXFLAGS", "CGO_CPPFLAGS", "CGO_LDFLAGS"}
33+
// cgoAbsEnvFlags are all the flags that need absolute path in cgoEnvVars
34+
cgoAbsEnvFlags = []string{"-I", "-L", "-isysroot", "-isystem", "-iquote", "-include", "-gcc-toolchain", "--sysroot"}
35+
)
36+
3037
// env holds a small amount of Go environment and toolchain information
3138
// which is common to multiple builders. Most Bazel-agnostic build information
3239
// is collected in go/build.Default though.
@@ -100,6 +107,17 @@ func (e *env) runCommandToFile(w io.Writer, args []string) error {
100107
return runAndLogCommand(cmd, e.verbose)
101108
}
102109

110+
func absEnv(envNameList []string, argList []string) error {
111+
for _, envName := range envNameList {
112+
splitedEnv := strings.Fields(os.Getenv(envName))
113+
absArgs(splitedEnv, argList)
114+
if err := os.Setenv(envName, strings.Join(splitedEnv, " ")); err != nil {
115+
return err
116+
}
117+
}
118+
return nil
119+
}
120+
103121
func runAndLogCommand(cmd *exec.Cmd, verbose bool) error {
104122
if verbose {
105123
formatCommand(os.Stderr, cmd)
@@ -144,29 +162,21 @@ func absArgs(args []string, flags []string) {
144162
absNext = false
145163
continue
146164
}
147-
if !strings.HasPrefix(args[i], "-") {
148-
continue
149-
}
150-
var flag, value string
151-
var separate bool
152-
if j := strings.IndexByte(args[i], '='); j >= 0 {
153-
flag = args[i][:j]
154-
value = args[i][j+1:]
155-
} else {
156-
separate = true
157-
flag = args[i]
158-
}
159-
flag = strings.TrimLeft(args[i], "-")
160165
for _, f := range flags {
161-
if flag != f {
166+
if !strings.HasPrefix(args[i], f) {
162167
continue
163168
}
164-
if separate {
169+
possibleValue := args[i][len(f):]
170+
if len(possibleValue) == 0 {
165171
absNext = true
166-
} else {
167-
value = abs(value)
168-
args[i] = fmt.Sprintf("-%s=%s", flag, value)
172+
break
173+
}
174+
separator := ""
175+
if possibleValue[0] == '=' {
176+
possibleValue = possibleValue[1:]
177+
separator = "="
169178
}
179+
args[i] = fmt.Sprintf("%s%s%s", f, separator, abs(possibleValue))
170180
break
171181
}
172182
}

go/tools/builders/stdlib.go

+6
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,12 @@ func run(args []string) error {
101101
installArgs = append(installArgs, "-ldflags="+allSlug+strings.Join(ldflags, " "))
102102
installArgs = append(installArgs, "-asmflags="+allSlug+strings.Join(asmflags, " "))
103103

104+
// Modifying CGO flags to use only absolute path
105+
// because go is having its own sandbox, all CGO flags must use absolute path
106+
if err := absEnv(cgoEnvVars, cgoAbsEnvFlags); err != nil {
107+
return fmt.Errorf("error modifying cgo environment to absolute path: %v", err)
108+
}
109+
104110
for _, target := range []string{"std", "runtime/cgo"} {
105111
if err := goenv.runCommand(append(installArgs, target)); err != nil {
106112
return err

0 commit comments

Comments
 (0)