Qt
This section describes the differences between Nix expressions for Qt
libraries and applications and Nix expressions for other C++ software. Some
knowledge of the latter is assumed. There are primarily two problems which
the Qt infrastructure is designed to address: ensuring consistent versioning
of all dependencies and finding dependencies at runtime.
Nix expression for a Qt package (default.nix)
{ mkDerivation, lib, qtbase }:
mkDerivation {
pname = "myapp";
version = "1.0";
buildInputs = [ qtbase ];
}
Import mkDerivation and Qt (such as
qtbase modules directly. Do not
import Qt package sets; the Qt versions of dependencies may not be
coherent, causing build and runtime failures.
Use mkDerivation instead of
stdenv.mkDerivation. mkDerivation
is a wrapper around stdenv.mkDerivation which
applies some Qt-specific settings.
This deriver accepts the same arguments as
stdenv.mkDerivation; refer to
for details.
To use another deriver instead of
stdenv.mkDerivation, use
mkDerivationWith:
mkDerivationWith myDeriver {
# ...
}
If you cannot use mkDerivationWith, please refer to
.
mkDerivation accepts the same arguments as
stdenv.mkDerivation, such as
buildInputs.
Locating runtime dependencies
Qt applications need to be wrapped to find runtime dependencies. If you
cannot use mkDerivation or
mkDerivationWith above, include
wrapQtAppsHook in nativeBuildInputs:
stdenv.mkDerivation {
# ...
nativeBuildInputs = [ wrapQtAppsHook ];
}
Entries added to qtWrapperArgs are used to modify the
wrappers created by wrapQtAppsHook. The entries are
passed as arguments to .
mkDerivation {
# ...
qtWrapperArgs = [ ''--prefix PATH : /path/to/bin'' ];
}
Set dontWrapQtApps to stop applications from being
wrapped automatically. It is required to wrap applications manually with
wrapQtApp, using the syntax of
:
mkDerivation {
# ...
dontWrapQtApps = true;
preFixup = ''
wrapQtApp "$out/bin/myapp" --prefix PATH : /path/to/bin
'';
}
wrapQtAppsHook ignores files that are non-ELF executables.
This means that scripts won't be automatically wrapped so you'll need to manually
wrap them as previously mentioned. An example of when you'd always need to do this
is with Python applications that use PyQT.
Libraries are built with every available version of Qt. Use the meta.broken
attribute to disable the package for unsupported Qt versions:
mkDerivation {
# ...
# Disable this library with Qt < 5.9.0
meta.broken = builtins.compareVersions qtbase.version "5.9.0" < 0;
}
Adding a library to Nixpkgs
Add a Qt library to all-packages.nix by adding it to the
collection inside mkLibsForQt5. This ensures that the
library is built with every available version of Qt as needed.
Adding a Qt library to all-packages.nix
{
# ...
mkLibsForQt5 = self: with self; {
# ...
mylib = callPackage ../path/to/mylib {};
};
# ...
}
Adding an application to Nixpkgs
Add a Qt application to all-packages.nix using
libsForQt5.callPackage instead of the usual
callPackage. The former ensures that all dependencies
are built with the same version of Qt.
Adding a Qt application to all-packages.nix
{
# ...
myapp = libsForQt5.callPackage ../path/to/myapp/ {};
# ...
}