Qt: Difference between revisions
Added a section for explicitly specifying development dependencies |
m Added nix lang on some code hightlight |
||
| (8 intermediate revisions by 4 users not shown) | |||
| Line 2: | Line 2: | ||
== Development == | == Development == | ||
{{warning|With the deprecation of <code>qt5.full</code> & <code>qt6.full</code>, for 25.11 and up (see [https://github.com/NixOS/nixpkgs/blob/32b61ba4d9088ef926dd27065daad604ca6b58aa/pkgs/development/libraries/qt-6/default.nix#L152 change]) this recommendation is outdated. For now please primarily refer to the [[#Explicit Dependencies|Explicit Dependencies]] Section below.}} | |||
To develop Qt applications in NixOS you may use nix-shell or direnv. | |||
For using nix-shell just run this command in the terminal: | For using nix-shell just run this command in the terminal: | ||
| Line 11: | Line 13: | ||
For using direnv, create a '''shell.nix''' file in the root of your project and paste these lines into it: | For using direnv, create a '''shell.nix''' file in the root of your project and paste these lines into it: | ||
< | <syntaxhighlight lang="nix"># shell.nix | ||
# shell.nix | |||
{ pkgs ? import <nixpkgs> {} }: | { pkgs ? import <nixpkgs> {} }: | ||
pkgs.mkShell { | pkgs.mkShell { | ||
buildInputs = [ | buildInputs = [ | ||
pkgs.qt5.full | |||
pkgs.qtcreator | |||
]; | |||
} | }</syntaxhighlight> | ||
</ | |||
Also, create '''.envrc''' file and paste: <code>use_nix</code> into it. | |||
=== Explicit Dependencies === | === Explicit Dependencies === | ||
If fetching the entirety of <code>pkgs.qt6.full</code> is not appealing and you know which parts of Qt you need, your first instinct might be adding something like <code>pkgs.qt6.qtdeclarative</code> for creating QML-based Qt programs to <code>buildInputs</code>, '''however''' that will not work and you will get compile errors for missing libraries. <code>pkgs.qt6.full</code> is actually [https://github.com/NixOS/nixpkgs/blob/nixos-24.11/pkgs/development/libraries/qt-6/default.nix#L94-L144 creating an environment that contains all Qt libraries] that allows <code>qmake</code> and tools to find those libraries, so you must do the same and <code>pkgs.qt6.env</code> will help make one. For example: | |||
< | <syntaxhighlight lang="nix"># shell.nix | ||
# shell.nix | |||
{ pkgs ? import <nixpkgs> {} }: | { pkgs ? import <nixpkgs> {} }: | ||
let | let | ||
# pkgs.qt6.env already includes pkgs.qt6.qtbase | # pkgs.qt6.env already includes pkgs.qt6.qtbase | ||
# And using `with` to prevent a lot of typing. | # And using `with` to prevent a lot of typing. | ||
qtEnv = with pkgs.qt6; env "qt-custom-${qtbase.version}" | qtEnv = with pkgs.qt6; env "qt-custom-${qtbase.version}" [ | ||
qtdeclarative | |||
]; | |||
in | in | ||
pkgs.mkShell { | pkgs.mkShell { | ||
| Line 52: | Line 45: | ||
pkgs.qtcreator | pkgs.qtcreator | ||
]; | ]; | ||
} | }</syntaxhighlight> | ||
</ | |||
== Packaging == | == Packaging == | ||
| Line 142: | Line 134: | ||
For actual python applications, you may also use something like that (to test) : | For actual python applications, you may also use something like that (to test) : | ||
<syntaxHighlight> | <syntaxHighlight lang=nix> | ||
python3.pkgs.buildPythonApplication { | python3.pkgs.buildPythonApplication { | ||
pname = "blabla"; | pname = "blabla"; | ||
| Line 196: | Line 188: | ||
== Troubleshooting == | == Troubleshooting == | ||
=== This application failed to start because it could not find or load the Qt platform plugin ??? in "" === | === This application failed to start because it could not find or load the Qt platform plugin ??? in "" === | ||
{{warning|This recommendation is deprecated for 19.09 and up, see {{issue|65399}}. Failing packages should be updated to use <code>wrapQtAppsHook</code>.}} | {{warning|This recommendation is deprecated for 19.09 and up, see {{issue|65399}}. Failing packages should be updated to use <code>wrapQtAppsHook</code>.}} | ||
<pre> | <pre> | ||
| Line 234: | Line 200: | ||
The package will need to be fixed to use [the new https://github.com/NixOS/nixpkgs/issues/65399 <code>wrapQtAppsHook</code>]. The hook wraps every qt application with adding <code>QT_PLUGIN_PATH</code> and <code>XDG_DATA_DIRS</code> as well as <code>XDG_CONFIG_DIRS</code>.See [https://github.com/NixOS/nixpkgs/blob/nixos-19.09/pkgs/development/libraries/qt-5/hooks/wrap-qt-apps-hook.sh wrap-qt-apps-hook.sh in nixpkgs] | The package will need to be fixed to use [the new https://github.com/NixOS/nixpkgs/issues/65399 <code>wrapQtAppsHook</code>]. The hook wraps every qt application with adding <code>QT_PLUGIN_PATH</code> and <code>XDG_DATA_DIRS</code> as well as <code>XDG_CONFIG_DIRS</code>.See [https://github.com/NixOS/nixpkgs/blob/nixos-19.09/pkgs/development/libraries/qt-5/hooks/wrap-qt-apps-hook.sh wrap-qt-apps-hook.sh in nixpkgs] | ||
=== Debugging methods === | |||
As a general rule, exporting <code>QT_DEBUG_PLUGINS=1</code> make qt print where it looks for plugins. | As a general rule, exporting <code>QT_DEBUG_PLUGINS=1</code> make qt print where it looks for plugins. | ||
If a plugin exists in a directory but is ignored with a message like <code>QLibraryPrivate::loadPlugin failed on "/nix/store/...-teamspeak-client-3.1.6/lib/teamspeak/platforms/libqxcb.so" : "Cannot load library /nix/store/...-client-3.1.6/lib/teamspeak/platforms/libqxcb.so: "</code> it can be that the library cannot be <code>dlopen()</code>ed because of dependencies/rpath issues and needs <code>patchelf</code>ing. Exporting <code>LD_DEBUG=libs</code> may prove helpful in this scenario. | If a plugin exists in a directory but is ignored with a message like <code>QLibraryPrivate::loadPlugin failed on "/nix/store/...-teamspeak-client-3.1.6/lib/teamspeak/platforms/libqxcb.so" : "Cannot load library /nix/store/...-client-3.1.6/lib/teamspeak/platforms/libqxcb.so: "</code> it can be that the library cannot be <code>dlopen()</code>ed because of dependencies/rpath issues and needs <code>patchelf</code>ing. Exporting <code>LD_DEBUG=libs</code> may prove helpful in this scenario. | ||