author | wenzelm |
Sun, 09 Apr 2023 23:09:24 +0200 | |
changeset 77799 | 3fb2c47a7605 |
parent 77128 | f40c36ab154d |
child 78158 | 8b5a2e4b16d4 |
permissions | -rw-r--r-- |
64188 | 1 |
/* Title: Pure/Admin/other_isabelle.scala |
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:
77078
diff
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:
77078
diff
changeset
|
64 |
|
7e11e96a922d
more formal Other_Isabelle.settings, with derived expand_path / bash_path;
wenzelm
parents:
77078
diff
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:
77078
diff
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:
77082
diff
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:
77078
diff
changeset
|
69 |
|
77085
351eee493580
more robust locations (amending 7e11e96a922d) --- notably for cleanup() in build_release, after Admin/ been deleted;
wenzelm
parents:
77082
diff
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:
77078
diff
changeset
|
71 |
def etc_settings: Path = etc + Path.explode("settings") |
7e11e96a922d
more formal Other_Isabelle.settings, with derived expand_path / bash_path;
wenzelm
parents:
77078
diff
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:
73522
diff
changeset
|
74 |
|
69388 | 75 |
/* components */ |
76 |
||
77 |
def init_components( |
|
77128
f40c36ab154d
clarified names to emphasize suble differences in meaning;
wenzelm
parents:
77124
diff
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:
77087
diff
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:
72375
diff
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:
77095
diff
changeset
|
90 |
def resolve_components( |
023273cf2651
clean components more accurately: purge other platforms or archives;
wenzelm
parents:
77095
diff
changeset
|
91 |
echo: Boolean = false, |
023273cf2651
clean components more accurately: purge other platforms or archives;
wenzelm
parents:
77095
diff
changeset
|
92 |
clean_platforms: Option[List[Platform.Family.Value]] = None, |
77124
be90af1e3254
proper use of current ISABELLE_COMPONENT_REPOSITORY from the managing Isabelle system (amending 3e963d68d394);
wenzelm
parents:
77123
diff
changeset
|
93 |
clean_archives: Boolean = false, |
77128
f40c36ab154d
clarified names to emphasize suble differences in meaning;
wenzelm
parents:
77124
diff
changeset
|
94 |
component_repository: String = Components.static_component_repository |
77097
023273cf2651
clean components more accurately: purge other platforms or archives;
wenzelm
parents:
77095
diff
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:
77095
diff
changeset
|
98 |
Components.resolve(path.dir, path.file_name, |
023273cf2651
clean components more accurately: purge other platforms or archives;
wenzelm
parents:
77095
diff
changeset
|
99 |
clean_platforms = clean_platforms, |
023273cf2651
clean components more accurately: purge other platforms or archives;
wenzelm
parents:
77095
diff
changeset
|
100 |
clean_archives = clean_archives, |
77124
be90af1e3254
proper use of current ISABELLE_COMPONENT_REPOSITORY from the managing Isabelle system (amending 3e963d68d394);
wenzelm
parents:
77123
diff
changeset
|
101 |
component_repository = component_repository, |
77097
023273cf2651
clean components more accurately: purge other platforms or archives;
wenzelm
parents:
77095
diff
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) |
|
115 |
ssh.set_executable(dummy_stty_remote, true) |
|
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:
69166
diff
changeset
|
127 |
/* settings */ |
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
wenzelm
parents:
69166
diff
changeset
|
128 |
|
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
wenzelm
parents:
69166
diff
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:
69166
diff
changeset
|
134 |
} |
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
wenzelm
parents:
69166
diff
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:
69166
diff
changeset
|
147 |
|
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
wenzelm
parents:
69166
diff
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:
77095
diff
changeset
|
154 |
echo: Boolean = false, |
023273cf2651
clean components more accurately: purge other platforms or archives;
wenzelm
parents:
77095
diff
changeset
|
155 |
clean_platforms: Option[List[Platform.Family.Value]] = None, |
77124
be90af1e3254
proper use of current ISABELLE_COMPONENT_REPOSITORY from the managing Isabelle system (amending 3e963d68d394);
wenzelm
parents:
77123
diff
changeset
|
156 |
clean_archives: Boolean = false, |
77128
f40c36ab154d
clarified names to emphasize suble differences in meaning;
wenzelm
parents:
77124
diff
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:
77095
diff
changeset
|
160 |
resolve_components( |
023273cf2651
clean components more accurately: purge other platforms or archives;
wenzelm
parents:
77095
diff
changeset
|
161 |
echo = echo, |
023273cf2651
clean components more accurately: purge other platforms or archives;
wenzelm
parents:
77095
diff
changeset
|
162 |
clean_platforms = clean_platforms, |
77124
be90af1e3254
proper use of current ISABELLE_COMPONENT_REPOSITORY from the managing Isabelle system (amending 3e963d68d394);
wenzelm
parents:
77123
diff
changeset
|
163 |
clean_archives = clean_archives, |
be90af1e3254
proper use of current ISABELLE_COMPONENT_REPOSITORY from the managing Isabelle system (amending 3e963d68d394);
wenzelm
parents:
77123
diff
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:
69166
diff
changeset
|
169 |
/* cleanup */ |
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
wenzelm
parents:
69166
diff
changeset
|
170 |
|
75393 | 171 |
def cleanup(): Unit = { |
69168
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
wenzelm
parents:
69166
diff
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:
69166
diff
changeset
|
175 |
} |
64188 | 176 |
} |