src/Pure/Tools/build.scala
changeset 65251 4b0a43afc3fb
parent 65250 13a6c81534a8
child 65253 85c0ac5c2589
equal deleted inserted replaced
65250:13a6c81534a8 65251:4b0a43afc3fb
    88           || !graph.defined(name)  // FIXME scala-2.10.0 TreeSet problem!?
    88           || !graph.defined(name)  // FIXME scala-2.10.0 TreeSet problem!?
    89           || !graph.is_minimal(name))
    89           || !graph.is_minimal(name))
    90       if (it.hasNext) { val name = it.next; Some((name, graph.get_node(name))) }
    90       if (it.hasNext) { val name = it.next; Some((name, graph.get_node(name))) }
    91       else None
    91       else None
    92     }
    92     }
    93   }
       
    94 
       
    95 
       
    96   /* source dependencies and static content */
       
    97 
       
    98   sealed case class Deps(deps: Map[String, Sessions.Base])
       
    99   {
       
   100     def is_empty: Boolean = deps.isEmpty
       
   101     def apply(name: String): Sessions.Base = deps(name)
       
   102     def sources(name: String): List[SHA1.Digest] = deps(name).sources.map(_._2)
       
   103   }
       
   104 
       
   105   def dependencies(
       
   106       progress: Progress = No_Progress,
       
   107       inlined_files: Boolean = false,
       
   108       verbose: Boolean = false,
       
   109       list_files: Boolean = false,
       
   110       check_keywords: Set[String] = Set.empty,
       
   111       tree: Sessions.Tree): Deps =
       
   112     Deps((Map.empty[String, Sessions.Base] /: tree.topological_order)(
       
   113       { case (deps, (name, info)) =>
       
   114           if (progress.stopped) throw Exn.Interrupt()
       
   115 
       
   116           try {
       
   117             val resources =
       
   118               new Resources(
       
   119                 info.parent match {
       
   120                   case None => Sessions.Base.bootstrap
       
   121                   case Some(parent) => deps(parent)
       
   122                 })
       
   123 
       
   124             if (verbose || list_files) {
       
   125               val groups =
       
   126                 if (info.groups.isEmpty) ""
       
   127                 else info.groups.mkString(" (", " ", ")")
       
   128               progress.echo("Session " + info.chapter + "/" + name + groups)
       
   129             }
       
   130 
       
   131             val thy_deps =
       
   132             {
       
   133               val root_theories =
       
   134                 info.theories.flatMap({
       
   135                   case (global, _, thys) =>
       
   136                     thys.map(thy =>
       
   137                       (resources.node_name(
       
   138                         if (global) "" else name, info.dir + resources.thy_path(thy)), info.pos))
       
   139                 })
       
   140               val thy_deps = resources.thy_info.dependencies(name, root_theories)
       
   141 
       
   142               thy_deps.errors match {
       
   143                 case Nil => thy_deps
       
   144                 case errs => error(cat_lines(errs))
       
   145               }
       
   146             }
       
   147 
       
   148             val known_theories =
       
   149               (resources.base.known_theories /: thy_deps.deps)({ case (known, dep) =>
       
   150                 val name = dep.name
       
   151                 known.get(name.theory) match {
       
   152                   case Some(name1) if name != name1 =>
       
   153                     error("Duplicate theory " + quote(name.node) + " vs. " + quote(name1.node))
       
   154                   case _ =>
       
   155                     known + (name.theory -> name) + (Long_Name.base_name(name.theory) -> name)
       
   156                 }
       
   157               })
       
   158 
       
   159             val loaded_theories = thy_deps.loaded_theories
       
   160             val keywords = thy_deps.keywords
       
   161             val syntax = thy_deps.syntax
       
   162 
       
   163             val theory_files = thy_deps.deps.map(dep => Path.explode(dep.name.node))
       
   164             val loaded_files =
       
   165               if (inlined_files) {
       
   166                 val pure_files =
       
   167                   if (Sessions.pure_name(name)) Sessions.pure_files(resources, syntax, info.dir)
       
   168                   else Nil
       
   169                 pure_files ::: thy_deps.loaded_files
       
   170               }
       
   171               else Nil
       
   172 
       
   173             val all_files =
       
   174               (theory_files ::: loaded_files :::
       
   175                 info.files.map(file => info.dir + file) :::
       
   176                 info.document_files.map(file => info.dir + file._1 + file._2)).map(_.expand)
       
   177 
       
   178             if (list_files)
       
   179               progress.echo(cat_lines(all_files.map(_.implode).sorted.map("  " + _)))
       
   180 
       
   181             if (check_keywords.nonEmpty)
       
   182               Check_Keywords.check_keywords(progress, syntax.keywords, check_keywords, theory_files)
       
   183 
       
   184             val sources = all_files.map(p => (p, SHA1.digest(p.file)))
       
   185 
       
   186             val session_graph =
       
   187               Present.session_graph(info.parent getOrElse "",
       
   188                 resources.base.loaded_theories, thy_deps.deps)
       
   189 
       
   190             val base =
       
   191               Sessions.Base(
       
   192                 loaded_theories, known_theories, keywords, syntax, sources, session_graph)
       
   193             deps + (name -> base)
       
   194           }
       
   195           catch {
       
   196             case ERROR(msg) =>
       
   197               cat_error(msg, "The error(s) above occurred in session " +
       
   198                 quote(name) + Position.here(info.pos))
       
   199           }
       
   200       }))
       
   201 
       
   202   def session_base(options: Options, session: String, dirs: List[Path] = Nil): Sessions.Base =
       
   203   {
       
   204     val (_, tree) = Sessions.load(options, dirs = dirs).selection(sessions = List(session))
       
   205     dependencies(tree = tree)(session)
       
   206   }
    93   }
   207 
    94 
   208 
    95 
   209   /* jobs */
    96   /* jobs */
   210 
    97 
   429     /* session selection and dependencies */
   316     /* session selection and dependencies */
   430 
   317 
   431     val build_options = options.int.update("completion_limit", 0).bool.update("ML_statistics", true)
   318     val build_options = options.int.update("completion_limit", 0).bool.update("ML_statistics", true)
   432     val full_tree = Sessions.load(build_options, dirs, select_dirs)
   319     val full_tree = Sessions.load(build_options, dirs, select_dirs)
   433     val (selected, selected_tree) = selection(full_tree)
   320     val (selected, selected_tree) = selection(full_tree)
   434     val deps = dependencies(progress, true, verbose, list_files, check_keywords, selected_tree)
   321     val deps =
       
   322       Sessions.dependencies(progress, true, verbose, list_files, check_keywords, selected_tree)
   435 
   323 
   436     def session_sources_stamp(name: String): String =
   324     def session_sources_stamp(name: String): String =
   437       sources_stamp(selected_tree(name).meta_digest :: deps.sources(name))
   325       sources_stamp(selected_tree(name).meta_digest :: deps.sources(name))
   438 
   326 
   439     val store = Sessions.store(system_mode)
   327     val store = Sessions.store(system_mode)