The move by Trilinos to the CMake build system has had many advantages for PyTrilinos. The two primary advantages being that shared libraries and python extension libraries can now both be built automatically by the host build system. Previously, shared libraries were built by the PyTrilinos package in an ad-hoc manner, and the python extension libraries were built using the python distutils module, which has some reports of portability issues. The move to CMake has improved the reliability and robustness of the PyTrilinos build system.
From a build-system point of view, there are two types of Trilinos packages that are supported by PyTrilinos: those that are contained within a single namespace, like Teuchos, Epetra and AztecOO; and those that are contained within nested namespaces, such as NOX. These two types are detailed below, in addition to the pytrilinos library and package-specific configuration options.
All supported packages must be listed in the LIB_OPTIONAL_DEP_PACKAGES variable in the cmake/Dependencies.cmake file, and they should be listed in build order.
The PyTrilinos build system maintains two variables, PyTrilnos_PACKAGES and PyTrilinos_MODULES, both set in the top-level CMakeLists.txt file, to keep track of what to build. (Note that these variables are referenced as ${PACKAGE_NAME}_PACKAGES and ${PACKAGE_NAME}_MODULES within CMakeLists.txt.) For single namespace packages, the entries in these two variables is the same. For example,
IF(PyTrilinos_ENABLE_Teuchos) APPEND_SET(${PACKAGE_NAME}_PACKAGES Teuchos) APPEND_SET(${PACKAGE_NAME}_MODULES Teuchos) ENDIF(PyTrilinos_ENABLE_Teuchos)
In this instance, the build system now expects to find a SWIG interface file in the source directory src/Teuchos.i that defines module PyTrilinos.Teuchos. The end products will be placed in the build directory src/PyTrilinos:
src/PyTrilinos/Teuchos.py src/PyTrilinos/Teuchos.pyc src/PyTrilinos/_Teuchos.so
Using NOX as an example, the LIB_OPTIONAL_DEP_PACKAGES variable in the cmake/Dependencies.cmake file should contain the entry NOX and it should be listed in build order.
In the top-level CMakeLists.txt file, the variable PyTrilinos_PACKAGES should be appended as before, with a single entry. But PyTrilinos_MODULES should contain an entry for each nested namespace:
IF(PyTrilinos_ENABLE_NOX) APPEND_SET(${PACKAGE_NAME}_PACKAGES NOX) APPEND_SET(${PACKAGE_NAME}_MODULES NOX.__init__ ) APPEND_SET(${PACKAGE_NAME}_MODULES NOX.Abstract ) APPEND_SET(${PACKAGE_NAME}_MODULES NOX.StatusTest) APPEND_SET(${PACKAGE_NAME}_MODULES NOX.Solver ) IF(NOX_ENABLE_Epetra) APPEND_SET(${PACKAGE_NAME}_MODULES NOX.Epetra.__init__ ) APPEND_SET(${PACKAGE_NAME}_MODULES NOX.Epetra.Interface) ENDIF(NOX_ENABLE_Epetra) ENDIF(PyTrilinos_ENABLE_NOX)
For every entry in PyTrilnos_MODULES, there should be a corresponding SWIG file in the source directory:
src/NOX.__init__.i src/NOX.Abstract.i src/NOX.StatusTest.i src/NOX.Solver.i src/NOX.Epetra.__init__.i src/NOX.Epetra.Interface.i
which will produce the following build products:
src/PyTrilinos/NOX/__init__.py src/PyTrilinos/NOX/__init__.pyc src/PyTrilinos/NOX/___init__.so src/PyTrilinos/NOX/Abstract.py src/PyTrilinos/NOX/Abstract.pyc src/PyTrilinos/NOX/_Abstract.so src/PyTrilinos/NOX/StatusTest.py src/PyTrilinos/NOX/StatusTest.pyc src/PyTrilinos/NOX/_StatusTest.so src/PyTrilinos/NOX/Solver.py src/PyTrilinos/NOX/Solver.pyc src/PyTrilinos/NOX/_Solver.so src/PyTrilinos/NOX/Epetra/__init__.py src/PyTrilinos/NOX/Epetra/__init__.pyc src/PyTrilinos/NOX/Epetra/___init__.so src/PyTrilinos/NOX/Epetra/Interface.py src/PyTrilinos/NOX/Epetra/Interface.pyc src/PyTrilinos/NOX/Epetra/_Interface.so
If you develop a module that requires compiled code not generated by SWIG, it should be put in the pytrilinos library. Simply append entries the the HEADERS and SOURCES variables in src/CMakeLists.txt file.
If you need package-specific configuration options set, they should be done so in src/CMakeLists.txt prior tothe call the call to PACKAGE_CONFIGURE_FILE(). Currently, the following variable are set depending upon the top-level Trilinos configuration:
HAVE_EPETRA HAVE_TEUCHOS HAVE_NOX_EPETRA HAVE_NOX_EPETRAEXT HAVE_MPI