src/Pure/System/build.scala
changeset 48737 f3bbb9ca57d6
parent 48724 e6e1b436caf0
child 48738 f8c1a5b9488f
--- a/src/Pure/System/build.scala	Wed Aug 08 14:45:40 2012 +0200
+++ b/src/Pure/System/build.scala	Wed Aug 08 15:58:40 2012 +0200
@@ -35,6 +35,7 @@
 
   // internal version
   sealed case class Session_Info(
+    select: Boolean,
     pos: Position.T,
     groups: List[String],
     dir: Path,
@@ -47,7 +48,8 @@
 
   def is_pure(name: String): Boolean = name == "RAW" || name == "Pure"
 
-  def session_info(options: Options, dir: Path, entry: Session_Entry): (String, Session_Info) =
+  def session_info(options: Options, select: Boolean, dir: Path, entry: Session_Entry)
+      : (String, Session_Info) =
     try {
       if (entry.base_name == "") error("Bad session name")
 
@@ -80,7 +82,7 @@
         SHA1.digest((full_name, entry.parent, entry.options, entry.theories).toString)
 
       val info =
-        Session_Info(entry.pos, entry.groups, dir + path, entry.parent, entry.description,
+        Session_Info(select, entry.pos, entry.groups, dir + path, entry.parent, entry.description,
           session_options, theories, files, entry_digest)
 
       (full_name, info)
@@ -145,10 +147,12 @@
       {
         if (all_sessions) graph.keys.toList
         else {
-          val sel_group = session_groups.toSet
-          val sel = sessions.toSet
-            graph.keys.toList.filter(name =>
-              sel(name) || apply(name).groups.exists(sel_group)).toList
+          val select_group = session_groups.toSet
+          val select = sessions.toSet
+          (for {
+            (name, (info, _)) <- graph.entries
+            if info.select || select(name) || apply(name).groups.exists(select_group)
+          } yield name).toList
         }
       }
       val descendants = graph.all_succs(selected)
@@ -223,18 +227,19 @@
     if (is_session_dir(dir)) dir
     else error("Bad session root directory: " + dir.toString)
 
-  def find_sessions(options: Options, more_dirs: List[Path]): Session_Tree =
+  def find_sessions(options: Options, more_dirs: List[(Boolean, Path)]): Session_Tree =
   {
-    def find_dir(dir: Path): List[(String, Session_Info)] = find_root(dir) ::: find_roots(dir)
+    def find_dir(select: Boolean, dir: Path): List[(String, Session_Info)] =
+      find_root(select, dir) ::: find_roots(select, dir)
 
-    def find_root(dir: Path): List[(String, Session_Info)] =
+    def find_root(select: Boolean, dir: Path): List[(String, Session_Info)] =
     {
       val root = dir + ROOT
-      if (root.is_file) Parser.parse_entries(root).map(session_info(options, dir, _))
+      if (root.is_file) Parser.parse_entries(root).map(session_info(options, select, dir, _))
       else Nil
     }
 
-    def find_roots(dir: Path): List[(String, Session_Info)] =
+    def find_roots(select: Boolean, dir: Path): List[(String, Session_Info)] =
     {
       val roots = dir + ROOTS
       if (roots.is_file) {
@@ -247,18 +252,20 @@
               case ERROR(msg) =>
                 error(msg + "\nThe error(s) above occurred in session catalog " + roots.toString)
             }
-          info <- find_dir(dir1)
+          info <- find_dir(select, dir1)
         } yield info
       }
       else Nil
     }
 
+    val default_dirs = Isabelle_System.components().filter(is_session_dir(_)).map((false, _))
+
+    more_dirs foreach { case (_, dir) => check_session_dir(dir) }
+
     Session_Tree(
       for {
-        dir <-
-          Isabelle_System.components().filter(is_session_dir(_)) :::
-          more_dirs.map(check_session_dir(_))
-        info <- find_dir(dir)
+        (select, dir) <- default_dirs ::: more_dirs
+        info <- find_dir(select, dir)
       } yield info)
   }
 
@@ -529,7 +536,7 @@
     all_sessions: Boolean = false,
     build_heap: Boolean = false,
     clean_build: Boolean = false,
-    more_dirs: List[Path] = Nil,
+    more_dirs: List[(Boolean, Path)] = Nil,
     session_groups: List[String] = Nil,
     max_jobs: Int = 1,
     no_build: Boolean = false,
@@ -696,9 +703,12 @@
           Properties.Value.Boolean(no_build) ::
           Properties.Value.Boolean(system_mode) ::
           Properties.Value.Boolean(verbose) ::
-          Command_Line.Chunks(more_dirs, session_groups, build_options, sessions) =>
-            build(all_sessions, build_heap, clean_build, more_dirs.map(Path.explode),
-              session_groups, max_jobs, no_build, build_options, system_mode, verbose, sessions)
+          Command_Line.Chunks(select_dirs, include_dirs, session_groups, build_options, sessions) =>
+            val dirs =
+              select_dirs.map(d => (true, Path.explode(d))) :::
+              include_dirs.map(d => (false, Path.explode(d)))
+            build(all_sessions, build_heap, clean_build, dirs, session_groups,
+              max_jobs, no_build, build_options, system_mode, verbose, sessions)
         case _ => error("Bad arguments:\n" + cat_lines(args))
       }
     }