QMakePackage

Much like Autotools and CMake, QMake is a build-script generator designed by the developers of Qt. In its simplest form, Spack’s QMakePackage runs the following steps:

$ qmake
$ make
$ make check  # optional
$ make install

QMake does not appear to have a standardized way of specifying the installation directory, so you may have to set environment variables or edit *.pro files to get things working properly.

Phases

The QMakePackage base class comes with the following phases:

  1. qmake - generate Makefiles
  2. build - build the project
  3. install - install the project

By default, these phases run:

$ qmake
$ make
$ make install

Any of these phases can be overridden in your package as necessary. There is also a check method that looks for a check target in the Makefile. If a check target exists and the user runs:

$ spack install --test=root <qmake-package>

Spack will run make check after the build phase.

Important files

Packages that use the QMake build system can be identified by the presence of a <project-name>.pro file. This file declares things like build instructions and dependencies.

One thing to look for is the minQtVersion function:

minQtVersion(5, 6, 0)

This means that Qt 5.6.0 is the earliest release that will work. You should specify this in a depends_on statement.

Build system dependencies

At the bare minimum, packages that use the QMake build system need a qt dependency. Since this is always the case, the QMakePackage base class already contains:

depends_on('qt', type='build')

If you want to specify a particular version requirement, or need to link to the qt libraries, you can override this in your package:

depends_on('qt@5.6.0:')

Passing arguments to qmake

If you need to pass any arguments to the qmake call, you can override the qmake_args method like so:

def qmake_args(self):
    return ['-recursive']

This method can be used to pass flags as well as variables.

*.pro file in a sub-directory

If the *.pro file used to tell QMake how to build the package is found in a sub-directory, you can tell Spack to run all phases in this sub-directory by adding the following to the package:

build_directory = 'src'

External documentation

For more information on the QMake build system, see: http://doc.qt.io/qt-5/qmake-manual.html