{"record":{"id":"346d34d6bdb75fcd","repo":"golang/go","slug":"s-entry-is-relative-must-be-absolute-path-q","errorCode":null,"errorMessage":"%s entry is relative; must be absolute path: %q","messagePattern":"(.+?) entry is relative; must be absolute path: %q","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/cmd/go/internal/envcmd/env.go","lineNumber":689,"sourceCode":"\t\t\treturn fmt.Errorf(\"GOPATH entry is relative; must be absolute path: %q\", val)\n\t\t}\n\tcase \"GOMODCACHE\":\n\t\tif !filepath.IsAbs(val) && val != \"\" {\n\t\t\treturn fmt.Errorf(\"GOMODCACHE entry is relative; must be absolute path: %q\", val)\n\t\t}\n\tcase \"CC\", \"CXX\":\n\t\tif val == \"\" {\n\t\t\tbreak\n\t\t}\n\t\targs, err := quoted.Split(val)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"invalid %s: %v\", key, err)\n\t\t}\n\t\tif len(args) == 0 {\n\t\t\treturn fmt.Errorf(\"%s entry cannot contain only space\", key)\n\t\t}\n\t\tif !filepath.IsAbs(args[0]) && args[0] != filepath.Base(args[0]) {\n\t\t\treturn fmt.Errorf(\"%s entry is relative; must be absolute path: %q\", key, args[0])\n\t\t}\n\t}\n\n\tif !utf8.ValidString(val) {\n\t\treturn fmt.Errorf(\"invalid UTF-8 in %s=... value\", key)\n\t}\n\tif strings.Contains(val, \"\\x00\") {\n\t\treturn fmt.Errorf(\"invalid NUL in %s=... value\", key)\n\t}\n\tif strings.ContainsAny(val, \"\\v\\r\\n\") {\n\t\treturn fmt.Errorf(\"invalid newline in %s=... value\", key)\n\t}\n\treturn nil\n}\n\nfunc readEnvFileLines(mustExist bool) []string {\n\tfile, _, err := cfg.EnvFile()\n\tif file == \"\" {","sourceCodeStart":671,"sourceCodeEnd":707,"githubUrl":"https://github.com/golang/go/blob/b6b368adc57c96c3151d224d172029f233ead2c3/src/cmd/go/internal/envcmd/env.go#L671-L707","documentation":"Returned by checkEnvWrite for CC/CXX when the first token of the split command is neither absolute nor a bare base name (i.e. it contains a path separator but is not absolute). Such paths are unstable because resolution depends on the working directory.","triggerScenarios":"`go env -w CC=./gcc`, `go env -w CC=bin/clang`, `go env -w CC=../toolchains/cc`, or any first token with a separator that is not absolute and not a plain base name.","commonSituations":"Project-local toolchain wrappers; relative wrappers intended to be resolved from $PATH (which already works via base name); monorepo setups referencing sibling directories.","solutions":["If the compiler is on $PATH, use just the base name: `go env -w CC=clang`.","Otherwise use an absolute path: `go env -w CC=/opt/toolchains/gcc`.","Install the wrapper somewhere on $PATH and reference it by base name."],"exampleFix":"# before\n$ go env -w CC=./wrappers/gcc\nerror: CC entry is relative; must be absolute path\n# after — absolute path\n$ go env -w CC=\"$PWD/wrappers/gcc\"","handlingStrategy":"validation","validationCode":"parts, _ := quoted.Split(v)\nfirst := parts[0]\nif !filepath.IsAbs(first) && first != filepath.Base(first) {\n    return fmt.Errorf(\"CC first token must be absolute or base name: %q\", first)\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use base names for $PATH-resolved compilers.","Use absolute paths for out-of-$PATH wrappers.","Never let config generators emit '../' or './' prefixes in CC."],"tags":["config","env","cc","cxx","cgo","validation","filesystem"],"backgroundTag":null,"analyzedSha":"b6b368adc57c96c3151d224d172029f233ead2c3","analyzedAt":"2026-08-12T00:22:02.250Z","schemaVersion":2},"datasetVersion":"2026-08-12T13:17:24.610Z"}