# HG changeset patch # User wenzelm # Date 1736174015 -3600 # Node ID 527daf6823fb5afb7d13f9d4a35c1ecb97ce9dd5 # Parent 78d95ff11ade1553cfa4ec87fcb85cf352f71a20 recovered "isabelle component_jcef" from bf537a75e872, adapted to 9fe5d8c70352 and 2a99fcb283ee; diff -r 78d95ff11ade -r 527daf6823fb etc/build.props --- 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 \ diff -r 78d95ff11ade -r 527daf6823fb src/Pure/Admin/component_jcef.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) + }) +} diff -r 78d95ff11ade -r 527daf6823fb src/Pure/System/isabelle_tool.scala --- 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,