1
0
mirror of synced 2026-01-12 00:42:56 +00:00

Overhaul of loadup scripts (#1699)

* Make medley.sh and its associated scripts POSIX compliant - i.e., debashify them

* Added config file for medley script, medley now reads from config file and prepends arguemnts from file to the copmmand line arguments

* WIP. Updates to medley.sh scripts.

* WIP.  More on medley.sh and friends update.

* WIP. Medley redo

* WIP.  Debugging new medley scripts

* Renamed medley.sh/medley.command to be medley_main.sh.  Added code to compile single medley.sh/medley.command script by inlining all of the source'd medley_*.sh files.

* Add temp fix for cygwin Issue #1685

* Minor fixup to medley_utils.sh; take debug code out out of run_medley

* Add README to medley directory to explain how to compile medley.sh (medley.command).

* Ooops. This time really adding the README file to the medley directory explaining how to compile medley.sh (medley.command)

* Update loadup- scripts to use updated medley scripts rather than run-medley

* Fix default setting of $config_file in medley_configfile.sh

* Redo medley compile to pick up last commikt

* Fixing how maiko exe is found and sysout argument error processing - both issues discovered testing on MAcOS

* In medley_configfile, replace echo with printf %s because echo - does not work in zsh

* Supress config file on loadups calls to Medley

* Add oldschool support (use original run-medley) to loadup scripts; improve FAILURE detection so loadup-all won't proceed once one of the components fails

* Add in medley_args.sh add -prog as synonym to --maikoprog to aid in loadup scripts; in medley_run.sh script try to get a good exit code for call to maiko, especially useful for loadup scripts

* Run loadup scripts thru shellcheck and update as necessary to make Posix compliant

* Get rid of -nt comparisons in loadup-setup.sh because they are not posix-complaint.  They were not really needed anyway.

* Removing (for now) use of lde exit codes to decide FAILURE case in loadup-setup.sh since exit codes from lde apperar to be inverted on MacOS.

* Update medley man page.  Add - functionality to more args is medley_args.sh

* Compile medley.sh with changes from last commit

* Ooops.  Left medley_args.sh changes out of last commit.  Rectifying here.

* Added support for LDEKEYBOARDTYPE to medley_run to match run-medley

* Add to medley.sh: auto numbered id's and titles with id's inserted

* Cleanup some shellcheck issues in medley_main.sh

* fix maiko args -nh-xxx.  were -nethub-xxxx. In medley_run.sh

* Overhaul handling of pass-on args to manage the quoting issues prevelant in the previous implementation

* Cleanup minor shellcheck issues in medley_*.sh scripts

* Add underscore as character allowed in ids - makes things clearer when id used with +

* Add a self-numbering id to medley calls in loadup scripts

* Put workaround in medley_run.sh for Issue #1702 - issues with sysout arg processing in Maiko

* Oops.  messed up LDESRCSYSOUT in last commit.  should be LDESOURCESYSOUT

* compile medley.sh
This commit is contained in:
Frank Halasz 2024-05-09 21:31:27 -07:00 committed by GitHub
parent 4272a6e5ed
commit 415a698df5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
29 changed files with 3728 additions and 769 deletions

View File

@ -7,101 +7,113 @@
<h1>OPTIONS</h1>
<p><strong>MEDLEYDIR</strong> is an environment variable set by Medley and used by many of the options described below. MEDLEYDIR is the top level directory of the Medley installation that contains the specific medley script that is invoked after all symbolic links are resolved. In the standard global installation this will be /usr/local/interlisp/medley. But Medley can be installed in multiple places on any given machine and hence MEDLEYDIR is computed on each invocation of medley.</p>
<h2>Flags</h2>
<dl>
<dt><strong>-h, --help</strong></dt>
<dt>-h, --help</dt>
<dd><p>Prints out a brief summary of the flags and arguments to medley.</p>
</dd>
<dt><strong>-z, --man</strong></dt>
<dt>-z, --man</dt>
<dd><p>Show the man page for medley</p>
</dd>
<dt><strong>-f, --full</strong></dt>
<dt>-c [<em>FILE</em> | -], --config [<em>FILE</em> | -]</dt>
<dd><p>Use <em>FILE</em> as the config file for this run of Medley. See information on <em>CONFIG FILE</em> below. If <em>FILE</em> is “-”, then suppress the use of a config file for this run of Medley.</p>
</dd>
<dt>-f, --full</dt>
<dd><p>Start Medley from the standard “full” sysout. full.sysout includes a complete Interlisp and CommonLisp environment with a standard set of development tools. It does not include any of the applications built using Medley. (See <em>SYSOUT_FILE</em> below for more information on starting sysouts.)</p>
</dd>
<dt><strong>-l, --lisp</strong></dt>
<dt>-l, --lisp</dt>
<dd><p>Start Medley from the standard “lisp” sysout. lisp.sysout only includes the basic Interlisp and CommonLisp environment. (See <em>SYSOUT_FILE</em> below for more information on starting sysouts.)</p>
</dd>
<dt><strong>-a, --apps</strong></dt>
<dt>-a, --apps</dt>
<dd><p>Start Medley from the standard “apps” sysout. apps.sysout includes everything in full.sysout plus Medley applications including Notecards, Rooms and CLOS. It also includes pre-installed links to key Medley documentation. (See <em>SYSOUT_FILE</em> below for more information on starting sysouts.)</p>
</dd>
<dt><strong>-e, --interlisp (relevent only when --apps is specified)</strong></dt>
<dd><p>Make the initial Exec window within Medley be an Interlisp Exec. Default is to start in an XCL Exec.</p>
<dt>-u, --continue</dt>
<dd><p>Nullify any prior setting of the sysout file (e.g., from the config file) - causing Medley to start from the virtual memory file resulting from the previous invocation (with the same values for id and logindir), if any. If there is no matching virtual memory file, Medley will start from the full.sysout (see -f/full above). Equivalent to “-y -”. (See <em>SYSOUT FILE</em> section below.)</p>
</dd>
<dt><strong>-n, --noscroll</strong></dt>
<dd><p>Ordinarily Medley displays scroll bars to enable the user to pan the Medley virtual display within the Medley window. This is true even when the entire virtual display fits within the window. Specifying --noscroll turns off the scroll bars. Note: If --noscroll is specified and the virtual screen is larger than the window, there will be no way to pan to the non-visible parts of the virtual display.</p>
<dt>-y [<em>SYSOUT_FILE</em> | -], --sysout [<em>SYSOUT-FILE</em> | -]</dt>
<dd><p>Start Medley from the specified <em>SYSOUT-FILE</em>. This is an alternative to specifying the <em>SYSOUT-FILE</em> as the last argument on the command line (but before any <em>PASS_ON_ARGS</em>). It can be used to specify the <em>SYSOUT-FILE</em> in the config file (see information on <em>CONFIG FILE</em> below). If <em>SYSOUT-FILE</em> is “-”, then any prior setting of the sysout file (e.g., from the config file) is nullified (see -u/continue above). (See <em>SYSOUT FILE</em> section below.)</p>
</dd>
<dt><strong>-g <em>WxH</em>, --geometry <em>WxH</em></strong></dt>
<dd><p>Sets the size of the X Window (or VNC window) that Medley runs in to be Width x Height. (Full X Windows geomtery specification with +X+Y is not currently supported). If --geometry is not specified but --screensize is, then the window size will be determined based on the --screensize values and the --noscroll flag. If neither --geometry nor --screensize is provided, then the window size is set to 1440x900 if --noscroll is set and 1462x922 if --noscroll is not set.</p>
<dt>-e [+ | -], --interlisp [+ | -]</dt>
<dd><p>If value is “+” or no value, make the initial Exec window within Medley be an Interlisp Exec. If value is “-”, make the initial Exec window be the default XCL Exec. This flag applies only when the apps flag is used.</p>
</dd>
<dt><strong>-s <em>WxH</em>, --screensize <em>WxH</em></strong></dt>
<dd><p>Sets the size of the virtual display as seen from Medleys point of view. The Medley window is an unscaled viewport onto this virtual display. If --screensize is not specified but --geometry is, then the virtual display size will be set so that the entire virtual display fits into the given window geometry. If neither --screensize nor --geometry is provided, then the screen size is set to 1440x900.</p>
<dt>-n [+ | -], --noscroll [+ | -]</dt>
<dd><p>Medley ordinarily displays scroll bars to enable the user to pan the Medley virtual display within the Medley window. This is true even when the entire virtual display fits within the window. Specifying “-n +” (noscroll +) turns off scroll bars. Specifying “-n -” (scroll -) turns on scroll bars. Specifying -n (noscroll) with no value is equivalent to specifying “noscroll +”. Default is scroll bars off. Note: If scroll bars are off and the virtual screen is larger than the window, there will be no way to pan to the non-visible parts of the virtual display.</p>
</dd>
<dt><strong>-t <em>STRING</em>, --title <em>STRING</em></strong></dt>
<dd><p>Use STRING as title of Medley window. Ignored when when the --vnc flag is set or when running on Windows (Docker) installations.</p>
<dt>-g [<em>WxH</em> | -], --geometry [<em>WxH</em> | -]</dt>
<dd><p>Sets the size of the X Window (or VNC window) that Medley runs in to be Width x Height. (Full X Windows geomtery specification with +X+Y is not currently supported). If a value of “-” is given, geometry is set to the default value. If --geometry is not specified but --screensize is, then the window size will be determined based on the --screensize values and the --noscroll flag. If neither --geometry nor --screensize is provided, then the window size is set to 1440x900 if --noscroll is set and 1462x922 if --noscroll is not set. (Also see note below under <em>CONFIG FILE</em> on the use of geometry and screensize in config files.)</p>
</dd>
<dt><strong>-d <em>:N</em>, --display <em>:N</em> ** <strong>Not</strong> applicable to Windows (Docker) installations **</strong></dt>
<dd><p>Use X display :N. Defaults to the value of $DISPLAY. This flag is ignored when the --vnc flag is set as well as on Windows (Docker) installations.</p>
<dt>-s [<em>WxH</em> | -], --screensize [<em>WxH</em> | -]</dt>
<dd><p>Sets the size of the virtual display as seen from Medleys point of view. If a value of “-” is given, screensize is set to the default value. The Medley window is an unscaled viewport onto this virtual display. If --screensize is not specified but --geometry is, then the virtual display size will be set so that the entire virtual display fits into the given window geometry. If neither --screensize nor --geometry is provided, then the screen size is set to 1440x900. (Also see note below under <em>CONFIG FILE</em> on the use of geometry and screensize in config files.)</p>
</dd>
<dt><strong>-v, --vnc ** <strong>Applicable</strong> only to WSL installations **</strong></dt>
<dd><p>Use a VNC window running on the Windows side instead of an X window. The VNC window will folllow the Windows desktop scaling setting allowing for much more usable Medley on high resolution displays. On WSL, X windows do not scale well. This flag is always set for WSL1 installations.</p>
<dt>-ps [<em>N</em> | -], pixelscale [<em>N</em> | -] ** <strong>Applicable only when display is SDL-based (e.g., on Windows/Cygwin)</strong> **</dt>
<dd><p>Sets the pixel scaling factor to <em>N</em>. If value of “-” is given, the pixel scale factor is set to its default of 1.</p>
</dd>
<dt><strong>-i [<em>ID_STRING</em> | - | --], --id [<em>ID_STRING</em> | - | --]</strong></dt>
<dd><p>Use ID_STRING as the id for this run of Medley, iunless ID_STRING is “-” or “--”. If ID_STRING is “-”, then use the basename of $MEDLEYDIR as the id. If ID_STRING is “--”, then use the basename of the parent directory of $MEDLEYDIR as the id. Only one instance of Medley with a given id can run at a time. The id is used to distinguish the virtual memory stores so that multiple instances of Medley can run simultaneously. Default id is “default”.</p>
<dt>-t [<em>STRING</em> | -], --title [<em>STRING</em> | -]</dt>
<dd><p>Use STRING as title of Medley window. If the value of “-” is given, sets the title to its default value (“Medley Interlisp”). Ignored when when the --vnc flag is set.</p>
</dd>
<dt><strong>-m <em>N</em>, --mem <em>N</em></strong></dt>
<dd><p>Set Medley to run in <em>N</em> MB of virtual memory. Defaults to 256MB.</p>
<dt>-d [<em>:N</em> | -], --display [<em>:N</em> | -]</dt>
<dd><p>Use X display :N. If value is “-”, reset display to its default value. Default value is the value of $DISPLAY. On platforms that support X Windows as well as SDL, the value of -d (display) should be set to “SDL” to select using SDL instead of X Windows. This flag is ignored on the Windows/Cygwin platform and when the --vnc flag is set on Windows System for Linux.</p>
</dd>
<dt><strong>-p <em>FILE</em>, --vmem <em>FILE</em></strong></dt>
<dd><p>Use FILE as the Medley virtual memory (vmem) store. FILE must be writeable by the current user. Care must be taken not to use the same vmem FILE for two instances of Medley running simultaneously. The --id flag will not protect against vmem collisions when the --vmem flag is used. Default is to store the vmem in LOGINDIR/vmem/lisp_XXX.virtualmem, where XXX is the id of this Medley run (see --id flag above). See --logindir below for setting of LOGINDIR. On Windows (Docker) installations, <em>FILE</em> is specified in the Medley file system, not the host Windows file system.</p>
<dt>-v [+ | -] , --vnc [+ | -] ** <strong>Applicable only to WSL installations</strong> **</dt>
<dd><p>If value is “+” or no value is given, then use a VNC window running on the Windows side instead of an X window. If value is “-”, then do not use a VNC window, relying instead on a standard X Window. A VNC window will folllow the Windows desktop scaling setting allowing for much more usable Medley on high resolution displays. On WSL, X windows do not scale well. This flag is always set for WSL1 installations.</p>
</dd>
<dt><strong>-r [<em>FILE</em> | -], --greet [<em>FILE</em> | -]</strong></dt>
<dd><p>Use FILE as the Medley greetfile, unless FILE is “-” in which case Medley will start up without using a greetfile. The default Medley greetfile is $MEDLEYDIR/greetfiles/MEDLEYDIR-INIT, except when the --apps flag is used in which case it is $MEDLEYDIR/greetfiles/APPS-INIT. On Windows (Docker) installations, <em>FILE</em> is specified in the Medley file system, not the host Windows file system.</p>
<dt>-i [<em>ID_STRING</em> | - | --], --id [<em>ID_STRING</em> | - | --]</dt>
<dd><p>Use ID_STRING as the id for this run of Medley, unless ID_STRING is “-”, “--”, or “---”. If ID_STRING is “-”, then reset the id to “default” (e.g., if it was previously set in the config file). If ID_STRING is “--”, then use the basename of $MEDLEYDIR as the id. If ID_STRING is “---”, then use the basename of the parent directory of $MEDLEYDIR as the id. Only one instance of Medley with a given id can run at a time. The id is used to distinguish the virtual memory stores so that multiple instances of Medley can run simultaneously. Default id is “default”.</p>
</dd>
<dt><strong>-x [<em>DIR</em> | -], --logindir [<em>DIR</em> | -] ** <strong>On</strong> Linux and WSL installations **</strong></dt>
<dd><p>Use DIR as LOGINDIR in Medley, unless DIR is “-”, in which case use $MEDLEYDIR/logindir. DIR (or $MEDLEYDIR/logindir) must be writeable by the current user. LOGINDIR defaults to $HOME/il. LOGINDIR is used by Medley as the working directory on start-up and where it loads any “personal” initialization file from.</p>
<dt>-m [<em>N</em> | -], --mem [<em>N</em> | -]</dt>
<dd><p>Set Medley to run in <em>N</em> MB of virtual memory. Defaults to 256MB. If a value of “-” is given, resets to default value.</p>
</dd>
<dt><strong>-x [<em>DIR</em> | -], --logindir [<em>DIR</em> | -] ** <strong>On</strong> Windows (Docker) installations **</strong></dt>
<dd><p>Map DIR in the Windows host file system to /home/medley/il in the Medley file system (in the Docker container). LOGINDIR is always /home/medley/il from Medleys standpoint. The “-” value is not valid in this case.</p>
<dt>-p [<em>FILE</em> | -], --vmem [<em>FILE</em> | -]</dt>
<dd><p>Use FILE as the Medley virtual memory (vmem) store. FILE must be writeable by the current user. Care must be taken not to use the same vmem FILE for two instances of Medley running simultaneously. The --id flag will not protect against vmem collisions when the --vmem flag is used. If the value “-” is given, then resets the vmem file to the default. Default is to store the vmem in LOGINDIR/vmem/lisp_III.virtualmem, where III is the id of this Medley run (see --id flag above). See --logindir below for setting of LOGINDIR.</p>
</dd>
<dt><strong>-u, --update ** <strong>Windows</strong> (Docker) installations only **</strong></dt>
<dd><p>Before running Medley, do a pull to retrieve the latest interlisp/medley docker image from Docker Hub.</p>
<dt>-r [<em>FILE</em> | -], --greet [<em>FILE</em> | -]</dt>
<dd><p>Use FILE as the Medley greetfile, unless FILE is “-” in which case Medley will start up without using a greetfile. The default Medley greetfile is $MEDLEYDIR/greetfiles/MEDLEYDIR-INIT, except when the --apps flag is used in which case it is $MEDLEYDIR/greetfiles/APPS-INIT. On Windows/Cygwin installations, <em>FILE</em> is specified in the Medley file system, not the host Windows file system.</p>
</dd>
<dt><strong>-b, --background ** <strong>Windows</strong> (Docker) installations only **</strong></dt>
<dd><p>Run Medley in background rather than foreground.</p>
<dt>-x [<em>DIR</em> | - | ], --logindir [<em>DIR</em> | - | ]</dt>
<dd><p>Use DIR as LOGINDIR in Medley. If the value is “–”, use $MEDLEYDIR/logindir as LOGINDIR. If a value of “-” is given, then reset LOGINDIR to its default value. DIR (or $MEDLEYDIR/logindir) must be writeable by the current user. LOGINDIR defaults to $HOME/il. LOGINDIR is used by Medley as the working directory on start-up and where it loads any “personal” initialization file from. On Windows/Cygwin installations, <em>FILE</em> is specified in the Medley file system, not the host Windows file system.</p>
</dd>
<dt><strong>-p <em>PORT</em>, --port <em>PORT</em> ** <strong>Windows</strong> (Docker) installations only **</strong></dt>
<dd><p>Use <em>PORT</em> as the port that VNC viewer uses to contact the VNC server within the Docker container. Default is 5900.</p>
<dt>-nh <em>Host:Port:Mac:Debug</em>, --nethub <em>Host:Port:Mac:Debug</em></dt>
<dd><p>Set the parameters for using Nethub XNS networking. <em>Host</em> is the full domain name of the nethub host. <em>Port</em> is the port on <em>Host</em> that nethub is using. <em>Mac</em> is the Mac address that this instance of Medley should use when contacting the nethub host. <em>Debug</em> is the level of nethub debug information that should be printed on stdout (value is 0, 1, or 2). A <em>Host</em> value is required and serves to turn nethub functionality on. <em>Port</em>, <em>Mac</em> and <em>Debug</em> parameters are optional and will default if left off. Finally, if any of the parameters have a value of “-”, any previous setting (e.g., in a config file) for the parameter will be reset to the default value - which in the case of <em>Host</em> is the null string, turning nethub functionality off.</p>
</dd>
<dt><strong>-w [<em>DISTRO</em> | -], --wsl [<em>DISTRO</em> | -] ** <strong>Windows</strong> (Docker) installations only **</strong></dt>
<dd><p>Run Medley in the context of the named WSL <em>DISTRO</em> instead of within Docker. If <em>DISTRO</em> is “-”, used the default WSL distro. Equivalent to typing “wsl -d <em>DISTRO</em> medley ...” into a Command or Powershell window.</p>
<dt>-nf, -NF, nofork</dt>
<dd><p>No fork. Relevant only to the Medley loadup workflow.</p>
</dd>
<dt>-prog <em>EXE</em>, maikoprog <em>EXE</em></dt>
<dd><p>Use <em>EXE</em> as the basename of the Maiko executable. Relevant only to the Medley loadup workflow.</p>
</dd>
<dt>maikodir <em>DIR</em></dt>
<dd><p>Use <em>DIR</em> as the directory containing the Maiko emulator. For testing purposes only.</p>
</dd>
</dl>
<h2>Other Options</h2>
<dl>
<dt><strong><em>SYSOUT_FILE</em></strong></dt>
<dt><em>SYSOUT_FILE</em></dt>
<dd><p>The pathname of the file to use as a sysout for Medley to start from. If SYSOUT_FILE is not provided and none of the flags (--apps, --full, --lisp) is used, then Medley will start from the saved virtual memory file from the previous session with the same ID_STRING as this run. If no such virtual memory file exists, then Medley will start from the standard full.sysout (equivalent to specifying the --full flag). On Windows (Docker) installations, <em>SYSOUT_FILE</em> is specified in the Medley file system, not the host Windows file system.</p>
</dd>
<dt><strong><em>PASS_ON_ARGS</em></strong></dt>
<dd><p>All arguments after the “--” flag, are passed unaltered to lde via run-medley.</p>
<dt><em>PASS_ON_ARGS</em></dt>
<dd><p>All arguments after the “--” flag, are passed unaltered to the Maiko emulator.</p>
</dd>
</dl>
<h1>FILES</h1>
<h1>CONFIG FILE</h1>
<p>A config file can be used to “pre-specify” any of the above command line arguments. The config file consists of command line arguments (flags or flag-value pairs), <em>one per line</em>. These arguments are read from the config file and prepended to the arguments actually given on the command line. Since later arguments override earlier arguments, any argument actually given on the command line will override a conflicting argument given in the config file.</p>
<p>Unless specified using the -c (config) argument, the default config file will be $MEDLEYDIR/.medley_config, if it exists, and $HOME/.medley_config, otherwise.</p>
<p>Specifying, “-c -” or “config -” on the command line will suppress the use of config files for the current run of Medley.</p>
<p><em>Note:</em> care must be taken when using -g (geometry) and/or -s (screensize) arguments in config files. If only one of these is specified, then the other is conputed. But if both are specified, then the specified dimensions are used as given. Unexpected results can arise if one is specified in the config file but the other is specified on the command line. In this case, the two specified dimensions will be used as given. It will not be the case, as might be expected, that the dimension given in the config file will be overridden by a dimension computed from the dimension given on the command line.</p>
<h1>OTHER FILES</h1>
<dl>
<dt><strong>$HOME/il</strong></dt>
<dt>$HOME/il</dt>
<dd><p>Default Medley LOGINDIR</p>
</dd>
<dt><strong>$HOME/il/vmem/lisp.virtualmem</strong></dt>
<dt>$HOME/il/vmem/lisp.virtualmem</dt>
<dd><p>Default virtual memory file</p>
</dd>
<dt><strong>$HOME/il/INIT(.LCOM)</strong></dt>
<dt>$HOME/il/INIT(.LCOM)</dt>
<dd><p>Default personal init file</p>
</dd>
<dt><strong>$MEDLEYDIR/greetfiles/MEDLEYDIR-INIT(.LCOM)</strong></dt>
<dt>$MEDLEYDIR/greetfiles/MEDLEYDIR-INIT(.LCOM)</dt>
<dd><p>Default Medley greetfile</p>
</dd>
</dl>
<h1>BUGS</h1>
<p>See GitHub Issues: &lt;https://github.com/Interlisp/medley/issues&gt;</p>
<h1>COPYRIGHT</h1>
<p>Copyright(c) 2023 by Interlisp.org</p>
<p>Copyright(c) 2023-2024 by Interlisp.org</p>

View File

@ -1,14 +1,14 @@
.\" Automatically generated by Pandoc 2.5
.\" Automatically generated by Pandoc 2.9.2.1
.\"
.ad l
.TH "MEDLEY" "1" "" "" "Start Medley Interlisp"
.nh \" Turn off hyphenation by default.
.nh
.SH NAME
.PP
\f[B]medley\f[R] \[em] starts up Medley Interlisp
.SH SYNOPSIS
.PP
\f[B]medley\f[R] [ flags \&... ] [ \f[I]SYSOUT_FILE\f[R] ] [ \-\-
\f[B]medley\f[R] [ flags \&... ] [ \f[I]SYSOUT_FILE\f[R] ] [ --
\f[I]PASS_ON_ARGS\f[R] ]
.SH DESCRIPTION
.PP
@ -28,13 +28,19 @@ hence MEDLEYDIR is computed on each invocation of medley.
.PP
\
.TP
.B \-h, \-\-help
-h, --help
Prints out a brief summary of the flags and arguments to medley.
.TP
.B \-z, \-\-man
-z, --man
Show the man page for medley
.TP
.B \-f, \-\-full
-c [\f[I]FILE\f[R] | -], --config [\f[I]FILE\f[R] | -]
Use \f[I]FILE\f[R] as the config file for this run of Medley.
See information on \f[I]CONFIG FILE\f[R] below.
If \f[I]FILE\f[R] is \[lq]-\[rq], then suppress the use of a config file
for this run of Medley.
.TP
-f, --full
Start Medley from the standard \[lq]full\[rq] sysout.
full.sysout includes a complete Interlisp and CommonLisp environment
with a standard set of development tools.
@ -42,179 +48,270 @@ It does not include any of the applications built using Medley.
(See \f[I]SYSOUT_FILE\f[R] below for more information on starting
sysouts.)
.TP
.B \-l, \-\-lisp
-l, --lisp
Start Medley from the standard \[lq]lisp\[rq] sysout.
lisp.sysout only includes the basic Interlisp and CommonLisp
environment.
(See \f[I]SYSOUT_FILE\f[R] below for more information on starting
sysouts.)
.TP
.B \-a, \-\-apps
-a, --apps
Start Medley from the standard \[lq]apps\[rq] sysout.
apps.sysout includes everything in full.sysout plus Medley applications
including Notecards, Rooms and CLOS.
It also includes pre\-installed links to key Medley documentation.
It also includes pre-installed links to key Medley documentation.
(See \f[I]SYSOUT_FILE\f[R] below for more information on starting
sysouts.)
.TP
.B \-e, \-\-interlisp (relevent only when \-\-apps is specified)
Make the initial Exec window within Medley be an Interlisp Exec.
Default is to start in an XCL Exec.
-u, --continue
Nullify any prior setting of the sysout file (e.g., from the config
file) - causing Medley to start from the virtual memory file resulting
from the previous invocation (with the same values for \[en]id and
\[en]logindir), if any.
If there is no matching virtual memory file, Medley will start from the
full.sysout (see -f/\[en]full above).
Equivalent to \[lq]-y -\[rq].
(See \f[I]SYSOUT FILE\f[R] section below.)
.TP
.B \-n, \-\-noscroll
Ordinarily Medley displays scroll bars to enable the user to pan the
-y [\f[I]SYSOUT_FILE\f[R] | -], --sysout [\f[I]SYSOUT-FILE\f[R] | -]
Start Medley from the specified \f[I]SYSOUT-FILE\f[R].
This is an alternative to specifying the \f[I]SYSOUT-FILE\f[R] as the
last argument on the command line (but before any
\f[I]PASS_ON_ARGS\f[R]).
It can be used to specify the \f[I]SYSOUT-FILE\f[R] in the config file
(see information on \f[I]CONFIG FILE\f[R] below).
If \f[I]SYSOUT-FILE\f[R] is \[lq]-\[rq], then any prior setting of the
sysout file (e.g., from the config file) is nullified (see
-u/\[en]continue above).
(See \f[I]SYSOUT FILE\f[R] section below.)
.TP
-e [+ | -], --interlisp [+ | -]
If value is \[lq]+\[rq] or no value, make the initial Exec window within
Medley be an Interlisp Exec.
If value is \[lq]-\[rq], make the initial Exec window be the default XCL
Exec.
This flag applies only when the \[en]apps flag is used.
.TP
-n [+ | -], --noscroll [+ | -]
Medley ordinarily displays scroll bars to enable the user to pan the
Medley virtual display within the Medley window.
This is true even when the entire virtual display fits within the
window.
Specifying \-\-noscroll turns off the scroll bars.
Note: If \-\-noscroll is specified and the virtual screen is larger than
the window, there will be no way to pan to the non\-visible parts of the
Specifying \[lq]-n +\[rq] (\[en]noscroll +) turns off scroll bars.
Specifying \[lq]-n -\[rq] (\[en]scroll -) turns on scroll bars.
Specifying -n (\[en]noscroll) with no value is equivalent to specifying
\[lq]\[en]noscroll +\[rq].
Default is scroll bars off.
Note: If scroll bars are off and the virtual screen is larger than the
window, there will be no way to pan to the non-visible parts of the
virtual display.
.TP
.B \-g \f[I]WxH\f[R], \-\-geometry \f[I]WxH\f[R]
-g [\f[I]WxH\f[R] | -], --geometry [\f[I]WxH\f[R] | -]
Sets the size of the X Window (or VNC window) that Medley runs in to be
Width x Height.
(Full X Windows geomtery specification with +X+Y is not currently
supported).
If \-\-geometry is not specified but \-\-screensize is, then the window
size will be determined based on the \-\-screensize values and the
\-\-noscroll flag.
If neither \-\-geometry nor \-\-screensize is provided, then the window
size is set to 1440x900 if \-\-noscroll is set and 1462x922 if
\-\-noscroll is not set.
If a value of \[lq]-\[rq] is given, geometry is set to the default
value.
If --geometry is not specified but --screensize is, then the window size
will be determined based on the --screensize values and the --noscroll
flag.
If neither --geometry nor --screensize is provided, then the window size
is set to 1440x900 if --noscroll is set and 1462x922 if --noscroll is
not set.
(Also see note below under \f[I]CONFIG FILE\f[R] on the use of geometry
and screensize in config files.)
.TP
.B \-s \f[I]WxH\f[R], \-\-screensize \f[I]WxH\f[R]
-s [\f[I]WxH\f[R] | -], --screensize [\f[I]WxH\f[R] | -]
Sets the size of the virtual display as seen from Medley\[cq]s point of
view.
If a value of \[lq]-\[rq] is given, screensize is set to the default
value.
The Medley window is an unscaled viewport onto this virtual display.
If \-\-screensize is not specified but \-\-geometry is, then the virtual
If --screensize is not specified but --geometry is, then the virtual
display size will be set so that the entire virtual display fits into
the given window geometry.
If neither \-\-screensize nor \-\-geometry is provided, then the screen
size is set to 1440x900.
If neither --screensize nor --geometry is provided, then the screen size
is set to 1440x900.
(Also see note below under \f[I]CONFIG FILE\f[R] on the use of geometry
and screensize in config files.)
.TP
.B \-t \f[I]STRING\f[R], \-\-title \f[I]STRING\f[R]
-ps [\f[I]N\f[R] | -], \[en]pixelscale [\f[I]N\f[R] | -]\ \ \ \ ** \f[B]Applicable only when display is SDL-based (e.g., on Windows/Cygwin)\f[R] **
Sets the pixel scaling factor to \f[I]N\f[R].
If value of \[lq]-\[rq] is given, the pixel scale factor is set to its
default of 1.
.TP
-t [\f[I]STRING\f[R] | -], --title [\f[I]STRING\f[R] | -]
Use STRING as title of Medley window.
Ignored when when the \-\-vnc flag is set or when running on Windows
(Docker) installations.
If the value of \[lq]-\[rq] is given, sets the title to its default
value (\[lq]Medley Interlisp\[rq]).
Ignored when when the --vnc flag is set.
.TP
.B \-d \f[I]:N\f[R], \-\-display \f[I]:N\f[R]\ \ \ \ ** \f[B]Not applicable to Windows (Docker) installations\f[R] **
-d [\f[I]:N\f[R] | -], --display [\f[I]:N\f[R] | -]
Use X display :N.
Defaults to the value of $DISPLAY.
This flag is ignored when the \-\-vnc flag is set as well as on Windows
(Docker) installations.
If value is \[lq]-\[rq], reset display to its default value.
Default value is the value of $DISPLAY.
On platforms that support X Windows as well as SDL, the value of -d
(\[en]display) should be set to \[lq]SDL\[rq] to select using SDL
instead of X Windows.
This flag is ignored on the Windows/Cygwin platform and when the --vnc
flag is set on Windows System for Linux.
.TP
.B \-v, \-\-vnc\ \ \ \ ** \f[B]Applicable only to WSL installations\f[R] **
Use a VNC window running on the Windows side instead of an X window.
The VNC window will folllow the Windows desktop scaling setting allowing
-v [+ | -] , --vnc [+ | -]\ \ \ \ ** \f[B]Applicable only to WSL installations\f[R] **
If value is \[lq]+\[rq] or no value is given, then use a VNC window
running on the Windows side instead of an X window.
If value is \[lq]-\[rq], then do not use a VNC window, relying instead
on a standard X Window.
A VNC window will folllow the Windows desktop scaling setting allowing
for much more usable Medley on high resolution displays.
On WSL, X windows do not scale well.
This flag is always set for WSL1 installations.
.TP
.B \-i [\f[I]ID_STRING\f[R] | \- | \-\-], \-\-id [\f[I]ID_STRING\f[R] | \- | \-\-]
Use ID_STRING as the id for this run of Medley, iunless ID_STRING is
\[lq]\-\[rq] or \[lq]\-\-\[rq].
If ID_STRING is \[lq]\-\[rq], then use the basename of $MEDLEYDIR as the
-i [\f[I]ID_STRING\f[R] | - | --], --id [\f[I]ID_STRING\f[R] | - | --]
Use ID_STRING as the id for this run of Medley, unless ID_STRING is
\[lq]-\[rq], \[lq]--\[rq], or \[lq]---\[rq].
If ID_STRING is \[lq]-\[rq], then reset the id to \[lq]default\[rq]
(e.g., if it was previously set in the config file).
If ID_STRING is \[lq]--\[rq], then use the basename of $MEDLEYDIR as the
id.
If ID_STRING is \[lq]\-\-\[rq], then use the basename of the parent
If ID_STRING is \[lq]---\[rq], then use the basename of the parent
directory of $MEDLEYDIR as the id.
Only one instance of Medley with a given id can run at a time.
The id is used to distinguish the virtual memory stores so that multiple
instances of Medley can run simultaneously.
Default id is \[lq]default\[rq].
.TP
.B \-m \f[I]N\f[R], \-\-mem \f[I]N\f[R]
-m [\f[I]N\f[R] | -], --mem [\f[I]N\f[R] | -]
Set Medley to run in \f[I]N\f[R] MB of virtual memory.
Defaults to 256MB.
If a value of \[lq]-\[rq] is given, resets to default value.
.TP
.B \-p \f[I]FILE\f[R], \-\-vmem \f[I]FILE\f[R]
-p [\f[I]FILE\f[R] | -], --vmem [\f[I]FILE\f[R] | -]
Use FILE as the Medley virtual memory (vmem) store.
FILE must be writeable by the current user.
Care must be taken not to use the same vmem FILE for two instances of
Medley running simultaneously.
The \-\-id flag will not protect against vmem collisions when the
\-\-vmem flag is used.
Default is to store the vmem in LOGINDIR/vmem/lisp_XXX.virtualmem, where
XXX is the id of this Medley run (see \-\-id flag above).
See \-\-logindir below for setting of LOGINDIR.
On Windows (Docker) installations, \f[I]FILE\f[R] is specified in the
Medley file system, not the host Windows file system.
The --id flag will not protect against vmem collisions when the --vmem
flag is used.
If the value \[lq]-\[rq] is given, then resets the vmem file to the
default.
Default is to store the vmem in LOGINDIR/vmem/lisp_III.virtualmem, where
III is the id of this Medley run (see --id flag above).
See --logindir below for setting of LOGINDIR.
.TP
.B \-r [\f[I]FILE\f[R] | \-], \-\-greet [\f[I]FILE\f[R] | \-]
Use FILE as the Medley greetfile, unless FILE is \[lq]\-\[rq] in which
-r [\f[I]FILE\f[R] | -], --greet [\f[I]FILE\f[R] | -]
Use FILE as the Medley greetfile, unless FILE is \[lq]-\[rq] in which
case Medley will start up without using a greetfile.
The default Medley greetfile is $MEDLEYDIR/greetfiles/MEDLEYDIR\-INIT,
except when the \-\-apps flag is used in which case it is
$MEDLEYDIR/greetfiles/APPS\-INIT.
On Windows (Docker) installations, \f[I]FILE\f[R] is specified in the
The default Medley greetfile is $MEDLEYDIR/greetfiles/MEDLEYDIR-INIT,
except when the --apps flag is used in which case it is
$MEDLEYDIR/greetfiles/APPS-INIT.
On Windows/Cygwin installations, \f[I]FILE\f[R] is specified in the
Medley file system, not the host Windows file system.
.TP
.B \-x [\f[I]DIR\f[R] | \-], \-\-logindir [\f[I]DIR\f[R] | \-]\ \ \ \ ** \f[B]On Linux and WSL installations\f[R] **
Use DIR as LOGINDIR in Medley, unless DIR is \[lq]\-\[rq], in which case
use $MEDLEYDIR/logindir.
-x [\f[I]DIR\f[R] | - | \[en]], --logindir [\f[I]DIR\f[R] | - | \[en]]
Use DIR as LOGINDIR in Medley.
If the value is \[lq]\[en]\[rq], use $MEDLEYDIR/logindir as LOGINDIR.
If a value of \[lq]-\[rq] is given, then reset LOGINDIR to its default
value.
DIR (or $MEDLEYDIR/logindir) must be writeable by the current user.
LOGINDIR defaults to $HOME/il.
LOGINDIR is used by Medley as the working directory on start\-up and
LOGINDIR is used by Medley as the working directory on start-up and
where it loads any \[lq]personal\[rq] initialization file from.
On Windows/Cygwin installations, \f[I]FILE\f[R] is specified in the
Medley file system, not the host Windows file system.
.TP
.B \-x [\f[I]DIR\f[R] | \-], \-\-logindir [\f[I]DIR\f[R] | \-]\ \ \ \ ** \f[B]On Windows (Docker) installations\f[R] **
Map DIR in the Windows host file system to /home/medley/il in the Medley
file system (in the Docker container).
LOGINDIR is always /home/medley/il from Medley\[cq]s standpoint.
The \[lq]\-\[rq] value is not valid in this case.
-nh \f[I]Host:Port:Mac:Debug\f[R], --nethub \f[I]Host:Port:Mac:Debug\f[R]
Set the parameters for using Nethub XNS networking.
\f[I]Host\f[R] is the full domain name of the nethub host.
\f[I]Port\f[R] is the port on \f[I]Host\f[R] that nethub is using.
\f[I]Mac\f[R] is the Mac address that this instance of Medley should use
when contacting the nethub host.
\f[I]Debug\f[R] is the level of nethub debug information that should be
printed on stdout (value is 0, 1, or 2).
A \f[I]Host\f[R] value is required and serves to turn nethub
functionality on.
\f[I]Port\f[R], \f[I]Mac\f[R] and \f[I]Debug\f[R] parameters are
optional and will default if left off.
Finally, if any of the parameters have a value of \[lq]-\[rq], any
previous setting (e.g., in a config file) for the parameter will be
reset to the default value - which in the case of \f[I]Host\f[R] is the
null string, turning nethub functionality off.
.TP
.B \-u, \-\-update\ \ \ \ ** \f[B]Windows (Docker) installations only\f[R] **
Before running Medley, do a pull to retrieve the latest interlisp/medley
docker image from Docker Hub.
-nf, -NF, \[en]nofork
No fork.
Relevant only to the Medley loadup workflow.
.TP
.B \-b, \-\-background\ \ \ \ ** \f[B]Windows (Docker) installations only\f[R] **
Run Medley in background rather than foreground.
-prog \f[I]EXE\f[R], \[en]maikoprog \f[I]EXE\f[R]
Use \f[I]EXE\f[R] as the basename of the Maiko executable.
Relevant only to the Medley loadup workflow.
.TP
.B \-p \f[I]PORT\f[R], \-\-port \f[I]PORT\f[R]\ \ \ \ ** \f[B]Windows (Docker) installations only\f[R] **
Use \f[I]PORT\f[R] as the port that VNC viewer uses to contact the VNC
server within the Docker container.
Default is 5900.
.TP
.B \-w [\f[I]DISTRO\f[R] | \-], \-\-wsl [\f[I]DISTRO\f[R] | \-]\ \ \ \ ** \f[B]Windows (Docker) installations only\f[R] **
Run Medley in the context of the named WSL \f[I]DISTRO\f[R] instead of
within Docker.
If \f[I]DISTRO\f[R] is \[lq]\-\[rq], used the default WSL distro.
Equivalent to typing \[lq]wsl \-d \f[I]DISTRO\f[R] medley \&...\[rq]
into a Command or Powershell window.
\[en]maikodir \f[I]DIR\f[R]
Use \f[I]DIR\f[R] as the directory containing the Maiko emulator.
For testing purposes only.
.SS Other Options
.PP
\
.TP
.B \f[I]SYSOUT_FILE\f[R]
\f[I]SYSOUT_FILE\f[R]
The pathname of the file to use as a sysout for Medley to start from.
If SYSOUT_FILE is not provided and none of the flags (\-\-apps,
\-\-full, \-\-lisp) is used, then Medley will start from the saved
virtual memory file from the previous session with the same ID_STRING as
this run.
If SYSOUT_FILE is not provided and none of the flags (--apps, --full,
--lisp) is used, then Medley will start from the saved virtual memory
file from the previous session with the same ID_STRING as this run.
If no such virtual memory file exists, then Medley will start from the
standard full.sysout (equivalent to specifying the \-\-full flag).
standard full.sysout (equivalent to specifying the --full flag).
On Windows (Docker) installations, \f[I]SYSOUT_FILE\f[R] is specified in
the Medley file system, not the host Windows file system.
.TP
.B \f[I]PASS_ON_ARGS\f[R]
All arguments after the \[lq]\-\-\[rq] flag, are passed unaltered to lde
via run\-medley.
.SH FILES
\f[I]PASS_ON_ARGS\f[R]
All arguments after the \[lq]--\[rq] flag, are passed unaltered to the
Maiko emulator.
.SH CONFIG FILE
.PP
A config file can be used to \[lq]pre-specify\[rq] any of the above
command line arguments.
The config file consists of command line arguments (flags or flag-value
pairs), \f[I]one per line\f[R].
These arguments are read from the config file and prepended to the
arguments actually given on the command line.
Since later arguments override earlier arguments, any argument actually
given on the command line will override a conflicting argument given in
the config file.
.PP
Unless specified using the -c (\[en]config) argument, the default config
file will be $MEDLEYDIR/.medley_config, if it exists, and
$HOME/.medley_config, otherwise.
.PP
Specifying, \[lq]-c -\[rq] or \[lq]\[en]config -\[rq] on the command
line will suppress the use of config files for the current run of
Medley.
.PP
\f[I]Note:\f[R] care must be taken when using -g (\[en]geometry) and/or
-s (\[en]screensize) arguments in config files.
If only one of these is specified, then the other is conputed.
But if both are specified, then the specified dimensions are used as
given.
Unexpected results can arise if one is specified in the config file but
the other is specified on the command line.
In this case, the two specified dimensions will be used as given.
It will not be the case, as might be expected, that the dimension given
in the config file will be overridden by a dimension computed from the
dimension given on the command line.
.SH OTHER FILES
.TP
.B $HOME/il
$HOME/il
Default Medley LOGINDIR
.TP
.B $HOME/il/vmem/lisp.virtualmem
$HOME/il/vmem/lisp.virtualmem
Default virtual memory file
.TP
.B $HOME/il/INIT(.LCOM)
$HOME/il/INIT(.LCOM)
Default personal init file
.TP
.B $MEDLEYDIR/greetfiles/MEDLEYDIR\-INIT(.LCOM)
$MEDLEYDIR/greetfiles/MEDLEYDIR-INIT(.LCOM)
Default Medley greetfile
.SH BUGS
.PP
See GitHub Issues: <https://github.com/Interlisp/medley/issues>
.SH COPYRIGHT
.PP
Copyright(c) 2023 by Interlisp.org
Copyright(c) 2023-2024 by Interlisp.org

Binary file not shown.

View File

@ -41,6 +41,10 @@ Flags
-z, \-\-man
: Show the man page for medley
-c [*FILE* | -], \-\-config [*FILE* | -]
: Use *FILE* as the config file for this run of Medley. See information on *CONFIG FILE* below. If *FILE* is "-",
then suppress the use of a config file for this run of Medley.
-f, \-\-full
: Start Medley from the standard "full" sysout. full.sysout includes a complete Interlisp and CommonLisp environment
with a standard set of development tools. It does not include any of the applications built using Medley.
@ -57,88 +61,122 @@ applications including Notecards, Rooms and CLOS. It also includes pre-installe
documentation.
(See *SYSOUT_FILE* below for more information on starting sysouts.)
-e, \-\-interlisp (relevent only when \-\-apps is specified)
: Make the initial Exec window within Medley be an Interlisp Exec. Default is to start in an XCL Exec.
-u, \-\-continue
: Nullify any prior setting of the sysout file (e.g., from the config file) - causing Medley to start from
the virtual memory file resulting from the previous invocation (with the same values for --id and --logindir),
if any. If there is no matching virtual memory file, Medley will start from the full.sysout (see -f/--full above).
Equivalent to "-y -". (See *SYSOUT FILE* section below.)
-n, \-\-noscroll
: Ordinarily Medley displays scroll bars to enable the user to pan the Medley virtual display within the
-y [*SYSOUT_FILE* | -], \-\-sysout [*SYSOUT-FILE* | -]
: Start Medley from the specified *SYSOUT-FILE*. This is an alternative to specifying the *SYSOUT-FILE*
as the last argument on the command line (but before any *PASS_ON_ARGS*). It can be used to specify the
*SYSOUT-FILE* in the config file (see information on *CONFIG FILE* below). If *SYSOUT-FILE* is "-", then
any prior setting of the sysout file (e.g., from the config file) is nullified (see -u/--continue above).
(See *SYSOUT FILE* section below.)
-e [+ | -], \-\-interlisp [+ | -]
: If value is "+" or no value, make the initial Exec window within Medley be an Interlisp Exec.
If value is "-", make the initial Exec window be the default XCL Exec.
This flag applies only when the --apps flag is used.
-n [+ | -], \-\-noscroll [+ | -]
: Medley ordinarily displays scroll bars to enable the user to pan the Medley virtual display within the
Medley window. This is true even when the entire virtual display fits within the window. Specifying
\-\-noscroll turns off the scroll bars. Note: If \-\-noscroll is specified and the virtual screen is larger
"-n +" (--noscroll +) turns off scroll bars. Specifying "-n -" (--scroll -) turns on scroll bars.
Specifying -n (--noscroll) with no value is equivalent to specifying "--noscroll +". Default
is scroll bars off. Note: If scroll bars are off and the virtual screen is larger
than the window, there will be no way to pan to the non-visible parts of the virtual display.
-g *WxH*, \-\-geometry *WxH*
-g [*WxH* | -], \-\-geometry [*WxH* | -]
: Sets the size of the X Window (or VNC window) that Medley runs in to be Width x Height. (Full X Windows
geomtery specification with +X+Y is not currently supported). If \-\-geometry is not specified but \-\-screensize is,
geomtery specification with +X+Y is not currently supported).
If a value of "-" is given, geometry is set to the default value.
If \-\-geometry is not specified but \-\-screensize is,
then the window size will be determined based on the \-\-screensize values and the \-\-noscroll flag. If neither
\-\-geometry nor \-\-screensize is provided, then the window size is set to 1440x900 if \-\-noscroll is set and 1462x922
if \-\-noscroll is not set.
if \-\-noscroll is not set. (Also see note below under *CONFIG FILE* on the use of geometry and screensize
in config files.)
-s *WxH*, \-\-screensize *WxH*
-s [*WxH* | -], \-\-screensize [*WxH* | -]
: Sets the size of the virtual display as seen from Medley's point of view.
If a value of "-" is given, screensize is set to the default value.
The Medley window is an unscaled viewport onto this virtual display. If \-\-screensize is not specified but
\-\-geometry is, then the virtual display size will be set so that the entire virtual display fits into the given
window geometry. If neither \-\-screensize nor \-\-geometry is provided, then the screen size is set to 1440x900.
(Also see note below under *CONFIG FILE* on the use of geometry and screensize in config files.)
-t *STRING*, \-\-title *STRING*
: Use STRING as title of Medley window. Ignored when when the \-\-vnc flag is set or when running on Windows (Docker)
installations.
-ps [*N* | -], --pixelscale [*N* | -]&nbsp;&nbsp;&nbsp;&nbsp;\*\* **Applicable only when display is SDL-based (e.g., on Windows/Cygwin)** \*\*
: Sets the pixel scaling factor to *N*. If value of "-" is given, the pixel scale factor is set to its default of 1.
-d *:N*, \-\-display *:N*&nbsp;&nbsp;&nbsp;&nbsp;\*\* **Not applicable to Windows (Docker) installations** \*\*
~ Use X display :N. Defaults to the value of $DISPLAY. This flag is ignored when the \-\-vnc flag is set as
well as on Windows (Docker) installations.
-t [*STRING* | -], \-\-title [*STRING* | -]
: Use STRING as title of Medley window. If the value of "-" is given, sets the title to its default value ("Medley Interlisp").
Ignored when when the \-\-vnc flag is set.
-v, \-\-vnc&nbsp;&nbsp;&nbsp;&nbsp;\*\* **Applicable only to WSL installations** \*\*
: Use a VNC window running on the Windows side instead of an X window.
The VNC window will folllow the Windows desktop scaling setting allowing
-d [*:N* | -], \-\-display [*:N* | -]
: Use X display :N. If value is "-", reset display to its default value. Default value is the value of $DISPLAY.
On platforms that support X Windows as well as SDL, the value of -d (--display) should
be set to "SDL" to select using SDL instead of X Windows. This flag is ignored on the Windows/Cygwin platform and when the \-\-vnc flag is
set on Windows System for Linux.
-v [+ | -] , \-\-vnc [+ | -]&nbsp;&nbsp;&nbsp;&nbsp;\*\* **Applicable only to WSL installations** \*\*
: If value is "+" or no value is given, then use a VNC window running on the Windows side instead of an X window. If value is "-", then do not
use a VNC window, relying instead on a standard X Window.
A VNC window will folllow the Windows desktop scaling setting allowing
for much more usable Medley on high resolution displays. On WSL, X windows
do not scale well. This flag is always set for WSL1 installations.
-i [*ID_STRING* | - | \-\-], \-\-id [*ID_STRING* | - | \-\-]
: Use ID_STRING as the id for this run of Medley, iunless ID_STRING is "-" or "\-\-".
If ID_STRING is "-", then use the basename of $MEDLEYDIR as the id.
If ID_STRING is "\-\-", then use the basename of the parent directory of $MEDLEYDIR as the id.
: Use ID_STRING as the id for this run of Medley, unless ID_STRING is "-", "\-\-", or "\-\-\-".
If ID_STRING is "-", then reset the id to "default" (e.g., if it was previously set in the
config file). If ID_STRING is "\-\-", then use the basename of $MEDLEYDIR as the id.
If ID_STRING is "\-\-\-", then use the basename of the parent directory of $MEDLEYDIR as the id.
Only one instance of Medley with a given id can run at a time.
The id is used to distinguish the virtual memory stores so that multiple
instances of Medley can run simultaneously. Default id is "default".
-m *N*, \-\-mem *N*
: Set Medley to run in *N* MB of virtual memory. Defaults to 256MB.
-m [*N* | -], \-\-mem [*N* | -]
: Set Medley to run in *N* MB of virtual memory. Defaults to 256MB. If a value of "-" is given, resets
to default value.
-p *FILE*, \-\-vmem *FILE*
-p [*FILE* | -], \-\-vmem [*FILE* | -]
: Use FILE as the Medley virtual memory (vmem) store. FILE must be writeable by the current user.
Care must be taken not to use the same vmem FILE for two instances of Medley running simultaneously.
The \-\-id flag will not protect against vmem collisions when the \-\-vmem flag is used.
Default is to store the vmem in LOGINDIR/vmem/lisp_XXX.virtualmem, where XXX is the id of this
Medley run (see \-\-id flag above). See \-\-logindir below for setting of LOGINDIR. On Windows (Docker) installations, *FILE* is specified in the Medley file system, not the host Windows file system.
If the value "-" is given, then resets the vmem file to the default.
Default is to store the vmem in LOGINDIR/vmem/lisp_III.virtualmem, where III is the id of this
Medley run (see \-\-id flag above). See \-\-logindir below for setting of LOGINDIR.
-r \[*FILE* | -], \-\-greet \[*FILE* | -]
: Use FILE as the Medley greetfile, unless FILE is "-" in which case
Medley will start up without using a greetfile. The default Medley greetfile
is $MEDLEYDIR/greetfiles/MEDLEYDIR-INIT, except when the \-\-apps flag is used
in which case it is $MEDLEYDIR/greetfiles/APPS-INIT. On Windows (Docker) installations, *FILE* is
in which case it is $MEDLEYDIR/greetfiles/APPS-INIT. On Windows/Cygwin installations, *FILE* is
specified in the Medley file system, not the host Windows file system.
-x \[*DIR* | -], \-\-logindir \[*DIR* | -]&nbsp;&nbsp;&nbsp;&nbsp;\*\* **On Linux and WSL installations** \*\*
: Use DIR as LOGINDIR in Medley, unless DIR is "-", in which case use
\$MEDLEYDIR/logindir. DIR (or \$MEDLEYDIR/logindir) must be writeable by the current user.
-x \[*DIR* | - | --], \-\-logindir \[*DIR* | - | --]
: Use DIR as LOGINDIR in Medley. If the value is "--", use
\$MEDLEYDIR/logindir as LOGINDIR.
If a value of "-" is given, then reset LOGINDIR to its default value.
DIR (or \$MEDLEYDIR/logindir) must be writeable by the current user.
LOGINDIR defaults to \$HOME/il. LOGINDIR is used by Medley as the working directory on start-up
and where it loads any "personal" initialization file from.
and where it loads any "personal" initialization file from. On Windows/Cygwin installations, *FILE* is
specified in the Medley file system, not the host Windows file system.
-x \[*DIR* | -], \-\-logindir \[*DIR* | -]&nbsp;&nbsp;&nbsp;&nbsp;\*\* **On Windows (Docker) installations** \*\*
: Map DIR in the Windows host file system to /home/medley/il in the Medley
file system (in the Docker container). LOGINDIR is always /home/medley/il from Medley's standpoint. The "-" value is not valid in this case.
-nh *Host:Port:Mac:Debug*, \-\-nethub *Host:Port:Mac:Debug*
: Set the parameters for using Nethub XNS networking. *Host* is the full domain name of the nethub host. *Port* is the port on *Host* that nethub is using.
*Mac* is the Mac address that this instance of Medley should use when contacting the nethub host. *Debug* is the level of nethub debug information
that should be printed on stdout (value is 0, 1, or 2). A *Host* value is required and serves to turn nethub functionality on. *Port*, *Mac* and *Debug*
parameters are optional and will default if left off. Finally, if any of the parameters have a value of "-", any previous setting (e.g., in a config file)
for the parameter will be reset to the default value - which in the case of *Host* is the null string, turning nethub functionality off.
-u, \-\-update&nbsp;&nbsp;&nbsp;&nbsp;\*\* **Windows (Docker) installations only** \*\*
: Before running Medley, do a pull to retrieve the latest interlisp/medley docker image from Docker Hub.
-nf, -NF, --nofork
: No fork. Relevant only to the Medley loadup workflow.
-b, \-\-background&nbsp;&nbsp;&nbsp;&nbsp;\*\* **Windows (Docker) installations only** \*\*
: Run Medley in background rather than foreground.
-prog *EXE*, --maikoprog *EXE*
: Use *EXE* as the basename of the Maiko executable. Relevant only to the Medley loadup workflow.
-p *PORT*, \-\-port *PORT*&nbsp;&nbsp;&nbsp;&nbsp;\*\* **Windows (Docker) installations only** \*\*
: Use *PORT* as the port that VNC viewer uses to contact the VNC server within the Docker container. Default is 5900.
-w \[*DISTRO* | -], \-\-wsl \[*DISTRO* | -]&nbsp;&nbsp;&nbsp;&nbsp;\*\* **Windows (Docker) installations only** \*\*
: Run Medley in the context of the named WSL *DISTRO* instead of within Docker. If *DISTRO* is "-", used the default WSL distro. Equivalent to typing "wsl -d *DISTRO* medley ..." into a Command or Powershell window.
--maikodir *DIR*
: Use *DIR* as the directory containing the Maiko emulator. For testing purposes only.
Other Options
@ -154,11 +192,33 @@ If no such virtual memory file exists, then Medley will start from the standard
specified in the Medley file system, not the host Windows file system.
*PASS_ON_ARGS*
: All arguments after the "\-\-" flag, are passed unaltered to lde via run-medley.
: All arguments after the "\-\-" flag, are passed unaltered to the Maiko emulator.
FILES
=====
CONFIG FILE
===========
A config file can be used to "pre-specify" any of the above command line arguments.
The config file consists of command line arguments (flags or flag-value pairs), *one per line*.
These arguments are read from the config file and prepended to the arguments actually given on
the command line. Since later arguments override earlier arguments, any argument actually given
on the command line will override a conflicting argument given in the config file.
Unless specified using the -c (--config) argument, the default config file will be $MEDLEYDIR/.medley_config,
if it exists, and $HOME/.medley_config, otherwise.
Specifying, "-c -" or "--config -" on the command line will suppress the use of config files for the
current run of Medley.
*Note:* care must be taken when using -g (--geometry) and/or -s (--screensize) arguments in config files.
If only one of these is specified, then the other is conputed. But if both are specified, then the specified
dimensions are used as given. Unexpected results can arise if one is specified in the config file
but the other is specified on the command line. In this case, the two specified dimensions will be used as given.
It will not be the case, as might be expected, that the dimension given in the config file will be overridden
by a dimension computed from the dimension given on the command line.
OTHER FILES
===========
\$HOME/il
: Default Medley LOGINDIR
@ -181,4 +241,4 @@ See GitHub Issues: <https://github.com/Interlisp/medley/issues>
COPYRIGHT
=========
Copyright(c) 2023 by Interlisp.org
Copyright(c) 2023-2024 by Interlisp.org

View File

@ -18,6 +18,9 @@
# LDEDESTSYSOUT name for destination of SaveVM/LOGOUT
# MEDLEYDIR used by init file to set other path variables
#for x in "$@"; do echo $x; done
#exit
inferred_medleydir=false
if [ -z "$MEDLEYDIR" ] ; then

View File

@ -1,27 +1,43 @@
#!/bin/sh
# shellcheck disable=SC2181
if [ ! -x run-medley ] ; then
echo run from MEDLEYDIR
if [ ! -h ./medley ] || [ ! -d ./lispusers ]
then
echo "*** ERROR ***"
echo "You must run $(basename "$0") while the cwd is a Medley top-level directory."
echo "The cwd ($(pwd)) is not a Medley top-level directory."
echo "Exiting."
exit 1
fi
# shellcheck source=./loadup-setup.sh
. scripts/loadup-setup.sh
if [ "$1" = "-apps" ]; then
# look thru args looking to see if -apps, --apps, or -a was specified in args
apps=true
j=1
jmax=$#
while [ "$j" -le "$jmax" ]
do
if [ "$(eval "printf %s \${${j}}")" = "-a" ] || \
[ "$(eval "printf %s \${${j}}")" = "-apps" ] || \
[ "$(eval "printf %s \${${j}}")" = "--apps" ]
then
apps="./scripts/loadup-apps-from-full.sh"
else
apps="true"
fi
break
fi
done
# Do loadup components
./scripts/loadup-init.sh && \
./scripts/loadup-mid-from-init.sh && \
./scripts/loadup-lisp-from-mid.sh && \
./scripts/loadup-full-from-lisp.sh && \
${apps} && \
./scripts/loadup-aux.sh && \
./scripts/copy-all.sh $1
./scripts/copy-all.sh "$1"
if [ $? -eq 0 ];
if [ $? -eq 0 ]
then
echo "+++++ loadup-all.sh: SUCCESS +++++"
else

View File

@ -1,29 +1,38 @@
#!/bin/sh
if [ ! -x run-medley ] ; then
echo must run from MEDLEYDIR ;
exit 1 ;
if [ ! -h ./medley ] || [ ! -d ./lispusers ]
then
echo "*** ERROR ***"
echo "You must run $(basename "$0") while the cwd is a Medley top-level directory."
echo "The cwd ($(pwd)) is not a Medley top-level directory."
echo "Exiting."
exit 1
fi
# shellcheck source=./loadup-setup.sh
. scripts/loadup-setup.sh
loadup_start
export ROOMSDIR=${MEDLEYDIR}/rooms
export CLOSDIR=${MEDLEYDIR}/clos
export ROOMSDIR="${MEDLEYDIR}/rooms"
export CLOSDIR="${MEDLEYDIR}/clos"
export NOTECARDSDIR=${MEDLEYDIR}/notecards
if [ ! -e ${NOTECARDSDIR} ]; then
NOTECARDSDIR=$(cd ${MEDLEYDIR}/../ && pwd)/notecards
if [ ! -e ${NOTECARDSDIR} ]; then
NOTECARDSDIR=$(cd ${MEDLEYDIR}/../../ && pwd)/notecards
if [ ! -e ${NOTECARDSDIR} ]; then
export NOTECARDSDIR="${MEDLEYDIR}/notecards"
if [ ! -e "${NOTECARDSDIR}" ]
then
NOTECARDSDIR=$(cd "${MEDLEYDIR}/../" && pwd)/notecards
if [ ! -e "${NOTECARDSDIR}" ]
then
NOTECARDSDIR=$(cd "${MEDLEYDIR}/../../" && pwd)/notecards
if [ ! -e "${NOTECARDSDIR}" ]
then
NOTECARDSDIR=""
fi
fi
fi
if [ -z "${NOTECARDSDIR}" ]; then
if [ -z "${NOTECARDSDIR}" ]
then
echo "Error: Cannot find the Notecards directory"
echo "It should be located at ${MEDLEYDIR}/../notecards or"
echo "${MEDLEYDIR}/../../notecards. But its not."
@ -62,6 +71,6 @@ SHH
"
EOF
./run-medley ${scr} -loadup "${cmfile}" "${LOADUP_WORKDIR}/full.sysout"
run_medley "${LOADUP_WORKDIR}/full.sysout"
loadup_finish "apps.sysout" "apps.*"

View File

@ -1,10 +1,15 @@
#!/bin/sh
if [ ! -f run-medley ] ; then
echo run from MEDLEYDIR
if [ ! -h ./medley ] || [ ! -d ./lispusers ]
then
echo "*** ERROR ***"
echo "You must run $(basename "$0") while the cwd is a Medley top-level directory."
echo "The cwd ($(pwd)) is not a Medley top-level directory."
echo "Exiting."
exit 1
fi
# shellcheck source=./loadup-setup.sh
. scripts/loadup-setup.sh
loadup_start
@ -26,6 +31,6 @@ cat >"${cmfile}" <<"EOF"
"
EOF
./run-medley ${scr} -loadup "${cmfile}" "${LOADUP_WORKDIR}"/full.sysout
run_medley "${LOADUP_WORKDIR}/full.sysout"
loadup_finish "whereis.hash" "whereis.hash" "exports.all"

View File

@ -1,10 +1,15 @@
#!/bin/sh
if [ ! -x run-medley ] ; then
echo run from MEDLEYDIR
if [ ! -h ./medley ] || [ ! -d ./lispusers ]
then
echo "*** ERROR ***"
echo "You must run $(basename "$0") while the cwd is a Medley top-level directory."
echo "The cwd ($(pwd)) is not a Medley top-level directory."
echo "Exiting."
exit 1
fi
# shellcheck source=./loadup-setup.sh
. scripts/loadup-setup.sh
loadup_start
@ -35,7 +40,7 @@ cat >"${cmfile}" <<"EOF"
"
EOF
./run-medley ${scr} -loadup "${cmfile}" "${SYSOUT}"
run_medley "${SYSOUT}"
loadup_finish "fuller.database" "fuller*"

View File

@ -1,10 +1,16 @@
#!/bin/sh
# shellcheck disable=SC2181
if [ ! -x run-medley ] ; then
echo run from MEDLEYDIR
if [ ! -h ./medley ] || [ ! -d ./lispusers ]
then
echo "*** ERROR ***"
echo "You must run $(basename "$0") while the cwd is a Medley top-level directory."
echo "The cwd ($(pwd)) is not a Medley top-level directory."
echo "Exiting."
exit 1
fi
# shellcheck source=./loadup-setup.sh
. scripts/loadup-setup.sh
./scripts/loadup-db-from-full.sh && ./scripts/copy-db.sh

View File

@ -1,10 +1,15 @@
#!/bin/sh
if [ ! -x run-medley ] ; then
echo must run from MEDLEYDIR ;
exit 1 ;
if [ ! -h ./medley ] || [ ! -d ./lispusers ]
then
echo "*** ERROR ***"
echo "You must run $(basename "$0") while the cwd is a Medley top-level directory."
echo "The cwd ($(pwd)) is not a Medley top-level directory."
echo "Exiting."
exit 1
fi
# shellcheck source=./loadup-setup.sh
. scripts/loadup-setup.sh
loadup_start
@ -27,7 +32,7 @@ SHH
"
EOF
./run-medley ${scr} -loadup "${cmfile}" "${LOADUP_WORKDIR}/lisp.sysout"
run_medley "${LOADUP_WORKDIR}/lisp.sysout"
loadup_finish "full.sysout" "full.*"

View File

@ -1,10 +1,16 @@
#!/bin/sh
# shellcheck disable=SC2181
if [ ! -x run-medley ] ; then
echo must run from MEDLEYDIR ;
exit 1 ;
if [ ! -h ./medley ] || [ ! -d ./lispusers ]
then
echo "*** ERROR ***"
echo "You must run $(basename "$0") while the cwd is a Medley top-level directory."
echo "The cwd ($(pwd)) is not a Medley top-level directory."
echo "Exiting."
exit 1
fi
# shellcheck source=./loadup-setup.sh
. ./scripts/loadup-setup.sh
./scripts/loadup-init.sh && \

View File

@ -1,10 +1,15 @@
#!/bin/sh
if [ ! -f run-medley ] ; then
echo run from MEDLEYDIR
if [ ! -h ./medley ] || [ ! -d ./lispusers ]
then
echo "*** ERROR ***"
echo "You must run $(basename "$0") while the cwd is a Medley top-level directory."
echo "The cwd ($(pwd)) is not a Medley top-level directory."
echo "Exiting."
exit 1
fi
# shellcheck source=./loadup-setup.sh
. scripts/loadup-setup.sh
loadup_start
@ -40,6 +45,6 @@ cat >"${cmfile}" <<"EOF"
STOP
EOF
./run-medley $scr -loadup "${cmfile}" "${LOADUP_SOURCEDIR}"/starter.sysout
run_medley "${LOADUP_SOURCEDIR}/starter.sysout"
loadup_finish "init.dlinit" "init.*" "RDSYS*" "I-NEW*"

View File

@ -1,10 +1,15 @@
#!/bin/sh
if [ ! -f run-medley ] ; then
echo run from MEDLEYDIR
if [ ! -h ./medley ] || [ ! -d ./lispusers ]
then
echo "*** ERROR ***"
echo "You must run $(basename "$0") while the cwd is a Medley top-level directory."
echo "The cwd ($(pwd)) is not a Medley top-level directory."
echo "Exiting."
exit 1
fi
# shellcheck source=./loadup-setup.sh
. scripts/loadup-setup.sh
loadup_start
@ -29,6 +34,6 @@ SHH
"
EOF
./run-medley ${scr} -loadup "${cmfile}" "${LOADUP_WORKDIR}/init-mid.sysout"
run_medley "${LOADUP_WORKDIR}/init-mid.sysout"
loadup_finish "lisp.sysout" "lisp.*"

View File

@ -1,10 +1,15 @@
#!/bin/sh
if [ ! -x run-medley ] ; then
echo run from MEDLEYDIR
if [ ! -h ./medley ] || [ ! -d ./lispusers ]
then
echo "*** ERROR ***"
echo "You must run $(basename "$0") while the cwd is a Medley top-level directory."
echo "The cwd ($(pwd)) is not a Medley top-level directory."
echo "Exiting."
exit 1
fi
# shellcheck source=./loadup-setup.sh
. scripts/loadup-setup.sh
loadup_start
@ -18,9 +23,8 @@ cat >"${cmfile}" <<"EOF"
"
EOF
./run-medley -prog "ldeinit" \
-NF \
-loadup "${cmfile}" ${scr} -vmem "${LOADUP_WORKDIR}/init-mid.sysout" \
"${LOADUP_WORKDIR}/init.dlinit"
run_medley "${LOADUP_WORKDIR}/init.dlinit" -NF -prog ldeinit --vmem "${LOADUP_WORKDIR}/init-mid.sysout"
echo " "
loadup_finish "init-mid.sysout" "init-mid.sysout"

View File

@ -1,19 +1,31 @@
#!sh
# shellcheck shell=sh
export MEDLEYDIR=`pwd`
MEDLEYDIR="$(pwd)"
export MEDLEYDIR
if [ -z "${LOADUP_WORKDIR}" ];
if [ -z "${LOADUP_WORKDIR}" ]
then
export LOADUP_WORKDIR=/tmp/loadups-$$
LOADUP_WORKDIR=/tmp/loadups-$$
export LOADUP_WORKDIR
fi
if [ -z "${LOADUP_SOURCEDIR}" ];
if [ -z "${LOADUP_SOURCEDIR}" ]
then
export LOADUP_SOURCEDIR="${MEDLEYDIR}"/internal/loadups
LOADUP_SOURCEDIR="${MEDLEYDIR}/internal/loadups"
export LOADUP_SOURCEDIR
fi
if [ -z "${LOADUP_OUTDIR}" ];
if [ -z "${LOADUP_OUTDIR}" ]
then
export LOADUP_OUTDIR="${MEDLEYDIR}"/loadups
LOADUP_OUTDIR="${MEDLEYDIR}/loadups"
export LOADUP_OUTDIR
fi
if [ -z "${LOADUP_LOGINDIR}" ]
then
LOADUP_LOGINDIR="${LOADUP_WORKDIR}/logindir"
export LOADUP_LOGINDIR
fi
if [ ! -d "${LOADUP_OUTDIR}" ];
@ -22,7 +34,8 @@ then
then
mkdir -p "${LOADUP_OUTDIR}"
else
"Error: ${LOADUP_OUTDIR} exists but is not a directory. Exiting."
echo "Error: ${LOADUP_OUTDIR} exists but is not a directory. Exiting."
exit 1
fi
fi
@ -32,18 +45,37 @@ then
then
mkdir -p "${LOADUP_WORKDIR}"
else
"Error: ${LOADUP_WORKDIR} exists but is not a directory. Exiting."
echo "Error: ${LOADUP_WORKDIR} exists but is not a directory. Exiting."
exit 1
fi
fi
scr="-sc 1024x768 -g 1042x790"
geometry=1024x768
touch "${LOADUP_WORKDIR}"/loadup.timestamp
script_name=$(basename "$0" ".sh")
cmfile="${LOADUP_WORKDIR}/${script_name}.cm"
# look thru args looking to see if oldschool was specified in args
j=1
jmax=$#
while [ "$j" -le "$jmax" ]
do
if [ "$(eval "printf %s \${${j}}")" = "-os" ] || [ "$(eval "printf %s \${${j}}")" = "--oldschool" ]
then
LOADUP_OLDSCHOOL=true
export LOADUP_OLDSCHOOL
break
else
j=$(( j + 1 ))
fi
done
######################################################################
@ -65,9 +97,12 @@ loadup_start () {
}
loadup_finish () {
local exit_code
rm -f "${cmfile}"
if [ "${LOADUP_WORKDIR}"/loadup.timestamp -nt "${LOADUP_WORKDIR}/${1}" ];
# 2024-05-05 FGH
# Can't use exit code for now since on MacOS exit codes appear to be inverted
# Will restore once MacOS exit code are figured out
# if [ "${exit_code}" -ne 0 ] || [ ! -f "${LOADUP_WORKDIR}/$1" ]
if [ ! -f "${LOADUP_WORKDIR}/$1" ]
then
echo "----- FAILURE -----"
exit_code=1
@ -76,17 +111,19 @@ loadup_finish () {
exit_code=0
fi
echo "..... files created ....."
if [ -f "${LOADUP_WORKDIR}/$1" ]
then
shift;
for f in ${*};
for f in "$@"
do
# shellcheck disable=SC2045,SC2086
for ff in $(ls -1 "${LOADUP_WORKDIR}"/$f);
do
if [ "${ff}" -nt "${LOADUP_WORKDIR}"/loadup.timestamp ];
then
ls -l ${ff} 2>/dev/null | grep -v "^.*~[0-9]\+~$"
fi
# shellcheck disable=SC2010
ls -l "${ff}" 2>/dev/null | grep -v "^.*~[0-9]\+~$"
done
done
fi
if [ "${TMP_PRE_EXISTS}" = "false" ];
then
rm -rf "${MEDLEYDIR}/tmp"
@ -101,6 +138,26 @@ loadup_finish () {
exit ${exit_code}
}
run_medley () {
if [ ! "${LOADUP_OLDSCHOOL}" = true ]
then
./medley --config - \
--id loadup_+ \
--geometry "${geometry}" \
--noscroll \
--logindir "${LOADUP_LOGINDIR}" \
--greet "${cmfile}" \
--sysout "$1" \
"$2" "$3" "$4" "$5" "$6" "$7" ;
exit_code=$?
else
# shellcheck disable=SC2086
./run-medley ${scr} $2 $3 $4 $5 $6 $7 -loadup "${cmfile}" "$1"
exit_code=$?
fi
}
######################################################################

6
scripts/medley/README Normal file
View File

@ -0,0 +1,6 @@
Note that medley.sh is just a symbolic link to medley.command (to accomodate MacOS).
medley.command should not be edited directly. It is compiled from all the of the
medley_*.sh components. The script compile.sh does this compile (with help from
the inline.sh script).

5
scripts/medley/compile.sh Executable file
View File

@ -0,0 +1,5 @@
#!/bin/sh
mv medley.command medley.command~
./inline.sh --in-file medley_main.sh --out-file medley.command
chmod +x medley.command

460
scripts/medley/inline.sh Executable file
View File

@ -0,0 +1,460 @@
#!/usr/bin/env sh
# MIT License
#
# Copyright (c) 2022-2022 Carlo Corradini
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
# Inspired by https://gist.github.com/joehillen/30f08738c1c3c0ca3e4c754ad33ad2ff
# Fail on error
set -o errexit
# Disable wildcard character expansion
set -o noglob
# PID shell
SELF_PID=$$
# ================
# LOGGER
# ================
# Fatal log level. Cause exit failure
LOG_LEVEL_FATAL=100
# Warning log level
LOG_LEVEL_WARN=200
# Informational log level
LOG_LEVEL_INFO=300
# Debug log level
LOG_LEVEL_DEBUG=400
# Silent log level
LOG_LEVEL_SILENT=500
# Log level
LOG_LEVEL=$LOG_LEVEL_INFO
# Log color flag
LOG_COLOR_ENABLE=true
# Convert log level to equivalent name
# @param $1 Log level
to_log_level_name() {
_log_level=${1:-LOG_LEVEL}
_log_level_name=
case $_log_level in
"$LOG_LEVEL_FATAL") _log_level_name=fatal ;;
"$LOG_LEVEL_WARN") _log_level_name=warn ;;
"$LOG_LEVEL_INFO") _log_level_name=info ;;
"$LOG_LEVEL_DEBUG") _log_level_name=debug ;;
"$LOG_LEVEL_SILENT") _log_level_name=silent ;;
*) FATAL "Unknown log level '$_log_level'" ;;
esac
printf "%s\n" "$_log_level_name"
}
# Print log message
# @param $1 Log level
# @param $2 Message
_log_print_message() {
_log_level=${1:-LOG_LEVEL_FATAL}
shift
_log_level_name=
_log_message=${*:-}
_log_prefix=
_log_suffix="\033[0m"
# Check log level
if [ "$LOG_LEVEL" -eq "$LOG_LEVEL_SILENT" ] || [ "$_log_level" -gt "$LOG_LEVEL" ]; then
return 0
fi
case $_log_level in
"$LOG_LEVEL_FATAL")
_log_level_name=FATAL
_log_prefix="\033[41;37m"
;;
"$LOG_LEVEL_WARN")
_log_level_name=WARN
_log_prefix="\033[1;33m"
;;
"$LOG_LEVEL_INFO")
_log_level_name=INFO
_log_prefix="\033[37m"
;;
"$LOG_LEVEL_DEBUG")
_log_level_name=DEBUG
_log_prefix="\033[1;34m"
;;
esac
# Check color flag
if [ "$LOG_COLOR_ENABLE" = false ]; then
_log_prefix=
_log_suffix=
fi
# Log
printf '%b[%-5s] %b%b\n' "$_log_prefix" "$_log_level_name" "$_log_message" "$_log_suffix"
}
# Fatal log message
# @param $1 Message
FATAL() {
_log_print_message "$LOG_LEVEL_FATAL" "$1" >&2
exit 1
}
# Warning log message
# @param $1 Message
WARN() { _log_print_message "$LOG_LEVEL_WARN" "$1" >&2; }
# Informational log message
# @param $1 Message
INFO() { _log_print_message "$LOG_LEVEL_INFO" "$1" >&2; }
# Debug log message
# @param $1 Message
DEBUG() { _log_print_message "$LOG_LEVEL_DEBUG" "$1" >&2; }
# ================
# FUNCTIONS
# ================
# Show help message
show_help() {
cat << EOF
Usage: $(basename "$0") --in-file <FILE> [--disable-color] [--help] [--log-level <LEVEL>] [--out-file <FILE>] [--overwrite]
reCluster bundle script.
Options:
--disable-color Disable color
--help Show this help message and exit
--in-file <FILE> Input file
Values:
Any valid file
--log-level <LEVEL> Logger level
Default: $(to_log_level_name "$LOG_LEVEL")
Values:
fatal Fatal level
warn Warning level
info Informational level
debug Debug level
silent Silent level
--out-file <FILE> Output file
Default: [IN_FILE_NAME].inlined[IN_FILE_EXTENSION]
Values:
Any valid file
--overwrite Overwrite input file
EOF
}
# Assert command is installed
# @param $1 Command name
assert_cmd() {
command -v "$1" > /dev/null 2>&1 || FATAL "Command '$1' not found"
DEBUG "Command '$1' found at '$(command -v "$1")'"
}
# ================
# CACHE
# ================
# Cache
CACHE=
# Add file path to cache
# @param $1 File path
cache_add() {
if [ -z "$CACHE" ]; then
CACHE=$(printf '%s\n' "$1")
else
CACHE=$(printf '%s\n%s\n' "$CACHE" "$1")
fi
}
# Check cache has file path
# @param $1 File path
cache_has() {
while read -r _entry; do
if [ "$_entry" = "$1" ]; then
return 0
fi
done << EOF
$CACHE
EOF
return 1
}
# Inline sources ('source' or '.') of given script file
# @param $1 Script file path
inline_sources() {
_file=$1
_file_dir=$(dirname "$_file")
_regex='^([[:space:]]*)(source|\.)[[:space:]]+(.+)'
_regex_inline_skip='^[[:space:]]*#[[:space:]]*inline[[:space:]]+skip.*'
_regex_shellcheck='^[[:space:]]*#[[:space:]]*shellcheck[[:space:]]+source=(.+)'
_inline_skip=false
_source_file_shellcheck=
[ -f "$_file" ] || FATAL "File '$_file' does not exists"
INFO "Reading file '$_file'"
# Add to cache
cache_add "$_file"
# Read
while IFS='' read -r _line; do
DEBUG "Analyzing line '$_line'"
if printf "%s\n" "$_line" | grep -q -E "$_regex_inline_skip"; then
# # inline skip
_inline_skip=true
DEBUG "Inline skip '$_line'"
# Print line
printf '%s\n' "$_line"
elif printf "%s\n" "$_line" | grep -q -E "$_regex_shellcheck"; then
# # shellcheck source=...
DEBUG "ShellCheck source '$_line'"
# Source
_source_file_shellcheck=$(printf "%s\n" "$_line" | sed -n -r "s/$_regex_shellcheck/\1/p")
# Print line
printf '%s\n' "$_line"
elif printf "%s\n" "$_line" | grep -q -E "$_regex"; then
# source ...
# . ...
DEBUG "Source '$_line'"
# Source
_source_file=$(printf "%s\n" "$_line" | sed -n -r "s/$_regex/\3/p" | sed -e 's/^"//' -e 's/"$//')
# Check skip
[ "$_inline_skip" = false ] || {
# Skip
WARN "Skipping source '$_line'"
# Reset inline skip
_inline_skip=false
# Reset shellcheck
_source_file_shellcheck=
# Print line
printf '%s\n' "$_line"
continue
}
# Resolve source path
_path=
if printf "%s\n" "$_source_file" | grep -q -E -v '.*\/.*'; then
# Search $PATH
DEBUG "Searching '\$PATH'"
_path=$(command -v "$_source_file" || :)
fi
if [ -z "$_path" ]; then
# Resolve links, relative paths, ~, quotes, and escapes
DEBUG "Path is undefined, continue searching"
_path=$_source_file
if printf "%s\n" "$_path" | grep -q -E -v '^\/|^\$'; then
# Path does not start with '/' or '$' symbol, preprend directory
_path="$_file_dir/$_path"
fi
# Canonicalize
_path=$(eval readlink -f "$_path" || :)
DEBUG "Path candidate '$_path'"
if [ ! -f "$_path" ] && [ -n "$_source_file_shellcheck" ]; then
# File does not exists, try shellcheck
DEBUG "Path '$_path' is invalid, searching ShellCheck"
_path=$_source_file_shellcheck
if printf "%s\n" "$_path" | grep -q -E -v '^\/'; then
# Path does not start with '/' symbol, preprend directory
_path="$_file_dir/$_path"
fi
# Canonicalize
_path=$(readlink -f "$_path" || :)
DEBUG "Path candidate '$_path'"
# Reset shellcheck
_source_file_shellcheck=
fi
fi
# Check path
[ -f "$_path" ] || FATAL "Unable to resolve source file path '$_source_file'"
DEBUG "Source '$_source_file' resolved to '$_path'"
# Comment source
printf '# %s\n' "$_line"
# Check if already sourced
! cache_has "$_path" || {
WARN "Recursion detected, source '$_source_file' of '$_file'"
kill $SELF_PID
wait $SELF_PID
}
# Inline source and remove shebang
inline_sources "$_path" | sed '/^#!.*/d'
else
# Reset inline skip
_inline_skip=false
# Reset shellcheck
_source_file_shellcheck=
# Print line
printf '%s\n' "$_line"
fi
done < "$_file"
}
################################################################################################################################
# Parse command line arguments
# @param $@ Arguments
parse_args() {
# Assert argument has a value
# @param $1 Argument name
# @param $2 Argument value
parse_args_assert_value() {
[ -n "$2" ] || FATAL "Argument '$1' requires a non-empty value"
}
while [ $# -gt 0 ]; do
case $1 in
--disable-color)
# Disable color
LOG_COLOR_ENABLE=false
shift
;;
--help)
# Display help message and exit
show_help
exit 0
;;
--in-file)
# Input file
parse_args_assert_value "$@"
IN_FILE=$2
shift
shift
;;
--log-level)
# Log level
parse_args_assert_value "$@"
case $2 in
fatal) LOG_LEVEL=$LOG_LEVEL_FATAL ;;
warn) LOG_LEVEL=$LOG_LEVEL_WARN ;;
info) LOG_LEVEL=$LOG_LEVEL_INFO ;;
debug) LOG_LEVEL=$LOG_LEVEL_DEBUG ;;
silent) LOG_LEVEL=$LOG_LEVEL_SILENT ;;
*) FATAL "Value '$2' of argument '$1' is invalid" ;;
esac
shift
shift
;;
--out-file)
# Output file
parse_args_assert_value "$@"
OUT_FILE=$2
shift
shift
;;
--overwrite)
# Overwrite
OVERWRITE=true
shift
;;
-*)
# Unknown argument
WARN "Unknown argument '$1' is ignored"
shift
;;
*)
# No argument
WARN "Skipping argument '$1'"
shift
;;
esac
done
# Determine output file
if [ "$OVERWRITE" = true ]; then
# Input file
OUT_FILE=$IN_FILE
elif [ -n "$IN_FILE" ] && [ -z "$OUT_FILE" ]; then
# Input file 'inlined'
_in_file_basename=$(basename -- "$IN_FILE")
_in_file_name="${_in_file_basename%.*}"
_in_file_extension=
case $_in_file_basename in
*.*) _in_file_extension=".${_in_file_basename##*.}" ;;
esac
OUT_FILE="$_in_file_name.inlined$_in_file_extension"
fi
}
# Verify system
verify_system() {
assert_cmd grep
assert_cmd sed
[ -n "$IN_FILE" ] || FATAL "Input file required"
[ -f "$IN_FILE" ] || FATAL "Input file '$IN_FILE' does not exists"
if [ "$OVERWRITE" = false ] && [ -f "$OUT_FILE" ]; then FATAL "Output file '$OUT_FILE' already exists"; fi
}
# Inline input file
inline() {
INFO "Inlining file '$IN_FILE'"
_inlined=$(inline_sources "$(readlink -f "$IN_FILE")") || FATAL "Error inlining file '$IN_FILE'"
INFO "Saving file '$OUT_FILE'"
printf '%s\n' "$_inlined" > "$OUT_FILE"
}
# ================
# CONFIGURATION
# ================
# Input file
IN_FILE=
# Log level
LOG_LEVEL=$LOG_LEVEL_INFO
# Log color flag
LOG_COLOR_ENABLE=true
# Output file
OUT_FILE=
# Overwrite flag
OVERWRITE=false
# ================
# MAIN
# ================
{
parse_args "$@"
verify_system
inline
}

File diff suppressed because it is too large Load Diff

View File

@ -1,3 +1,6 @@
#!only-to-be-sourced
# shellcheck shell=sh
# shellcheck disable=SC2034,SC2154,SC2164
###############################################################################
#
# medley_args.sh - script for processing the args to medley.sh script.
@ -12,115 +15,232 @@
###############################################################################
# load usage function
source ${SCRIPTDIR}/medley_usage.sh
# shellcheck source=./medley_usage.sh
. "${SCRIPTDIR}/medley_usage.sh"
args_stage="config file"
# Defaults
apps_flag=false
err_msg=""
full_flag=false
geometry=""
greet_specified=false
lisp_flag=false
noscroll=false
pass_args=false
run_args=()
run_id="default"
screensize=""
sysout_flag=false
sysout_arg=""
title="Medley Interlisp"
sysout_stage=""
title="Medley Interlisp %i"
use_vnc=false
windows=false
maikodir_arg=""
maikodir_stage=""
maikoprog_arg=""
greet_arg=""
noscroll=false
display_arg=""
vmem_arg=""
mem_arg=""
maiko_args=""
logindir_arg=""
nh_host_arg=""
nh_port_arg=""
nh_mac_arg=""
nh_debug_arg=""
pixelscale_arg=""
borderwidth_arg=""
# Add marker at end of args so we can accumulate pass-on args in args array
set -- "$@" "--start_of_pass_args"
# Loop thru args and process
while [ "$#" -ne 0 ];
do
if [ ${pass_args} = false ];
if [ "${pass_args}" = false ];
then
case "$1" in
-a | --apps)
sysout_arg="apps"
apps_flag=true
sysout_stage="${args_stage}"
;;
-c | --config)
# already handled so just skip both flag and value
shift;
;;
-d | --display)
check_for_dash_or_end "$1" "$2"
run_args+=(-d $2)
if [ "$2" = "-" ]
then
display=""
else
check_for_dash_or_end "$1" "$2"
display_arg="$2"
fi
shift
;;
-e | --interlisp)
export MEDLEY_EXEC="inter"
case "$2" in
-)
MEDLEY_EXEC=""
shift
;;
+)
export MEDLEY_EXEC="inter"
shift
;;
*)
export MEDLEY_EXEC="inter"
;;
esac
;;
-f | --full)
sysout_arg="-full"
full_flag=true
sysout_arg="full"
sysout_stage="${args_stage}"
;;
-g | --geometry)
check_for_dash_or_end "$1" "$2"
geometry="$2"
if [ "$2" = "-" ]
then
geometry=""
else
check_for_dash_or_end "$1" "$2"
geometry="$2"
fi
shift
;;
-h | --help)
usage
;;
-i | --id)
if [ "$2" = "-" ];
if [ "$2" = "-" ]
then
run_id=$( basename ${MEDLEYDIR} )
elif [ "$2" = "--" ];
run_id="default"
elif [ "$2" = "--" ]
then
run_id=$(cd ${MEDLEYDIR}; cd ..; basename $(pwd))
run_id="$( basename "${MEDLEYDIR}" )"
elif [ "$2" = "---" ]
then
run_id="$(cd "${MEDLEYDIR}/.."; basename "$(pwd)")"
else
check_for_dash_or_end "$1" "$2"
run_id=$(echo "$2" | sed s/[^A-Za-z0-9]//g)
run_id=$(echo "$2" | sed -e "s/++*\(.\)/\\1/g" -e "s/[^A-Za-z0-9+_]//g")
fi
shift
;;
-k | --vmem)
check_for_dash_or_end "$1" "$2"
check_file_writeable_or_creatable "$1" "$2"
export LDEDESTSYSOUT="$2"
if [ "$2" = "-" ]
then
vmem_arg=""
else
check_for_dash_or_end "$1" "$2"
check_file_writeable_or_creatable "$1" "$2"
vmem_arg="$2"
fi
shift
;;
-l | --lisp)
sysout_arg="-lisp"
lisp_flag=true
sysout_arg="lisp"
sysout_stage="${args_stage}"
;;
-m | --mem)
check_for_dash_or_end "$1" "$2"
run_args+=(-m $2)
if [ "$2" = "-" ]
then
mem_arg=""
else
check_for_dash_or_end "$1" "$2"
mem_arg="$2"
fi
shift
;;
-n | --noscroll)
noscroll=true
run_args+=("-noscroll")
case "$2" in
-)
noscroll=false
shift
;;
+)
noscroll=true
shift
;;
*)
noscroll=true
;;
esac
;;
-nh | --nethub)
case "$2" in
-:* | - )
true
;;
*)
check_for_dash_or_end "$1" "$2"
;;
esac
parse_nethub_data "$2"
if [ "${nh_host}" = "-" ]; then nh_host_arg=""; else nh_host_arg="${nh_host}"; fi
if [ "${nh_port}" = "-" ]; then nh_port_arg=""; else nh_port_arg="${nh_port}"; fi
if [ "${nh_mac}" = "-" ]; then nh_mac_arg=""; else nh_mac_arg="${nh_mac}"; fi
if [ "${nh_debug}" = "-" ]; then nh_debug_arg=""; else nh_debug_arg="${nh_debug}"; fi
shift
;;
-ps | --pixelscale)
if [ "$2" = "-" ]
then
pixelscale_arg=""
else
check_for_dash_or_end "$1" "$2"
pixelscale_arg="$2"
fi
shift
;;
-r | --greet)
if [[ "$2" = "-" || "$2" = "--" ]];
if [ "$2" = "-" ] || [ "$2" = "--" ]
then
run_args+=("--nogreet")
greet_arg="--nogreet--"
else
check_for_dash_or_end "$1" "$2"
check_file_readable "$1" "$2"
run_args+=("-greet" "$2")
greet_arg="$2"
fi
greet_specified='true'
shift
;;
-s | --screensize)
check_for_dash_or_end "$1" "$2"
screensize="$2"
if [ "$2" = "-" ]
then
screensize=""
else
check_for_dash_or_end "$1" "$2"
screensize="$2"
fi
shift
;;
-t | --title)
check_for_dash_or_end "$1" "$2"
if [ -n "$2" ]; then title="$2"; fi
if [ "$2" = "-" ]
then
title=""
else
check_for_dash_or_end "$1" "$2"
if [ -n "$2" ]; then title="$2"; fi
fi
shift
;;
-u | --continue)
sysout_arg=""
sysout_stage="${args_stage}"
;;
-v | --vnc)
if [[ ${wsl} = true && $(uname -m) = x86_64 ]];
case "$2" in
-)
use_vnc=false
shift
;;
+)
use_vnc=true
shift
;;
*)
use_vnc=true
;;
esac
if [ "${use_vnc}" = true ] && { [ ! "${wsl}" = true ] || [ ! "$(uname -m)" = x86_64 ] ; }
then
use_vnc=true
else
echo "Warning: The -v or --vnc flag was set."
echo "But the vnc option is only available when running on "
echo "Windows System for Linux (wsl) on x86_64 machines."
@ -129,19 +249,33 @@ do
fi
;;
-x | --logindir)
if [[ "$2" = "-" || "$2" = "--" ]];
if [ "$2" = "-" ]
then
logindir_arg=""
elif [ "$2" = "--" ]
then
check_dir_writeable_or_creatable "$1" "${MEDLEYDIR}/logindir"
LOGINDIR="${MEDLEYDIR}/logindir"
logindir_arg="${MEDLEYDIR}/logindir"
else
check_for_dash_or_end "$1" "$2"
check_dir_writeable_or_creatable "$1" "$2"
LOGINDIR="$2"
logindir_arg="$2"
fi
shift
;;
-y | --sysout)
if [ "$2" = "-" ]
then
sysout_arg=""
else
check_for_dash_or_end "$1" "$2"
sysout_arg="$2"
fi
sysout_stage="${args_stage}"
shift
;;
-z | --man)
if [ ${darwin} = true ];
if [ "${darwin}" = true ]
then
/usr/bin/man "${MEDLEYDIR}/docs/man-page/medley.1.gz"
else
@ -149,79 +283,89 @@ do
fi
exit 0
;;
-nf | -NF | --nofork)
# for use in loadups
case $2 in
-)
nofork_arg=""
;;
+)
nofork_arg="-NF"
;;
*)
nofork_arg="-NF"
;;
esac
;;
--maikodir)
# for use in loadups
check_for_dash_or_end "$1" "$2"
check_dir_exists "$1" "2"
maikodir_arg="$2"
maikodir_stage="${args_stage}"
shift;
;;
-prog | --maikoprog)
# for use in loadups
check_for_dash_or_end "$1" "$2"
maikoprog_arg="$2"
shift
;;
--windows)
# internal: called from Windows medley.ps1 (via docker)
windows=true
;;
--start_cl_args)
# internal: used to separate config file args from command line args
args_stage="command line arguments"
pass_args=false
;;
--start_of_pass_args)
# internal: used to mark end of args and start of accumulated pass-on args
shift
break
;;
--)
pass_args=true
;;
-*)
err_msg=("ERROR: Unknown flag: $1" )
usage "${err_msg[@]}"
usage "ERROR: Unknown flag: $1"
;;
*)
# if matched the empty string, just ignore
if [ -n "$1" ];
then
if [[ $# -eq 1 || "$2" = "--" ]];
if [ $# -eq 1 ] || [ "$2" = "--" ]
then
sysout_flag=true
sysout_arg="$1"
sysout_stage="${args_stage}"
else
err_msg=(
"ERROR: sysout argument must be last argument"
"or last argument before the \"--\" flag"
)
usage "${err_msg[@]}"
err_msg="ERROR: unexpected argument \"$1\""
usage "${err_msg}"
fi
fi
;;
esac
else
run_args+=("$1")
if [ "$1" = "--start_cl_args" ]
then
args_stage="command line arguments"
pass_args=false
elif [ "$1" = "--start_of_pass_args" ]
then
shift
break
else
# add pass-on args to end of args array
set -- "$@" "$1"
# maiko_args="${maiko_args} \"$1\""
fi
fi
shift
done
# Figure out screensize and geometry based on arguments
source ${SCRIPTDIR}/medley_geometry.sh
# Figure out the sysout situation
ctr=0
for x in ${lisp_flag} ${full_flag} ${apps_flag} ${sysout_flag};
do
if [ "${x}" = "true" ];
then
(( ctr++ ))
fi
done
if [ ${ctr} -gt 1 ];
then
err_msg=(
"Error: only one sysout can be specified. Two or more sysouts were specified"
"via the -l (--lisp), -f (--full), -a (--apps) flags and/or a sysout filename"
)
usage "${err_msg[@]}"
fi
if [ "${sysout_arg}" = "apps" ];
then
export LDESRCESYSOUT="${MEDLEYDIR}/loadups/apps.sysout"
if [ "${greet_specified}" = "false" ];
then
export LDEINIT="${MEDLEYDIR}/greetfiles/APPS-INIT.LCOM"
fi
else
# pass on to run-medley
unset LDESRCESYSOUT
if [ -n "${sysout_arg}" ];
then
run_args+=("${sysout_arg}")
fi
fi
# if running on WSL1, force use_vnc
if [[ ${wsl} = true && ${wsl_ver} -eq 1 ]];
if [ "${wsl}" = true ] && [ "${wsl_ver}" -eq 1 ]
then
use_vnc=true
fi

View File

@ -0,0 +1,78 @@
#!only-to-be-sourced
# shellcheck shell=sh
###############################################################################
#
# medley_configfile.sh - script for processing the config file for the
# medley.sh script.
#
# !!!! This script is meant to be SOURCEd from the scripts/medley.sh script.
# !!!! It should not be run as a standlone script.
#
# 2024-04-20 Frank Halasz
#
# Copyright 2024 Interlisp.org
#
###############################################################################
config_file=""
# look thru args looking to see if a config file was specified
j=1
jmax=$#
while [ "$j" -le "$jmax" ]
do
if [ "$(eval "printf %s \${${j}}")" = "-c" ] || [ "$(eval "printf %s \${${j}}")" = "--config" ]
then
k=$(( j + 1 ))
config_file="$(eval "printf %s \${${k}}")"
if [ ! "${config_file}" = "-" ] && [ ! -f "${config_file}" ]
then
echo "Error: specified config file \"${config_file}\" not found."
echo "Exiting."
exit 52
fi
j=$(( j + 1 ))
fi
j=$(( j + 1 ))
done
# if no config file specified, use the defaults (if they exist)
if [ -z "${config_file}" ]
then
for f in "${HOME}/.medley_config" "${MEDLEYDIR}/.medley_config"
do
if [ -f "$f" ]
then
config_file="$f"
fi
done
fi
# add marker to separate config file args from command line args
set -- "--start_cl_args" "--start_cl_args" "$@"
# if there is a config file and its not been suppressed with "-",
# read the config file (in reverse order) and add the first two items on each line
# to the arguments array
if [ -n "${config_file}" ] && [ ! "${config_file}" = "-" ]
then
rev_config_file="${TMPDIR:-/tmp}"/.medley_config_$$
# reverse order of lines in medley config file
sed '1!x;H;1h;$!d;g' < "${config_file}" >"${rev_config_file}"
while read -r arg1 arg2
do
if [ -n "${arg2}" ]
then
arg2="$(echo "${arg2}" | sed s/\"//g)"
set -- "${arg2}" "$@"
fi
if [ -n "${arg1}" ]
then
set -- "${arg1}" "$@"
fi
done < "${rev_config_file}"
rm -f "${rev_config_file}"
fi

View File

@ -1,3 +1,6 @@
#!only-to-be-sourced
# shellcheck shell=sh
# shellcheck disable=SC2154,SC2269
###############################################################################
#
# medley_geometry.sh - script for computing the geometry and screensize
@ -12,68 +15,66 @@
#
###############################################################################
if [ ${noscroll} = false ];
if [ "${noscroll}" = false ];
then
scroll=22
else
scroll=0
fi
if [[ -n ${geometry} && -n ${screensize} ]];
if [ -n "${geometry}" ] && [ -n "${screensize}" ]
then
gw=$(expr "${geometry}" : "\([0-9]*\)x[0-9]*$")
gh=$(expr "${geometry}" : "[0-9]*x\([0-9]*\)$")
if [[ -z "${gw}" || -z "${gh}" ]];
if [ -z "${gw}" ] || [ -z "${gh}" ]
then
echo "Error: Improperly formed -geometry or -dimension argument: ${geometry}"
echo "Exiting"
exit 7
err_msg="Error: Improperly formed -geometry or -dimension argument: ${geometry}"
usage "${err_msg}"
fi
geometry="-g ${geometry}"
geometry="${geometry}"
#
sw=$(expr "${screensize}" : "\([0-9]*\)x[0-9]*$")
sh=$(expr "${screensize}" : "[0-9]*x\([0-9]*\)$")
if [[ -z "${sw}" || -z "${sh}" ]];
if [ -z "${sw}" ] || [ -z "${sh}" ]
then
echo "Error: Improperly formed -screensize argument: ${screensize}"
echo "Exiting"
exit 7
err_msg="Error: Improperly formed -screensize argument: ${screensize}"
usage "${err_msg}"
fi
screensize="-sc ${screensize}"
elif [[ -n ${geometry} ]];
screensize="${screensize}"
elif [ -n "${geometry}" ]
then
gw=$(expr "${geometry}" : "\([0-9]*\)x[0-9]*$")
gh=$(expr "${geometry}" : "[0-9]*x\([0-9]*\)$")
if [ -n "${gw}" -a -n "${gh}" ] ; then
sw=$(( ((31+${gw})/32*32) - ${scroll} ))
sh=$(( ${gh} - ${scroll} ))
geometry="-g ${gw}x${gh}"
screensize="-sc ${sw}x${sh}"
if [ -n "${gw}" ] && [ -n "${gh}" ]
then
sw=$(( (((31+gw)/32)*32)-scroll ))
sh=$(( gh - scroll ))
geometry="${gw}x${gh}"
screensize="${sw}x${sh}"
else
echo "Error: Improperly formed -geometry or -dimension argument: ${geometry}"
echo "Exiting"
exit 7
err_msg="Error: Improperly formed -geometry or -dimension argument: ${geometry}"
usage "${err_msg}"
fi
elif [[ -n ${screensize} ]];
elif [ -n "${screensize}" ]
then
sw=$(expr "${screensize}" : "\([0-9]*\)x[0-9]*$")
sh=$(expr "${screensize}" : "[0-9]*x\([0-9]*\)$")
if [ -n "${sw}" -a -n "${sh}" ] ; then
sw=$(( (31+$sw)/32*32 ))
gw=$(( ${scroll}+${sw} ))
gh=$(( ${scroll}+${sh} ))
geometry="-g ${gw}x${gh}"
screensize="-sc ${sw}x${sh}"
if [ -n "${sw}" ] && [ -n "${sh}" ]
then
sw=$(( (31+sw)/32*32 ))
gw=$(( scroll+sw ))
gh=$(( scroll+sh ))
geometry="${gw}x${gh}"
screensize="${sw}x${sh}"
else
echo "Error: Improperly formed -screensize argument: ${screensize}"
echo "Exiting"
exit 7
err_msg="Error: Improperly formed -screensize argument: ${screensize}"
usage "${err_msg}"
fi
else
screensize="-sc 1440x900"
if [ ${noscroll} = false ];
screensize="1440x900"
if [ "${noscroll}" = false ];
then
geometry="-g 1462x922"
geometry="1462x922"
else
geometry="-g 1440x900"
geometry="1440x900"
fi
fi

View File

@ -0,0 +1,28 @@
#!only-to-be-sourced
# shellcheck shell=sh
###############################################################################
#
# medley.sh - script for running Medley Interlisp on
# Linux/WSL/Cygwin/MacOS. On all platforms it just sets
# up directories and environment variables and then calls
# maiko with the right arguments. On WSL, there is an option to
# run without or around X Windows by using the XVnc and a VNC viewer
# on the Windows side. This script will start this VNC viewer
# on the Windows side.
#
# NOTE: This script is "compiled" using compile.sh (and inline.sh) from the
# component scripts (medley_*.sh). The top-level component is
# medley_main.sh. The other components are sourced (directly or
# indirectly) from medley_main.sh.
#
# Do not edit this script directly. Edit the component scripts and
# then recompile to get this "combined" script. You can also run
# the scripts by exec-ing the medley_main.sh script. This will allow
# testing of component modifications without having to compile.
#
# 2023-01-12 Frank Halasz
# 2024-04-29 Frank Halasz: Major overhaul
#
# Copyright 2023-2024 Interlisp.org
#
###############################################################################

207
scripts/medley/medley_main.sh Executable file
View File

@ -0,0 +1,207 @@
#!/bin/sh
# shellcheck disable=SC2164,SC2181,SC2009,SC2034,SC2154
. ./medley_header.sh
###############################################################################
#
# medley_main.sh - "main" script for running Medley Interlisp on
# Linux/WSL/Cygwin/MacOS. On all platforms it just sets
# up directories and environment variables and then calls
# maiko with the right arguments. On WSL, there is an option to
# run without or around X Windows by using the XVnc and a VNC viewer
# on the Windows side. This script will start this VNC viewer
# on the Windows side.
#
# 2023-01-12 Frank Halasz
# 2024-04-29 Frank Halasz: Major overhaul
#
# Copyright 2023-2024 Interlisp.org
#
###############################################################################
#set -x
#
#
# Start off with some functions to determine what directory this script is being executed from
#
#
get_abs_filename() {
# $1 : relative filename
echo "$(cd "$(dirname "$1")" && pwd)/$(basename "$1")"
}
# This function taken from
# https://stackoverflow.com/questions/29832037/how-to-get-script-directory-in-posix-sh
rreadlink() (
# Execute this function in a *subshell* to localize variables and the effect of `cd`.
target=$1
fname=
targetDir=
CDPATH=
# Try to make the execution environment as predictable as possible:
# All commands below are invoked via `command`, so we must make sure that `command`
# itself is not redefined as an alias or shell function.
# (Note that command is too inconsistent across shells, so we don't use it.)
# `command` is a *builtin* in bash, dash, ksh, zsh, and some platforms do not even have
# an external utility version of it (e.g, Ubuntu).
# `command` bypasses aliases and shell functions and also finds builtins
# in bash, dash, and ksh. In zsh, option POSIX_BUILTINS must be turned on for that
# to happen.
{ \unalias command; \unset -f command; } >/dev/null 2>&1
[ -n "$ZSH_VERSION" ] && options[POSIX_BUILTINS]=on # make zsh find *builtins* with `command` too.
while :; do # Resolve potential symlinks until the ultimate target is found.
[ -L "$target" ] || [ -e "$target" ] || { command printf '%s\n' "ERROR: '$target' does not exist." >&2; return 1; }
command cd "$(command dirname -- "$target")" # Change to target dir; necessary for correct resolution of target path.
fname=$(command basename -- "$target") # Extract filename.
[ "$fname" = '/' ] && fname='' # !! curiously, `basename /` returns '/'
if [ -L "$fname" ]; then
# Extract [next] target path, which may be defined
# *relative* to the symlink's own directory.
# Note: We parse `ls -l` output to find the symlink target
# which is the only POSIX-compliant, albeit somewhat fragile, way.
target=$(command ls -l "$fname")
target=${target#* -> }
continue # Resolve [next] symlink target.
fi
break # Ultimate target reached.
done
targetDir=$(command pwd -P) # Get canonical dir. path
# Output the ultimate target's canonical path.
# Note that we manually resolve paths ending in /. and /.. to make sure we have a normalized path.
if [ "$fname" = '.' ]; then
command printf '%s\n' "${targetDir%/}"
elif [ "$fname" = '..' ]; then
# Caveat: something like /var/.. will resolve to /private (assuming /var@ -> /private/var), i.e. the '..' is applied
# AFTER canonicalization.
command printf '%s\n' "$(command dirname -- "${targetDir}")"
else
command printf '%s\n' "${targetDir%/}/$fname"
fi
)
get_script_dir() {
# call this with $0 (from main script) as its (only) parameter
# if you need to preserve cwd, run this is a subshell since
# it can change cwd
# set -x
local_SCRIPT_PATH="$( get_abs_filename "$1" )";
while [ -h "$local_SCRIPT_PATH" ];
do
cd "$( dirname -- "$local_SCRIPT_PATH"; )";
local_SCRIPT_PATH="$( rreadlink "$local_SCRIPT_PATH" )";
done
cd "$( dirname -- "$local_SCRIPT_PATH"; )" > '/dev/null';
local_SCRIPT_PATH="$( pwd; )";
# set +x
echo "${local_SCRIPT_PATH}"
}
# end of script directory functions
###############################################################################
# figure out the script dir
SCRIPTDIR="$(get_script_dir "$0")"
# Define some generally useful functions
# shellcheck source=./medley_utils.sh
. "${SCRIPTDIR}/medley_utils.sh"
MEDLEYDIR="$(cd "${SCRIPTDIR}/../.."; pwd)"
export MEDLEYDIR
IL_DIR="$(cd "${MEDLEYDIR}/.."; pwd)"
# Are we running under WSL or Darwin or Cygwin?
#
wsl=false
darwin=false
cygwin=false
if [ "$(uname)" = "Darwin" ]
then
darwin=true
elif [ "$(uname -s | head --bytes 6)" = "CYGWIN" ]
then
cygwin=true
elif [ -e "/proc/version" ] && grep --ignore-case --quiet Microsoft /proc/version
then
wsl=true
wsl_ver=0
# WSL2
grep --ignore-case --quiet wsl /proc/sys/kernel/osrelease
if [ $? -eq 0 ];
then
wsl_ver=2
else
# WSL1
grep --ignore-case --quiet microsoft /proc/sys/kernel/osrelease
if [ $? -eq 0 ]
then
if [ "$(uname -m)" = "x86_64" ]
then
wsl_ver=1
else
err_msg="ERROR: Running Medley on WSL1 requires an x86_64-based PC.
This is not an x86_64-based PC.
Exiting"
output_error_msg "${err_msg}"
exit 23
fi
fi
fi
fi
# process config file and args
# shellcheck source=./medley_configfile.sh
. "${SCRIPTDIR}/medley_configfile.sh"
# shellcheck source=./medley_args.sh
. "${SCRIPTDIR}/medley_args.sh"
# Process run_id
# if it doesn't end in #, make sure that there is not another instance currently running with this same id
# If it does end in #, find the right number to fill in for the #
run_id_base="${run_id%+}"
run_id_has_plus="${run_id#"${run_id_base}"}"
if [ -z "${run_id_has_plus}" ]
then
matching=$(ps ax | sed -e "/sed/d" -e "/ldex.*-id ${run_id_base}/p" -e "/ldesdl.*-id ${run_id_base}/p" -e d)
if [ -n "${matching}" ]
then
err_msg="Another instance of Medley Interlisp is already running with the id \"${run_id}\".
Only a single instance with a given id can be run at the same time.
Please retry using the \"--id <name>\" argument to give this new instance a different id.
Exiting"
output_error_msg "${err_msg}"
exit 3
fi
else
matching=$( \
ps ax | \
sed -e "/ldex.*-id ${run_id_base}[0-9]/s/^.*-id ${run_id_base}\([0-9]*\).*$/\\1/p" \
-e "/ldesdl.*-id ${run_id_base}[0-9]/s/^.*-id ${run_id_base}\([0-9]*\).*$/\\1/p" \
-e d \
)
max=0
for n in $matching
do
if [ "$n" -gt "$max" ]; then max=$n; fi
done
max=$(( max + 1 ))
run_id="${run_id_base}${max}"
fi
# Run medley
# shellcheck source=./medley_run.sh
. "${SCRIPTDIR}/medley_run.sh"

View File

@ -0,0 +1,320 @@
#!only-to-be-sourced
# shellcheck shell=sh
# shellcheck disable=SC2154,SC2164,SC2086
###############################################################################
#
# medley_run.sh - script for processing actually running maiko/medley
# for the medley.sh script.
#
# !!!! This script is meant to be SOURCEd from the scripts/medley.sh script.
# !!!! It should not be run as a standlone script.
#
# 2024-04-21 Frank Halasz
#
# Copyright 2024 Interlisp.org
#
###############################################################################
# Figure out LOGINDIR situation
if [ -z "${logindir_arg}" ]
then
LOGINDIR="${HOME}/il"
else
LOGINDIR="${logindir_arg}"
fi
export LOGINDIR
if [ ! -e "${LOGINDIR}" ];
then
mkdir -p "${LOGINDIR}"
elif [ ! -d "${LOGINDIR}" ];
then
echo "ERROR: Medley requires a directory named ${LOGINDIR}."
echo "But ${LOGINDIR} exists but appears not be a directory."
echo "Exiting"
exit 2
fi
mkdir -p "${LOGINDIR}"/vmem
# Set LDEDESTSYSOUT env variable based on id
# if LDEDESRTSYSOUT has not already been set
# during arg processing
if [ -z "${vmem_arg}" ]
then
if [ "${run_id}" = "default" ]
then
LDEDESTSYSOUT="${LOGINDIR}/vmem/lisp.virtualmem"
else
LDEDESTSYSOUT="${LOGINDIR}/vmem/lisp_${run_id}.virtualmem"
fi
else
LDEDESTSYSOUT="${vmem_arg}"
fi
export LDEDESTSYSOUT
# Figure out the sysout situation
loadups_dir="${MEDLEYDIR}/loadups"
if [ -z "${sysout_arg}" ]
then
if [ -f "${LDEDESTSYSOUT}" ]
then
src_sysout="${LDEDESTSYSOUT}"
else
src_sysout="${loadups_dir}/full.sysout"
fi
else
case "${sysout_arg}" in
lisp | full | apps)
if [ ! -d "${loadups_dir}" ]
then
err_msg="Error: The sysout argument --${sysout_arg} was specified in ${sysout_stage},
but the directory \"${loadups_dir}\" where ${sysout_arg}.sysout is supposed to be located
cannot be found.
Exiting."
output_error_msg "${err_msg}"
exit 62
fi
src_sysout="${loadups_dir}/${sysout_arg}.sysout"
;;
*)
src_sysout="${sysout_arg}"
;;
esac
fi
if [ ! -f "${src_sysout}" ]
then
err_msg="Error: Cannot find the specified sysout file \"${src_sysout}\".
Exiting."
output_error_msg "${err_msg}"
fi
# Figure out screensize and geometry based on arguments
# shellcheck source=./medley_geometry.sh
. "${SCRIPTDIR}/medley_geometry.sh"
# Figure out border width situation
borderwidth_flag=""
borderwidth_value=""
if [ -n "${borderwidth_arg}" ]
then
borderwidth_flag="-bw"
borderwidth_value="${borderwidth_arg}"
fi
# Figure out pixelscale situation
pixelscale_flag=""
pixelscale_value=""
if [ -n "${pixelscale_arg}" ]
then
pixelscale_flag="-pixelscale"
pixelscale_value="${pixelscale_arg}"
fi
# figure out greet files situation
if [ -z "${greet_arg}" ]
then
if [ "${sysout_arg}" = "apps" ]
then
LDEINIT="${MEDLEYDIR}/greetfiles/APPS-INIT.LCOM"
else
LDEINIT="${MEDLEYDIR}/greetfiles/MEDLEYDIR-INIT.LCOM"
fi
else
if [ "${greet_arg}" = "--nogreet--" ]
then
LDEINIT="${MEDLEYDIR}/greetfiles/NOGREET"
else
LDEINIT="${greet_arg}"
fi
fi
export LDEINIT
# figure out noscroll situation
noscroll_arg=""
if [ "${noscroll}" = true ]
then
noscroll_arg="-noscroll"
fi
# figure out -m situatiom
mem_flag=""
mem_value=""
if [ -n "${mem_arg}" ]
then
mem_flag="-m"
mem_value="${mem_arg}"
fi
# figure out the nethub situation
nh_host_flag=""
nh_host_value=""
nh_port_flag=""
nh_port_value=""
nh_mac_flag=""
nh_mac_value=""
nh_debug_flag=""
nh_debug_value=""
if [ -n "${nh_host_arg}" ]
then
nh_host_flag="-nh-host"
nh_host_value="${nh_host_arg}"
if [ -n "${nh_port_arg}" ]
then
nh_port_flag="-nh-port"
nh_port_value="${nh_port_arg}"
fi
if [ -n "${nh_mac_arg}" ]
then
nh_mac_flag="-nh-mac"
nh_mac_value="${nh_mac_arg}"
fi
if [ -n "${nh_debug_arg}" ]
then
nh_debug_flag="-nh-loglevel"
nh_debug_value="${nh_debug_arg}"
fi
fi
# figure out the keyboard type
if [ -z "${LDEKBDTYPE}" ]; then
export LDEKBDTYPE="X"
fi
# figure out title situation
if [ ! "${run_id}" = default ]
then
title="$(printf %s "${title}" | sed -e "s/%i/:: ${run_id}/")"
else
title="$(printf %s "${title}" | sed -e "s/%i//")"
fi
# Figure out the maiko executable name
# used for loadups (ldeinit)
if [ -z "${maikoprog_arg}" ]
then
maikoprog_arg="lde"
fi
# Figure out the maiko directory maiko
check_if_maiko_dir () {
if [ -d "$1/bin" ]
then
cd "$1/bin"
else
return 1
fi
if [ -x ./osversion ] && [ -x ./machinetype ]
then
maiko_exe="$1/$(./osversion).$(./machinetype)/${maikoprog_arg}"
if [ -x "${maiko_exe}" ]
then
cd ${OLDPWD}
return 0
fi
fi
maiko_exe=""
cd ${OLDPWD}
return 1
}
if [ -z "${maikodir_arg}" ]
then
if [ -d "${MEDLEYDIR}/maiko" ] && check_if_maiko_dir "${MEDLEYDIR}/maiko"
then
maikodir_arg="${MEDLEYDIR}/maiko"
elif [ -d "${MEDLEYDIR}/../maiko" ] && check_if_maiko_dir "${MEDLEYDIR}/../maiko"
then
maikodir_arg="$(cd "${MEDLEYDIR}/../maiko"; pwd)"
else
err_msg="ERROR: Cannot find the directory containing the Maiko emulator in either
\"${MEDLEYDIR}/maiko\" or \"${MEDLEYDIR}/../maiko\".
Please use the --maikodir argument to specify the correct Maiko directory.
Exiting."
output_error_msg "${err_msg}"
exit 53
fi
elif ! check_if_maiko_dir "${maikodir_arg}"
then
err_msg="In ${maikodir_stage}:
ERROR: The value of the --maikodir argument is not in fact a directory containing
the Maiko emulator. Exiting."
output_error_msg "${err_msg}"
exit 53
fi
maiko="${maiko_exe}"
# Define function to start up maiko given all arguments
# Arg to this function should be "$@", the main args
# array that at this point should just include the pass-on args
start_maiko() {
echo \
\"${maiko}\" \"${src_sysout}\" \
-id \"${run_id}\" \
-title \"${title}\" \
-g ${geometry} \
-sc ${screensize} \
${borderwidth_flag} ${borderwidth_value} \
${pixelscale_flag} ${pixelscale_value} \
${noscroll_arg} \
${mem_flag} ${mem_value} \
${nh_host_flag} ${nh_host_value} \
${nh_port_flag} ${nh_port_value} \
${nh_mac_flag} ${nh_mac_value} \
${nh_debug_flag} ${nh_debug_value} \
${nofork_arg} \
"$@" ;
echo "MEDLEYDIR: \"${MEDLEYDIR}\""
echo "LOGINDIR: \"${LOGINDIR}\""
echo "GREET FILE: \"${LDEINIT}\""
echo "VMEM FILE: \"${LDEDESTSYSOUT}\""
#
# Temp workaround for issues in Maiko sysout arg
# processing. See Issue #1702. FGH 2024-05-09
#
LDESOURCESYSOUT="${src_sysout}"
export LDESOURCESYSOUT
#
# End work around
#
"${maiko}" "${src_sysout}" \
-id "${run_id}" \
-title "${title}" \
-g "${geometry}" \
-sc "${screensize}" \
${borderwidth_flag} ${borderwidth_value} \
${pixelscale_flag} ${pixelscale_value} \
${noscroll_arg} \
${mem_flag} ${mem_value} \
${nh_host_flag} ${nh_host_value} \
${nh_port_flag} ${nh_port_value} \
${nh_mac_flag} ${nh_mac_value} \
${nh_debug_flag} ${nh_debug_value} \
${nofork_arg} \
"$@" ;
exit_code=$?
}
# temp fix for cygwin to workaround issue #1685
# 2024-04-29
if [ "${cygwin}" = true ]
then
MEDLEYDIR="${MEDLEYDIR}/"
fi
# Run maiko either directly or with vnc
if [ "${wsl}" = true ] && [ "${use_vnc}" = true ]
then
# do the vnc thing on wsl (if called for)
# shellcheck source=./medley_vnc.sh
. "${SCRIPTDIR}/medley_vnc.sh"
else
# If not using vnc, just exec maiko directly
# handing over the pass-on args which are all thats left in the main args array
start_maiko "$@"
fi
exit ${exit_code}

View File

@ -1,3 +1,6 @@
#!only-to-be-sourced
# shellcheck shell=sh
# shellcheck disable=SC2154
###############################################################################
#
# medley_useage.sh - script defining the "usage" for medley.sh script.
@ -11,14 +14,13 @@
#
###############################################################################
PAGER=$( if [ -n $(which more) ]; then echo "more"; else echo "cat"; fi)
PAGER=$( if [ -n "$(which more)" ]; then echo "more"; else echo "cat"; fi)
usage() {
local err_msg
local msg_path=/tmp/msg-$$
local lines=("$@")
usage_msg_path=/tmp/msg-$$
if [ ${wsl} = true ];
if [ "${wsl}" = true ];
then
wsl_incl="+w"
wsl_excl="-w"
@ -27,7 +29,7 @@ usage() {
wsl_excl="+w"
fi
if [ ${docker} = true ];
if [ "${docker}" = true ];
then
docker_incl="+d"
docker_excl="-d"
@ -36,7 +38,7 @@ usage() {
docker_excl="+d"
fi
if [ ${windows} = true ];
if [ "${windows}" = true ];
then
windows_incl="+W"
windows_excl="-W"
@ -47,15 +49,14 @@ usage() {
if [ $# -ne 0 ];
then
echo > ${msg_path}
echo "$(output_error_msg "${lines[@]}")" >> ${msg_path}
echo >> ${msg_path}
echo >> ${msg_path}
full_msg="In ${args_stage}:
$1"
{ echo; output_error_msg "${full_msg}"; echo; } >> "${usage_msg_path}"
else
touch ${msg_path}
touch "${usage_msg_path}"
fi
cat ${msg_path} - <<EOF \
cat "${usage_msg_path}" - <<EOF \
| sed -e "/^${docker_excl}/d" -e "s/^${docker_incl}/ /" \
| sed -e "/^${wsl_excl}/d" -e "s/^${wsl_incl}/ /" \
| sed -e "/^${windows_excl}/d" -e "s/^${windows_incl}/ /" \
@ -72,11 +73,17 @@ flags:
-z | --man : show the man page for medley
-c FILE | --config FILE : use FILE as the config file (default: ~/.medley_config)
-f | --full : start Medley from the "full" sysout
-l | --lisp : start Medley from the "lisp" sysout
-a | --apps : start Medley from the "apps" sysout
-a | --apps : start Medley from the "apps" sysout
-u | --continue : start Medley from the vmem file from previous Medley run
-y FILE | --sysout FILE : start Medley using FILE as sysout
-e | --interlisp : (for apps.sysout only) Start in the Interlisp exec
@ -86,6 +93,8 @@ flags:
-s WxH | --screensize WxH : set the Medley screen size to be Width x Height
-ps N | --pixelscale N : use N as the pixel scale factor - for SDL display only
-t STRING | --title STRING : use STRING as title of window
-d :N | --display :N : use X display :N
@ -94,42 +103,25 @@ flags:
-i STRING | --id STRING : use STRING as the id for this run of Medley (default: default)
-i - | --id - : for id use the basename of MEDLEYDIR
-i -- | --id -- : for id use the basename of the parent directory of MEDLEYDIR
-m N | --mem N : set Medley memory size to N
-k FILE | --vmem FILE : use FILE as the Medley virtual memory store.
+d FILE must be a file in the Medley file system under LOGINDIR (/home/medley/il).
-r FILE | --greet FILE : use FILE as the Medley greetfile.
+d FILE must be a file in the Medley file system under LOGINDIR (/home/medley/il).
-r - | --greet - : do not use a greetfile
-d
-d -x DIR | --logindir DIR : use DIR as LOGINDIR in Medley
-d
-d -x - | --logindir - : use MEDLEYDIR/logindir as LOGINDIR in Medley
+d
+d -x DIR | --logindir DIR : use DIR (on the host) to map to LOGINDIR (/home/medley/il) in Medley
+d
+d -p N | --port N : use N as the port for connecting to the Xvnc server inside the Docker container
+d
+d -u | --update : first do a pull to get the latest medley Docker image
+W
+W -w DISTRO | --wsl DISTRO : run in WSL (on the named DISTRO) instead of in a Docker container
+W
+W -b | --background : run as background process
-x DIR | --logindir DIR : use DIR as LOGINDIR in Medley
-x - | --logindir - : use MEDLEYDIR/logindir as LOGINDIR in Medley
sysout:
The pathname of the file to use as a sysout for Medley to start from.
+d The pathname must be in the Medley file system under LOGINDIR (/home/medley/il).
If sysout is not provided and none of the flags [-a, -f & -l] is used, then Medley will start from
the saved virtual memory file for the previous run with the sane id as this run.
pass_args:
All arguments after the "--" flag, are passed unaltered to lde via run-medley.
All arguments after the "--" flag, are passed unaltered to the Maiko emulator.
EOF

View File

@ -1,3 +1,5 @@
#!only-to-be-sourced
# shellcheck shell=sh
###############################################################################
#
# medley_utils.sh - script containing various useful functions for medley.sh script.
@ -11,123 +13,152 @@
#
###############################################################################
is_tput=$(which tput)
is_tput="$(which tput)"
output_error_msg() {
local lines=("$@")
for line in "${lines[@]}"
local_oem_file="${TMPDIR:-/tmp}"/oem_$$
echo "$1" >"${local_oem_file}"
while read -r line
do
if [ -n "${is_tput}" ];
then
echo "$(${is_tput} setab 1)$(${is_tput} setaf 7)${line}$(${is_tput} sgr0)"
else
echo "${line}"
echo "$1"
fi
done
done <"${local_oem_file}"
rm -f "${local_oem_file}"
}
check_for_dash_or_end() {
local err_msg;
if [[ -z "$2" || "$2" = "--" ]];
local_err_msg="";
if [ -z "$2" ] || [ "$2" = "--" ]
then
err_msg=(
"Error: the flag \"$1\" requires a value."
"Value is missing."
)
usage "${err_msg[@]}"
elif [ "${2:0:1}" = "-" ];
then
err_msg=(
"Error: either the value for flag \"${1}\" is missing OR"
"the value begins with a \"-\", which is not allowed."
)
usage "${err_msg[@]}"
local_err_msg="Error: the flag \"$1\" requires a value.
Value is missing."
usage "${local_err_msg}"
else
case "$2" in
-*)
local_err_msg="Error: either the value for flag \"${1}\" is missing OR
the value begins with a \"-\", which is not allowed."
usage "${local_err_msg}"
;;
esac
fi
}
check_file_writeable_or_creatable() {
local msg_core="\"$2\" given as the value of the \"$1\" flag"
local err_msg;
if [[ -e "$%2" ]];
local_msg_core="\"$2\" given as the value of the \"$1\" flag"
local_err_msg=""
if [ -e "$%2" ]
then
if [[ ! -f "$2" ]];
if [ ! -f "$2" ]
then
err_msg=(
"Error: File ${msg_core} is not a regular file."
"It is either a directory or a device file of some sort."
"Exiting"
)
output_error_msg "${err_msg[@]}"
local_err_msg="Error: File ${local_msg_core} is not a regular file.
It is either a directory or a device file of some sort.
Exiting"
output_error_msg "${local_err_msg}"
exit 1
elif [[ ! -w "$2" ]];
elif [ ! -w "$2" ]
then
err_msg=(
"Error: File ${msg_core} exists but is not writeable"
"Exiting"
)
output_error_msg "${err_msg[@]}"
local_err_msg="Error: File ${local_msg_core} exists but is not writeable
Exiting"
output_error_msg "${local_err_msg}"
exit 1
fi
else
if [[ ! -w "$(dirname -- $2)" ]];
if [ ! -w "$(dirname -- "$2")" ]
then
err_msg=(
"Error: File ${msg_core} cannot be created because"
"its directory either doen't exist or is not writeable."
"Exiting"
)
output_error_msg "${err_msg[@]}"
local_err_msg="Error: File ${local_msg_core} cannot be created because
its directory either doen't exist or is not writeable.
Exiting"
output_error_msg "${local_err_msg}"
exit 1
fi
fi
}
check_file_readable() {
local msg_core="\"$2\" given as the value of the \"$1\" flag"
if [[ ! -r "$2" ]];
then
err_msg=(
"Error: File ${msg_core}"
"either doesn't exist or is not readable."
"Exiting"
)
output_error_msg "${err_msg[@]}"
exit 1
fi
}
check_dir_writeable_or_creatable() {
local msg_core="\"$2\" given as the value of the \"$1\" flag"
if [[ -e "$2" ]];
local_msg_core="\"$2\" given as the value of the \"$1\" flag"
local_err_msg=""
if [ -e "$%2" ]
then
if [[ ! -d "$2" ]];
if [ ! -d "$2" ]
then
err_msg=(
"Error: Pathname ${msg_core} exists but is not a directory."
"Exiting"
)
output_error_msg "${err_msg[@]}"
local_err_msg="Error: ${local_msg_core} exists but is not a directory.
Exiting"
output_error_msg "${local_err_msg}"
exit 1
elif [[ ! -w "$2" ]];
elif [ ! -w "$2" ]
then
err_msg=(
"Error: Directory ${msg_core} exists but is not writeable."
"Exiting"
)
output_error_msg "${err_msg[@]}"
local_err_msg="Error: Directory ${local_msg_core} exists but is not writeable
Exiting"
output_error_msg "${local_err_msg}"
exit 1
fi
else
if [[ ! -w "$(dirname -- $2)" ]];
if [ ! -w "$(dirname -- "$2")" ]
then
err_msg=(
"Error: Directory ${msg_core} cannot be created because"
"its parent directory either doesn't exist or is not writeable."
"Exiting"
)
output_error_msg "${err_msg[@]}"
local_err_msg="Error: Directory ${local_msg_core} cannot be created because
its directory either doesn't exist or is not writeable.
Exiting"
output_error_msg "${local_err_msg}"
exit 1
fi
fi
}
check_file_readable() {
local_msg_core="\"$2\" given as the value of the \"$1\" flag"
if [ ! -r "$2" ]
then
local_err_msg="Error: File ${local_msg_core}
either doesn't exist or is not readable.
Exiting"
output_error_msg "${local_err_msg}"
exit 1
fi
}
check_dir_exists() {
local_msg_core="\"$2\" given as the value of the \"$1\" flag"
if [ -e "$2" ]
then
if [ ! -d "$2" ]
then
local_err_msg="Error: Pathname ${local_msg_core} exists but is not a directory.
Exiting"
output_error_msg "${local_err_msg}"
exit 1
elif [ ! -r "$2" ]
then
local_err_msg="Error: Directory ${local_msg_core} exists but is not readable.
Exiting"
output_error_msg "${local_err_msg}"
exit 1
fi
fi
}
parse_nethub_data() {
nh_host=""
nh_port=""
nh_mac=""
nh_debug=""
#
x="${1%:}:"
nh_host="${x%%:*}"
x="${x#"${nh_host}":*}"
nh_port="${x%%:*}"
if [ "${nh_port}" = "${x}" ]; then nh_port=""; return 0; fi
x="${x#"${nh_port}":*}"
nh_mac="${x%%:*}"
if [ "${nh_mac}" = "${x}" ]; then nh_mac=""; return 0; fi
nh_debug="${x#"${nh_mac}":*}"
if [ "${nh_debug}" = "${x}" ]; then nh_debug=""; return 0; fi
nh_debug="${nh_debug%:}"
return 0
}

View File

@ -1,3 +1,6 @@
#!only-to-be-sourced
# shellcheck shell=sh
# shellcheck disable=SC2154,SC2162
###############################################################################
#
# medley_vnc.sh - script for running Medley Interlisp on WSL using Xvnc
@ -19,50 +22,41 @@
}
find_open_display() {
local ctr=1
local result=-1
local locked_pid=0
while [ ${ctr} -lt 64 ];
local_ctr=1
local_result=-1
while [ ${local_ctr} -lt 64 ];
do
if [ ! -e /tmp/.X${ctr}-lock ];
if [ ! -e /tmp/.X${local_ctr}-lock ];
then
result=${ctr}
local_result=${local_ctr}
break
else
locked_pid=$(cat /tmp/.X${ctr}-lock)
ps lax | awk '{print $3}' | grep --quiet ${locked_pid} >/dev/null
if [ $? -eq 1 ];
then
result=${ctr}
break
else
(( ctr++ ))
fi
local_ctr=$(( local_ctr+1 ))
fi
done
echo ${result}
echo ${local_result}
}
find_open_port() {
local ctr=5900
local result=-1
while [ ${ctr} -lt 6000 ];
local_ctr=5900
local_result=-1
while [ ${local_ctr} -lt 6000 ];
do
if [[ ${wsl} = true && ${wsl_ver} -eq 1 ]];
if [ "${wsl}" = true ] && [ "${wsl_ver}" -eq 1 ]
then
netstat.exe -a -n | awk '{ print $2 }' | grep -q ":${ctr}\$"
netstat.exe -a -n | awk '{ print $2 }' | grep -q ":${local_ctr}\$"
else
ss -a | grep -q "LISTEN.*:${ctr}[^0-9]"
ss -a | grep -q "LISTEN.*:${local_ctr}[^0-9]"
fi
if [ $? -eq 1 ];
then
result=${ctr}
local_result=${local_ctr}
break
else
(( ctr++ ))
local_ctr=$(( local_ctr+1 ))
fi
done
echo ${result}
echo ${local_result}
}
#
@ -71,9 +65,9 @@
if [ "${use_vnc}" = "true" ];
then
win_userprofile="$(cmd.exe /c "<nul set /p=%UserProfile%" 2>/dev/null)"
vnc_dir="$(wslpath ${win_userprofile})/AppData/Local/Interlisp"
vnc_dir="$(wslpath "${win_userprofile}")/AppData/Local/Interlisp"
vnc_exe="vncviewer64-1.12.0.exe"
if [[ $(which Xvnc) = "" || $(Xvnc -version |& grep -iq tigervnc; echo $?) -eq 1 ]];
if [ "$(which Xvnc)" = "" ] || [ "$(Xvnc -version 2>&1 | grep -iq tigervnc; echo $?)" -eq 1 ]
then
echo "Error: The -v or --vnc flag was set."
echo "But it appears that that TigerVNC \(Xvnc\) has not been installed."
@ -86,165 +80,134 @@
then
# make sure TigerVNC viewer is in a Windows (not Linux) directory. If its in a Linux directory
# there will be a long delay when it starts up
mkdir -p ${vnc_dir}
mkdir -p "${vnc_dir}"
cp -p "${IL_DIR}/wsl/${vnc_exe}" "${vnc_dir}/${vnc_exe}"
else
echo "TigerVnc viewer is required by the -vnc option but is not installed."
echo -n "Ok to download from SourceForge? [y, Y, n or N, default n] "
read resp
if [ -z ${resp} ]; then resp=n; else resp=${resp:0:1}; fi
if [[ ${resp} = 'n' || ${resp} = 'N' ]];
then
echo "Ok. You can download the Tiger VNC viewer \(v1.12.0\) .exe yourself and "
echo "place it in ${vnc_dir}/${vnc_exe}. Then retry."
echo "Exiting."
exit 5
else
pushd "${vnc_dir}" >/dev/null
wget https://sourceforge.net/projects/tigervnc/files/stable/1.12.0/vncviewer64-1.12.0.exe
popd >/dev/null
fi
loop_done=false
while [ "${loop_done}" = "false" ]
do
echo "TigerVnc viewer is required by the -vnc option but is not installed."
echo "Ok to download from SourceForge? [y, Y, n or N, default n] "
read resp
if [ -z "${resp}" ]; then resp=n; fi
case "${resp}" in
n* | N* )
echo "Ok. You can download the Tiger VNC viewer \(v1.12.0\) .exe yourself and "
echo "place it in ${vnc_dir}/${vnc_exe}. Then retry."
echo "Exiting."
exit 5
;;
y* | Y* )
wget -P "${vnc_dir}" https://sourceforge.net/projects/tigervnc/files/stable/1.12.0/vncviewer64-1.12.0.exe
loop_done=true
;;
* )
echo "Answer not one of Y, y, N, or n. Retry."
;;
esac
done
fi
fi
fi
#
# Start the log file so we can trace any issues with vnc, etc
#
LOG=${LOGINDIR}/logs/medley_${run_id}.log
mkdir -p $(dirname -- ${LOG})
echo "START" >${LOG}
LOG="${LOGINDIR}/logs/medley_${run_id}.log"
mkdir -p "$(dirname -- "${LOG}")"
echo "START" >"${LOG}"
#
# If we're running under docker:
# set the VNC_PORT to the value of the --port flag (or its default value)
# set DISPLAY to :0
#
#set -x
if [ "${docker}" = "true" ];
# are we running in background - used for pretty-fying the echos
case $(ps -o stat= -p $$) in
*+*) bg=false ;;
*) bg=true ;;
esac
#
# find an unused display and an available port
#
#set -x
OPEN_DISPLAY="$(find_open_display)"
if [ "${OPEN_DISPLAY}" -eq -1 ];
then
export VNC_PORT=5900
export DISPLAY=:0
echo "Error: cannot find an unused DISPLAY between 1 and 63"
echo "Exiting"
exit 33
else
# are we running in background - used for pretty-fying the echos
case $(ps -o stat= -p $$) in
*+*) bg=false ;;
*) bg=true ;;
esac
# For not docker (i.e., for wsl/vnc)
# find an unused display and an available port
#
#set -x
OPEN_DISPLAY=`find_open_display`
if [ ${OPEN_DISPLAY} -eq -1 ];
then
echo "Error: cannot find an unused DISPLAY between 1 and 63"
echo "Exiting"
exit 33
else
if [ ${bg} = true ]; then echo; fi
echo "Using DISPLAY=:${OPEN_DISPLAY}"
fi
export DISPLAY=":${OPEN_DISPLAY}"
export VNC_PORT=`find_open_port`
if [ ${VNC_PORT} -eq -1 ];
then
echo "Error: cannot find an unused port between 5900 and 5999"
echo "Exiting"
exit 33
else
echo "Using VNC_PORT=${VNC_PORT}"
fi
if [ "${bg}" = true ]; then echo; fi
echo "Using DISPLAY=:${OPEN_DISPLAY}"
fi
DISPLAY=":${OPEN_DISPLAY}"
export DISPLAY
VNC_PORT="$(find_open_port)"
export VNC_PORT
if [ "${VNC_PORT}" -eq -1 ];
then
echo "Error: cannot find an unused port between 5900 and 5999"
echo "Exiting"
exit 33
else
echo "Using VNC_PORT=${VNC_PORT}"
fi
#
# Start the Xvnc server
#
mkdir -p ${LOGINDIR}/logs
mkdir -p "${LOGINDIR}"/logs
/usr/bin/Xvnc "${DISPLAY}" \
-rfbport ${VNC_PORT} \
-geometry "${geometry#-g }" \
-rfbport "${VNC_PORT}" \
-geometry "${geometry}" \
-SecurityTypes None \
-NeverShared \
-DisconnectClients=0 \
-desktop "${title}" \
--MaxDisconnectionTime=10 \
>> ${LOG} 2>&1 &
>> "${LOG}" 2>&1 &
# Leaving pid wait for all but docker,
# which seems to need it. For all others
# it seems like its not needed but we'll have
# to see how it runs on slower/faster machines
# FGH 2023-02-16
if [ ${docker} = true ];
then
xvnc_pid=""
end_time=$(expr $(date +%s) + 10)
while [ -z "${xvnc_pid}" ];
do
if [ $(date +%s) -gt $end_time ];
then
echo "Xvnc server failed to start."
echo "See log file at ${LOG}"
echo "Exiting"
exit 3
fi
sleep .125
xvnc_pid=$(pgrep -f "Xvnc ${DISPLAY}")
done
# echo "XVNC_PID is ${xvnc_pid}"
fi
sleep .5
#
# Run Medley in foreground if docker, else in background
# Run Maiko in background, handing over the pass-on args which are all thats left in the main args array
#
tmp_dir=$(if [[ -d /run/shm && ! -h /run/shm ]]; then echo "/run/shm"; else echo "/tmp"; fi)
medley_run=$(mktemp --tmpdir=${tmp_dir} medley-XXXXX)
cat > ${medley_run} <<..EOF
#!/bin/bash
${MEDLEYDIR}/run-medley -id '${run_id}' ${geometry} ${screensize} ${run_args[@]} \
2>&1 | tee -a ${LOG} | grep -v "broken (explicit kill"
if [ -n "\$(pgrep -f "${vnc_exe}.*:${VNC_PORT}")" ]; then vncconfig -disconnect; fi
..EOF
#cat ${medley_run}
chmod +x ${medley_run}
if [ "${docker}" = "true" ];
{
start_maiko "$@"
if [ -n "$(pgrep -f "${vnc_exe}.*:${VNC_PORT}")" ]; then vncconfig -disconnect; fi
} &
#
# Start the vncviewer on the windows side
#
# First give medley time to startup
# sleep .25
# SLeep appears not to be needed, but faster/slower machines ????
# FGH 2023-02-08
# Then start vnc viewer on Windows side
vncv_loc=$(( OPEN_DISPLAY * 50 ))
start_time=$(date +%s)
"${vnc_dir}"/${vnc_exe} \
-geometry "+${vncv_loc}+${vncv_loc}" \
-ReconnectOnError=off \
AlertOnFatalError=off \
"$(ip_addr)":"${VNC_PORT}" \
>>"${LOG}" 2>&1 &
wait $!
if [ $(( $(date +%s) - start_time )) -lt 5 ]
then
${medley_run}; rm ${medley_run}
else
(${medley_run}; rm ${medley_run}) &
#
# If not docker (i.e., if wsl/vnc), start the vncviewer on the windows side
#
# First give medley time to startup
# sleep .25
# SLeep appears not to be needed, but faster/slower machines ????
# FGH 2023-02-08
# Then start vnc viewer on Windows side
start_time=$(date +%s)
${vnc_dir}/${vnc_exe} \
-geometry "+50+50" \
-ReconnectOnError=off \
AlertOnFatalError=off \
$(ip_addr):${VNC_PORT} \
>>${LOG} 2>&1 &
wait $!
if [ $( expr $(date +%s) - ${start_time} ) -lt 5 ];
if [ -z "$(pgrep -f "Xvnc ${DISPLAY}")" ]
then
if [ -z "$(pgrep -f "Xvnc ${DISPLAY}")" ];
then
echo "Xvnc server failed to start."
echo "See log file at ${LOG}"
echo "Exiting"
exit 3
else
echo "VNC viewer failed to start.";
echo "See log file at ${LOG}";
echo "Exiting" ;
exit 4;
fi
echo "Xvnc server failed to start."
echo "See log file at ${LOG}"
echo "Exiting"
exit 3
else
echo "VNC viewer failed to start.";
echo "See log file at ${LOG}";
echo "Exiting" ;
exit 4;
fi
fi
#
# Done, "Go back" to medley.sh
# Done, "Go back" to medley_run.sh
#
true