src/Pure/Tools/build.scala
changeset 59892 2a616319c171
parent 59891 9ce697050455
child 59893 89f3bd11fa8b
equal deleted inserted replaced
59891:9ce697050455 59892:2a616319c171
   160     extends PartialFunction[String, Session_Info]
   160     extends PartialFunction[String, Session_Info]
   161   {
   161   {
   162     def apply(name: String): Session_Info = graph.get_node(name)
   162     def apply(name: String): Session_Info = graph.get_node(name)
   163     def isDefinedAt(name: String): Boolean = graph.defined(name)
   163     def isDefinedAt(name: String): Boolean = graph.defined(name)
   164 
   164 
   165     def selection(requirements: Boolean, all_sessions: Boolean,
   165     def selection(
   166       session_groups: List[String], sessions: List[String]): (List[String], Session_Tree) =
   166       requirements: Boolean = false,
   167     {
   167       all_sessions: Boolean = false,
   168       val bad_sessions = sessions.filterNot(isDefinedAt(_))
   168       session_groups: List[String] = Nil,
       
   169       exclude_sessions: List[String] = Nil,
       
   170       sessions: List[String] = Nil): (List[String], Session_Tree) =
       
   171     {
       
   172       val bad_sessions =
       
   173         SortedSet((exclude_sessions ::: sessions).filterNot(isDefinedAt(_)): _*).toList
   169       if (bad_sessions.nonEmpty) error("Undefined session(s): " + commas_quote(bad_sessions))
   174       if (bad_sessions.nonEmpty) error("Undefined session(s): " + commas_quote(bad_sessions))
   170 
   175 
       
   176       val excluded = graph.all_succs(exclude_sessions).toSet
   171       val pre_selected =
   177       val pre_selected =
   172       {
   178       {
   173         if (all_sessions) graph.keys
   179         if (all_sessions) graph.keys
   174         else {
   180         else {
   175           val select_group = session_groups.toSet
   181           val select_group = session_groups.toSet
   177           (for {
   183           (for {
   178             (name, (info, _)) <- graph.iterator
   184             (name, (info, _)) <- graph.iterator
   179             if info.select || select(name) || apply(name).groups.exists(select_group)
   185             if info.select || select(name) || apply(name).groups.exists(select_group)
   180           } yield name).toList
   186           } yield name).toList
   181         }
   187         }
   182       }
   188       }.filterNot(excluded)
       
   189 
   183       val selected =
   190       val selected =
   184         if (requirements) (graph.all_preds(pre_selected).toSet -- pre_selected).toList
   191         if (requirements) (graph.all_preds(pre_selected).toSet -- pre_selected).toList
   185         else pre_selected
   192         else pre_selected
   186 
   193 
   187       val graph1 = graph.restrict(graph.all_preds(selected).toSet)
   194       val graph1 = graph.restrict(graph.all_preds(selected).toSet)
   531     options: Options,
   538     options: Options,
   532     inlined_files: Boolean,
   539     inlined_files: Boolean,
   533     dirs: List[Path],
   540     dirs: List[Path],
   534     sessions: List[String]): Deps =
   541     sessions: List[String]): Deps =
   535   {
   542   {
   536     val (_, tree) = find_sessions(options, dirs = dirs).selection(false, false, Nil, sessions)
   543     val (_, tree) = find_sessions(options, dirs = dirs).selection(sessions = sessions)
   537     dependencies(inlined_files = inlined_files, tree = tree)
   544     dependencies(inlined_files = inlined_files, tree = tree)
   538   }
   545   }
   539 
   546 
   540   def session_content(
   547   def session_content(
   541     options: Options,
   548     options: Options,
   756     list_files: Boolean = false,
   763     list_files: Boolean = false,
   757     check_keywords: Set[String] = Set.empty,
   764     check_keywords: Set[String] = Set.empty,
   758     no_build: Boolean = false,
   765     no_build: Boolean = false,
   759     system_mode: Boolean = false,
   766     system_mode: Boolean = false,
   760     verbose: Boolean = false,
   767     verbose: Boolean = false,
       
   768     exclude_sessions: List[String] = Nil,
   761     sessions: List[String] = Nil): Map[String, Int] =
   769     sessions: List[String] = Nil): Map[String, Int] =
   762   {
   770   {
   763     /* session tree and dependencies */
   771     /* session tree and dependencies */
   764 
   772 
   765     val full_tree = find_sessions(options.int("completion_limit") = 0, dirs, select_dirs)
   773     val full_tree = find_sessions(options.int("completion_limit") = 0, dirs, select_dirs)
   766     val (selected, selected_tree) =
   774     val (selected, selected_tree) =
   767       full_tree.selection(requirements, all_sessions, session_groups, sessions)
   775       full_tree.selection(requirements, all_sessions, session_groups, exclude_sessions, sessions)
   768 
   776 
   769     val deps = dependencies(progress, true, verbose, list_files, check_keywords, selected_tree)
   777     val deps = dependencies(progress, true, verbose, list_files, check_keywords, selected_tree)
   770 
   778 
   771     def make_stamp(name: String): String =
   779     def make_stamp(name: String): String =
   772       sources_stamp(selected_tree(name).entry_digest :: deps.sources(name))
   780       sources_stamp(selected_tree(name).entry_digest :: deps.sources(name))
  1008     list_files: Boolean = false,
  1016     list_files: Boolean = false,
  1009     check_keywords: Set[String] = Set.empty,
  1017     check_keywords: Set[String] = Set.empty,
  1010     no_build: Boolean = false,
  1018     no_build: Boolean = false,
  1011     system_mode: Boolean = false,
  1019     system_mode: Boolean = false,
  1012     verbose: Boolean = false,
  1020     verbose: Boolean = false,
       
  1021     exclude_sessions: List[String] = Nil,
  1013     sessions: List[String] = Nil): Int =
  1022     sessions: List[String] = Nil): Int =
  1014   {
  1023   {
  1015     val results =
  1024     val results =
  1016       build_results(options, progress, requirements, all_sessions,
  1025       build_results(options, progress, requirements, all_sessions, build_heap, clean_build,
  1017         build_heap, clean_build, dirs, select_dirs, session_groups, max_jobs,
  1026         dirs, select_dirs, session_groups, max_jobs, list_files, check_keywords,
  1018         list_files, check_keywords, no_build, system_mode, verbose, sessions)
  1027         no_build, system_mode, verbose, exclude_sessions, sessions)
  1019 
  1028 
  1020     val rc = (0 /: results)({ case (rc1, (_, rc2)) => rc1 max rc2 })
  1029     val rc = (0 /: results)({ case (rc1, (_, rc2)) => rc1 max rc2 })
  1021     if (rc != 0 && (verbose || !no_build)) {
  1030     if (rc != 0 && (verbose || !no_build)) {
  1022       val unfinished =
  1031       val unfinished =
  1023         (for ((name, r) <- results.iterator if r != 0) yield name).toList.sorted
  1032         (for ((name, r) <- results.iterator if r != 0) yield name).toList.sorted
  1041           Properties.Value.Int(max_jobs) ::
  1050           Properties.Value.Int(max_jobs) ::
  1042           Properties.Value.Boolean(list_files) ::
  1051           Properties.Value.Boolean(list_files) ::
  1043           Properties.Value.Boolean(no_build) ::
  1052           Properties.Value.Boolean(no_build) ::
  1044           Properties.Value.Boolean(system_mode) ::
  1053           Properties.Value.Boolean(system_mode) ::
  1045           Properties.Value.Boolean(verbose) ::
  1054           Properties.Value.Boolean(verbose) ::
  1046           Command_Line.Chunks(
  1055           Command_Line.Chunks(dirs, select_dirs, session_groups, check_keywords,
  1047               dirs, select_dirs, session_groups, check_keywords, build_options, sessions) =>
  1056               build_options, exclude_sessions, sessions) =>
  1048             val options = (Options.init() /: build_options)(_ + _)
  1057             val options = (Options.init() /: build_options)(_ + _)
  1049             val progress = new Console_Progress(verbose)
  1058             val progress = new Console_Progress(verbose)
  1050             progress.interrupt_handler {
  1059             progress.interrupt_handler {
  1051               build(options, progress, requirements, all_sessions, build_heap, clean_build,
  1060               build(options, progress, requirements, all_sessions, build_heap, clean_build,
  1052                 dirs.map(Path.explode(_)), select_dirs.map(Path.explode(_)), session_groups,
  1061                 dirs.map(Path.explode(_)), select_dirs.map(Path.explode(_)), session_groups,
  1053                 max_jobs, list_files, check_keywords.toSet, no_build, system_mode,
  1062                 max_jobs, list_files, check_keywords.toSet, no_build, system_mode,
  1054                 verbose, sessions)
  1063                 verbose, exclude_sessions, sessions)
  1055             }
  1064             }
  1056         case _ => error("Bad arguments:\n" + cat_lines(args))
  1065         case _ => error("Bad arguments:\n" + cat_lines(args))
  1057       }
  1066       }
  1058     }
  1067     }
  1059   }
  1068   }