.. default-domain:: py
.. py:currentmodule:: mod
.. cpp:namespace:: mod
.. _mod-wrapper:
****************************
The Wrapper Script (``mod``)
****************************
The script ``mod`` is a convenience script primarily for starting ``python3``
and after its exit execute PostMØD (the summary generator).
The execution can however be customised somewhat, e.g., by running ``python3``
through ``valgrind`` or ``gdb``.
At some point the script will be able to call some other virtual machine than
Python, which is why the documentation will not refer directly to running
``python3`` but instead simply say "running the selected virtual machine (VM)".
As default ``python3`` is that VM.
The wrapper script does the following.
#. Clear the folder ``out/``. If it does not exist, if will be created.
All printing functions in libMØD assumes ``out/`` is created.
#. Run the selected VM, optionally through some selected command
(e.g., ``gdb``).
#. If the exit code of the VM is not 0, exit with that exit code.
#. If PostMØD is not selected to be run, exit with code 0.
#. Run PostMØD and exit with its exit code.
Usage
#####
.. program:: mod
.. code-block:: bash
mod [options]
.. option:: --help, -h
Shows the help output of the script.
.. option:: --version, -v
Print the version of MØD and exit
(the version is always printed in the start).
.. option:: --nopost
Do not run PostMØD after the selected VM has executed.
.. option:: --profile
Run the VM through `Valgrind `_
with ``--tool=callgrind``.
This option takes precedence over the ``memcheck`` option.
.. option:: --memcheck
Run the VM through `Valgrind `_ with standard options
for memory check.
If ``--debug`` is given as well, the options ``--vgdb=yes --vgdb-error=0`` are
also given to ``valgrind`` such that ``gdb`` can be connected.
.. option:: --vgArgs
If either :option:`--profile` or :option:`--memcheck` is used, this inserts
```` as an extra argument for ``valgrind``.
.. option:: --debug
Run the VM through `GDB `_.
If :option:`--memcheck` is given as well, this is not the case, but GDB can
then be connected to the process by the following steps:
1. Run ``gdb python3`` (substitute ``python3`` for your VM).
2. In the GDB prompt, run ``target remote | vgdb``
3. In the GDB prompt, run ``continue``
.. option:: clean
Do not run any VM or PostMØD, but remove the ``out`` and ``summary`` folders.
.. option:: -j
Give ``-j `` to PostMØD (if executed). It will pass it on to ``make``.
.. option:: -f
When ``python3`` is the VM, execute the code ``include("filename")``.
.. option:: -e
When ``python3`` is the VM, execute ``code`` (with a line break afterwards).
.. option:: -i
Use interactive mode for the Python interpreter (i.e., pass ``-i`` as
additional argument), but disable the log. If ``ipython3`` is available it
will be used as interpreter, otherwise ``python3`` is used.
.. option:: -q
Use quiet mode. Certain messages are not printed.
.. envvar:: MOD_NO_DEPRECATED
When set to a non-empty string, and Python is the VM,
then the string ``config.common.ignoreDeprecation = False`` is executed first.
This can be used to force errors when scripts use deprecated functionality.
.. envvar:: MOD_ILP_SOLVER
When set to a non-empty string, and Python is the VM,
then the string ``config.ilp.solver = ilpSolver`` where ``ilpSolver`` is the
value of the this environment variable.
Whenever the ``defaul`` solver is requested, this one will be selected.
See also :cpp:func:`getAvailableILPSolvers`
and :py:func:`getAvailableILPSolvers`.
Plugins (Loading of Additional Modules)
#######################################
It can be useful to always import additional modules when using MØD.
This can be achieved by writing a file in the following format::
name:
path:
When ``mod`` uses such a file, it will append ```` to ``PYTHONPATH``,
and insert both ``import `` and ``from import *`` into the preamble.
The plugin specification file must be placed in a directory that is also mentioned in the
following environment variable.
.. envvar:: MOD_PLUGIN_PATH
A colon separated list of paths to search for plugins. Non-directory paths are skipped.
All files (non-recursively) in each specified directory are checked for plugin information.
PyMØD Preamble
##############
When the wrapper script is starting Python, it will execute a small preamble of
useful code before the user-defined code is executed.
The complete code, including the preamble, given to the Python interpereter can
be seen in ``out/input`` after execution of the wrapper script.
The preamble has the following effects.
* Setting ``RTLD_GLOBAL`` in the interpreters ``dlopen`` flags (see :ref:`creatingPyMODExt`)
* ``import mod`` and ``from mod import *``
* Defining the following function both in global scope and in the ``mod`` module.
.. py:function:: include(fName, checkDup=True, putDup=True, skipDup=True)
Include the file ``fName`` in somewhat the same way that the ``#include`` directive
in the C/C++ preprocessor includes files. Paths are handled relatively using the functions
:py:func:`prefixFilename`, :py:func:`pushFilePrefix`, and :py:func:`popFilePrefix`.
:param str fName: the file to be included.
:param bool checkDup: check if the file has already been included before (with ``putDup=True``)
:param bool putDup: remember that this file has been included in subsequent calls.
:param bool skipDup: skip inclusion instead of exiting if the file has already been included
before (with ``putDup=True``)