This module implements the build system that is used by pack_install/1
and pack_rebuild/1. The build system is a plugin based system where each
plugin knows about a specific build toolchain. The plugins recognise
whether they are applicable based on the existence of files that are
unique to the toolchain. Currently it supports
- conan for the installation of dependencies
- cmake for configuration and building
- GNU tools including
for configuration and building
- build_steps(+Steps:list, SrcDir:atom, +Options) is det
- Run the desired build steps. Normally, Steps is the list below,
optionally prefixed with
[test] may be
--no-test is effective.
[[dependencies], [configure], build, [test], install]
Each step finds an applicable toolchain based on known unique files
and calls the matching plugin to perform the step. A step may fail,
which causes the system to try an alternative. A step that wants to
abort the build process must throw an exception.
- To be done
- - If no tool is willing to execute some step, the step is
skipped. This is ok for some steps such as
Possibly we should force the
install step to succeed?
- ensure_build_dir(+Dir, +State0, -State) is det
- Create the build directory. Dir is normally either '.' to build in
the source directory or
build to create a
- prolog:build_environment(-Name, -Value) is nondet[multifile]
- Hook to define the environment for building packs. This
Multifile hook extends the process environment for building
foreign extensions. A value provided by this hook overrules
defaults provided by def_environment/3. In addition to changing
the environment, this may be used to pass additional values to
the environment, as in:
prolog:build_environment('USER', User) :-
|Name||- is an atom denoting a valid variable name|
|Value||- is either an atom or number representing the
value of the variable.|
- prolog_install_prefix(-Prefix) is semidet
- Return the directory that can be passed into
to install executables and other related resources in a similar
location as SWI-Prolog itself. Tries these rules:
- If the Prolog flag
pack_prefix at a writable directory, use
- If the current executable can be found on $PATH and the parent
of the directory of the executable is writable, use this.
- If the user has a writable
~/bin directory, use
- run_process(+Executable, +Argv, +Options) is det
- Run Executable. Defined options:
- Execute in the given directory
- Unify Out with a list of codes representing stdout of the
command. Otherwise the output is handed to print_message/2
output(Out), but messages are printed at level
- Environment passed to the new process.
If Executable is
path(Program) and we have an environment we make
sure to use the
PATH from this environment for searching
- path_sep(-Sep) is det
- Path separator for the OS.
; for Windows,
: for POSIX.
The following predicates are exported from this file while their implementation is defined in imported modules or non-module files loaded by this module.
- has_program(+Spec) is semidet
- has_program(+Spec, -Path) is semidet
- has_program(+Spec, -Path, +Env:list) is semidet
- True when the OS has the program Spec at the absolute file location
Path. Normally called as e.g.
The second allows passing in an environment as Name=Value pairs. If
this contains a value for
PATH, this is used rather than the
current path variable.