]> Cypherpunks.ru repositories - goredo.git/blobdiff - run.go
bmake/gmake jobserver protocol compatibility
[goredo.git] / run.go
diff --git a/run.go b/run.go
index 2efd2d31a80e20917f0ee89a027da0f10354ddca..1c1b0d7759295786f9e1237975a5a8e18064bd1f 100644 (file)
--- a/run.go
+++ b/run.go
@@ -67,6 +67,8 @@ var (
        flagTraceAll     = flag.Bool("xx", false, fmt.Sprintf("trace (sh -x) all targets (%s=1)", EnvTrace))
        flagStderrKeep   = flag.Bool("logs", false, fmt.Sprintf("keep job's stderr (%s=1)", EnvStderrKeep))
        flagStderrSilent = flag.Bool("silent", false, fmt.Sprintf("do not print job's stderr (%s=1)", EnvStderrSilent))
+
+       TracedAll bool
 )
 
 type RunErr struct {
@@ -87,7 +89,7 @@ func (e *RunErr) Name() string {
        if e.Finished == nil {
                return name
        }
-       return fmt.Sprintf("%s (%fsec)", name, e.Finished.Sub(*e.Started).Seconds())
+       return fmt.Sprintf("%s (%.3fs)", name, e.Finished.Sub(*e.Started).Seconds())
 }
 
 func (e RunErr) Error() string {
@@ -304,7 +306,7 @@ func runScript(tgtOrig string, errs chan error, traced bool) error {
                args = make([]string, 0, 3)
        } else {
                cmdName = "/bin/sh"
-               if traced {
+               if traced || TracedAll {
                        args = append(args, "-ex")
                } else {
                        args = append(args, "-e")
@@ -360,18 +362,6 @@ func runScript(tgtOrig string, errs chan error, traced bool) error {
                fdNum++
        }
 
-       if JSR == nil {
-               // infinite jobs
-               cmd.Env = append(cmd.Env, fmt.Sprintf("%s=NO", EnvJSFd))
-       } else {
-               cmd.ExtraFiles = append(cmd.ExtraFiles, JSR)
-               cmd.ExtraFiles = append(cmd.ExtraFiles, JSW)
-               cmd.Env = append(cmd.Env, fmt.Sprintf(
-                       "%s=%d,%d", EnvJSFd, 3+fdNum+0, 3+fdNum+1,
-               ))
-               fdNum += 2
-       }
-
        // Preparing stderr
        var fdStderr *os.File
        if StderrKeep {
@@ -394,7 +384,21 @@ func runScript(tgtOrig string, errs chan error, traced bool) error {
 
        Jobs.Add(1)
        go func() {
-               jsAcquire(shCtx)
+               jsToken := jsAcquire(shCtx)
+               if JSR == nil {
+                       // infinite jobs
+                       cmd.Env = append(cmd.Env, fmt.Sprintf("%s=NO", EnvJobs))
+               } else {
+                       cmd.ExtraFiles = append(cmd.ExtraFiles, JSR)
+                       cmd.ExtraFiles = append(cmd.ExtraFiles, JSW)
+                       cmd.Env = append(cmd.Env, fmt.Sprintf(
+                               "%s=%s %s%d,%d",
+                               MakeFlagsName, MakeFlags, MakeJSArg, 3+fdNum+0, 3+fdNum+1,
+                       ))
+                       fdNum += 2
+                       cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%d", EnvJSToken, jsToken))
+               }
+
                if FdStatus != nil {
                        FdStatus.Write([]byte{StatusRun})
                }
@@ -419,7 +423,7 @@ func runScript(tgtOrig string, errs chan error, traced bool) error {
                fdNum++
 
                defer func() {
-                       jsRelease(shCtx)
+                       jsRelease(shCtx, jsToken)
                        lockRelease()
                        fdDep.Close()
                        fdStdout.Close()
@@ -466,7 +470,7 @@ func runScript(tgtOrig string, errs chan error, traced bool) error {
                                if fdStderr != nil {
                                        ts.FromTime(time.Now())
                                        LogMutex.Lock()
-                                       fmt.Fprintf(fdStderr, "%s %s\n", tai64n.Encode(ts[:]), line)
+                                       fmt.Fprintln(fdStderr, tai64n.Encode(ts[:]), line)
                                        LogMutex.Unlock()
                                }
                                if StderrSilent {