diff options
-rw-r--r-- | mesonbuild/dependencies/ui.py | 40 | ||||
-rw-r--r-- | mesonbuild/interpreter.py | 2 | ||||
-rw-r--r-- | test cases/frameworks/4 qt/main.cpp | 4 | ||||
-rw-r--r-- | test cases/frameworks/4 qt/meson.build | 2 |
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) |