| author | wenzelm | 
| Sat, 30 Dec 2023 21:40:48 +0100 | |
| changeset 79395 | 40e3d97b277e | 
| parent 78610 | fd1fec53665b | 
| child 79633 | c59231722f10 | 
| permissions | -rw-r--r-- | 
| 78415 
a4dee214dfcf
clarified file location: to be used by regular Isabelle/Scala tools;
 wenzelm parents: 
78158diff
changeset | 1 | /* Title: Pure/System/other_isabelle.scala | 
| 64188 | 2 | Author: Makarius | 
| 3 | ||
| 77082 | 4 | Manage other Isabelle distributions: support historic versions starting from | 
| 5 | tag "build_history_base". | |
| 64188 | 6 | */ | 
| 7 | ||
| 8 | package isabelle | |
| 9 | ||
| 10 | ||
| 75393 | 11 | object Other_Isabelle {
 | 
| 77050 | 12 | def apply( | 
| 77093 | 13 | root: Path, | 
| 77050 | 14 | isabelle_identifier: String = "", | 
| 77093 | 15 | ssh: SSH.System = SSH.Local, | 
| 77050 | 16 | progress: Progress = new Progress | 
| 17 |   ): Other_Isabelle = {
 | |
| 77093 | 18 | val (isabelle_home, url_prefix) = | 
| 19 |       ssh match {
 | |
| 20 | case session: SSH.Session => (ssh.absolute_path(root), session.rsync_prefix) | |
| 21 | case _ => | |
| 22 |           if (proper_string(System.getenv("ISABELLE_SETTINGS_PRESENT")).isDefined) {
 | |
| 23 |             error("Cannot manage other Isabelle distribution: global ISABELLE_SETTINGS_PRESENT")
 | |
| 24 | } | |
| 25 | (root.canonical, "") | |
| 26 | } | |
| 27 | val isabelle_home_url = url_prefix + isabelle_home.implode | |
| 28 | new Other_Isabelle(isabelle_home, isabelle_identifier, isabelle_home_url, ssh, progress) | |
| 77050 | 29 | } | 
| 67045 | 30 | } | 
| 31 | ||
| 77041 | 32 | final class Other_Isabelle private( | 
| 67045 | 33 | val isabelle_home: Path, | 
| 34 | val isabelle_identifier: String, | |
| 77093 | 35 | isabelle_home_url: String, | 
| 36 | ssh: SSH.System, | |
| 75393 | 37 | progress: Progress | 
| 38 | ) {
 | |
| 77093 | 39 | override def toString: String = isabelle_home_url | 
| 67046 | 40 | |
| 64188 | 41 | |
| 42 | /* static system */ | |
| 43 | ||
| 65930 | 44 | def bash( | 
| 77042 | 45 | script: String, | 
| 46 | redirect: Boolean = false, | |
| 47 | echo: Boolean = false, | |
| 48 | strict: Boolean = true | |
| 49 |   ): Process_Result = {
 | |
| 77093 | 50 | ssh.execute( | 
| 51 | Isabelle_System.export_isabelle_identifier(isabelle_identifier) + | |
| 52 | "cd " + ssh.bash_path(isabelle_home) + "\n" + script, | |
| 53 | progress_stdout = progress.echo_if(echo, _), | |
| 54 | progress_stderr = progress.echo_if(echo, _), | |
| 55 | redirect = redirect, | |
| 56 | settings = false, | |
| 57 | strict = strict) | |
| 77042 | 58 | } | 
| 64188 | 59 | |
| 69166 | 60 | def getenv(name: String): String = | 
| 77071 | 61 |     bash("bin/isabelle getenv -b " + Bash.string(name)).check.out
 | 
| 69166 | 62 | |
| 77080 
7e11e96a922d
more formal Other_Isabelle.settings, with derived expand_path / bash_path;
 wenzelm parents: 
77078diff
changeset | 63 | val settings: Isabelle_System.Settings = (name: String) => getenv(name) | 
| 
7e11e96a922d
more formal Other_Isabelle.settings, with derived expand_path / bash_path;
 wenzelm parents: 
77078diff
changeset | 64 | |
| 
7e11e96a922d
more formal Other_Isabelle.settings, with derived expand_path / bash_path;
 wenzelm parents: 
77078diff
changeset | 65 | def expand_path(path: Path): Path = path.expand_env(settings) | 
| 
7e11e96a922d
more formal Other_Isabelle.settings, with derived expand_path / bash_path;
 wenzelm parents: 
77078diff
changeset | 66 | def bash_path(path: Path): String = Bash.string(expand_path(path).implode) | 
| 64188 | 67 | |
| 77085 
351eee493580
more robust locations (amending 7e11e96a922d) --- notably for cleanup() in build_release, after Admin/ been deleted;
 wenzelm parents: 
77082diff
changeset | 68 |   val isabelle_home_user: Path = expand_path(Path.explode("$ISABELLE_HOME_USER"))
 | 
| 77080 
7e11e96a922d
more formal Other_Isabelle.settings, with derived expand_path / bash_path;
 wenzelm parents: 
77078diff
changeset | 69 | |
| 77085 
351eee493580
more robust locations (amending 7e11e96a922d) --- notably for cleanup() in build_release, after Admin/ been deleted;
 wenzelm parents: 
77082diff
changeset | 70 |   def etc: Path = isabelle_home_user + Path.explode("etc")
 | 
| 77080 
7e11e96a922d
more formal Other_Isabelle.settings, with derived expand_path / bash_path;
 wenzelm parents: 
77078diff
changeset | 71 |   def etc_settings: Path = etc + Path.explode("settings")
 | 
| 
7e11e96a922d
more formal Other_Isabelle.settings, with derived expand_path / bash_path;
 wenzelm parents: 
77078diff
changeset | 72 |   def etc_preferences: Path = etc + Path.explode("preferences")
 | 
| 64188 | 73 | |
| 73625 
f8f065e20837
misc tuning and clarification: more explicit types Release_Context, Release_Archive;
 wenzelm parents: 
73522diff
changeset | 74 | |
| 69388 | 75 | /* components */ | 
| 76 | ||
| 77 | def init_components( | |
| 77128 
f40c36ab154d
clarified names to emphasize suble differences in meaning;
 wenzelm parents: 
77124diff
changeset | 78 | components_base: String = Components.dynamic_components_base, | 
| 77055 | 79 | catalogs: List[String] = Components.default_catalogs, | 
| 75393 | 80 | components: List[String] = Nil | 
| 81 |   ): List[String] = {
 | |
| 77088 
6e2c6ccc5dc0
clarified defaults: imitate "isabelle components -I" without further parameters;
 wenzelm parents: 
77087diff
changeset | 82 | val admin = Components.admin(Path.ISABELLE_HOME).implode | 
| 73240 
3e963d68d394
more robust ISABELLE_COMPONENT_REPOSITORY: use current value of managing process to avoid its fluctuation in ancient history;
 wenzelm parents: 
72375diff
changeset | 83 | |
| 77090 | 84 | catalogs.map(name => | 
| 85 | "init_components " + quote(components_base) + " " + quote(admin + "/" + name)) ::: | |
| 86 | components.map(name => | |
| 87 | "init_component " + quote(components_base) + "/" + name) | |
| 69388 | 88 | } | 
| 89 | ||
| 77097 
023273cf2651
clean components more accurately: purge other platforms or archives;
 wenzelm parents: 
77095diff
changeset | 90 | def resolve_components( | 
| 
023273cf2651
clean components more accurately: purge other platforms or archives;
 wenzelm parents: 
77095diff
changeset | 91 | echo: Boolean = false, | 
| 78610 | 92 | clean_platforms: Option[List[Platform.Family]] = None, | 
| 77124 
be90af1e3254
proper use of current ISABELLE_COMPONENT_REPOSITORY from the managing Isabelle system (amending 3e963d68d394);
 wenzelm parents: 
77123diff
changeset | 93 | clean_archives: Boolean = false, | 
| 77128 
f40c36ab154d
clarified names to emphasize suble differences in meaning;
 wenzelm parents: 
77124diff
changeset | 94 | component_repository: String = Components.static_component_repository | 
| 77097 
023273cf2651
clean components more accurately: purge other platforms or archives;
 wenzelm parents: 
77095diff
changeset | 95 |   ): Unit = {
 | 
| 77093 | 96 |     val missing = Path.split(getenv("ISABELLE_COMPONENTS_MISSING"))
 | 
| 97 |     for (path <- missing) {
 | |
| 77097 
023273cf2651
clean components more accurately: purge other platforms or archives;
 wenzelm parents: 
77095diff
changeset | 98 | Components.resolve(path.dir, path.file_name, | 
| 
023273cf2651
clean components more accurately: purge other platforms or archives;
 wenzelm parents: 
77095diff
changeset | 99 | clean_platforms = clean_platforms, | 
| 
023273cf2651
clean components more accurately: purge other platforms or archives;
 wenzelm parents: 
77095diff
changeset | 100 | clean_archives = clean_archives, | 
| 77124 
be90af1e3254
proper use of current ISABELLE_COMPONENT_REPOSITORY from the managing Isabelle system (amending 3e963d68d394);
 wenzelm parents: 
77123diff
changeset | 101 | component_repository = component_repository, | 
| 77097 
023273cf2651
clean components more accurately: purge other platforms or archives;
 wenzelm parents: 
77095diff
changeset | 102 | ssh = ssh, | 
| 77093 | 103 | progress = if (echo) progress else new Progress) | 
| 104 | } | |
| 105 | } | |
| 106 | ||
| 77094 | 107 |   def scala_build(fresh: Boolean = false, echo: Boolean = false): Unit = {
 | 
| 108 |     if (fresh) ssh.rm_tree(isabelle_home + Path.explode("lib/classes"))
 | |
| 109 | ||
| 110 |     val dummy_stty = Path.explode("~~/lib/dummy_stty/stty")
 | |
| 111 | val dummy_stty_remote = expand_path(dummy_stty) | |
| 112 |     if (!ssh.is_file(dummy_stty_remote)) {
 | |
| 113 | ssh.make_directory(dummy_stty_remote.dir) | |
| 114 | ssh.write_file(dummy_stty_remote, dummy_stty) | |
| 78158 | 115 | ssh.set_executable(dummy_stty_remote) | 
| 77094 | 116 | } | 
| 117 |     try {
 | |
| 118 | bash( | |
| 119 | "export PATH=\"" + bash_path(dummy_stty_remote.dir) + ":$PATH\"\n" + | |
| 120 |         "export CLASSPATH=" + Bash.string(getenv("ISABELLE_CLASSPATH")) + "\n" +
 | |
| 121 | "bin/isabelle jedit -b", echo = echo).check | |
| 122 | } | |
| 123 |     catch { case ERROR(msg) => cat_error("Failed to build Isabelle/Scala/Java modules:", msg) }
 | |
| 124 | } | |
| 125 | ||
| 69388 | 126 | |
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69166diff
changeset | 127 | /* settings */ | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69166diff
changeset | 128 | |
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69166diff
changeset | 129 | def clean_settings(): Boolean = | 
| 77093 | 130 | if (!ssh.is_file(etc_settings)) true | 
| 131 |     else if (ssh.read(etc_settings).startsWith("# generated by Isabelle")) {
 | |
| 132 | ssh.delete(etc_settings) | |
| 77042 | 133 | true | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69166diff
changeset | 134 | } | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69166diff
changeset | 135 | else false | 
| 64188 | 136 | |
| 75393 | 137 |   def init_settings(settings: List[String]): Unit = {
 | 
| 77078 | 138 |     if (clean_settings()) {
 | 
| 77093 | 139 | ssh.make_directory(etc_settings.dir) | 
| 140 | ssh.write(etc_settings, | |
| 77078 | 141 | "# generated by Isabelle " + Date.now() + "\n" + | 
| 142 | "#-*- shell-script -*- :mode=shellscript:\n" + | |
| 143 |         settings.mkString("\n", "\n", "\n"))
 | |
| 77042 | 144 | } | 
| 77078 | 145 |     else error("Cannot proceed with existing user settings file: " + etc_settings)
 | 
| 64188 | 146 | } | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69166diff
changeset | 147 | |
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69166diff
changeset | 148 | |
| 77123 | 149 | /* init */ | 
| 150 | ||
| 77095 | 151 | def init( | 
| 152 | other_settings: List[String] = init_components(), | |
| 153 | fresh: Boolean = false, | |
| 77097 
023273cf2651
clean components more accurately: purge other platforms or archives;
 wenzelm parents: 
77095diff
changeset | 154 | echo: Boolean = false, | 
| 78610 | 155 | clean_platforms: Option[List[Platform.Family]] = None, | 
| 77124 
be90af1e3254
proper use of current ISABELLE_COMPONENT_REPOSITORY from the managing Isabelle system (amending 3e963d68d394);
 wenzelm parents: 
77123diff
changeset | 156 | clean_archives: Boolean = false, | 
| 77128 
f40c36ab154d
clarified names to emphasize suble differences in meaning;
 wenzelm parents: 
77124diff
changeset | 157 | component_repository: String = Components.static_component_repository | 
| 77095 | 158 |   ): Unit = {
 | 
| 159 | init_settings(other_settings) | |
| 77097 
023273cf2651
clean components more accurately: purge other platforms or archives;
 wenzelm parents: 
77095diff
changeset | 160 | resolve_components( | 
| 
023273cf2651
clean components more accurately: purge other platforms or archives;
 wenzelm parents: 
77095diff
changeset | 161 | echo = echo, | 
| 
023273cf2651
clean components more accurately: purge other platforms or archives;
 wenzelm parents: 
77095diff
changeset | 162 | clean_platforms = clean_platforms, | 
| 77124 
be90af1e3254
proper use of current ISABELLE_COMPONENT_REPOSITORY from the managing Isabelle system (amending 3e963d68d394);
 wenzelm parents: 
77123diff
changeset | 163 | clean_archives = clean_archives, | 
| 
be90af1e3254
proper use of current ISABELLE_COMPONENT_REPOSITORY from the managing Isabelle system (amending 3e963d68d394);
 wenzelm parents: 
77123diff
changeset | 164 | component_repository = component_repository) | 
| 77095 | 165 | scala_build(fresh = fresh, echo = echo) | 
| 166 | } | |
| 167 | ||
| 168 | ||
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69166diff
changeset | 169 | /* cleanup */ | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69166diff
changeset | 170 | |
| 75393 | 171 |   def cleanup(): Unit = {
 | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69166diff
changeset | 172 | clean_settings() | 
| 77093 | 173 | ssh.delete(etc) | 
| 174 | ssh.delete(isabelle_home_user) | |
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69166diff
changeset | 175 | } | 
| 64188 | 176 | } |