Some notes on multi-platform support of Isabelle================================================Preamble--------The general programming model is that of a stylized ML + Scala + POSIXenvironment, with hardly any system specific code in user-space toolsand packages.The basic Isabelle system infrastructure provides some facilities tomake this work, e.g. see the ML structures File and Path, or functionslike bash_output. The settings environment also provides some meansfor portability, e.g. jvm_path to hold up the impression that Java onWindows/Cygwin adheres to Isabelle/POSIX standards.When producing add-on tools, it is important to stay within this cleanroom of Isabelle, and refrain from overly ambitious system hacking.The existing Isabelle scripts follow a certain style that might lookodd at first sight, but reflects long years of experience in gettingsystem plumbing right (which is quite hard).Supported platforms-------------------The following hardware and operating system platforms are officiallysupported by the Isabelle distribution (and bundled tools), with thefollowing reference versions (which have been selected to be neithertoo old nor too new): x86-linux Ubuntu 8.04 LTS Server x86-darwin Mac OS Leopard x86-cygwin Cygwin 1.7 x86_64-linux Ubuntu 8.04 LTS Server (64) x86_64-darwin Mac OS LeopardAll of the above platforms are 100% supported by Isabelle -- end-usersshould not have to care about the differences at all. There are alsosome secondary platforms where Poly/ML also happens to work: ppc-darwin sparc-solaris x86-solaris x86-bsdThere is no guarantee that Isabelle add-ons work on these fringeplatforms. Even Isabelle/Scala already fails on ppc-darwin due tolack of JVM 1.6 support by Apple.32 bit vs. 64 bit platforms---------------------------64 bit hardware becomes more and more important for power users.Add-on tools need to work seamlessly without manual userconfiguration, although it is often sufficient to fall back on 32 bitexecutables.The ISABELLE_PLATFORM setting variable refers to the 32 bit version ofthe platform, even on 64 bit hardware. Power-tools need to indicate64 bit support explicitly, via the (optional) ISABELLE_PLATFORM64setting. The following bash expressions prefers the 64 bit platform,if that is available: "${ISABELLE_PLATFORM64:-$ISABELLE_PLATFORM}"Note that ML and JVM may have a different idea of the platform,depending the the respective binaries that are actually run.Dependable system tools-----------------------The following portable system tools can be taken for granted:* GNU bash as uniform shell on all platforms. The POSIX "standard" shell /bin/sh is *not* appropriate, because there are too many different implementations of it.* Perl as largely portable system programming language. In some situations Python may serve as an alternative, but it usually performs not as well in addressing various delicate details of operating system concepts (processes, signals, sockets etc.).* Scala with Java Runtime 1.6. The Isabelle/Pure.jar library irons out many oddities and portability problems of the Java platform.Known problems--------------* Mac OS: If MacPorts is installed and its version of Perl takes precedence over /usr/bin/perl in the PATH, then the end-user needs to take care of installing extra modules, e.g. for HTTP support. Such add-ons are usually included in Apple's /usr/bin/perl by default.* The Java runtime has its own idea about the underlying platform, e.g. on a 64 bit machine Isabelle/ML could be x86-linux, but the JVM could be x86_64-linux. This affects Java native libraries in particular -- which cause extra portability problems and can make the JVM crash anyway. In Isabelle/Scala isabelle.Platform.jvm_platform identifies the JVM platform. Since there can be many different Java installations on the same machine, which can also be run with different options, reliable JVM platform identification works from inside the running JVM only.