Previous: Extended Runtime Systems, Up: The Application Builder [Contents][Index]
sicstus
) can be created using:
% spld --main=prolog -o sicstus
This will create a development system that is dynamically linked and has no prelinked foreign resources.
% spld --static -D --resources=random -o main
main
that
has the resource random
prelinked (statically).
This example is similar to the example in All-in-one Executables, with the addition of a foreign resource of our own.
% bar.pl
:- use_module(library(random)). :- use_module(library(clpfd)). % This will be called when the application starts: user:runtime_entry(start) :- %% You may consider putting some other code here... write('hello world'),nl, write('Getting a random value:'),nl, random(1, 10, R), % from random write(R),nl, ( all_different([3,9]) -> % from clpfd write('3 != 9'),nl ; otherwise -> write('3 = 9!?'),nl ), '$pint'(4711). % from our own foreign resource 'bar' foreign(print_int, '$pint'(+integer)). foreign_resource(bar, [print_int]). :- load_foreign_resource(bar).
/* bar.c */
#include <sicstus/sicstus.h> #include <stdio.h> /* bar_glue.h is generated by splfr from the foreign/[2,3] facts. Always include the glue header in your foreign resource code. */ #include "bar_glue.h" extern void print_int(SP_integer a); void print_int(SP_integer a) { /* Note the use of SPRIdINTEGER to get a format specifier corresponding to the SP_integer type. For most platforms this corresponds to "ld" and long, respectively. */ printf("a=%" SPRIdINTEGER "\n", (SP_integer)a); }
To create the saved state bar.sav
we will compile the
file bar.pl and save it with save_program('bar.sav').
When
compiling the file the directive :-
load_foreign_resource(bar).
is called so a dynamic foreign
resource must be present.
Thus, first we build a dynamic foreign resource.
% splfr bar.c bar.pl
Then, we create the saved state.
% sicstus --goal "compile(bar), save_program('bar.sav'), halt."
We also need a static foreign resource to embed in our all-in-one executable.
% splfr --static bar.c bar.pl
Finally, we build the all-in-one executable with spld
. We do not
need to list the foreign resources needed. spld
will
extract their names from the .sav file. Adding the
--verbose option will make spld
output lots of
progress information, among which are the names of the foreign
resources that are needed. Look for “Found resource name” in the
output.
% spld --verbose --static --main=restore --respath=. --resources=bar.sav=/mystuff/bar.sav --output=bar
In this case four foreign resource names are extracted from the
.sav file: bar
, clpfd
, and random
. The
source file bar.pl loads the foreign resource named bar
.
It also uses the library(random)
module, which loads the
foreign resource named random
, and the library(clpfd)
module, which loads the foreign resource named clpfd
.
By not listing foreign resources when running spld
, we
avoid the risk of omitting a required resource.