Creating Prolog executables
I have recently been porting some of my GNU Prolog code to both SWI Prolog and SICStus Prolog.
Here is a simple attempt at synthesizing some of what I learnt from that experience, especially as far as building executables is concerned.
Indeed, neither SWI nor SICStus will allow you to do something like
$ gplc -o my_native_binary --min-fd-bips --strip -C -Wall some.pl source.pl files.pl
The magic formula is the following:
$ swipl -o my_executable --stand_alone=true --global=128000 -g my_main_predicate -O -q -c some.pl source.pl files.pl
This will load quietly (
-q) all source files (and run their initialization
if there is any), then create a saved state with a 128M global stack,
-O) and that embeds the SWI interpreter (you will thus also need
libswipl.so/dylib/dll to run the created executable). When executed, it will
It is possible to produce executables for other target architectures by
specifying another emulator image with the aptly named
The process is very similar, but it seems that the two steps of creating the saved state and the executable cannot be merged. We thus go:
$ sicstus -f --nologo --noinfo -l some_source.pl --goal "save_program('my_saved'),halt." $ spld --output my_executable --static my_saved.sav
Here we use a fast and quiet SICStus call to load one source file (if you need more, add them in the goal) and save the state.
Then we convert the saved state to a standalone and static executable that
embeds a restricted interpreter and will run the goal called
user:runtime_entry(start) on start. Once again, another SICStus executable
can be used with
--sicstus (but I think that it is used for more than
spld, thus cross-building might not work…).