| author | traytel | 
| Thu, 11 Mar 2021 10:25:04 +0100 | |
| changeset 73408 | be11fe268b33 | 
| parent 73340 | 0ffcad1f6130 | 
| child 73519 | 8f485a199874 | 
| permissions | -rw-r--r-- | 
| 64202 | 1 | /* Title: Pure/Admin/build_release.scala | 
| 2 | Author: Makarius | |
| 3 | ||
| 4 | Build full Isabelle distribution from repository. | |
| 5 | */ | |
| 6 | ||
| 7 | package isabelle | |
| 8 | ||
| 9 | ||
| 10 | object Build_Release | |
| 11 | {
 | |
| 69174 | 12 | /** release info **/ | 
| 13 | ||
| 14 | sealed case class Bundle_Info( | |
| 69410 | 15 | platform: Platform.Family.Value, | 
| 69174 | 16 | platform_description: String, | 
| 69432 
d072f3287ffa
discontinued somewhat point dmg: plain .tar.gz is smaller and more convenient to install;
 wenzelm parents: 
69425diff
changeset | 17 | name: String) | 
| 69174 | 18 |   {
 | 
| 69432 
d072f3287ffa
discontinued somewhat point dmg: plain .tar.gz is smaller and more convenient to install;
 wenzelm parents: 
69425diff
changeset | 19 | def path: Path = Path.explode(name) | 
| 69174 | 20 | } | 
| 21 | ||
| 22 | class Release private[Build_Release]( | |
| 69401 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 23 | progress: Progress, | 
| 69174 | 24 | val date: Date, | 
| 25 | val dist_name: String, | |
| 26 | val dist_dir: Path, | |
| 27 | val dist_version: String, | |
| 28 | val ident: String) | |
| 29 |   {
 | |
| 30 | val isabelle_dir: Path = dist_dir + Path.explode(dist_name) | |
| 31 | val isabelle_archive: Path = dist_dir + Path.explode(dist_name + ".tar.gz") | |
| 32 | val isabelle_library_archive: Path = dist_dir + Path.explode(dist_name + "_library.tar.gz") | |
| 33 | ||
| 69401 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 34 | def other_isabelle(dir: Path): Other_Isabelle = | 
| 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 35 | Other_Isabelle(dir + Path.explode(dist_name), | 
| 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 36 | isabelle_identifier = dist_name + "-build", | 
| 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 37 | progress = progress) | 
| 69174 | 38 | |
| 69410 | 39 | def bundle_info(platform: Platform.Family.Value): Bundle_Info = | 
| 40 |       platform match {
 | |
| 70246 
7c55ea37fbf7
back to gz for linux (and macos) -- xz is too slow and cumbersome;
 wenzelm parents: 
70244diff
changeset | 41 | case Platform.Family.linux => Bundle_Info(platform, "Linux", dist_name + "_linux.tar.gz") | 
| 
7c55ea37fbf7
back to gz for linux (and macos) -- xz is too slow and cumbersome;
 wenzelm parents: 
70244diff
changeset | 42 | case Platform.Family.macos => Bundle_Info(platform, "macOS", dist_name + "_macos.tar.gz") | 
| 69432 
d072f3287ffa
discontinued somewhat point dmg: plain .tar.gz is smaller and more convenient to install;
 wenzelm parents: 
69425diff
changeset | 43 | case Platform.Family.windows => Bundle_Info(platform, "Windows", dist_name + ".exe") | 
| 69177 | 44 | } | 
| 69174 | 45 | } | 
| 46 | ||
| 47 | ||
| 48 | ||
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 49 | /** generated content **/ | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 50 | |
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 51 | /* patch release */ | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 52 | |
| 72378 | 53 |   private val getsettings_path = Path.explode("lib/scripts/getsettings")
 | 
| 69171 
710845a85944
more robust release.read_ident: eliminated odd state files ISABELLE_IDENT, ISABELLE_DIST;
 wenzelm parents: 
69170diff
changeset | 54 | |
| 
710845a85944
more robust release.read_ident: eliminated odd state files ISABELLE_IDENT, ISABELLE_DIST;
 wenzelm parents: 
69170diff
changeset | 55 | private val ISABELLE_ID = """ISABELLE_ID="(.+)"""".r | 
| 
710845a85944
more robust release.read_ident: eliminated odd state files ISABELLE_IDENT, ISABELLE_DIST;
 wenzelm parents: 
69170diff
changeset | 56 | |
| 73340 | 57 | def patch_release(release: Release, is_official: Boolean): Unit = | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 58 |   {
 | 
| 69174 | 59 | val dir = release.isabelle_dir | 
| 60 | ||
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 61 |     for (name <- List("src/Pure/System/distribution.ML", "src/Pure/System/distribution.scala"))
 | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 62 |     {
 | 
| 72378 | 63 | File.change(dir + Path.explode(name), | 
| 72387 | 64 |         _.replace("val is_identified = false", "val is_identified = true")
 | 
| 65 |          .replace("val is_official = false", "val is_official = " + is_official))
 | |
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 66 | } | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 67 | |
| 72378 | 68 | File.change(dir + getsettings_path, | 
| 72387 | 69 |       _.replace("ISABELLE_ID=\"\"", "ISABELLE_ID=" + quote(release.ident))
 | 
| 70 |        .replace("ISABELLE_IDENTIFIER=\"\"", "ISABELLE_IDENTIFIER=" + quote(release.dist_name)))
 | |
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 71 | |
| 72378 | 72 |     File.change(dir + Path.explode("lib/html/library_index_header.template"),
 | 
| 72387 | 73 |       _.replace("{ISABELLE}", release.dist_name))
 | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 74 | |
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 75 |     for {
 | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 76 | name <- | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 77 | List( | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 78 | "src/Pure/System/distribution.ML", | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 79 | "src/Pure/System/distribution.scala", | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 80 | "lib/Tools/version") } | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 81 |     {
 | 
| 72387 | 82 |       File.change(dir + Path.explode(name), _.replace("repository version", release.dist_version))
 | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 83 | } | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 84 | |
| 72378 | 85 |     File.change(dir + Path.explode("README"),
 | 
| 72387 | 86 |       _.replace("some repository version of Isabelle", release.dist_version))
 | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 87 | } | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 88 | |
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 89 | |
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 90 | /* ANNOUNCE */ | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 91 | |
| 73340 | 92 | def make_announce(release: Release): Unit = | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 93 |   {
 | 
| 69174 | 94 |     File.write(release.isabelle_dir + Path.explode("ANNOUNCE"),
 | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 95 | """ | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 96 | IMPORTANT NOTE | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 97 | ============== | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 98 | |
| 69174 | 99 | This is a snapshot of Isabelle/""" + release.ident + """ from the repository. | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 100 | |
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 101 | """) | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 102 | } | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 103 | |
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 104 | |
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 105 | /* NEWS */ | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 106 | |
| 73340 | 107 | def make_news(other_isabelle: Other_Isabelle, dist_version: String): Unit = | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 108 |   {
 | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 109 |     val target = other_isabelle.isabelle_home + Path.explode("doc")
 | 
| 72376 | 110 |     val target_fonts = Isabelle_System.make_directory(target + Path.explode("fonts"))
 | 
| 69360 | 111 | other_isabelle.copy_fonts(target_fonts) | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 112 | |
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 113 | HTML.write_document(target, "NEWS.html", | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 114 |       List(HTML.title("NEWS (" + dist_version + ")")),
 | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 115 | List( | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 116 |         HTML.chapter("NEWS"),
 | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 117 | HTML.source( | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 118 |           Symbol.decode(File.read(other_isabelle.isabelle_home + Path.explode("NEWS"))))))
 | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 119 | } | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 120 | |
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 121 | |
| 69395 
d1c4a1dee9e7
more explicit support for Isabelle system components;
 wenzelm parents: 
69392diff
changeset | 122 | /* bundled components */ | 
| 
d1c4a1dee9e7
more explicit support for Isabelle system components;
 wenzelm parents: 
69392diff
changeset | 123 | |
| 69410 | 124 | class Bundled(platform: Option[Platform.Family.Value] = None) | 
| 69395 
d1c4a1dee9e7
more explicit support for Isabelle system components;
 wenzelm parents: 
69392diff
changeset | 125 |   {
 | 
| 
d1c4a1dee9e7
more explicit support for Isabelle system components;
 wenzelm parents: 
69392diff
changeset | 126 | def detect(s: String): Boolean = | 
| 
d1c4a1dee9e7
more explicit support for Isabelle system components;
 wenzelm parents: 
69392diff
changeset | 127 |       s.startsWith("#bundled") && !s.startsWith("#bundled ")
 | 
| 
d1c4a1dee9e7
more explicit support for Isabelle system components;
 wenzelm parents: 
69392diff
changeset | 128 | |
| 
d1c4a1dee9e7
more explicit support for Isabelle system components;
 wenzelm parents: 
69392diff
changeset | 129 | def apply(name: String): String = | 
| 69410 | 130 |       "#bundled" + (platform match { case None => "" case Some(plat) => "-" + plat }) + ":" + name
 | 
| 69391 
a3c776b9d3dd
manage components similar to makedist_bundle (still inactive);
 wenzelm parents: 
69390diff
changeset | 131 | |
| 69395 
d1c4a1dee9e7
more explicit support for Isabelle system components;
 wenzelm parents: 
69392diff
changeset | 132 |     private val Pattern1 = ("""^#bundled:(.*)$""").r
 | 
| 
d1c4a1dee9e7
more explicit support for Isabelle system components;
 wenzelm parents: 
69392diff
changeset | 133 |     private val Pattern2 = ("""^#bundled-(.*):(.*)$""").r
 | 
| 
d1c4a1dee9e7
more explicit support for Isabelle system components;
 wenzelm parents: 
69392diff
changeset | 134 | |
| 
d1c4a1dee9e7
more explicit support for Isabelle system components;
 wenzelm parents: 
69392diff
changeset | 135 | def unapply(s: String): Option[String] = | 
| 
d1c4a1dee9e7
more explicit support for Isabelle system components;
 wenzelm parents: 
69392diff
changeset | 136 |       s match {
 | 
| 
d1c4a1dee9e7
more explicit support for Isabelle system components;
 wenzelm parents: 
69392diff
changeset | 137 | case Pattern1(name) => Some(name) | 
| 69410 | 138 | case Pattern2(Platform.Family(plat), name) if platform == Some(plat) => Some(name) | 
| 69395 
d1c4a1dee9e7
more explicit support for Isabelle system components;
 wenzelm parents: 
69392diff
changeset | 139 | case _ => None | 
| 
d1c4a1dee9e7
more explicit support for Isabelle system components;
 wenzelm parents: 
69392diff
changeset | 140 | } | 
| 
d1c4a1dee9e7
more explicit support for Isabelle system components;
 wenzelm parents: 
69392diff
changeset | 141 | } | 
| 69391 
a3c776b9d3dd
manage components similar to makedist_bundle (still inactive);
 wenzelm parents: 
69390diff
changeset | 142 | |
| 73340 | 143 | def record_bundled_components(dir: Path): Unit = | 
| 69391 
a3c776b9d3dd
manage components similar to makedist_bundle (still inactive);
 wenzelm parents: 
69390diff
changeset | 144 |   {
 | 
| 
a3c776b9d3dd
manage components similar to makedist_bundle (still inactive);
 wenzelm parents: 
69390diff
changeset | 145 | val catalogs = | 
| 69395 
d1c4a1dee9e7
more explicit support for Isabelle system components;
 wenzelm parents: 
69392diff
changeset | 146 |       List("main", "bundled").map((_, new Bundled())) :::
 | 
| 
d1c4a1dee9e7
more explicit support for Isabelle system components;
 wenzelm parents: 
69392diff
changeset | 147 | default_platform_families.flatMap(platform => | 
| 69410 | 148 | List(platform.toString, "bundled-" + platform.toString). | 
| 149 | map((_, new Bundled(platform = Some(platform))))) | |
| 69391 
a3c776b9d3dd
manage components similar to makedist_bundle (still inactive);
 wenzelm parents: 
69390diff
changeset | 150 | |
| 69395 
d1c4a1dee9e7
more explicit support for Isabelle system components;
 wenzelm parents: 
69392diff
changeset | 151 | File.append(Components.components(dir), | 
| 69391 
a3c776b9d3dd
manage components similar to makedist_bundle (still inactive);
 wenzelm parents: 
69390diff
changeset | 152 |       terminate_lines("#bundled components" ::
 | 
| 
a3c776b9d3dd
manage components similar to makedist_bundle (still inactive);
 wenzelm parents: 
69390diff
changeset | 153 |         (for {
 | 
| 69395 
d1c4a1dee9e7
more explicit support for Isabelle system components;
 wenzelm parents: 
69392diff
changeset | 154 | (catalog, bundled) <- catalogs.iterator | 
| 71601 | 155 | path = Components.admin(dir) + Path.basic(catalog) | 
| 69391 
a3c776b9d3dd
manage components similar to makedist_bundle (still inactive);
 wenzelm parents: 
69390diff
changeset | 156 | if path.is_file | 
| 
a3c776b9d3dd
manage components similar to makedist_bundle (still inactive);
 wenzelm parents: 
69390diff
changeset | 157 | line <- split_lines(File.read(path)) | 
| 
a3c776b9d3dd
manage components similar to makedist_bundle (still inactive);
 wenzelm parents: 
69390diff
changeset | 158 |           if line.nonEmpty && !line.startsWith("#") && !line.startsWith("jedit_build")
 | 
| 69395 
d1c4a1dee9e7
more explicit support for Isabelle system components;
 wenzelm parents: 
69392diff
changeset | 159 | } yield bundled(line)).toList)) | 
| 
d1c4a1dee9e7
more explicit support for Isabelle system components;
 wenzelm parents: 
69392diff
changeset | 160 | } | 
| 
d1c4a1dee9e7
more explicit support for Isabelle system components;
 wenzelm parents: 
69392diff
changeset | 161 | |
| 69410 | 162 | def get_bundled_components(dir: Path, platform: Platform.Family.Value): (List[String], String) = | 
| 69395 
d1c4a1dee9e7
more explicit support for Isabelle system components;
 wenzelm parents: 
69392diff
changeset | 163 |   {
 | 
| 69410 | 164 | val Bundled = new Bundled(platform = Some(platform)) | 
| 69401 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 165 | val components = | 
| 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 166 |       for {
 | 
| 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 167 | Bundled(name) <- Components.read_components(dir) | 
| 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 168 |         if !name.startsWith("jedit_build")
 | 
| 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 169 | } yield name | 
| 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 170 | val jdk_component = | 
| 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 171 |       components.find(_.startsWith("jdk")) getOrElse error("Missing jdk component")
 | 
| 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 172 | (components, jdk_component) | 
| 69391 
a3c776b9d3dd
manage components similar to makedist_bundle (still inactive);
 wenzelm parents: 
69390diff
changeset | 173 | } | 
| 
a3c776b9d3dd
manage components similar to makedist_bundle (still inactive);
 wenzelm parents: 
69390diff
changeset | 174 | |
| 73340 | 175 | def activate_components( | 
| 176 | dir: Path, platform: Platform.Family.Value, more_names: List[String]): Unit = | |
| 69391 
a3c776b9d3dd
manage components similar to makedist_bundle (still inactive);
 wenzelm parents: 
69390diff
changeset | 177 |   {
 | 
| 69413 | 178 | def contrib_name(name: String): String = | 
| 179 | Components.contrib(name = name).implode | |
| 180 | ||
| 69410 | 181 | val Bundled = new Bundled(platform = Some(platform)) | 
| 69395 
d1c4a1dee9e7
more explicit support for Isabelle system components;
 wenzelm parents: 
69392diff
changeset | 182 | Components.write_components(dir, | 
| 
d1c4a1dee9e7
more explicit support for Isabelle system components;
 wenzelm parents: 
69392diff
changeset | 183 | Components.read_components(dir).flatMap(line => | 
| 69391 
a3c776b9d3dd
manage components similar to makedist_bundle (still inactive);
 wenzelm parents: 
69390diff
changeset | 184 |         line match {
 | 
| 69395 
d1c4a1dee9e7
more explicit support for Isabelle system components;
 wenzelm parents: 
69392diff
changeset | 185 | case Bundled(name) => | 
| 69413 | 186 | if (Components.check_dir(Components.contrib(dir, name))) Some(contrib_name(name)) | 
| 69395 
d1c4a1dee9e7
more explicit support for Isabelle system components;
 wenzelm parents: 
69392diff
changeset | 187 | else None | 
| 
d1c4a1dee9e7
more explicit support for Isabelle system components;
 wenzelm parents: 
69392diff
changeset | 188 | case _ => if (Bundled.detect(line)) None else Some(line) | 
| 71601 | 189 | }) ::: more_names.map(contrib_name)) | 
| 69391 
a3c776b9d3dd
manage components similar to makedist_bundle (still inactive);
 wenzelm parents: 
69390diff
changeset | 190 | } | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 191 | |
| 73340 | 192 | def make_contrib(dir: Path): Unit = | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 193 |   {
 | 
| 72375 | 194 | Isabelle_System.make_directory(Components.contrib(dir)) | 
| 69395 
d1c4a1dee9e7
more explicit support for Isabelle system components;
 wenzelm parents: 
69392diff
changeset | 195 | File.write(Components.contrib(dir, "README"), | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 196 | """This directory contains add-on components that contribute to the main | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 197 | Isabelle distribution. Separate licensing conditions apply, see each | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 198 | directory individually. | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 199 | """) | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 200 | } | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 201 | |
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 202 | |
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 203 | |
| 70099 
9b9c1192f972
support for platform-specific builds on remote server;
 wenzelm parents: 
70098diff
changeset | 204 | /** build release **/ | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 205 | |
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 206 | private def execute(dir: Path, script: String): Unit = | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 207 | Isabelle_System.bash(script, cwd = dir.file).check | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 208 | |
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 209 | private def execute_tar(dir: Path, args: String): Unit = | 
| 69425 | 210 | Isabelle_System.gnutar(args, dir = dir).check | 
| 69170 | 211 | |
| 70099 
9b9c1192f972
support for platform-specific builds on remote server;
 wenzelm parents: 
70098diff
changeset | 212 | |
| 
9b9c1192f972
support for platform-specific builds on remote server;
 wenzelm parents: 
70098diff
changeset | 213 | /* build heaps on remote server */ | 
| 
9b9c1192f972
support for platform-specific builds on remote server;
 wenzelm parents: 
70098diff
changeset | 214 | |
| 70101 | 215 | private def remote_build_heaps( | 
| 216 | options: Options, | |
| 217 | platform: Platform.Family.Value, | |
| 218 | build_sessions: List[String], | |
| 73340 | 219 | local_dir: Path): Unit = | 
| 70099 
9b9c1192f972
support for platform-specific builds on remote server;
 wenzelm parents: 
70098diff
changeset | 220 |   {
 | 
| 72341 | 221 | val server_option = "build_host_" + platform.toString | 
| 70099 
9b9c1192f972
support for platform-specific builds on remote server;
 wenzelm parents: 
70098diff
changeset | 222 |     options.string(server_option) match {
 | 
| 
9b9c1192f972
support for platform-specific builds on remote server;
 wenzelm parents: 
70098diff
changeset | 223 | case SSH.Target(user, host) => | 
| 
9b9c1192f972
support for platform-specific builds on remote server;
 wenzelm parents: 
70098diff
changeset | 224 | using(SSH.open_session(options, host = host, user = user))(ssh => | 
| 
9b9c1192f972
support for platform-specific builds on remote server;
 wenzelm parents: 
70098diff
changeset | 225 |         {
 | 
| 
9b9c1192f972
support for platform-specific builds on remote server;
 wenzelm parents: 
70098diff
changeset | 226 |           Isabelle_System.with_tmp_file("tmp", "tar")(local_tmp_tar =>
 | 
| 
9b9c1192f972
support for platform-specific builds on remote server;
 wenzelm parents: 
70098diff
changeset | 227 |           {
 | 
| 
9b9c1192f972
support for platform-specific builds on remote server;
 wenzelm parents: 
70098diff
changeset | 228 | execute_tar(local_dir, "-cf " + File.bash_path(local_tmp_tar) + " .") | 
| 
9b9c1192f972
support for platform-specific builds on remote server;
 wenzelm parents: 
70098diff
changeset | 229 | ssh.with_tmp_dir(remote_dir => | 
| 
9b9c1192f972
support for platform-specific builds on remote server;
 wenzelm parents: 
70098diff
changeset | 230 |             {
 | 
| 
9b9c1192f972
support for platform-specific builds on remote server;
 wenzelm parents: 
70098diff
changeset | 231 |               val remote_tmp_tar = remote_dir + Path.basic("tmp.tar")
 | 
| 
9b9c1192f972
support for platform-specific builds on remote server;
 wenzelm parents: 
70098diff
changeset | 232 | ssh.write_file(remote_tmp_tar, local_tmp_tar) | 
| 
9b9c1192f972
support for platform-specific builds on remote server;
 wenzelm parents: 
70098diff
changeset | 233 | val remote_commands = | 
| 
9b9c1192f972
support for platform-specific builds on remote server;
 wenzelm parents: 
70098diff
changeset | 234 | List( | 
| 
9b9c1192f972
support for platform-specific builds on remote server;
 wenzelm parents: 
70098diff
changeset | 235 | "cd " + File.bash_path(remote_dir), | 
| 
9b9c1192f972
support for platform-specific builds on remote server;
 wenzelm parents: 
70098diff
changeset | 236 | "tar -xf tmp.tar", | 
| 
9b9c1192f972
support for platform-specific builds on remote server;
 wenzelm parents: 
70098diff
changeset | 237 | "./bin/isabelle build -o system_heaps -b -- " + Bash.strings(build_sessions), | 
| 
9b9c1192f972
support for platform-specific builds on remote server;
 wenzelm parents: 
70098diff
changeset | 238 | "tar -cf tmp.tar heaps") | 
| 
9b9c1192f972
support for platform-specific builds on remote server;
 wenzelm parents: 
70098diff
changeset | 239 |               ssh.execute(remote_commands.mkString(" && ")).check
 | 
| 
9b9c1192f972
support for platform-specific builds on remote server;
 wenzelm parents: 
70098diff
changeset | 240 | ssh.read_file(remote_tmp_tar, local_tmp_tar) | 
| 
9b9c1192f972
support for platform-specific builds on remote server;
 wenzelm parents: 
70098diff
changeset | 241 | }) | 
| 
9b9c1192f972
support for platform-specific builds on remote server;
 wenzelm parents: 
70098diff
changeset | 242 | execute_tar(local_dir, "-xf " + File.bash_path(local_tmp_tar)) | 
| 
9b9c1192f972
support for platform-specific builds on remote server;
 wenzelm parents: 
70098diff
changeset | 243 | }) | 
| 
9b9c1192f972
support for platform-specific builds on remote server;
 wenzelm parents: 
70098diff
changeset | 244 | }) | 
| 
9b9c1192f972
support for platform-specific builds on remote server;
 wenzelm parents: 
70098diff
changeset | 245 |       case s => error("Bad " + server_option + ": " + quote(s))
 | 
| 
9b9c1192f972
support for platform-specific builds on remote server;
 wenzelm parents: 
70098diff
changeset | 246 | } | 
| 
9b9c1192f972
support for platform-specific builds on remote server;
 wenzelm parents: 
70098diff
changeset | 247 | } | 
| 
9b9c1192f972
support for platform-specific builds on remote server;
 wenzelm parents: 
70098diff
changeset | 248 | |
| 
9b9c1192f972
support for platform-specific builds on remote server;
 wenzelm parents: 
70098diff
changeset | 249 | |
| 73066 | 250 | /* Isabelle application */ | 
| 73060 | 251 | |
| 73340 | 252 | def make_isabelle_options(path: Path, options: List[String], line_ending: String = "\n"): Unit = | 
| 73068 
a95f5ae5a12a
discontinued macOS JavaAppLauncher: re-use plain shell script;
 wenzelm parents: 
73067diff
changeset | 253 |   {
 | 
| 
a95f5ae5a12a
discontinued macOS JavaAppLauncher: re-use plain shell script;
 wenzelm parents: 
73067diff
changeset | 254 | val title = "# Java runtime options" | 
| 
a95f5ae5a12a
discontinued macOS JavaAppLauncher: re-use plain shell script;
 wenzelm parents: 
73067diff
changeset | 255 | File.write(path, (title :: options).map(_ + line_ending).mkString) | 
| 
a95f5ae5a12a
discontinued macOS JavaAppLauncher: re-use plain shell script;
 wenzelm parents: 
73067diff
changeset | 256 | } | 
| 
a95f5ae5a12a
discontinued macOS JavaAppLauncher: re-use plain shell script;
 wenzelm parents: 
73067diff
changeset | 257 | |
| 73065 | 258 | def make_isabelle_app( | 
| 73193 | 259 | platform: Platform.Family.Value, | 
| 260 | isabelle_target: Path, | |
| 261 | isabelle_name: String, | |
| 73065 | 262 | jdk_component: String, | 
| 73095 | 263 | classpath: List[Path], | 
| 73340 | 264 | dock_icon: Boolean = false): Unit = | 
| 73064 | 265 |   {
 | 
| 266 | val script = """#!/usr/bin/env bash | |
| 73060 | 267 | # | 
| 268 | # Author: Makarius | |
| 269 | # | |
| 270 | # Main Isabelle application script. | |
| 271 | ||
| 272 | # minimal Isabelle environment | |
| 273 | ||
| 73193 | 274 | ISABELLE_HOME="$(cd "$(dirname "$0")"; cd "$(pwd -P)/../.."; pwd)" | 
| 73060 | 275 | source "$ISABELLE_HOME/lib/scripts/isabelle-platform" | 
| 276 | ||
| 73063 | 277 | #paranoia settings -- avoid intrusion of alien options | 
| 278 | unset "_JAVA_OPTIONS" | |
| 279 | unset "JAVA_TOOL_OPTIONS" | |
| 280 | ||
| 281 | #paranoia settings -- avoid problems of Java/Swing versus XIM/IBus etc. | |
| 282 | unset XMODIFIERS | |
| 283 | ||
| 73062 | 284 | COMPONENT="$ISABELLE_HOME/contrib/""" + jdk_component + """" | 
| 285 | source "$COMPONENT/etc/settings" | |
| 286 | ||
| 73060 | 287 | |
| 73063 | 288 | # main | 
| 73060 | 289 | |
| 290 | declare -a JAVA_OPTIONS=($(perl -p -e 's,#.*$,,g;' "$ISABELLE_HOME/Isabelle.options")) | |
| 291 | ||
| 73197 
d967f6643f5e
proper Isabelle environment (amending 31fbde3baa97);
 wenzelm parents: 
73193diff
changeset | 292 | "$ISABELLE_HOME/bin/isabelle" env "$ISABELLE_HOME/lib/scripts/java-gui-setup" | 
| 73153 
96d87b9c2b42
workaround for Big Sur fullscreen mode: better support for JDialog windows (e.g. Find on top of main View);
 wenzelm parents: 
73152diff
changeset | 293 | |
| 73062 | 294 | exec "$ISABELLE_JDK_HOME/bin/java" \ | 
| 73060 | 295 |   "-Disabelle.root=$ISABELLE_HOME" "${JAVA_OPTIONS[@]}" \
 | 
| 73061 | 296 |   -classpath """" + classpath.map(p => "$ISABELLE_HOME/" + p.implode).mkString(":") + """" \
 | 
| 73060 | 297 | "-splash:$ISABELLE_HOME/lib/logo/isabelle.gif" \ | 
| 73095 | 298 | """ + (if (dock_icon) """"-Xdock:icon=$ISABELLE_HOME/lib/logo/isabelle_transparent-128.png" \ | 
| 299 | """ else "") + """isabelle.Main "$@" | |
| 73060 | 300 | """ | 
| 73193 | 301 |     val script_path = isabelle_target + Path.explode("lib/scripts/Isabelle_app")
 | 
| 302 | File.write(script_path, script) | |
| 303 | File.set_executable(script_path, true) | |
| 304 | ||
| 305 |     val component_dir = isabelle_target + Path.explode("contrib/Isabelle_app")
 | |
| 73317 | 306 | Isabelle_System.move_file( | 
| 73193 | 307 |       component_dir + Path.explode(Platform.standard_platform(platform)) + Path.explode("Isabelle"),
 | 
| 308 | isabelle_target + Path.explode(isabelle_name)) | |
| 309 | Isabelle_System.rm_tree(component_dir) | |
| 73064 | 310 | } | 
| 73060 | 311 | |
| 312 | ||
| 73340 | 313 | def make_isabelle_plist(path: Path, isabelle_name: String, isabelle_rev: String): Unit = | 
| 73066 | 314 |   {
 | 
| 315 | File.write(path, """<?xml version="1.0" ?> | |
| 316 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | |
| 317 | <plist version="1.0"> | |
| 318 | <dict> | |
| 319 | <key>CFBundleDevelopmentRegion</key> | |
| 320 | <string>English</string> | |
| 73075 
893310d6d76d
recovered bundle icons (not application) from macos_app;
 wenzelm parents: 
73074diff
changeset | 321 | <key>CFBundleIconFile</key> | 
| 
893310d6d76d
recovered bundle icons (not application) from macos_app;
 wenzelm parents: 
73074diff
changeset | 322 | <string>isabelle.icns</string> | 
| 73066 | 323 | <key>CFBundleIdentifier</key> | 
| 73152 
5a954fd5f078
clarified app identification, potentially relevant for macOS "defaults";
 wenzelm parents: 
73112diff
changeset | 324 | <string>de.tum.in.isabelle</string> | 
| 73066 | 325 | <key>CFBundleDisplayName</key> | 
| 326 | <string>""" + isabelle_name + """</string> | |
| 327 | <key>CFBundleInfoDictionaryVersion</key> | |
| 328 | <string>6.0</string> | |
| 329 | <key>CFBundleName</key> | |
| 330 | <string>""" + isabelle_name + """</string> | |
| 331 | <key>CFBundlePackageType</key> | |
| 332 | <string>APPL</string> | |
| 333 | <key>CFBundleShortVersionString</key> | |
| 73152 
5a954fd5f078
clarified app identification, potentially relevant for macOS "defaults";
 wenzelm parents: 
73112diff
changeset | 334 | <string>""" + isabelle_name + """</string> | 
| 73066 | 335 | <key>CFBundleSignature</key> | 
| 336 | <string>????</string> | |
| 337 | <key>CFBundleVersion</key> | |
| 73152 
5a954fd5f078
clarified app identification, potentially relevant for macOS "defaults";
 wenzelm parents: 
73112diff
changeset | 338 | <string>""" + isabelle_rev + """</string> | 
| 73066 | 339 | <key>NSHumanReadableCopyright</key> | 
| 340 | <string></string> | |
| 341 | <key>LSMinimumSystemVersion</key> | |
| 73085 | 342 | <string>10.11</string> | 
| 73066 | 343 | <key>LSApplicationCategoryType</key> | 
| 344 | <string>public.app-category.developer-tools</string> | |
| 345 | <key>NSHighResolutionCapable</key> | |
| 346 | <string>true</string> | |
| 347 | <key>NSSupportsAutomaticGraphicsSwitching</key> | |
| 348 | <string>true</string> | |
| 349 | <key>CFBundleDocumentTypes</key> | |
| 350 | <array> | |
| 351 | <dict> | |
| 352 | <key>CFBundleTypeExtensions</key> | |
| 353 | <array> | |
| 354 | <string>thy</string> | |
| 355 | </array> | |
| 73077 | 356 | <key>CFBundleTypeIconFile</key> | 
| 357 | <string>theory.icns</string> | |
| 73066 | 358 | <key>CFBundleTypeName</key> | 
| 359 | <string>Isabelle theory file</string> | |
| 360 | <key>CFBundleTypeRole</key> | |
| 361 | <string>Editor</string> | |
| 362 | <key>LSTypeIsPackage</key> | |
| 363 | <false/> | |
| 364 | </dict> | |
| 365 | </array> | |
| 366 | </dict> | |
| 367 | </plist> | |
| 368 | """) | |
| 369 | } | |
| 370 | ||
| 371 | ||
| 73064 | 372 | /* main */ | 
| 70099 
9b9c1192f972
support for platform-specific builds on remote server;
 wenzelm parents: 
70098diff
changeset | 373 | |
| 69415 | 374 | private val default_platform_families: List[Platform.Family.Value] = | 
| 69410 | 375 | List(Platform.Family.linux, Platform.Family.windows, Platform.Family.macos) | 
| 64204 | 376 | |
| 64202 | 377 | def build_release(base_dir: Path, | 
| 69401 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 378 | options: Options, | 
| 69434 | 379 | components_base: Path = Components.default_components_base, | 
| 71726 
a5fda30edae2
clarified signature: more uniform treatment of stopped/interrupted state;
 wenzelm parents: 
71632diff
changeset | 380 | progress: Progress = new Progress, | 
| 64202 | 381 | rev: String = "", | 
| 64405 
81bac77929d9
just one task to identify Isabelle + AFP repository snapshots and build release;
 wenzelm parents: 
64371diff
changeset | 382 | afp_rev: String = "", | 
| 64202 | 383 | official_release: Boolean = false, | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 384 | proper_release_name: Option[String] = None, | 
| 69410 | 385 | platform_families: List[Platform.Family.Value] = default_platform_families, | 
| 69413 | 386 | more_components: List[Path] = Nil, | 
| 64211 | 387 | website: Option[Path] = None, | 
| 70101 | 388 | build_sessions: List[String] = Nil, | 
| 64202 | 389 | build_library: Boolean = false, | 
| 69432 
d072f3287ffa
discontinued somewhat point dmg: plain .tar.gz is smaller and more convenient to install;
 wenzelm parents: 
69425diff
changeset | 390 | parallel_jobs: Int = 1): Release = | 
| 64202 | 391 |   {
 | 
| 69174 | 392 |     val hg = Mercurial.repository(Path.explode("$ISABELLE_HOME"))
 | 
| 393 | ||
| 69167 | 394 | val release = | 
| 64203 | 395 |     {
 | 
| 69171 
710845a85944
more robust release.read_ident: eliminated odd state files ISABELLE_IDENT, ISABELLE_DIST;
 wenzelm parents: 
69170diff
changeset | 396 | val date = Date.now() | 
| 
710845a85944
more robust release.read_ident: eliminated odd state files ISABELLE_IDENT, ISABELLE_DIST;
 wenzelm parents: 
69170diff
changeset | 397 |       val dist_name = proper_release_name getOrElse ("Isabelle_" + Date.Format.date(date))
 | 
| 
710845a85944
more robust release.read_ident: eliminated odd state files ISABELLE_IDENT, ISABELLE_DIST;
 wenzelm parents: 
69170diff
changeset | 398 |       val dist_dir = (base_dir + Path.explode("dist-" + dist_name)).absolute
 | 
| 69174 | 399 | |
| 69414 
eab0d3108b46
clarified defaults: explicit "rev" takes precedence;
 wenzelm parents: 
69413diff
changeset | 400 | val version = proper_string(rev) orElse proper_release_name getOrElse "tip" | 
| 69174 | 401 | val ident = | 
| 402 |         try { hg.id(version) }
 | |
| 71936 | 403 |         catch { case ERROR(msg) => cat_error("Bad repository version: " + version, msg) }
 | 
| 69174 | 404 | |
| 405 | val dist_version = | |
| 406 |         proper_release_name match {
 | |
| 407 |           case Some(name) => name + ": " + Date.Format("LLLL uuuu")(date)
 | |
| 408 | case None => "Isabelle repository snapshot " + ident + " " + Date.Format.date(date) | |
| 409 | } | |
| 410 | ||
| 69401 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 411 | new Release(progress, date, dist_name, dist_dir, dist_version, ident) | 
| 69171 
710845a85944
more robust release.read_ident: eliminated odd state files ISABELLE_IDENT, ISABELLE_DIST;
 wenzelm parents: 
69170diff
changeset | 412 | } | 
| 
710845a85944
more robust release.read_ident: eliminated odd state files ISABELLE_IDENT, ISABELLE_DIST;
 wenzelm parents: 
69170diff
changeset | 413 | |
| 
710845a85944
more robust release.read_ident: eliminated odd state files ISABELLE_IDENT, ISABELLE_DIST;
 wenzelm parents: 
69170diff
changeset | 414 | |
| 
710845a85944
more robust release.read_ident: eliminated odd state files ISABELLE_IDENT, ISABELLE_DIST;
 wenzelm parents: 
69170diff
changeset | 415 | /* make distribution */ | 
| 64202 | 416 | |
| 69171 
710845a85944
more robust release.read_ident: eliminated odd state files ISABELLE_IDENT, ISABELLE_DIST;
 wenzelm parents: 
69170diff
changeset | 417 |     if (release.isabelle_archive.is_file) {
 | 
| 69400 | 418 |       progress.echo_warning("Release archive already exists: " + release.isabelle_archive)
 | 
| 69175 | 419 | |
| 420 | val archive_ident = | |
| 421 |         Isabelle_System.with_tmp_dir("build_release")(tmp_dir =>
 | |
| 422 |           {
 | |
| 72378 | 423 | val getsettings = Path.explode(release.dist_name) + getsettings_path | 
| 69175 | 424 | execute_tar(tmp_dir, "-xzf " + | 
| 425 | File.bash_path(release.isabelle_archive) + " " + File.bash_path(getsettings)) | |
| 426 | split_lines(File.read(tmp_dir + getsettings)) | |
| 427 |               .collectFirst({ case ISABELLE_ID(ident) => ident })
 | |
| 428 |               .getOrElse(error("Failed to read ISABELLE_ID from " + release.isabelle_archive))
 | |
| 429 | }) | |
| 430 | ||
| 431 |       if (release.ident != archive_ident) {
 | |
| 432 |         error("Mismatch of release identification " + release.ident +
 | |
| 433 | " vs. archive " + archive_ident) | |
| 434 | } | |
| 69171 
710845a85944
more robust release.read_ident: eliminated odd state files ISABELLE_IDENT, ISABELLE_DIST;
 wenzelm parents: 
69170diff
changeset | 435 | } | 
| 
710845a85944
more robust release.read_ident: eliminated odd state files ISABELLE_IDENT, ISABELLE_DIST;
 wenzelm parents: 
69170diff
changeset | 436 |     else {
 | 
| 69400 | 437 |       progress.echo_warning("Producing release archive " + release.isabelle_archive + " ...")
 | 
| 69171 
710845a85944
more robust release.read_ident: eliminated odd state files ISABELLE_IDENT, ISABELLE_DIST;
 wenzelm parents: 
69170diff
changeset | 438 | |
| 72375 | 439 | Isabelle_System.make_directory(release.dist_dir) | 
| 64221 | 440 | |
| 69171 
710845a85944
more robust release.read_ident: eliminated odd state files ISABELLE_IDENT, ISABELLE_DIST;
 wenzelm parents: 
69170diff
changeset | 441 | if (release.isabelle_dir.is_dir) | 
| 
710845a85944
more robust release.read_ident: eliminated odd state files ISABELLE_IDENT, ISABELLE_DIST;
 wenzelm parents: 
69170diff
changeset | 442 |         error("Directory " + release.isabelle_dir + " already exists")
 | 
| 
710845a85944
more robust release.read_ident: eliminated odd state files ISABELLE_IDENT, ISABELLE_DIST;
 wenzelm parents: 
69170diff
changeset | 443 | |
| 
710845a85944
more robust release.read_ident: eliminated odd state files ISABELLE_IDENT, ISABELLE_DIST;
 wenzelm parents: 
69170diff
changeset | 444 | |
| 69400 | 445 |       progress.echo_warning("Retrieving Mercurial repository version " + release.ident)
 | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 446 | |
| 69174 | 447 | hg.archive(release.isabelle_dir.expand.implode, rev = release.ident, options = "--type files") | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 448 | |
| 69171 
710845a85944
more robust release.read_ident: eliminated odd state files ISABELLE_IDENT, ISABELLE_DIST;
 wenzelm parents: 
69170diff
changeset | 449 |       for (name <- List(".hg_archival.txt", ".hgtags", ".hgignore", "README_REPOSITORY")) {
 | 
| 
710845a85944
more robust release.read_ident: eliminated odd state files ISABELLE_IDENT, ISABELLE_DIST;
 wenzelm parents: 
69170diff
changeset | 450 | (release.isabelle_dir + Path.explode(name)).file.delete | 
| 
710845a85944
more robust release.read_ident: eliminated odd state files ISABELLE_IDENT, ISABELLE_DIST;
 wenzelm parents: 
69170diff
changeset | 451 | } | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 452 | |
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 453 | |
| 69400 | 454 |       progress.echo_warning("Preparing distribution " + quote(release.dist_name))
 | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 455 | |
| 69174 | 456 | patch_release(release, proper_release_name.isDefined && official_release) | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 457 | |
| 69174 | 458 | if (proper_release_name.isEmpty) make_announce(release) | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 459 | |
| 69171 
710845a85944
more robust release.read_ident: eliminated odd state files ISABELLE_IDENT, ISABELLE_DIST;
 wenzelm parents: 
69170diff
changeset | 460 | make_contrib(release.isabelle_dir) | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 461 | |
| 69171 
710845a85944
more robust release.read_ident: eliminated odd state files ISABELLE_IDENT, ISABELLE_DIST;
 wenzelm parents: 
69170diff
changeset | 462 | execute(release.isabelle_dir, """find . -print | xargs chmod -f u+rw""") | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 463 | |
| 69401 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 464 | record_bundled_components(release.isabelle_dir) | 
| 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 465 | |
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 466 | |
| 69171 
710845a85944
more robust release.read_ident: eliminated odd state files ISABELLE_IDENT, ISABELLE_DIST;
 wenzelm parents: 
69170diff
changeset | 467 | /* build tools and documentation */ | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 468 | |
| 69401 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 469 | val other_isabelle = release.other_isabelle(release.dist_dir) | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 470 | |
| 69388 | 471 | other_isabelle.init_settings( | 
| 69434 | 472 |         other_isabelle.init_components(components_base = components_base, catalogs = List("main")))
 | 
| 69171 
710845a85944
more robust release.read_ident: eliminated odd state files ISABELLE_IDENT, ISABELLE_DIST;
 wenzelm parents: 
69170diff
changeset | 473 | other_isabelle.resolve_components(echo = true) | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 474 | |
| 69171 
710845a85944
more robust release.read_ident: eliminated odd state files ISABELLE_IDENT, ISABELLE_DIST;
 wenzelm parents: 
69170diff
changeset | 475 |       try {
 | 
| 
710845a85944
more robust release.read_ident: eliminated odd state files ISABELLE_IDENT, ISABELLE_DIST;
 wenzelm parents: 
69170diff
changeset | 476 | val export_classpath = | 
| 
710845a85944
more robust release.read_ident: eliminated odd state files ISABELLE_IDENT, ISABELLE_DIST;
 wenzelm parents: 
69170diff
changeset | 477 |           "export CLASSPATH=" + Bash.string(other_isabelle.getenv("ISABELLE_CLASSPATH")) + "\n"
 | 
| 
710845a85944
more robust release.read_ident: eliminated odd state files ISABELLE_IDENT, ISABELLE_DIST;
 wenzelm parents: 
69170diff
changeset | 478 | other_isabelle.bash(export_classpath + "./Admin/build all", echo = true).check | 
| 
710845a85944
more robust release.read_ident: eliminated odd state files ISABELLE_IDENT, ISABELLE_DIST;
 wenzelm parents: 
69170diff
changeset | 479 | other_isabelle.bash(export_classpath + "./bin/isabelle jedit -b", echo = true).check | 
| 
710845a85944
more robust release.read_ident: eliminated odd state files ISABELLE_IDENT, ISABELLE_DIST;
 wenzelm parents: 
69170diff
changeset | 480 | } | 
| 71936 | 481 |       catch { case ERROR(msg) => cat_error("Failed to build tools:", msg) }
 | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 482 | |
| 69171 
710845a85944
more robust release.read_ident: eliminated odd state files ISABELLE_IDENT, ISABELLE_DIST;
 wenzelm parents: 
69170diff
changeset | 483 |       try {
 | 
| 
710845a85944
more robust release.read_ident: eliminated odd state files ISABELLE_IDENT, ISABELLE_DIST;
 wenzelm parents: 
69170diff
changeset | 484 | other_isabelle.bash( | 
| 69873 | 485 | "./bin/isabelle build_doc -a -o system_heaps -j " + parallel_jobs, echo = true).check | 
| 69171 
710845a85944
more robust release.read_ident: eliminated odd state files ISABELLE_IDENT, ISABELLE_DIST;
 wenzelm parents: 
69170diff
changeset | 486 | } | 
| 71936 | 487 |       catch { case ERROR(msg) => cat_error("Failed to build documentation:", msg) }
 | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 488 | |
| 69174 | 489 | make_news(other_isabelle, release.dist_version) | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 490 | |
| 69171 
710845a85944
more robust release.read_ident: eliminated odd state files ISABELLE_IDENT, ISABELLE_DIST;
 wenzelm parents: 
69170diff
changeset | 491 |       for (name <- List("Admin", "browser_info", "heaps")) {
 | 
| 
710845a85944
more robust release.read_ident: eliminated odd state files ISABELLE_IDENT, ISABELLE_DIST;
 wenzelm parents: 
69170diff
changeset | 492 | Isabelle_System.rm_tree(other_isabelle.isabelle_home + Path.explode(name)) | 
| 
710845a85944
more robust release.read_ident: eliminated odd state files ISABELLE_IDENT, ISABELLE_DIST;
 wenzelm parents: 
69170diff
changeset | 493 | } | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 494 | |
| 69171 
710845a85944
more robust release.read_ident: eliminated odd state files ISABELLE_IDENT, ISABELLE_DIST;
 wenzelm parents: 
69170diff
changeset | 495 | other_isabelle.cleanup() | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 496 | |
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 497 | |
| 69400 | 498 |       progress.echo_warning("Creating distribution archive " + release.isabelle_archive)
 | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 499 | |
| 69174 | 500 | def execute_dist_name(script: String): Unit = | 
| 501 | Isabelle_System.bash(script, cwd = release.dist_dir.file, | |
| 502 |           env = Isabelle_System.settings() + ("DIST_NAME" -> release.dist_name)).check
 | |
| 503 | ||
| 504 |       execute_dist_name("""
 | |
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 505 | set -e | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 506 | |
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 507 | chmod -R a+r "$DIST_NAME" | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 508 | chmod -R u+w "$DIST_NAME" | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 509 | chmod -R g=o "$DIST_NAME" | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 510 | find "$DIST_NAME" -type f "(" -name "*.thy" -o -name "*.ML" -o -name "*.scala" ")" -print | xargs chmod -f u-w
 | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 511 | """) | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 512 | |
| 69425 | 513 | execute_tar(release.dist_dir, "-czf " + | 
| 69171 
710845a85944
more robust release.read_ident: eliminated odd state files ISABELLE_IDENT, ISABELLE_DIST;
 wenzelm parents: 
69170diff
changeset | 514 | File.bash_path(release.isabelle_archive) + " " + Bash.string(release.dist_name)) | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 515 | |
| 69174 | 516 |       execute_dist_name("""
 | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 517 | set -e | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 518 | |
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 519 | mv "$DIST_NAME" "${DIST_NAME}-old"
 | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 520 | mkdir "$DIST_NAME" | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 521 | |
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 522 | mv "${DIST_NAME}-old/README" "${DIST_NAME}-old/NEWS" "${DIST_NAME}-old/ANNOUNCE" \
 | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 523 |   "${DIST_NAME}-old/COPYRIGHT" "${DIST_NAME}-old/CONTRIBUTORS" "$DIST_NAME"
 | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 524 | mkdir "$DIST_NAME/doc" | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 525 | mv "${DIST_NAME}-old/doc/"*.pdf \
 | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 526 |   "${DIST_NAME}-old/doc/"*.html \
 | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 527 |   "${DIST_NAME}-old/doc/"*.css \
 | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 528 |   "${DIST_NAME}-old/doc/fonts" \
 | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 529 |   "${DIST_NAME}-old/doc/Contents" "$DIST_NAME/doc"
 | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 530 | |
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 531 | rm -f Isabelle && ln -sf "$DIST_NAME" Isabelle | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 532 | |
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 533 | rm -rf "${DIST_NAME}-old"
 | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 534 | """) | 
| 64203 | 535 | } | 
| 64202 | 536 | |
| 537 | ||
| 538 | /* make application bundles */ | |
| 539 | ||
| 69177 | 540 | val bundle_infos = platform_families.map(release.bundle_info) | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 541 | |
| 66730 | 542 |     for (bundle_info <- bundle_infos) {
 | 
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 543 | val isabelle_name = release.dist_name | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 544 | val platform = bundle_info.platform | 
| 69401 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 545 | |
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 546 |       progress.echo("\nApplication bundle for " + platform)
 | 
| 69401 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 547 | |
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 548 |       Isabelle_System.with_tmp_dir("build_release")(tmp_dir =>
 | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 549 |       {
 | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 550 | // release archive | 
| 69401 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 551 | |
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 552 | execute_tar(tmp_dir, "-xzf " + File.bash_path(release.isabelle_archive)) | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 553 | val other_isabelle = release.other_isabelle(tmp_dir) | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 554 | val isabelle_target = other_isabelle.isabelle_home | 
| 69401 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 555 | |
| 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 556 | |
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 557 | // bundled components | 
| 69401 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 558 | |
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 559 |         progress.echo("Bundled components:")
 | 
| 69401 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 560 | |
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 561 | val contrib_dir = Components.contrib(isabelle_target) | 
| 69401 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 562 | |
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 563 | val (bundled_components, jdk_component) = | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 564 | get_bundled_components(isabelle_target, platform) | 
| 69401 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 565 | |
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 566 | Components.resolve(components_base, bundled_components, | 
| 70102 | 567 | target_dir = Some(contrib_dir), | 
| 568 |           copy_dir = Some(release.dist_dir + Path.explode("contrib")),
 | |
| 569 | progress = progress) | |
| 69413 | 570 | |
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 571 | val more_components_names = | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 572 | more_components.map(Components.unpack(contrib_dir, _, progress = progress)) | 
| 69401 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 573 | |
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 574 | Components.purge(contrib_dir, platform) | 
| 69401 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 575 | |
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 576 | activate_components(isabelle_target, platform, more_components_names) | 
| 69401 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 577 | |
| 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 578 | |
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 579 | // Java parameters | 
| 69401 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 580 | |
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 581 | val java_options: List[String] = | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 582 |           (for {
 | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 583 | variable <- | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 584 | List( | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 585 | "ISABELLE_JAVA_SYSTEM_OPTIONS", | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 586 | "JEDIT_JAVA_SYSTEM_OPTIONS", | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 587 | "JEDIT_JAVA_OPTIONS") | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 588 | opt <- Word.explode(other_isabelle.getenv(variable)) | 
| 73068 
a95f5ae5a12a
discontinued macOS JavaAppLauncher: re-use plain shell script;
 wenzelm parents: 
73067diff
changeset | 589 | } | 
| 
a95f5ae5a12a
discontinued macOS JavaAppLauncher: re-use plain shell script;
 wenzelm parents: 
73067diff
changeset | 590 |           yield {
 | 
| 
a95f5ae5a12a
discontinued macOS JavaAppLauncher: re-use plain shell script;
 wenzelm parents: 
73067diff
changeset | 591 | val s = "-Dapple.awt.application.name=" | 
| 
a95f5ae5a12a
discontinued macOS JavaAppLauncher: re-use plain shell script;
 wenzelm parents: 
73067diff
changeset | 592 | if (opt.startsWith(s)) s + isabelle_name else opt | 
| 
a95f5ae5a12a
discontinued macOS JavaAppLauncher: re-use plain shell script;
 wenzelm parents: 
73067diff
changeset | 593 |           }) ::: List("-Disabelle.jedit_server=" + isabelle_name)
 | 
| 69401 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 594 | |
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 595 | val classpath: List[Path] = | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 596 |         {
 | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 597 | val base = isabelle_target.absolute | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 598 |           Path.split(other_isabelle.getenv("ISABELLE_CLASSPATH")).map(path =>
 | 
| 69401 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 599 |           {
 | 
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 600 | val abs_path = path.absolute | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 601 |             File.relative_path(base, abs_path) match {
 | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 602 | case Some(rel_path) => rel_path | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 603 |               case None => error("Bad ISABELLE_CLASSPATH element: " + abs_path)
 | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 604 | } | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 605 |           }) ::: List(Path.explode("src/Tools/jEdit/dist/jedit.jar"))
 | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 606 | } | 
| 69401 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 607 | |
| 71542 
e76692ec6e5a
more usable defaults for high resolution on Linux, where the desktop environment usually lacks automatic scaling;
 wenzelm parents: 
71459diff
changeset | 608 |         val jedit_options = Path.explode("src/Tools/jEdit/etc/options")
 | 
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 609 |         val jedit_props = Path.explode("src/Tools/jEdit/dist/properties/jEdit.props")
 | 
| 69401 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 610 | |
| 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 611 | |
| 70101 | 612 | // build heaps | 
| 613 | ||
| 614 |         if (build_sessions.nonEmpty) {
 | |
| 70103 | 615 |           progress.echo("Building heaps ...")
 | 
| 70101 | 616 | remote_build_heaps(options, platform, build_sessions, isabelle_target) | 
| 617 | } | |
| 618 | ||
| 619 | ||
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 620 | // application bundling | 
| 69401 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 621 | |
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 622 |         platform match {
 | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 623 | case Platform.Family.linux => | 
| 72378 | 624 | File.change(isabelle_target + jedit_options, | 
| 625 |               _.replaceAll("jedit_reset_font_size : int =.*", "jedit_reset_font_size : int = 24"))
 | |
| 71542 
e76692ec6e5a
more usable defaults for high resolution on Linux, where the desktop environment usually lacks automatic scaling;
 wenzelm parents: 
71459diff
changeset | 626 | |
| 72378 | 627 | File.change(isabelle_target + jedit_props, | 
| 628 |               _.replaceAll("console.fontsize=.*", "console.fontsize=18")
 | |
| 629 |                .replaceAll("helpviewer.fontsize=.*", "helpviewer.fontsize=18")
 | |
| 630 |                .replaceAll("metal.primary.fontsize=.*", "metal.primary.fontsize=18")
 | |
| 631 |                .replaceAll("metal.secondary.fontsize=.*", "metal.secondary.fontsize=18")
 | |
| 632 |                .replaceAll("view.fontsize=.*", "view.fontsize=24")
 | |
| 633 |                .replaceAll("view.gutter.fontsize=.*", "view.gutter.fontsize=16"))
 | |
| 71542 
e76692ec6e5a
more usable defaults for high resolution on Linux, where the desktop environment usually lacks automatic scaling;
 wenzelm parents: 
71459diff
changeset | 634 | |
| 73068 
a95f5ae5a12a
discontinued macOS JavaAppLauncher: re-use plain shell script;
 wenzelm parents: 
73067diff
changeset | 635 | make_isabelle_options( | 
| 
a95f5ae5a12a
discontinued macOS JavaAppLauncher: re-use plain shell script;
 wenzelm parents: 
73067diff
changeset | 636 |               isabelle_target + Path.explode("Isabelle.options"), java_options)
 | 
| 69401 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 637 | |
| 73193 | 638 | make_isabelle_app(platform, isabelle_target, isabelle_name, jdk_component, classpath) | 
| 69417 | 639 | |
| 70246 
7c55ea37fbf7
back to gz for linux (and macos) -- xz is too slow and cumbersome;
 wenzelm parents: 
70244diff
changeset | 640 | val archive_name = isabelle_name + "_linux.tar.gz" | 
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 641 |             progress.echo("Packaging " + archive_name + " ...")
 | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 642 | execute_tar(tmp_dir, | 
| 70246 
7c55ea37fbf7
back to gz for linux (and macos) -- xz is too slow and cumbersome;
 wenzelm parents: 
70244diff
changeset | 643 | "-czf " + File.bash_path(release.dist_dir + Path.explode(archive_name)) + " " + | 
| 70242 | 644 | Bash.string(isabelle_name)) | 
| 69424 
840f0cadeba8
clarified application bundling: discontinued redundant archives;
 wenzelm parents: 
69417diff
changeset | 645 | |
| 69432 
d072f3287ffa
discontinued somewhat point dmg: plain .tar.gz is smaller and more convenient to install;
 wenzelm parents: 
69425diff
changeset | 646 | |
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 647 | case Platform.Family.macos => | 
| 72378 | 648 | File.change(isabelle_target + jedit_props, | 
| 73112 | 649 |               _.replaceAll("delete-line.shortcut=.*", "delete-line.shortcut=C+d")
 | 
| 72378 | 650 |                .replaceAll("delete.shortcut2=.*", "delete.shortcut2=A+d"))
 | 
| 69417 | 651 | |
| 69401 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 652 | |
| 73193 | 653 | // macOS application bundle | 
| 69401 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 654 | |
| 73193 | 655 |             val app_contents = isabelle_target + Path.explode("Contents")
 | 
| 69401 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 656 | |
| 73077 | 657 |             for (icon <- List("lib/logo/isabelle.icns", "lib/logo/theory.icns")) {
 | 
| 73317 | 658 | Isabelle_System.copy_file(isabelle_target + Path.explode(icon), | 
| 73193 | 659 |                 Isabelle_System.make_directory(app_contents + Path.explode("Resources")))
 | 
| 73077 | 660 | } | 
| 73075 
893310d6d76d
recovered bundle icons (not application) from macos_app;
 wenzelm parents: 
73074diff
changeset | 661 | |
| 73083 | 662 | make_isabelle_plist( | 
| 663 |               app_contents + Path.explode("Info.plist"), isabelle_name, release.ident)
 | |
| 69401 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 664 | |
| 73193 | 665 | make_isabelle_app(platform, isabelle_target, isabelle_name, jdk_component, | 
| 666 | classpath, dock_icon = true) | |
| 667 | ||
| 668 |             val isabelle_options = Path.explode("Isabelle.options")
 | |
| 669 | make_isabelle_options( | |
| 670 | isabelle_target + isabelle_options, | |
| 671 |               java_options ::: List("-Disabelle.app=true"))
 | |
| 672 | ||
| 69424 
840f0cadeba8
clarified application bundling: discontinued redundant archives;
 wenzelm parents: 
69417diff
changeset | 673 | |
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 674 | // application archive | 
| 69424 
840f0cadeba8
clarified application bundling: discontinued redundant archives;
 wenzelm parents: 
69417diff
changeset | 675 | |
| 70244 | 676 | val archive_name = isabelle_name + "_macos.tar.gz" | 
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 677 |             progress.echo("Packaging " + archive_name + " ...")
 | 
| 73193 | 678 | |
| 679 | val isabelle_app = Path.explode(isabelle_name + ".app") | |
| 73317 | 680 | Isabelle_System.move_file(tmp_dir + Path.explode(isabelle_name), | 
| 681 | tmp_dir + isabelle_app) | |
| 73193 | 682 | |
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 683 | execute_tar(tmp_dir, | 
| 70244 | 684 | "-czf " + File.bash_path(release.dist_dir + Path.explode(archive_name)) + " " + | 
| 70242 | 685 | File.bash_path(isabelle_app)) | 
| 69432 
d072f3287ffa
discontinued somewhat point dmg: plain .tar.gz is smaller and more convenient to install;
 wenzelm parents: 
69425diff
changeset | 686 | |
| 69417 | 687 | |
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 688 | case Platform.Family.windows => | 
| 72378 | 689 | File.change(isabelle_target + jedit_props, | 
| 73112 | 690 |               _.replaceAll("foldPainter=.*", "foldPainter=Square"))
 | 
| 69424 
840f0cadeba8
clarified application bundling: discontinued redundant archives;
 wenzelm parents: 
69417diff
changeset | 691 | |
| 
840f0cadeba8
clarified application bundling: discontinued redundant archives;
 wenzelm parents: 
69417diff
changeset | 692 | |
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 693 | // application launcher | 
| 69424 
840f0cadeba8
clarified application bundling: discontinued redundant archives;
 wenzelm parents: 
69417diff
changeset | 694 | |
| 73317 | 695 |             Isabelle_System.move_file(isabelle_target + Path.explode("contrib/windows_app"), tmp_dir)
 | 
| 69424 
840f0cadeba8
clarified application bundling: discontinued redundant archives;
 wenzelm parents: 
69417diff
changeset | 696 | |
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 697 |             val app_template = Path.explode("~~/Admin/Windows/launch4j")
 | 
| 69424 
840f0cadeba8
clarified application bundling: discontinued redundant archives;
 wenzelm parents: 
69417diff
changeset | 698 | |
| 73068 
a95f5ae5a12a
discontinued macOS JavaAppLauncher: re-use plain shell script;
 wenzelm parents: 
73067diff
changeset | 699 | make_isabelle_options( | 
| 
a95f5ae5a12a
discontinued macOS JavaAppLauncher: re-use plain shell script;
 wenzelm parents: 
73067diff
changeset | 700 | isabelle_target + Path.explode(isabelle_name + ".l4j.ini"), | 
| 
a95f5ae5a12a
discontinued macOS JavaAppLauncher: re-use plain shell script;
 wenzelm parents: 
73067diff
changeset | 701 | java_options, line_ending = "\r\n") | 
| 69424 
840f0cadeba8
clarified application bundling: discontinued redundant archives;
 wenzelm parents: 
69417diff
changeset | 702 | |
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 703 |             val isabelle_xml = Path.explode("isabelle.xml")
 | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 704 | val isabelle_exe = Path.explode(isabelle_name + ".exe") | 
| 69424 
840f0cadeba8
clarified application bundling: discontinued redundant archives;
 wenzelm parents: 
69417diff
changeset | 705 | |
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 706 | File.write(tmp_dir + isabelle_xml, | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 707 | File.read(app_template + isabelle_xml) | 
| 72387 | 708 |                 .replace("{ISABELLE_NAME}", isabelle_name)
 | 
| 709 |                 .replace("{OUTFILE}", File.platform_path(isabelle_target + isabelle_exe))
 | |
| 710 |                 .replace("{ICON}",
 | |
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 711 |                   File.platform_path(app_template + Path.explode("isabelle_transparent.ico")))
 | 
| 72387 | 712 |                 .replace("{SPLASH}",
 | 
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 713 |                   File.platform_path(app_template + Path.explode("isabelle.bmp")))
 | 
| 72387 | 714 |                 .replace("{CLASSPATH}",
 | 
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 715 | cat_lines(classpath.map(cp => | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 716 |                     "    <cp>%EXEDIR%\\" + File.platform_path(cp).replace('/', '\\') + "</cp>")))
 | 
| 72387 | 717 |                 .replace("\\jdk\\", "\\" + jdk_component + "\\"))
 | 
| 69424 
840f0cadeba8
clarified application bundling: discontinued redundant archives;
 wenzelm parents: 
69417diff
changeset | 718 | |
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 719 | execute(tmp_dir, | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 720 |               "\"windows_app/launch4j-${ISABELLE_PLATFORM_FAMILY}/launch4j\" isabelle.xml")
 | 
| 69424 
840f0cadeba8
clarified application bundling: discontinued redundant archives;
 wenzelm parents: 
69417diff
changeset | 721 | |
| 73317 | 722 |             Isabelle_System.copy_file(app_template + Path.explode("manifest.xml"),
 | 
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 723 |               isabelle_target + isabelle_exe.ext("manifest"))
 | 
| 69424 
840f0cadeba8
clarified application bundling: discontinued redundant archives;
 wenzelm parents: 
69417diff
changeset | 724 | |
| 
840f0cadeba8
clarified application bundling: discontinued redundant archives;
 wenzelm parents: 
69417diff
changeset | 725 | |
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 726 | // Cygwin setup | 
| 69424 
840f0cadeba8
clarified application bundling: discontinued redundant archives;
 wenzelm parents: 
69417diff
changeset | 727 | |
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 728 |             val cygwin_template = Path.explode("~~/Admin/Windows/Cygwin")
 | 
| 69424 
840f0cadeba8
clarified application bundling: discontinued redundant archives;
 wenzelm parents: 
69417diff
changeset | 729 | |
| 73317 | 730 |             Isabelle_System.copy_file(cygwin_template + Path.explode("Cygwin-Terminal.bat"),
 | 
| 731 | isabelle_target) | |
| 69424 
840f0cadeba8
clarified application bundling: discontinued redundant archives;
 wenzelm parents: 
69417diff
changeset | 732 | |
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 733 | val cygwin_mirror = | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 734 |               File.read(isabelle_target + Path.explode("contrib/cygwin/isabelle/cygwin_mirror"))
 | 
| 69424 
840f0cadeba8
clarified application bundling: discontinued redundant archives;
 wenzelm parents: 
69417diff
changeset | 735 | |
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 736 |             val cygwin_bat = Path.explode("Cygwin-Setup.bat")
 | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 737 | File.write(isabelle_target + cygwin_bat, | 
| 72387 | 738 |               File.read(cygwin_template + cygwin_bat).replace("{MIRROR}", cygwin_mirror))
 | 
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 739 | File.set_executable(isabelle_target + cygwin_bat, true) | 
| 69424 
840f0cadeba8
clarified application bundling: discontinued redundant archives;
 wenzelm parents: 
69417diff
changeset | 740 | |
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 741 |             for (name <- List("isabelle/postinstall", "isabelle/rebaseall")) {
 | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 742 | val path = Path.explode(name) | 
| 73317 | 743 | Isabelle_System.copy_file(cygwin_template + path, | 
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 744 |                 isabelle_target + Path.explode("contrib/cygwin") + path)
 | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 745 | } | 
| 69424 
840f0cadeba8
clarified application bundling: discontinued redundant archives;
 wenzelm parents: 
69417diff
changeset | 746 | |
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 747 | execute(isabelle_target, | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 748 | """find . -type f -not -name "*.exe" -not -name "*.dll" """ + | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 749 | (if (Platform.is_macos) "-perm +100" else "-executable") + | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 750 | " -print0 > contrib/cygwin/isabelle/executables") | 
| 69424 
840f0cadeba8
clarified application bundling: discontinued redundant archives;
 wenzelm parents: 
69417diff
changeset | 751 | |
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 752 | execute(isabelle_target, | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 753 |               """find . -type l -exec echo "{}" ";" -exec readlink "{}" ";" """ +
 | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 754 | """> contrib/cygwin/isabelle/symlinks""") | 
| 69424 
840f0cadeba8
clarified application bundling: discontinued redundant archives;
 wenzelm parents: 
69417diff
changeset | 755 | |
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 756 |             execute(isabelle_target, """find . -type l -exec rm "{}" ";" """)
 | 
| 69424 
840f0cadeba8
clarified application bundling: discontinued redundant archives;
 wenzelm parents: 
69417diff
changeset | 757 | |
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 758 |             File.write(isabelle_target + Path.explode("contrib/cygwin/isabelle/uninitialized"), "")
 | 
| 69424 
840f0cadeba8
clarified application bundling: discontinued redundant archives;
 wenzelm parents: 
69417diff
changeset | 759 | |
| 
840f0cadeba8
clarified application bundling: discontinued redundant archives;
 wenzelm parents: 
69417diff
changeset | 760 | |
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 761 | // executable archive (self-extracting 7z) | 
| 69424 
840f0cadeba8
clarified application bundling: discontinued redundant archives;
 wenzelm parents: 
69417diff
changeset | 762 | |
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 763 | val archive_name = isabelle_name + ".7z" | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 764 | val exe_archive = tmp_dir + Path.explode(archive_name) | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 765 | exe_archive.file.delete | 
| 69401 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 766 | |
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 767 |             progress.echo("Packaging " + archive_name + " ...")
 | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 768 | execute(tmp_dir, | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 769 | "7z -y -bd a " + File.bash_path(exe_archive) + " " + Bash.string(isabelle_name)) | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 770 |             if (!exe_archive.is_file) error("Failed to create archive: " + exe_archive)
 | 
| 69401 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 771 | |
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 772 |             val sfx_exe = tmp_dir + Path.explode("windows_app/7zsd_All_x64.sfx")
 | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 773 | val sfx_txt = | 
| 72387 | 774 |               File.read(Path.explode("~~/Admin/Windows/Installer/sfx.txt"))
 | 
| 775 |                 .replace("{ISABELLE_NAME}", isabelle_name)
 | |
| 69401 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 776 | |
| 70098 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 777 | Bytes.write(release.dist_dir + isabelle_exe, | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 778 | Bytes.read(sfx_exe) + Bytes(sfx_txt) + Bytes.read(exe_archive)) | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 779 | File.set_executable(release.dist_dir + isabelle_exe, true) | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 780 | } | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 781 | }) | 
| 
956d2430cb29
more robust: always (re)build platform application bundles;
 wenzelm parents: 
70046diff
changeset | 782 |       progress.echo("DONE")
 | 
| 64202 | 783 | } | 
| 784 | ||
| 785 | ||
| 786 | /* minimal website */ | |
| 787 | ||
| 64361 | 788 |     for (dir <- website) {
 | 
| 789 | val website_platform_bundles = | |
| 790 |         for {
 | |
| 66730 | 791 | bundle_info <- bundle_infos | 
| 69432 
d072f3287ffa
discontinued somewhat point dmg: plain .tar.gz is smaller and more convenient to install;
 wenzelm parents: 
69425diff
changeset | 792 | if (release.dist_dir + bundle_info.path).is_file | 
| 
d072f3287ffa
discontinued somewhat point dmg: plain .tar.gz is smaller and more convenient to install;
 wenzelm parents: 
69425diff
changeset | 793 | } yield (bundle_info.name, bundle_info) | 
| 64206 | 794 | |
| 71275 | 795 | val isabelle_link = | 
| 796 | HTML.link(Isabelle_Cronjob.isabelle_repos_source + "/rev/" + release.ident, | |
| 797 |           HTML.text("Isabelle/" + release.ident))
 | |
| 64405 
81bac77929d9
just one task to identify Isabelle + AFP repository snapshots and build release;
 wenzelm parents: 
64371diff
changeset | 798 | val afp_link = | 
| 70046 | 799 |         HTML.link(AFP.repos_source + "/rev/" + afp_rev, HTML.text("AFP/" + afp_rev))
 | 
| 64405 
81bac77929d9
just one task to identify Isabelle + AFP repository snapshots and build release;
 wenzelm parents: 
64371diff
changeset | 800 | |
| 65838 | 801 | HTML.write_document(dir, "index.html", | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 802 | List(HTML.title(release.dist_name)), | 
| 65838 | 803 | List( | 
| 71973 | 804 | HTML.section(release.dist_name), | 
| 71275 | 805 |           HTML.subsection("Platforms"),
 | 
| 65838 | 806 | HTML.itemize( | 
| 66730 | 807 |             website_platform_bundles.map({ case (bundle, bundle_info) =>
 | 
| 71275 | 808 | List(HTML.link(bundle, HTML.text(bundle_info.platform_description))) })), | 
| 809 |           HTML.subsection("Repositories"),
 | |
| 810 | HTML.itemize( | |
| 811 | List(List(isabelle_link)) ::: (if (afp_rev == "") Nil else List(List(afp_link)))))) | |
| 64202 | 812 | |
| 64361 | 813 | for ((bundle, _) <- website_platform_bundles) | 
| 73317 | 814 | Isabelle_System.copy_file(release.dist_dir + Path.explode(bundle), dir) | 
| 64361 | 815 | } | 
| 64202 | 816 | |
| 817 | ||
| 818 | /* HTML library */ | |
| 819 | ||
| 64203 | 820 |     if (build_library) {
 | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 821 |       if (release.isabelle_library_archive.is_file) {
 | 
| 69400 | 822 |         progress.echo_warning("Library archive already exists: " + release.isabelle_library_archive)
 | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 823 | } | 
| 64203 | 824 |       else {
 | 
| 64316 | 825 |         Isabelle_System.with_tmp_dir("build_release")(tmp_dir =>
 | 
| 826 |           {
 | |
| 69401 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 827 | val bundle = | 
| 70246 
7c55ea37fbf7
back to gz for linux (and macos) -- xz is too slow and cumbersome;
 wenzelm parents: 
70244diff
changeset | 828 | release.dist_dir + Path.explode(release.dist_name + "_" + Platform.family + ".tar.gz") | 
| 
7c55ea37fbf7
back to gz for linux (and macos) -- xz is too slow and cumbersome;
 wenzelm parents: 
70244diff
changeset | 829 | execute_tar(tmp_dir, "-xzf " + File.bash_path(bundle)) | 
| 64316 | 830 | |
| 69401 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 831 | val other_isabelle = release.other_isabelle(tmp_dir) | 
| 64316 | 832 | |
| 72375 | 833 | Isabelle_System.make_directory(other_isabelle.etc) | 
| 68755 
67d6f1708ea4
enforce ML_system_64: more robust as cold build, without command_timings;
 wenzelm parents: 
67045diff
changeset | 834 | File.write(other_isabelle.etc_preferences, "ML_system_64 = true\n") | 
| 
67d6f1708ea4
enforce ML_system_64: more robust as cold build, without command_timings;
 wenzelm parents: 
67045diff
changeset | 835 | |
| 70243 | 836 |             other_isabelle.bash("bin/isabelle build -f -j " + parallel_jobs +
 | 
| 69406 | 837 | " -o browser_info -o document=pdf -o document_variants=document:outline=/proof,/ML" + | 
| 69873 | 838 | " -o system_heaps -c -a -d '~~/src/Benchmarks'", echo = true).check | 
| 64316 | 839 | other_isabelle.isabelle_home_user.file.delete | 
| 840 | ||
| 69401 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 841 | execute(tmp_dir, "chmod -R a+r " + Bash.string(release.dist_name)) | 
| 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 842 | execute(tmp_dir, "chmod -R g=o " + Bash.string(release.dist_name)) | 
| 69425 | 843 | execute_tar(tmp_dir, "-czf " + File.bash_path(release.isabelle_library_archive) + | 
| 69401 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 844 | " " + Bash.string(release.dist_name + "/browser_info")) | 
| 64316 | 845 | }) | 
| 64203 | 846 | } | 
| 847 | } | |
| 848 | ||
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 849 | release | 
| 64202 | 850 | } | 
| 851 | ||
| 852 | ||
| 853 | ||
| 854 | /** command line entry point **/ | |
| 855 | ||
| 73340 | 856 | def main(args: Array[String]): Unit = | 
| 64202 | 857 |   {
 | 
| 71632 | 858 |     Command_Line.tool {
 | 
| 64405 
81bac77929d9
just one task to identify Isabelle + AFP repository snapshots and build release;
 wenzelm parents: 
64371diff
changeset | 859 | var afp_rev = "" | 
| 69434 | 860 | var components_base: Path = Components.default_components_base | 
| 64202 | 861 | var official_release = false | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 862 | var proper_release_name: Option[String] = None | 
| 64211 | 863 | var website: Option[Path] = None | 
| 70101 | 864 | var build_sessions: List[String] = Nil | 
| 69413 | 865 | var more_components: List[Path] = Nil | 
| 64202 | 866 | var parallel_jobs = 1 | 
| 867 | var build_library = false | |
| 69401 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 868 | var options = Options.init() | 
| 64208 | 869 | var platform_families = default_platform_families | 
| 64202 | 870 | var rev = "" | 
| 871 | ||
| 872 |       val getopts = Getopts("""
 | |
| 873 | Usage: Admin/build_release [OPTIONS] BASE_DIR | |
| 874 | ||
| 875 | Options are: | |
| 64405 
81bac77929d9
just one task to identify Isabelle + AFP repository snapshots and build release;
 wenzelm parents: 
64371diff
changeset | 876 | -A REV corresponding AFP changeset id | 
| 69434 | 877 | -C DIR base directory for Isabelle components (default: """ + | 
| 878 | Components.default_components_base + """) | |
| 64202 | 879 | -O official release (not release-candidate) | 
| 880 | -R RELEASE proper release with name | |
| 64211 | 881 | -W WEBSITE produce minimal website in given directory | 
| 70101 | 882 | -b SESSIONS build platform-specific session images (separated by commas) | 
| 69413 | 883 | -c ARCHIVE clean bundling with additional component .tar.gz archive | 
| 64202 | 884 | -j INT maximum number of parallel jobs (default 1) | 
| 885 | -l build library | |
| 69401 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 886 | -o OPTION override Isabelle system OPTION (via NAME=VAL or NAME) | 
| 65067 | 887 |     -p NAMES     platform families (default: """ + default_platform_families.mkString(",") + """)
 | 
| 64202 | 888 | -r REV Mercurial changeset id (default: RELEASE or tip) | 
| 889 | ||
| 890 | Build Isabelle release in base directory, using the local repository clone. | |
| 891 | """, | |
| 64405 
81bac77929d9
just one task to identify Isabelle + AFP repository snapshots and build release;
 wenzelm parents: 
64371diff
changeset | 892 | "A:" -> (arg => afp_rev = arg), | 
| 69434 | 893 | "C:" -> (arg => components_base = Path.explode(arg)), | 
| 64202 | 894 | "O" -> (_ => official_release = true), | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 895 | "R:" -> (arg => proper_release_name = Some(arg)), | 
| 64211 | 896 | "W:" -> (arg => website = Some(Path.explode(arg))), | 
| 70101 | 897 |         "b:" -> (arg => build_sessions = space_explode(',', arg)),
 | 
| 69413 | 898 | "c:" -> (arg => | 
| 899 |           {
 | |
| 900 | val path = Path.explode(arg) | |
| 901 | Components.Archive.get_name(path.file_name) | |
| 902 | more_components = more_components ::: List(path) | |
| 903 | }), | |
| 64202 | 904 | "j:" -> (arg => parallel_jobs = Value.Int.parse(arg)), | 
| 64316 | 905 | "l" -> (_ => build_library = true), | 
| 69401 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 906 | "o:" -> (arg => options = options + arg), | 
| 69410 | 907 |         "p:" -> (arg => platform_families = space_explode(',', arg).map(Platform.Family.parse)),
 | 
| 64204 | 908 | "r:" -> (arg => rev = arg)) | 
| 64202 | 909 | |
| 910 | val more_args = getopts(args) | |
| 911 |       val base_dir = more_args match { case List(base_dir) => base_dir case _ => getopts.usage() }
 | |
| 912 | ||
| 913 | val progress = new Console_Progress() | |
| 914 | ||
| 69415 | 915 |       if (platform_families.contains(Platform.Family.windows) && !Isabelle_System.bash("7z i").ok)
 | 
| 916 |         error("Building for windows requires 7z")
 | |
| 917 | ||
| 69401 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 918 | build_release(Path.explode(base_dir), options, components_base = components_base, | 
| 
7a1b7b737c02
eliminated old makedist_bundle and remote_dmg: build_release does everything in Scala;
 wenzelm parents: 
69400diff
changeset | 919 | progress = progress, rev = rev, afp_rev = afp_rev, official_release = official_release, | 
| 69397 | 920 | proper_release_name = proper_release_name, website = website, | 
| 64204 | 921 | platform_families = | 
| 69168 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 922 | if (platform_families.isEmpty) default_platform_families | 
| 
68816d1c73a7
eliminated "isabelle makedist" -- prefer Scala over bash/perl scripting;
 wenzelm parents: 
69167diff
changeset | 923 | else platform_families, | 
| 70101 | 924 | more_components = more_components, build_sessions = build_sessions, | 
| 925 | build_library = build_library, parallel_jobs = parallel_jobs) | |
| 64202 | 926 | } | 
| 927 | } | |
| 928 | } |