src/Pure/Tools/build.scala
changeset 77330 47eb96592aa2
parent 77326 b3f8aad678e9
child 77372 44fe9fe96130
--- a/src/Pure/Tools/build.scala	Tue Feb 21 11:20:42 2023 +0100
+++ b/src/Pure/Tools/build.scala	Tue Feb 21 12:03:52 2023 +0100
@@ -9,7 +9,7 @@
 
 
 object Build {
-  /** build with results **/
+  /* results */
 
   object Results {
     def apply(context: Build_Process.Context, results: Map[String, Process_Result]): Results =
@@ -41,6 +41,29 @@
     override def toString: String = rc.toString
   }
 
+
+  /* engine */
+
+  abstract class Engine(val name: String) extends Isabelle_System.Service {
+    override def toString: String = name
+    def init(build_context: Build_Process.Context): Build_Process
+  }
+
+  class Default_Engine extends Engine("") {
+    override def toString: String = "<default>"
+    override def init(build_context: Build_Process.Context): Build_Process =
+      new Build_Process(build_context)
+  }
+
+  lazy val engines: List[Engine] =
+    Isabelle_System.make_services(classOf[Engine])
+
+  def get_engine(name: String): Engine =
+    engines.find(_.name == name).getOrElse(error("Bad build engine " + quote(name)))
+
+
+  /* build */
+
   def build(
     options: Options,
     selection: Sessions.Selection = Sessions.Selection.empty,
@@ -147,7 +170,8 @@
 
     val results =
       Isabelle_Thread.uninterruptible {
-        val build_process = new Build_Process(build_context)
+        val engine = get_engine(build_options.string("build_engine"))
+        val build_process = engine.init(build_context)
         val res = build_process.run()
         Results(build_context, res)
       }