Home Contents Index Summary Previous Next

5.7 Linking embedded applications using plld

The utility program plld may be used to link a combination of C-files and Prolog files into a stand-alone executable. It is a simple Bourne-shell script that automates most of the steps outlined in the previous sections.

In the normal usage, a copy is made of the default embedding template ... /pl/include/stub.c. Additional foreign predicates are defined and added to the extension table PL_extensions. The main() routine is modified to suit your application. PL_initialise() must be passed the program-name (argv[0]). The other elements of the command-line may be modified. Next, plld is typically invoked as:

plld -o output stubfile.c [other-c-or-o-files] [plfiles]

plld will first split the options into various groups for both the C-compiler and the Prolog compiler. Next, it will add various default options to the C-compiler and call it to create an executable holding the user's C-code and the Prolog kernel. Then, it will call the SWI-Prolog compiler to create a saved state from the provided Prolog files and finally, it will attach this saved state to the created emulator to create the requested executable.

Below, it is described how the options are split and which additional options are passed.

-help
Print brief synopsis.

-pl prolog
Select the prolog to use. This prolog is used for two purposes: get the home-directory as well as the compiler/linker options and create a saved state of the Prolog code.

-v
Select verbose operation, showing the various programs and their options.

-o outfile
Reserved to specify the final output file.

-llibrary
Specifies a library for the C-compiler. By default, -lpl and the libraries needed by the Prolog kernel are given.

-Llibrary-directory
Specifies a library directory for the C-compiler. By default the directory containing -lpl for the current architecture is passed.

-g | -Iinclude-directory | -Ddefinition
These options are passed to the C-compiler. By default, the include directory containing SWI-Prolog.h is passed. plld adds two additional * -Ddef flags:

-D__SWI_PROLOG__
Indicates the code is to be connected to SWI-Prolog.

-D__SWI_EMBEDDED__
Indicates the creation of an embedded program.

*.o | *.c | *.C | *.cxx | *.cpp
Passed as input files to the C-compiler

*.pl | *.qlf
Passed as input files to the Prolog compiler to create the saved-state.

*
I.e. all other options. These are passed as linker options to the C-compiler.

5.7.1 A simple example

The following is a very simple example going through all the steps outlined above. It provides an arithmetic expression evaluator. We will call the application calc and define it in the files calc.c and calc.pl. The Prolog file is simple:

calc(Atom) :- term_to_atom(Expr, Atom), A is Expr, write(A), nl.

The C-part of the application parses the command-line options, initialises the Prolog engine, locates the calc/1 predicate and calls it. The coder is in figure 10.

#include <stdio.h> #include <SWI-Prolog.h> PL_extension PL_extensions [] = { /*{ "name", arity, function, PL_FA_<flags> },*/ { NULL, 0, NULL, 0 } /* terminating line */ }; #define MAXLINE 1024 int main(int argc, char **argv, char **env) { char expression[MAXLINE]; char *e = expression; char *program = argv[0]; char *plav[2]; int n; /* combine all the arguments in a single string */ for(n=1; n<argc; n++) { if ( n != 1 ) *e++ = ' '; strcpy(e, argv[n]); e += strlen(e); } /* make the argument vector for Prolog */ plav[0] = program; plav[1] = NULL; /* initialise Prolog */ if ( !PL_initialise(1, plav, env) ) PL_halt(1); /* Lookup calc/1 and make the arguments and call */ { predicate_t pred = PL_predicate("calc", 1, "user"); term_t h0 = PL_new_term_refs(1); int rval; PL_put_atom_chars(h0, expression); rval = PL_call_predicate(NULL, FALSE, pred, h0); PL_halt(rval ? 0 : 1); } return 0; }

Figure 10 : C-source for the calc application

The application is now created using the following command-line:

% plld -o calc calc.c calc.pl

The following indicates the usage of the application:

% calc pi/2 1.5708