Hi everyone,
so I’m trying to compile a Qt5 project with CMake, and I’m facing an issue.
Here’s a little bit of context: I have developped Qt projects for the past several
months without too much problem, but I was doing it from qtcreator
, and clicking the
“Build & run” button. This worked. But now, for reasons outside the scope of this post
I need to use CMake to compile and run the project.
So here is the shell.nix
file that I have been using for the last few months:
with import <nixpkgs> {};
stdenv.mkDerivation {
name = "hello-dev-environment";
buildInputs = [ pkgconfig cryptopp qt5.full qtcreator gdb cmake ];
}
I have been entering the shell with nix-shell
, launching qtcreator
and compiling / launching
my programs from qtcreator
without too much problems.
Now I have written this CMakeLists.txt
:
cmake_minimum_required(VERSION 3.1.0)
project(hello)
# MOC files are generated in the build directory, so include it
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# Tell CMake to run MOC when necessary
set(CMAKE_AUTOMOC ON)
# Tell CMake to run UIC automatically to generate ui files
set(CMAKE_AUTOUIC ON)
# Widget finds its own dependency
find_package(Qt5Widgets REQUIRED)
# Create the executable with the sources
add_executable(hello_cmake main.cpp mainwindow.cpp)
# Encapsulates all the setup required to use a Qt module
qt5_use_modules(hello_cmake Widgets)
Now, here is what happens when I run cmake ..
from inside the nix shell:
cmake ..
-- The C compiler identification is GNU 7.3.0
-- The CXX compiler identification is GNU 7.3.0
-- Check for working C compiler: /nix/store/gqg2vrcq7krqi9rrl6pphvsg81sb8pjw-gcc-wrapper-7.3.0/bin/gcc
-- Check for working C compiler: /nix/store/gqg2vrcq7krqi9rrl6pphvsg81sb8pjw-gcc-wrapper-7.3.0/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /nix/store/gqg2vrcq7krqi9rrl6pphvsg81sb8pjw-gcc-wrapper-7.3.0/bin/g++
-- Check for working CXX compiler: /nix/store/gqg2vrcq7krqi9rrl6pphvsg81sb8pjw-gcc-wrapper-7.3.0/bin/g++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
CMake Error at /nix/store/v521qbyfwv3png4bliwgz693v2534ynd-qt-full-5.10.1/lib/cmake/Qt5Gui/Qt5GuiConfig.cmake:13 (message):
The imported target "Qt5::Gui" references the file
"/nix/store/9yiv0c2ga2lmp14m01ncaibmr2ky4jwh-qtbase-5.10.1-bin/lib/qt-5.10/plugins/imageformats/libqicns.so"
but this file does not exist. Possible reasons include:
* The file was deleted, renamed, or moved to another location.
* An install or uninstall procedure did not complete successfully.
* The installation package was faulty and contained
"/nix/store/v521qbyfwv3png4bliwgz693v2534ynd-qt-full-5.10.1/lib/cmake/Qt5Gui/Qt5Gui_QICNSPlugin.cmake"
but not all the files it references.
Call Stack (most recent call first):
/nix/store/v521qbyfwv3png4bliwgz693v2534ynd-qt-full-5.10.1/lib/cmake/Qt5Gui/Qt5GuiConfig.cmake:156 (_qt5_Gui_check_file_exists)
/nix/store/v521qbyfwv3png4bliwgz693v2534ynd-qt-full-5.10.1/lib/cmake/Qt5Gui/Qt5Gui_QICNSPlugin.cmake:4 (_populate_Gui_plugin_properties)
/nix/store/v521qbyfwv3png4bliwgz693v2534ynd-qt-full-5.10.1/lib/cmake/Qt5Gui/Qt5GuiConfig.cmake:164 (include)
/nix/store/v521qbyfwv3png4bliwgz693v2534ynd-qt-full-5.10.1/lib/cmake/Qt5Widgets/Qt5WidgetsConfig.cmake:87 (find_package)
CMakeLists.txt:14 (find_package)
-- Configuring incomplete, errors occurred!
Mostly I’m interested in this (from the beginning of the output):
CMake Error at /nix/store/v521qbyfwv3png4bliwgz693v2534ynd-qt-full-5.10.1/lib/cmake/Qt5Gui/Qt5GuiConfig.cmake:13 (message):
The imported target "Qt5::Gui" references the file
"/nix/store/9yiv0c2ga2lmp14m01ncaibmr2ky4jwh-qtbase-5.10.1-bin/lib/qt-5.10/plugins/imageformats/libqicns.so"
but this file does not exist.
I have found an issue on nixpkgs’ github where the issue is very similar.
Also I have checked: there is no libqicns.so
in qtbase
plugins directory, but there is one in
qtfull
plugins directory.
Quoting github user lucas8
from the link above:
“It seems the errors comes from the fact that when the cmake files are created, they think the plugins are in the qtbase installation, while they are in the qt-full installation.”.
Also he mentions CMAKE_PLUGIN_DIR
.
I’m fairly new to nix/nixOS, but by searching a little, I have found a mention of this
CMAKE_PLUGIN_DIR
inside file nixpkgs/pkgs/development/libraries/qt-5/5.10/qtbase.patch
.
Here is the link on the github repo (for some reason Qt 5.10 disappeared from the repo, so here is 5.11
instead, but the content is similar):
https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/libraries/qt-5/5.11/qtbase.patch#L76
This is where clear water stops for me
So what I understand and what I’m trying to fix is: qtbase
seems to set the root directory of Qt
plugins to be its own “plugins” directory whereas it looks like it should be qtfull
’s “plugins”
directory.
I hope I’m correct, because otherwise I’ve just wasted a few hours!
I haven’t found a way to do this: from the qtbase.patch
file, it seems CMAKE_PLUGIN_PATH
is set
to NIX_OUTPUT_PLUGIN
, so I was trying to find this.
Looking a bit at the directory nixpkgs/pkgs/development/libraries/qt-5/5.10
, here is what I
“found”:
First, the default.nix
file mentions:
qtbase
../modules/qtbase.nix
, andqtbase.patch
so it looks promising.
../modules/qtbase.nix
mentions ../hooks/fix-qt-builtin-paths.sh
and also it has this line
NIX_OUTPUT_PLUGIN = $bin/$qtPluginPrefix
inside its preConfigure
. Not sure what this $bin
and
$qtPluginPrefix
evaluates to, nor where they are set.
Now in ../hooks/fix-qt-builtin-paths.sh
, there are a lot of modifications on QT_
-prefixed
environment variables. But not CMAKE_PLUGIN_DIR
, nor NIX_OUTOUT_PLUGIN
, so I’m not sure this is
relevant, and I don’t want to get lost too deep!
I’m a bit overwhelmed, and when I keep looking, I fall into deeper threads than mention other
environment variables, QT_PLUGIN_PATH
, etc. And I’m not sure where the nix-specific stuffs stop
and where the qt-specific stuff begin.
Making a quick github search for qt plugin
(here) I find a lot of -DUSE_QT_PUGIN_DIR=OFF
, and also a lot of mentions to a mythical ${qtPluginPrefix:?}
variable.
I’m not sure what happens: there seems to be as many solutions as there are package developers(!)
but I feel like I’m not too far from “fixing” it.
So does anybody has a clue on how I should continue? Where should I look? Am I even in the right
direction?
A couple of things that I think are worth mentionning:
-
at the moment, I enter a nix shell with
nix-shell
and theshell.nix
file from above, from
there I type thecmake
andmake
commands. I haven’t written a nix derivation to automatically
build all of this (os am I missing on some env variable or something?). -
I cannot make a dirty, temporary hack setting an environment variable before running the
cmake
command in myhello
directory, because I looked at file
/nix/store/v521qbyfwv3png4bliwgz693v2534ynd-qt-full-5.10.1/lib/cmake/Qt5Gui/Qt5GuiConfig.cmake
(from the error message I pasted above), and it’s writtenset(imported_location "/nix/store/9yiv0c2ga2lmp14m01ncaibmr2ky4jwh-qtbase-5.10.1-bin/lib/qt-5.10/plugins/${PLUGIN_LOCATION}")
inside it.
So thisQt5GuiConfig.cmake
file is being generated while Qt is built, and it’s somehow called by
mycmake
file. So the only way is to fix the problem at the moment the file is being generated,
i.e. when qt is being built.Sorry this was a pretty long post! I just wanted to explain the context and what I had digged up
so far.
I hope someone here as a clue on how to proceed.
Thanks in advance for taking the time!