402 def is_empty: Boolean = deps.isEmpty |
402 def is_empty: Boolean = deps.isEmpty |
403 def apply(name: String): Session_Content = deps(name) |
403 def apply(name: String): Session_Content = deps(name) |
404 def sources(name: String): List[SHA1.Digest] = deps(name).sources.map(_._2) |
404 def sources(name: String): List[SHA1.Digest] = deps(name).sources.map(_._2) |
405 } |
405 } |
406 |
406 |
407 def dependencies(progress: Build.Progress, inlined_files: Boolean, |
407 def dependencies(progress: Progress, inlined_files: Boolean, |
408 verbose: Boolean, list_files: Boolean, tree: Session_Tree): Deps = |
408 verbose: Boolean, list_files: Boolean, tree: Session_Tree): Deps = |
409 Deps((Map.empty[String, Session_Content] /: tree.topological_order)( |
409 Deps((Map.empty[String, Session_Content] /: tree.topological_order)( |
410 { case (deps, (name, info)) => |
410 { case (deps, (name, info)) => |
411 val (preloaded, parent_syntax) = |
411 val (preloaded, parent_syntax) = |
412 info.parent match { |
412 info.parent match { |
456 def session_content(inlined_files: Boolean, dirs: List[Path], session: String): Session_Content = |
456 def session_content(inlined_files: Boolean, dirs: List[Path], session: String): Session_Content = |
457 { |
457 { |
458 val options = Options.init() |
458 val options = Options.init() |
459 val (_, tree) = |
459 val (_, tree) = |
460 find_sessions(options, dirs.map((false, _))).selection(false, false, Nil, List(session)) |
460 find_sessions(options, dirs.map((false, _))).selection(false, false, Nil, List(session)) |
461 dependencies(Build.Ignore_Progress, inlined_files, false, false, tree)(session) |
461 dependencies(Ignore_Progress, inlined_files, false, false, tree)(session) |
462 } |
462 } |
463 |
463 |
464 def outer_syntax(session: String): Outer_Syntax = |
464 def outer_syntax(session: String): Outer_Syntax = |
465 session_content(false, Nil, session).syntax |
465 session_content(false, Nil, session).syntax |
466 |
466 |
467 |
467 |
468 /* jobs */ |
468 /* jobs */ |
469 |
469 |
470 private class Job(progress: Build.Progress, |
470 private class Job(progress: Progress, |
471 name: String, val info: Session_Info, output: Path, do_output: Boolean, |
471 name: String, val info: Session_Info, output: Path, do_output: Boolean, |
472 verbose: Boolean, browser_info: Path, command_timings: List[Properties.T]) |
472 verbose: Boolean, browser_info: Path, command_timings: List[Properties.T]) |
473 { |
473 { |
474 def output_path: Option[Path] = if (do_output) Some(output) else None |
474 def output_path: Option[Path] = if (do_output) Some(output) else None |
475 |
475 |
646 else None |
646 else None |
647 } |
647 } |
648 else None |
648 else None |
649 |
649 |
650 |
650 |
651 /* build */ |
651 /* build_results */ |
652 |
652 |
653 def build( |
653 def build_results( |
654 progress: Build.Progress, |
654 progress: Progress, |
655 options: Options, |
655 options: Options, |
656 requirements: Boolean = false, |
656 requirements: Boolean = false, |
657 all_sessions: Boolean = false, |
657 all_sessions: Boolean = false, |
658 build_heap: Boolean = false, |
658 build_heap: Boolean = false, |
659 clean_build: Boolean = false, |
659 clean_build: Boolean = false, |
662 max_jobs: Int = 1, |
662 max_jobs: Int = 1, |
663 list_files: Boolean = false, |
663 list_files: Boolean = false, |
664 no_build: Boolean = false, |
664 no_build: Boolean = false, |
665 system_mode: Boolean = false, |
665 system_mode: Boolean = false, |
666 verbose: Boolean = false, |
666 verbose: Boolean = false, |
667 sessions: List[String] = Nil): Int = |
667 sessions: List[String] = Nil): Map[String, Int] = |
668 { |
668 { |
669 /* session tree and dependencies */ |
669 /* session tree and dependencies */ |
670 |
670 |
671 val full_tree = find_sessions(options, more_dirs) |
671 val full_tree = find_sessions(options, more_dirs) |
672 val (selected, selected_tree) = |
672 val (selected, selected_tree) = |
887 File.read(Path.explode("~~/lib/html/library_index_footer.template"))) |
887 File.read(Path.explode("~~/lib/html/library_index_footer.template"))) |
888 } |
888 } |
889 } |
889 } |
890 |
890 |
891 |
891 |
892 /* return code */ |
892 /* results */ |
893 |
893 |
894 val rc = (0 /: results)({ case (rc1, (_, res)) => rc1 max res.rc }) |
894 results.map({ case (name, result) => (name, result.rc) }) |
|
895 } |
|
896 |
|
897 |
|
898 /* build */ |
|
899 |
|
900 def build( |
|
901 progress: Progress, |
|
902 options: Options, |
|
903 requirements: Boolean = false, |
|
904 all_sessions: Boolean = false, |
|
905 build_heap: Boolean = false, |
|
906 clean_build: Boolean = false, |
|
907 more_dirs: List[(Boolean, Path)] = Nil, |
|
908 session_groups: List[String] = Nil, |
|
909 max_jobs: Int = 1, |
|
910 list_files: Boolean = false, |
|
911 no_build: Boolean = false, |
|
912 system_mode: Boolean = false, |
|
913 verbose: Boolean = false, |
|
914 sessions: List[String] = Nil): Int = |
|
915 { |
|
916 val results = |
|
917 build_results(progress, options, requirements, all_sessions, |
|
918 build_heap, clean_build, more_dirs, session_groups, max_jobs, list_files, no_build, |
|
919 system_mode, verbose, sessions) |
|
920 |
|
921 val rc = (0 /: results)({ case (rc1, (_, rc2)) => rc1 max rc2 }) |
895 if (rc != 0 && (verbose || !no_build)) { |
922 if (rc != 0 && (verbose || !no_build)) { |
896 val unfinished = |
923 val unfinished = |
897 (for ((name, res) <- results.iterator if res.rc != 0) yield name).toList.sorted |
924 (for ((name, r) <- results.iterator if r != 0) yield name).toList.sorted |
898 progress.echo("Unfinished session(s): " + commas(unfinished)) |
925 progress.echo("Unfinished session(s): " + commas(unfinished)) |
899 } |
926 } |
900 rc |
927 rc |
901 } |
928 } |
902 |
929 |
917 Properties.Value.Boolean(no_build) :: |
944 Properties.Value.Boolean(no_build) :: |
918 Properties.Value.Boolean(system_mode) :: |
945 Properties.Value.Boolean(system_mode) :: |
919 Properties.Value.Boolean(verbose) :: |
946 Properties.Value.Boolean(verbose) :: |
920 Command_Line.Chunks(select_dirs, include_dirs, session_groups, build_options, sessions) => |
947 Command_Line.Chunks(select_dirs, include_dirs, session_groups, build_options, sessions) => |
921 val options = (Options.init() /: build_options)(_ + _) |
948 val options = (Options.init() /: build_options)(_ + _) |
922 val dirs = |
949 val more_dirs = |
923 select_dirs.map(d => (true, Path.explode(d))) ::: |
950 select_dirs.map(d => (true, Path.explode(d))) ::: |
924 include_dirs.map(d => (false, Path.explode(d))) |
951 include_dirs.map(d => (false, Path.explode(d))) |
925 val progress = new Build.Console_Progress(verbose) |
952 val progress = new Console_Progress(verbose) |
926 progress.interrupt_handler { |
953 progress.interrupt_handler { |
927 build(progress, options, requirements, all_sessions, |
954 build(progress, options, requirements, all_sessions, |
928 build_heap, clean_build, dirs, session_groups, max_jobs, list_files, no_build, |
955 build_heap, clean_build, more_dirs, session_groups, max_jobs, list_files, no_build, |
929 system_mode, verbose, sessions) |
956 system_mode, verbose, sessions) |
930 } |
957 } |
931 case _ => error("Bad arguments:\n" + cat_lines(args)) |
958 case _ => error("Bad arguments:\n" + cat_lines(args)) |
932 } |
959 } |
933 } |
960 } |