src/Pure/Tools/build.scala
changeset 62402 bff56eae3ec5
parent 62401 15a2533f1f0a
child 62403 1d7aba20a332
equal deleted inserted replaced
62401:15a2533f1f0a 62402:bff56eae3ec5
   750     check_keywords: Set[String] = Set.empty,
   750     check_keywords: Set[String] = Set.empty,
   751     no_build: Boolean = false,
   751     no_build: Boolean = false,
   752     system_mode: Boolean = false,
   752     system_mode: Boolean = false,
   753     verbose: Boolean = false,
   753     verbose: Boolean = false,
   754     exclude_sessions: List[String] = Nil,
   754     exclude_sessions: List[String] = Nil,
   755     sessions: List[String] = Nil): Map[String, Int] =
   755     sessions: List[String] = Nil): Map[String, Option[Process_Result]] =
   756   {
   756   {
   757     /* session tree and dependencies */
   757     /* session tree and dependencies */
   758 
   758 
   759     val full_tree = find_sessions(options.int("completion_limit") = 0, dirs, select_dirs)
   759     val full_tree = find_sessions(options.int("completion_limit") = 0, dirs, select_dirs)
   760     val (selected, selected_tree) =
   760     val (selected, selected_tree) =
   833         if (!files.forall(p => p.file.delete)) progress.echo(name + " FAILED to delete")
   833         if (!files.forall(p => p.file.delete)) progress.echo(name + " FAILED to delete")
   834       }
   834       }
   835     }
   835     }
   836 
   836 
   837     // scheduler loop
   837     // scheduler loop
   838     case class Result(current: Boolean, heap: String, rc: Int)
   838     case class Result(current: Boolean, heap: String, process: Option[Process_Result])
       
   839     {
       
   840       def ok: Boolean =
       
   841         process match {
       
   842           case None => false
       
   843           case Some(res) => res.rc == 0
       
   844         }
       
   845     }
   839 
   846 
   840     def sleep()
   847     def sleep()
   841     {
   848     {
   842       try { Thread.sleep(500) }
   849       try { Thread.sleep(500) }
   843       catch { case Exn.Interrupt() => Exn.Interrupt.impose() }
   850       catch { case Exn.Interrupt() => Exn.Interrupt.impose() }
   885                 }
   892                 }
   886 
   893 
   887                 no_heap
   894                 no_heap
   888               }
   895               }
   889             loop(pending - name, running - name,
   896             loop(pending - name, running - name,
   890               results + (name -> Result(false, heap, process_result.rc)))
   897               results + (name -> Result(false, heap, Some(process_result.clear))))
   891             //}}}
   898             //}}}
   892           case None if running.size < (max_jobs max 1) =>
   899           case None if running.size < (max_jobs max 1) =>
   893             //{{{ check/start next job
   900             //{{{ check/start next job
   894             pending.dequeue(running.isDefinedAt(_)) match {
   901             pending.dequeue(running.isDefinedAt(_)) match {
   895               case Some((name, info)) =>
   902               case Some((name, info)) =>
   896                 val parent_result =
   903                 val parent_result =
   897                   info.parent match {
   904                   info.parent match {
   898                     case None => Result(true, no_heap, 0)
   905                     case None => Result(true, no_heap, Some(Process_Result(0)))
   899                     case Some(parent) => results(parent)
   906                     case Some(parent) => results(parent)
   900                   }
   907                   }
   901                 val output = output_dir + Path.basic(name)
   908                 val output = output_dir + Path.basic(name)
   902                 val do_output = build_heap || queue.is_inner(name)
   909                 val do_output = build_heap || queue.is_inner(name)
   903 
   910 
   916                   }
   923                   }
   917                 }
   924                 }
   918                 val all_current = current && parent_result.current
   925                 val all_current = current && parent_result.current
   919 
   926 
   920                 if (all_current)
   927                 if (all_current)
   921                   loop(pending - name, running, results + (name -> Result(true, heap, 0)))
   928                   loop(pending - name, running,
       
   929                     results + (name -> Result(true, heap, Some(Process_Result(0)))))
   922                 else if (no_build) {
   930                 else if (no_build) {
   923                   if (verbose) progress.echo("Skipping " + name + " ...")
   931                   if (verbose) progress.echo("Skipping " + name + " ...")
   924                   loop(pending - name, running, results + (name -> Result(false, heap, 1)))
   932                   loop(pending - name, running,
       
   933                     results + (name -> Result(false, heap, Some(Process_Result(1)))))
   925                 }
   934                 }
   926                 else if (parent_result.rc == 0 && !progress.stopped) {
   935                 else if (parent_result.ok && !progress.stopped) {
   927                   progress.echo((if (do_output) "Building " else "Running ") + name + " ...")
   936                   progress.echo((if (do_output) "Building " else "Running ") + name + " ...")
   928                   val job =
   937                   val job =
   929                     new Job(progress, name, info, output, do_output, verbose, browser_info,
   938                     new Job(progress, name, info, output, do_output, verbose, browser_info,
   930                       deps(name).session_graph, queue.command_timings(name))
   939                       deps(name).session_graph, queue.command_timings(name))
   931                   loop(pending, running + (name -> (parent_result.heap, job)), results)
   940                   loop(pending, running + (name -> (parent_result.heap, job)), results)
   932                 }
   941                 }
   933                 else {
   942                 else {
   934                   progress.echo(name + " CANCELLED")
   943                   progress.echo(name + " CANCELLED")
   935                   loop(pending - name, running, results + (name -> Result(false, heap, 1)))
   944                   loop(pending - name, running, results + (name -> Result(false, heap, None)))
   936                 }
   945                 }
   937               case None => sleep(); loop(pending, running, results)
   946               case None => sleep(); loop(pending, running, results)
   938             }
   947             }
   939             ///}}}
   948             ///}}}
   940           case None => sleep(); loop(pending, running, results)
   949           case None => sleep(); loop(pending, running, results)
   957 
   966 
   958     if (!no_build) {
   967     if (!no_build) {
   959       val browser_chapters =
   968       val browser_chapters =
   960         (for {
   969         (for {
   961           (name, result) <- results.iterator
   970           (name, result) <- results.iterator
   962           if result.rc == 0 && !is_pure(name)
   971           if result.ok && !is_pure(name)
   963           info = full_tree(name)
   972           info = full_tree(name)
   964           if info.options.bool("browser_info")
   973           if info.options.bool("browser_info")
   965         } yield (info.chapter, (name, info.description))).toList.groupBy(_._1).
   974         } yield (info.chapter, (name, info.description))).toList.groupBy(_._1).
   966             map({ case (chapter, es) => (chapter, es.map(_._2)) }).filterNot(_._2.isEmpty)
   975             map({ case (chapter, es) => (chapter, es.map(_._2)) }).filterNot(_._2.isEmpty)
   967 
   976 
   970 
   979 
   971       if (browser_chapters.nonEmpty) Present.make_global_index(browser_info)
   980       if (browser_chapters.nonEmpty) Present.make_global_index(browser_info)
   972     }
   981     }
   973 
   982 
   974 
   983 
   975     /* results */
   984     /* process results */
   976 
   985 
   977     results.map({ case (name, result) => (name, result.rc) })
   986     (for ((name, result) <- results.iterator) yield (name, result.process)).toMap
   978   }
   987   }
   979 
   988 
   980 
   989 
   981   /* build */
   990   /* build */
   982 
   991 
  1003     val results =
  1012     val results =
  1004       build_results(options, progress, requirements, all_sessions, build_heap, clean_build,
  1013       build_results(options, progress, requirements, all_sessions, build_heap, clean_build,
  1005         dirs, select_dirs, exclude_session_groups, session_groups, max_jobs, list_files,
  1014         dirs, select_dirs, exclude_session_groups, session_groups, max_jobs, list_files,
  1006         check_keywords, no_build, system_mode, verbose, exclude_sessions, sessions)
  1015         check_keywords, no_build, system_mode, verbose, exclude_sessions, sessions)
  1007 
  1016 
  1008     val rc = (0 /: results)({ case (rc1, (_, rc2)) => rc1 max rc2 })
  1017     val rc = (0 /: results.iterator.flatMap(p => p._2.map(_.rc)))(_ max _)
  1009     if (rc != 0 && (verbose || !no_build)) {
  1018     if (rc != 0 && (verbose || !no_build)) {
  1010       val unfinished =
  1019       val unfinished =
  1011         (for ((name, r) <- results.iterator if r != 0) yield name).toList.sorted
  1020         (for {
       
  1021           (name, r) <- results.iterator
       
  1022           if r.isEmpty || r.isDefined && !r.get.ok
       
  1023          } yield name).toList.sorted
  1012       progress.echo("Unfinished session(s): " + commas(unfinished))
  1024       progress.echo("Unfinished session(s): " + commas(unfinished))
  1013     }
  1025     }
  1014     rc
  1026     rc
  1015   }
  1027   }
  1016 
  1028