A custom check is a Python function that checks for a certain condition to exist on the running system, usually using methods that SCons supplies to take care of the details of checking whether a compilation succeeds, a link succeeds, a program is runnable, etc. A simple custom check for the existence of a specific library might look as follows:
mylib_test_source_file = """ #include <mylib.h> int main(int argc, char **argv) { MyLibrary mylib(argc, argv); return 0; } """ def CheckMyLibrary(context): context.Message('Checking for MyLibrary...') result = context.TryLink(mylib_test_source_file, '.c') context.Result(result) return result
The Message
and Result
methods
should typically begin and end a custom check to
let the user know what's going on:
the Message
call prints the
specified message (with no trailing newline)
and the Result
call prints
ok if the check succeeds and
failed if it doesn't.
The TryLink
method
actually tests for whether the
specified program text
will successfully link.
(Note that a custom check can modify its check based on any arguments you choose to pass it, or by using or modifying the configure context environment in the context.env attribute.)
This custom check function is
then attached to the configure context
by passing a dictionary
to the Configure
call
that maps a name of the check
to the underlying function:
env = Environment() conf = Configure(env, custom_tests = {'CheckMyLibrary' : CheckMyLibrary})
You'll typically want to make the check and the function name the same, as we've done here, to avoid potential confusion.
We can then put these pieces together and actually call the CheckMyLibrary check as follows:
mylib_test_source_file = """ #include <mylib.h> int main(int argc, char **argv) { MyLibrary mylib(argc, argv); return 0; } """ def CheckMyLibrary(context): context.Message('Checking for MyLibrary... ') result = context.TryLink(mylib_test_source_file, '.c') context.Result(result) return result env = Environment() conf = Configure(env, custom_tests = {'CheckMyLibrary' : CheckMyLibrary}) if not conf.CheckMyLibrary(): print 'MyLibrary is not installed!' Exit(1) env = conf.Finish() # We would then add actual calls like Program() to build # something using the "env" construction environment.
If MyLibrary is not installed on the system, the output will look like:
% scons scons: Reading SConscript file ... Checking for MyLibrary... failed MyLibrary is not installed!
If MyLibrary is installed, the output will look like:
% scons scons: Reading SConscript file ... Checking for MyLibrary... failed scons: done reading SConscript scons: Building targets ... . . .