| Did you know ... | Search Documentation: |
| tools.pl -- Utilities for building foreign resources |
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
automake and autoconf
for configuration and building
build_steps(+Steps:list, SrcDir:atom, +Options) is detdistclean or clean. [test] may be
omited if --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.
If a step fails, a warning message is printed. The message can be
suppressed by enclosing the step in square brackets. Thus, in the
above example of Steps, only failure by the build and install
steps result in warning messages; failure of the other steps is
silent.
The failure of a step can be made into an error by enclosing it
in curly brackets, e.g. [[dependencies], [configure], {build}, [test], {install}]
would throw an exception if either the build or install step failed.
Options are:
@tbd If no tool is willing to execute some step, the step is
skipped. This is ok for some steps such as dependencies or test.
Possibly we should force the install step to succeed?
ensure_build_dir(+Dir, +State0, -State) is detbuild to create a build subdir.
prolog:build_environment('USER', User) :-
getenv('USER', User).
prolog_install_prefix(-Prefix) is semidetconfigure or cmake
to install executables and other related resources in a similar
location as SWI-Prolog itself. Tries these rules:
pack_prefix at a writable directory, use
this.~/bin directory, use ~.
run_process(+Executable, +Argv, +Options) is detinformational.output(Out), but messages are printed at level error.
If Executable is path(Program) and we have an environment we make
sure to use the PATH from this environment for searching
Program.
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 semidethas_program(path(cmake), CMakeExe).
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.