package nixbuild import ( "context" "iter" "strings" ) // Build builds all entries yielded by installables. func Build(ctx context.Context, installables iter.Seq[string]) error { c, cancel := context.WithCancel(ctx) defer cancel() cmd := Nix(c, CommandBuild, FlagKeepGoing, FlagNoLink, FlagStdin) if Stdout != nil { cmd.Stdout = Stdout cmd.Args = append(cmd.Args, FlagPrintBuildLogs) } else { cmd.Args = append(cmd.Args, FlagQuiet) } if Stderr != nil { cmd.Stderr = Stderr cmd.Args = append(cmd.Args, FlagVerbose) } stdin, err := cmd.StdinPipe() if err != nil { return err } if err = cmd.Start(); err != nil { return err } for drv := range installables { if strings.HasSuffix(drv, ".drv") { // this is just what nix requires now :c drv += "^*" } if _, err = stdin.Write([]byte(drv + "\n")); err != nil { return err } } if err = stdin.Close(); err != nil { return err } return cmd.Wait() }