+func jsInit() {
+ jsTokens = make(map[byte]int)
+
+ makeType := os.Getenv(EnvMake)
+ var makeArgRe *regexp.Regexp
+ switch makeType {
+ case MakeTypeGmake:
+ makeArgRe = GMakeJSArgRe
+ MakeJSArg = GMakeJSArg
+ case MakeTypeBmake:
+ makeArgRe = BMakeJSArgRe
+ MakeJSArg = BMakeJSArg
+ case "":
+ fallthrough
+ case MakeTypeNone:
+ MakeFlagsName = EnvJSFd
+ makeArgRe = DMakeJSArgRe
+ MakeJSArg = DMakeJSArg
+ default:
+ log.Fatalln("unknown", EnvMake, "type")
+ }
+
+ MakeFlags = os.Getenv(MakeFlagsName)
+ jobsEnv := os.Getenv(EnvJobs)
+ if jobsEnv == "NO" {
+ // jobserver disabled, infinite jobs
+ return
+ }
+ if MakeFlags == "" {
+ // we are not running under make
+ jsStart(jobsEnv)
+ return
+ }
+
+ match := makeArgRe.FindStringSubmatch(MakeFlags)
+ if len(match) == 0 {
+ // MAKEFLAGS does not contain anything related to jobserver
+ jsStart(jobsEnv)
+ return
+ }
+ MakeFlags = match[1] + " " + match[4]
+
+ func() {
+ defer func() {
+ if err := recover(); err != nil {
+ log.Fatalln(err)
+ }
+ }()
+ JSR = mustParseFd(match[2], "JSR")
+ JSW = mustParseFd(match[3], "JSW")
+ }()
+
+ if token := os.Getenv(EnvJSToken); token != "" {
+ jsTokenInt, err := strconv.ParseUint(token, 10, 8)
+ if err != nil {
+ log.Fatalln("invalid", EnvJSToken, "format:", err)
+ }
+ jsToken = byte(jsTokenInt)
+ jsTokens[jsToken]++
+ jsRelease("ifchange entered", jsToken)