| 
36204
 | 
     1  | 
Some notes on multi-platform support of Isabelle
  | 
| 
 | 
     2  | 
================================================
  | 
| 
35610
 | 
     3  | 
  | 
| 
 | 
     4  | 
Preamble
  | 
| 
 | 
     5  | 
--------
  | 
| 
 | 
     6  | 
  | 
| 
 | 
     7  | 
The general programming model is that of a stylized ML + Scala + POSIX
  | 
| 
48833
 | 
     8  | 
environment, with as little system-specific code in user-space tools
  | 
| 
 | 
     9  | 
as possible.
  | 
| 
35610
 | 
    10  | 
  | 
| 
 | 
    11  | 
The basic Isabelle system infrastructure provides some facilities to
  | 
| 
48833
 | 
    12  | 
make this work, e.g. see the ML and Scala modules File and Path, or
  | 
| 
 | 
    13  | 
functions like Isabelle_System.bash.  The settings environment also
  | 
| 
48836
 | 
    14  | 
provides some means for portability, e.g. the bash function "jvmpath"
  | 
| 
 | 
    15  | 
to keep the impression that Java on Windows/Cygwin adheres to
  | 
| 
 | 
    16  | 
Isabelle/POSIX standards, although inside the JVM itself there are
  | 
| 
 | 
    17  | 
many Windows-specific things.
  | 
| 
35610
 | 
    18  | 
  | 
| 
 | 
    19  | 
When producing add-on tools, it is important to stay within this clean
  | 
| 
 | 
    20  | 
room of Isabelle, and refrain from overly ambitious system hacking.
  | 
| 
48833
 | 
    21  | 
The existing Isabelle scripts follow a peculiar style that reflects
  | 
| 
 | 
    22  | 
long years of experience in getting system plumbing right.
  | 
| 
35610
 | 
    23  | 
  | 
| 
 | 
    24  | 
  | 
| 
 | 
    25  | 
Supported platforms
  | 
| 
 | 
    26  | 
-------------------
  | 
| 
 | 
    27  | 
  | 
| 
 | 
    28  | 
The following hardware and operating system platforms are officially
  | 
| 
36204
 | 
    29  | 
supported by the Isabelle distribution (and bundled tools), with the
  | 
| 
 | 
    30  | 
following reference versions (which have been selected to be neither
  | 
| 
 | 
    31  | 
too old nor too new):
  | 
| 
35610
 | 
    32  | 
  | 
| 
44876
 | 
    33  | 
  x86-linux         Ubuntu 10.04 LTS
  | 
| 
48833
 | 
    34  | 
  x86_64-linux      Ubuntu 10.04 LTS
  | 
| 
35610
 | 
    35  | 
  | 
| 
48833
 | 
    36  | 
  x86_64-darwin     Mac OS Snow Leopard (macbroy2)
  | 
| 
44977
 | 
    37  | 
                    Mac OS Lion (macbroy6)
  | 
| 
48833
 | 
    38  | 
                    Mac OS Mountain Lion (macbroy30)
  | 
| 
 | 
    39  | 
  | 
| 
 | 
    40  | 
  x86-cygwin        Cygwin 1.7 (vmbroy9)
  | 
| 
36204
 | 
    41  | 
  | 
| 
 | 
    42  | 
All of the above platforms are 100% supported by Isabelle -- end-users
  | 
| 
44876
 | 
    43  | 
should not have to care about the differences (at least in theory).
  | 
| 
48833
 | 
    44  | 
There are also some additional platforms where Poly/ML might also
  | 
| 
 | 
    45  | 
happen to work, but they are *not* covered by the official Isabelle
  | 
| 
44876
 | 
    46  | 
distribution:
  | 
| 
35610
 | 
    47  | 
  | 
| 
 | 
    48  | 
  ppc-darwin
  | 
| 
48833
 | 
    49  | 
  x86-darwin
  | 
| 
35610
 | 
    50  | 
  sparc-solaris
  | 
| 
 | 
    51  | 
  x86-solaris
  | 
| 
 | 
    52  | 
  x86-bsd
  | 
| 
 | 
    53  | 
  | 
| 
44876
 | 
    54  | 
There are increasing problems to make contributing components of
  | 
| 
 | 
    55  | 
Isabelle work on such fringe platforms.  Note that x86-bsd is silently
  | 
| 
 | 
    56  | 
treated like x86-linux -- this works if certain Linux compatibility
  | 
| 
48833
 | 
    57  | 
packages are installed on BSD.  Old 32 bit Macintosh hardware is no
  | 
| 
 | 
    58  | 
longer supported due the its lack of Java 7.
  | 
| 
36204
 | 
    59  | 
  | 
| 
 | 
    60  | 
  | 
| 
 | 
    61  | 
32 bit vs. 64 bit platforms
  | 
| 
 | 
    62  | 
---------------------------
  | 
| 
 | 
    63  | 
  | 
| 
48833
 | 
    64  | 
Most users have 64 bit hardware and are running a 64 bit operating
  | 
| 
 | 
    65  | 
system by default.  For Linux this often means missing 32 bit shared
  | 
| 
 | 
    66  | 
libraries, so native x86_64-linux needs to be used by default, despite
  | 
| 
 | 
    67  | 
its doubled space requirements for Poly/ML heaps.  For Mac OS X, the
  | 
| 
 | 
    68  | 
x86-darwin personality usually works seamlessly for C/C++ programs,
  | 
| 
 | 
    69  | 
but the Java 7 platform is only available for x86_64-darwin.
  | 
| 
 | 
    70  | 
  | 
| 
49144
 | 
    71  | 
Add-on executables are expected to work without manual user
  | 
| 
 | 
    72  | 
configuration.  Each component settings script needs to determine the
  | 
| 
 | 
    73  | 
platform details appropriately.
  | 
| 
48833
 | 
    74  | 
  | 
| 
 | 
    75  | 
The Isabelle settings environment provides the following variables to
  | 
| 
 | 
    76  | 
help configuring platform-dependent tools:
  | 
| 
 | 
    77  | 
  | 
| 
 | 
    78  | 
  ISABELLE_PLATFORM64  (potentially empty)
  | 
| 
 | 
    79  | 
  ISABELLE_PLATFORM32
  | 
| 
 | 
    80  | 
  ISABELLE_PLATFORM
  | 
| 
36204
 | 
    81  | 
  | 
| 
 | 
    82  | 
The ISABELLE_PLATFORM setting variable refers to the 32 bit version of
  | 
| 
48833
 | 
    83  | 
the platform, even on 64 bit hardware.  Using regular bash notation,
  | 
| 
 | 
    84  | 
tools may express their preference for 64 bit with a fall-back for 32
  | 
| 
 | 
    85  | 
bit as follows:
  | 
| 
 | 
    86  | 
  | 
| 
 | 
    87  | 
  "${ISABELLE_PLATFORM64:-$ISABELLE_PLATFORM32}"
 | 
| 
36204
 | 
    88  | 
  | 
| 
48833
 | 
    89  | 
Moreover note that ML and JVM usually have a different idea of the
  | 
| 
 | 
    90  | 
platform, depending on the respective binaries that are actually run.
  | 
| 
49144
 | 
    91  | 
Poly/ML 5.5.x performs best in 32 bit mode, even for large
  | 
| 
 | 
    92  | 
applications, thanks to its sophisticated heap management.  The JVM
  | 
| 
 | 
    93  | 
usually works better in 64 bit mode, which allows its heap to grow
  | 
| 
 | 
    94  | 
beyond 2 GB.
  | 
| 
36204
 | 
    95  | 
  | 
| 
48833
 | 
    96  | 
The traditional "uname" Unix tool usually only tells about its own
  | 
| 
 | 
    97  | 
executable format, not the underlying platform!
  | 
| 
35610
 | 
    98  | 
  | 
| 
 | 
    99  | 
  | 
| 
 | 
   100  | 
Dependable system tools
  | 
| 
 | 
   101  | 
-----------------------
  | 
| 
 | 
   102  | 
  | 
| 
 | 
   103  | 
The following portable system tools can be taken for granted:
  | 
| 
 | 
   104  | 
  | 
| 
36204
 | 
   105  | 
* GNU bash as uniform shell on all platforms.  The POSIX "standard"
  | 
| 
 | 
   106  | 
  shell /bin/sh is *not* appropriate, because there are too many
  | 
| 
44876
 | 
   107  | 
  non-standard implementations of it.
  | 
| 
35610
 | 
   108  | 
  | 
| 
36204
 | 
   109  | 
* Perl as largely portable system programming language.  In some
  | 
| 
 | 
   110  | 
  situations Python may serve as an alternative, but it usually
  | 
| 
 | 
   111  | 
  performs not as well in addressing various delicate details of
  | 
| 
 | 
   112  | 
  operating system concepts (processes, signals, sockets etc.).
  | 
| 
35610
 | 
   113  | 
  | 
| 
49144
 | 
   114  | 
* Scala with Java 1.7.  Isabelle/Scala irons out many oddities and
  | 
| 
 | 
   115  | 
  portability issues of the Java platform.
  | 
| 
35610
 | 
   116  | 
  | 
| 
 | 
   117  | 
  | 
| 
 | 
   118  | 
Known problems
  | 
| 
 | 
   119  | 
--------------
  | 
| 
 | 
   120  | 
  | 
| 
41668
 | 
   121  | 
* Mac OS: If MacPorts is installed there is some danger that
  | 
| 
 | 
   122  | 
  accidental references to its shared libraries are created
  | 
| 
 | 
   123  | 
  (e.g. libgmp).  Use otool -L to check if compiled binaries also work
  | 
| 
 | 
   124  | 
  without MacPorts.
  | 
| 
 | 
   125  | 
  | 
| 
35610
 | 
   126  | 
* Mac OS: If MacPorts is installed and its version of Perl takes
  | 
| 
 | 
   127  | 
  precedence over /usr/bin/perl in the PATH, then the end-user needs
  | 
| 
36204
 | 
   128  | 
  to take care of installing extra modules, e.g. for HTTP support.
  | 
| 
 | 
   129  | 
  Such add-ons are usually included in Apple's /usr/bin/perl by
  | 
| 
 | 
   130  | 
  default.
  | 
| 
35610
 | 
   131  | 
  | 
| 
 | 
   132  | 
* The Java runtime has its own idea about the underlying platform,
  | 
| 
48833
 | 
   133  | 
  which affects Java native libraries in particular.  In
  | 
| 
49144
 | 
   134  | 
  Isabelle/Scala the function isabelle.Platform.jvm_platform
  | 
| 
 | 
   135  | 
  identifies the JVM platform.  Since a particular Java version is
  | 
| 
 | 
   136  | 
  always bundled with Isabelle, the resulting settings also provide
  | 
| 
 | 
   137  | 
  some clues about its platform, without running it.
  |