It is possible to embed saved-states into an executable. Together with static linking, this gives an all-in-one executable, an executable that does not depend on external SICStus files.
The keys to this feature are:
sprt310.dll
(Windows) or libsprt310.so
(UNIX). Note that, as
of SICStus 3.9, static linking is supported under Windows.
If the application needs foreign resources (predicates
written in C code), as used for example by library(system)
and
library(clpfd)
, then these foreign resources can be linked
statically with the application as well.
The remaining component is the Prolog code itself; see the next item.
An application needs two saved-states:
sprt.sav
).
This is added automatically when spld
is invoked with the
--static
(or -S
) option unless the spld
-option
--no-embed-rt-sav
is specified. It can also be added explicitly
with the option --embed-rt-sav
.
This saved-state is typically created by loading all
application code using compile/1
and then creating the
saved-state with save_program/2
.
Data resources are added by specifying their internal name and their
location as part of the comma separated list of resources passed with
the spld
option --resources
. Each data resource is
specified as file=name where file is the name of the
file containing the data (it must exist during the call to spld
)
and name is the name used to access the content of file
during run-time. name should begin with a slash (/
) and
look like an ordinary lowercase file path made up of /
-separated
names consisting of a
to z
, underscore (_
, period
(.
), and digits.
Typically, you would use spld --main=restore
, which will
automatically restore the first .sav
argument. To manually
restore an embedded saved-state you should use the syntax
URL:x-sicstus-resource:
name, e.g.
SP_restore("URL:x-sicstus-resource:/mystuff/main.sav")
.
An example will make this clearer. Suppose we create a run-time system
that consists of a single file main.pl
that looks like:
% main.pl:- use_module(library(system)). :- use_module(library(clpfd)). % This will be called when the application starts: runtime_entry(start) :- %% You may consider putting some other code here... write('hello world'),nl, write('Getting host name:'),nl, host_name(HostName), % from system write(HostName),nl, ( all_different([3,9]) -> % from clpfd write('3 != 9'),nl ; otherwise -> write('3 = 9!?'),nl ).
Then create the saved-state main.sav
, which will contain
the compiled code of main.pl
as well as the Prolog code of
library(system)
and library(clpfd)
and other Prolog
libraries needed by library(clpfd)
.
% sicstus -i -f SICStus 3.11.1 ... Licensed to SICS | ?- compile(main). % compiling .../main.pl... % ... loading several library modules | ?- save_program('main.sav'). % .../main.sav created in 201 msec | ?- halt.
Finally, tell spld
to build an executable statically linked
with the SICStus run-time and the foreign resources needed by
library(system)
and library(clpfd)
. Also, embed the Prolog
run-time saved-state and the application specific
saved-state just created.
(The example is using Cygwin bash
(http://www.cygwin.com)
under Windows but would look much the same on other platforms. The command
should be given on a single line; it is broken up here for better
layout.)
% spld --static --main=restore --resources=main.sav=/mystuff/main.sav,clpfd,system --output=main.exe
The arguments are as follows:
--static
system
and clpfd
in this case). This option also adds
--embed-rt-sav
ensuring that the SICStus run-time .sav
file is
embedded.
--main=restore
runtime_entry(start)
. This is not strictly needed in the above
example since it is the default if any file with extension .sav
or a data resource with a name with extension .sav
is
specified.
--resources=...
main.sav=/mystuff/main.sav
spld
to make the content (at the time spld
is
invoked) of the file main.sav
available at run-time in a data
resource named /mystuff/main.sav
. That is, the data resource
name corresponding to "URL:x-sicstus-resource:/mystuff/main.sav"
.
clpfd
system
spld
to link with the foreign resources (that
is, C-code) associated with library(system)
and
library(clpfd)
. Since --static
was specified the static
versions of these foreign resources will be used.
Alternatively, spld
can extract the information about the
required foreign resources from the saved-state
(main.sav
). This feature is enabled by adding the option
--resources-from-sav
. By adding this option the example above
would be
% spld --static --main=restore --resources-from-sav --resources=main.sav=/mystuff/main.sav --output=main.exethis option was introduced in SICStus 3.10.0 and may become the default in a future release.
--output=main.exe
spld
where to put the resulting executable.
Finally, we may run this executable on any machine, even if SICStus is not installed:
bash-2.04$ ./main.exe hello world Getting host name: EOWYN 3 != 9 bash-2.04$
Note that no pathnames passed to spld
should contain spaces. Under
Windows, this can be avoided by using the short version of pathnames
as necessary.