recovered "isabelle component_jcef" from bf537a75e872, adapted to 9fe5d8c70352 and 2a99fcb283ee;
authorwenzelm
Mon, 06 Jan 2025 15:33:35 +0100
changeset 81735 527daf6823fb
parent 81734 78d95ff11ade
child 81736 30ae92baf0c3
recovered "isabelle component_jcef" from bf537a75e872, adapted to 9fe5d8c70352 and 2a99fcb283ee;
etc/build.props
src/Pure/Admin/component_jcef.scala
src/Pure/System/isabelle_tool.scala
--- a/etc/build.props	Sun Jan 05 22:28:05 2025 +0100
+++ b/etc/build.props	Mon Jan 06 15:33:35 2025 +0100
@@ -28,6 +28,7 @@
   src/Pure/Admin/component_fonts.scala \
   src/Pure/Admin/component_hugo.scala \
   src/Pure/Admin/component_javamail.scala \
+  src/Pure/Admin/component_jcef.scala \
   src/Pure/Admin/component_jdk.scala \
   src/Pure/Admin/component_jedit.scala \
   src/Pure/Admin/component_jsoup.scala \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Pure/Admin/component_jcef.scala	Mon Jan 06 15:33:35 2025 +0100
@@ -0,0 +1,172 @@
+/*  Title:      Pure/Admin/component_jcef.scala
+    Author:     Makarius
+
+Build Isabelle component for Java Chromium Embedded Framework (JCEF).
+See also:
+
+  - https://github.com/jcefmaven/jcefbuild
+  - https://github.com/chromiumembedded/java-cef
+*/
+
+package isabelle
+
+
+object Component_JCEF {
+  /* platform information */
+
+  sealed case class JCEF_Platform(
+    platform_name: String, archive: String, lib: String, library: String)
+
+  private val linux_library =
+    """ISABELLE_JCEF_LIBRARY="$ISABELLE_JCEF_LIB/libcef.so"
+      export LD_LIBRARY_PATH="$ISABELLE_JCEF_LIB:$JAVA_HOME/lib:$LD_LIBRARY_PATH""""
+
+  private val macos_library =
+    """export JAVA_LIBRARY_PATH="$ISABELLE_JCEF_HOME/bin/jcef_app.app/Contents/Java:$ISABELLE_JCEF_LIB:$JAVA_LIBRARY_PATH""""
+
+  private val windows_library =
+    """export PATH="$ISABELLE_JCEF_LIB:$PATH""""
+
+  val platforms: List[JCEF_Platform] =
+    List(
+      JCEF_Platform("x86_64-linux", "linux-amd64.tar.gz", "bin/lib/linux64", linux_library),
+      JCEF_Platform("arm64-linux", "linux-arm64.tar.gz", "bin/lib/linux64", linux_library),
+      JCEF_Platform("x86_64-darwin", "macosx-amd64.tar.gz",
+        "bin/jcef_app.app/Contents/Frameworks/Chromium Embedded Framework.framework/Libraries", macos_library),
+      JCEF_Platform("arm64-darwin", "macosx-arm64.tar.gz",
+        "bin/jcef_app.app/Contents/Frameworks/Chromium Embedded Framework.framework/Libraries", macos_library),
+      JCEF_Platform("x86_64-windows", "windows-amd64.tar.gz", "bin/lib/win64", windows_library))
+
+
+  /* build JCEF */
+
+  val default_url = "https://github.com/jcefmaven/jcefbuild/releases/download"
+  val default_version = "1.0.18"
+
+  def build_jcef(
+    base_url: String = default_url,
+    version: String = default_version,
+    target_dir: Path = Path.current,
+    progress: Progress = new Progress
+  ): Unit = {
+    /* component name */
+
+    val component = "jcef-" + version
+    val component_dir =
+      Components.Directory(target_dir + Path.basic(component)).create(progress = progress)
+
+
+    /* download and assemble platforms */
+
+    val platform_settings: List[String] =
+      for (platform <- platforms) yield {
+        Isabelle_System.with_tmp_file("archive", ext = "tar.gz") { archive_file =>
+          val url = base_url + "/" + version + "/" + platform.archive
+          Isabelle_System.download_file(url, archive_file, progress = progress)
+
+          val platform_dir = component_dir.path + Path.explode(platform.platform_name)
+          Isabelle_System.make_directory(platform_dir)
+          Isabelle_System.gnutar("-xzf " + File.bash_path(archive_file), dir = platform_dir).check
+
+          for {
+            file <- File.find_files(platform_dir.file).iterator
+            name = file.getName
+            if File.is_dll(name) || File.is_exe(name)
+          } File.set_executable(File.path(file), true)
+
+          val classpath =
+            File.find_files(platform_dir.file, pred = file => File.is_jar(file.getName))
+              .flatMap(file => File.relative_path(platform_dir, File.path(file)))
+              .map(_.implode).sorted.map(jar => "        " + quote("$ISABELLE_JCEF_HOME/" + jar))
+              .mkString(" \\\n")
+
+          "    " + platform.platform_name + ")\n" +
+          "      " + "classpath \\\n" + classpath + "\n" +
+          "      " + "ISABELLE_JCEF_LIB=\"$ISABELLE_JCEF_HOME/" + platform.lib + "\"\n" +
+          "      " + platform.library + "\n" +
+          "      " + ";;"
+        }
+      }
+
+
+    /* settings */
+
+    File.write(component_dir.settings,
+      """# -*- shell-script -*- :mode=shellscript:
+
+ISABELLE_JCEF_PLATFORM="${ISABELLE_WINDOWS_PLATFORM64:-${ISABELLE_APPLE_PLATFORM64:-$ISABELLE_PLATFORM64}}"
+if [ -d "$COMPONENT/$ISABELLE_JCEF_PLATFORM" ]
+then
+  ISABELLE_JCEF_HOME="$COMPONENT/$ISABELLE_JCEF_PLATFORM"
+  ISABELLE_JCEF_LIBRARY=""
+  case "$ISABELLE_JCEF_PLATFORM" in
+""" + cat_lines(platform_settings) + """
+  esac
+fi
+""")
+
+
+    /* README */
+
+    File.write(component_dir.README,
+      """This distribution of Java Chromium Embedded Framework (JCEF)
+has been assembled from the binary builds from
+https://github.com/jcefmaven/jcefbuild/releases/tag/""" +version + """
+
+Examples invocations:
+
+* Command-line
+
+  isabelle env bash -c 'isabelle java -Djava.library.path="$(platform_path "$ISABELLE_JCEF_LIB")" tests.detailed.MainFrame'
+
+* Scala REPL (e.g. Isabelle/jEdit Console)
+
+  import isabelle._
+  System.setProperty("java.library.path", File.platform_path(Path.explode("$ISABELLE_JCEF_LIB")))
+  org.cef.CefApp.startup(Array())
+  GUI_Thread.later { val frame = new tests.detailed.MainFrame(false, false, false, Array()); frame.setSize(1200,900); frame.setVisible(true) }
+
+* Demo websites
+
+    https://mozilla.github.io/pdf.js/web/viewer.html
+    https://www.w3schools.com/w3css/w3css_demo.asp
+
+
+        Makarius
+        """ + Date.Format.date(Date.now()) + "\n")
+  }
+
+
+  /* Isabelle tool wrapper */
+
+  val isabelle_tool =
+    Isabelle_Tool("component_jcef", "build component for Java Chromium Embedded Framework",
+      Scala_Project.here,
+      { args =>
+        var target_dir = Path.current
+        var base_url = default_url
+        var version = default_version
+
+        val getopts = Getopts("""
+Usage: isabelle component_jcef [OPTIONS]
+
+  Options are:
+    -D DIR       target directory (default ".")
+    -U URL       download URL (default: """" + default_url + """")
+    -V VERSION   version (default: """" + default_version + """")
+
+  Build component for Java Chromium Embedded Framework.
+""",
+          "D:" -> (arg => target_dir = Path.explode(arg)),
+          "U:" -> (arg => base_url = arg),
+          "V:" -> (arg => version = arg))
+
+        val more_args = getopts(args)
+        if (more_args.nonEmpty) getopts.usage()
+
+        val progress = new Console_Progress()
+
+        build_jcef(base_url = base_url, version = version, target_dir = target_dir,
+          progress = progress)
+      })
+}
--- a/src/Pure/System/isabelle_tool.scala	Sun Jan 05 22:28:05 2025 +0100
+++ b/src/Pure/System/isabelle_tool.scala	Mon Jan 06 15:33:35 2025 +0100
@@ -181,6 +181,7 @@
   Component_Fonts.isabelle_tool,
   Component_Hugo.isabelle_tool,
   Component_Javamail.isabelle_tool,
+  Component_JCEF.isabelle_tool,
   Component_JDK.isabelle_tool,
   Component_JEdit.isabelle_tool,
   Component_Jsoup.isabelle_tool,