aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mesonbuild/dependencies/ui.py40
-rw-r--r--mesonbuild/interpreter.py2
-rw-r--r--test cases/frameworks/4 qt/main.cpp4
-rw-r--r--test cases/frameworks/4 qt/meson.build2
4 files changed, 41 insertions, 7 deletions
diff --git a/mesonbuild/dependencies/ui.py b/mesonbuild/dependencies/ui.py
index 2f31196..70d2abc 100644
--- a/mesonbuild/dependencies/ui.py
+++ b/mesonbuild/dependencies/ui.py
@@ -158,9 +158,8 @@ class QtBaseDependency(ExternalDependency):
self.qtpkgname = self.qtname
self.root = '/usr'
self.bindir = None
- mods = kwargs.get('modules', [])
- if isinstance(mods, str):
- mods = [mods]
+ self.private_headers = kwargs.get('private_headers', False)
+ mods = extract_as_list(kwargs, 'modules')
if not mods:
raise DependencyException('No ' + self.qtname + ' modules specified.')
type_text = 'cross' if env.is_cross_build() else 'native'
@@ -216,6 +215,11 @@ class QtBaseDependency(ExternalDependency):
# qmake-based fallback if pkg-config fails.
kwargs['required'] = False
modules = OrderedDict()
+ # Until Qt's pkg-config files provide private headers path
+ # let's just fallback to qmake method
+ if self.private_headers:
+ self.is_found = False
+ return
for module in mods:
modules[module] = PkgConfigDependency(self.qtpkgname + module, self.env,
kwargs, language=self.language)
@@ -296,6 +300,10 @@ class QtBaseDependency(ExternalDependency):
for module in mods:
mincdir = os.path.join(incdir, 'Qt' + module)
self.compile_args.append('-I' + mincdir)
+ if self.private_headers:
+ priv_inc = self.get_private_includes(incdir, module)
+ for dir in priv_inc:
+ self.compile_args.append('-I' + dir)
if for_windows(self.env.is_cross_build(), self.env):
is_debug = self.env.cmd_line_options.buildtype.startswith('debug')
dbg = 'd' if is_debug else ''
@@ -361,6 +369,9 @@ class QtBaseDependency(ExternalDependency):
# for you, patches are welcome.
return compiler.get_pic_args()
+ def get_private_includes(self, incdir, module):
+ return tuple()
+
class Qt4Dependency(QtBaseDependency):
def __init__(self, env, kwargs):
@@ -386,6 +397,29 @@ class Qt5Dependency(QtBaseDependency):
def get_pkgconfig_host_bins(self, core):
return core.get_pkgconfig_variable('host_bins', {})
+ def get_private_includes(self, incdir, module):
+ # usually Qt5 puts private headers in /QT_INSTALL_HEADERS/module/VERSION/module/private
+ # except for at least QtWebkit and Enginio where the module version doesn't match Qt version
+ # as an example with Qt 5.10.1 on linux you would get:
+ # /usr/include/qt5/QtCore/5.10.1/QtCore/private/
+ # /usr/include/qt5/QtWidgets/5.10.1/QtWidgets/private/
+ # /usr/include/qt5/Enginio/1.6.2/Enginio/private/
+
+ mod_inc_dir = os.path.join(incdir, 'Qt' + module)
+ private_dir = os.path.join(mod_inc_dir, self.version)
+ # fallback, let's try to find a directory with the latest version
+ if not os.path.exists(private_dir):
+ dirs = [filename for filename in os.listdir(mod_inc_dir)
+ if os.path.isdir(os.path.join(mod_inc_dir, filename))]
+ dirs.sort(reverse=True)
+
+ for dirname in dirs:
+ if len(dirname.split('.')) == 3:
+ private_dir = dirname
+ break
+ return (private_dir,
+ os.path.join(private_dir, 'Qt' + module))
+
# There are three different ways of depending on SDL2:
# sdl2-config, pkg-config and OSX framework
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py
index c948778..0e48d66 100644
--- a/mesonbuild/interpreter.py
+++ b/mesonbuild/interpreter.py
@@ -1656,7 +1656,7 @@ permitted_kwargs = {'add_global_arguments': {'language'},
'build_target': known_build_target_kwargs,
'configure_file': {'input', 'output', 'configuration', 'command', 'install_dir', 'capture', 'install', 'format'},
'custom_target': {'input', 'output', 'command', 'install', 'install_dir', 'build_always', 'capture', 'depends', 'depend_files', 'depfile', 'build_by_default'},
- 'dependency': {'default_options', 'fallback', 'language', 'main', 'method', 'modules', 'optional_modules', 'native', 'required', 'static', 'version'},
+ 'dependency': {'default_options', 'fallback', 'language', 'main', 'method', 'modules', 'optional_modules', 'native', 'required', 'static', 'version', 'private_headers'},
'declare_dependency': {'include_directories', 'link_with', 'sources', 'dependencies', 'compile_args', 'link_args', 'link_whole', 'version'},
'executable': build.known_exe_kwargs,
'find_program': {'required', 'native'},
diff --git a/test cases/frameworks/4 qt/main.cpp b/test cases/frameworks/4 qt/main.cpp
index 0fcc734..0ad7154 100644
--- a/test cases/frameworks/4 qt/main.cpp
+++ b/test cases/frameworks/4 qt/main.cpp
@@ -1,10 +1,10 @@
#include <QApplication>
#include "mainWindow.h"
// include some random private headers
-#if QT_VERSION < 0x050000
+#if QT_VERSION > 0x050000
#include <private/qconfig_p.h>
#else
- #include <private/qmetaobject_p.h>
+ #include <private/qobject_p.h>
#endif
int main(int argc, char **argv) {
diff --git a/test cases/frameworks/4 qt/meson.build b/test cases/frameworks/4 qt/meson.build
index e8d12b6..16fe564 100644
--- a/test cases/frameworks/4 qt/meson.build
+++ b/test cases/frameworks/4 qt/meson.build
@@ -33,7 +33,7 @@ foreach qt : ['qt4', 'qt5']
nocoredep = dependency(qt, modules : ['Gui'], required : qt == 'qt5', method : get_option('method'))
# If qt4 modules are found, test that. qt5 is required.
- qtdep = dependency(qt, modules : qt_modules, required : qt == 'qt5', method : get_option('method'))
+ qtdep = dependency(qt, modules : qt_modules, private_headers: true, required : qt == 'qt5', method : get_option('method'))
if qtdep.found()
qtmodule = import(qt)