-
Notifications
You must be signed in to change notification settings - Fork 1.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Qml modules #13304
base: master
Are you sure you want to change the base?
Qml modules #13304
Conversation
5a309af
to
2c9b9eb
Compare
arch tests are failing because the CI doesn't provide QtQml for qt 6 which is a new requirement for the test |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for working on this! I've taken a cursory glance, and there's a few smallish things I've noticed. I'd like to have another look later when I have more time to get into more of the details
mesonbuild/modules/_qt.py
Outdated
for check in checklist: | ||
if check not in choices: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think you can simplify (and make a better error message) this to something like:
invalid = set(checklist).difference(choices)
if invalid:
return f"invalid selections {', '.join(sorted(invalid))}, valid elements are {', '.join(sorted(choices))}."
mesonbuild/modules/_qt.py
Outdated
preserve_paths: bool | ||
|
||
class HasToolKwArgs(kwargs.ExtractRequired): | ||
|
||
method: str | ||
tools: T.List[str] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
you can make this a little more powerful (and maybe remove an assert later on) with:
tools: T.List[Literal['moc, 'lrelease', <insert reset of valid tools>]]
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
fixed
mesonbuild/modules/_qt.py
Outdated
else: | ||
assert False, "unreachable" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm happy to trust the type annotations for the final release, though this might be useful for bringup
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I changed this function quite a bit, I took inspiration from the one in gnome.py
mesonbuild/modules/_qt.py
Outdated
basename: str = os.path.basename(sourcepath) | ||
classname: str = basename.rsplit('.', maxsplit=1)[0] | ||
|
||
if not any(basename.endswith(ext) for ext in ['.qml', '.js', '.mjs']): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
if not any(basename.endswith(ext) for ext in ['.qml', '.js', '.mjs']): | |
if not basename.endswith(('.qml', '.js', '.mjs')): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
fixed
mesonbuild/modules/_qt.py
Outdated
if not any(basename.endswith(ext) for ext in ['.qml', '.js', '.mjs']): | ||
raise MesonException(f'unexpected file type declared in qml sources {s}') | ||
|
||
if len(classname) == 0 or '.' in classname or classname[0].islower(): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
if len(classname) == 0 or '.' in classname or classname[0].islower(): | |
if not classname or '.' in classname or classname[0].islower(): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
fixed
mesonbuild/modules/_qt.py
Outdated
|
||
cmd.extend(kwargs['extra_args']) | ||
|
||
if namespace != '': |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
if namespace != '': | |
if namespace: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
fixed
mesonbuild/modules/_qt.py
Outdated
description=f'Qml type registration for {target_name}', | ||
) | ||
|
||
@FeatureNew('qt.qml_module', '1.0') |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@FeatureNew('qt.qml_module', '1.0') | |
@FeatureNew('qt.qml_module', '1.6') |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
fixed
mesonbuild/modules/_qt.py
Outdated
qrc_resouces: T.List[T.Union[FileOrString, build.CustomTarget, build.CustomTargetIndex, build.GeneratedList]] = [] | ||
all_qml_files: T.Sequence[T.Union[FileOrString, build.CustomTarget]] = list(kwargs['qml_sources']) + list(kwargs['qml_singletons']) + list(kwargs['qml_internals']) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm wondering if it would be beneficial to use the Interpreter.source_strings_to_files
method here to remove the strings and just have list[File | CustomTarget | CustomTargetIndex | GeneratedList]
here, and then not have to do string handling internally.
some self comments on the PR: I tried to follow Qt module directory structure
at the moment this is still a bit clumpsy:
|
Thank you for undertaking this work ! I wanted to give a try to registering QML modules but I am afraid I've hit against a regression introduced in this MR before I could get to it. Here's the reproducer: git clone --depth=1 https://github.com/AdelKS/ZeGrapher.git
cd ZeGrapher
meson setup build
cd build
meson compile which outputs this error
it looks like there's a naming convention that isn't respected between Or maybe it's related to the fact that I currently pass all headers that need a |
Hi, thanks for your interest
your repository doesn't use the feature from this MR, so I don't really see how this is a regression. I tried to compile you project but I ended up with a lot of compilation issues (template issues in your math classes, compiled on ubuntu 22.04 with GCC 11.4), So I can't really help you there
qt.qml_module will moc the file itself as it needs to pass specific options to moc to extract type information, so |
Hey, thanks for trying to look into it
Yeah I stopped trying to make "old" GCC or clang versions happy x)
Sorry, I haven't been clear enough: the master branch of my repo builds fine with latest release of meson 1.5.0, but not with this branch, this is before I make changes to
I understand. I have a noob suggestion on this aspect: I have this (maybe wrong ?) approach where I use a bash script to make a meson |
Okay I just tried on meson commit Would you be willing to install add-apt-repository -y ppa:ubuntu-toolchain-r/test
apt install -y gcc-13
git clone --depth=1 https://github.com/AdelKS/ZeGrapher.git
cd ZeGrapher
CXX=g++13 meson setup build
cd build
meson compile |
mesonbuild/modules/_qt.py
Outdated
for tool in self.tools.values(): | ||
if not tool.found(): | ||
for tool in kwargs['tools']: | ||
assert tool in self.tools, 'tools must be in {moc, uic, rcc, lrelease}' |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is the third time that same set of tools (moc, uic, rcc, lrelease
) is explicitly listed out in the code, hardcoded — that's a lot of redundancy and places to keep in sync if the list ever changes. Couldn't it be defined somewhere as a set variable, then used...
- on line 273:
default=list(_set_of_qt_tools)
- on line 274:
QtBaseModule._list_in_set_validator(_set_of_qt_tools)
- and here:
assert tool in self.tools, f'tools must be in {_set_of_qt_tools}'
to keep things from potentially getting out of sync?
(Or, heck, at least here as...)
assert tool in self.tools, f'tools must be in {self.tools}'
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
fixed, though it doesn't seems that I can reference _set_of_qt_tools for the typechecker in HasToolKwArgs
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Mm, it seems the arg is typed as a T.List[str]
... perhaps that should be more generic.
Hmm. Is there a generic that covers both list
and set
? Neither Sequence
nor Mapping
will match both. (I suppose you could call HasToolKwArgs(list(_set_of_qt_tools))
but that's kind of ugh.)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
`outfiles` is the output list of the individual commands Bug: mesonbuild/pull/13304#issuecomment-2226398671
`outfilelist` is the output list of the target, while `outfiles` is the output list of the individual commands Bug: mesonbuild/pull/13304#issuecomment-2226398671
`outfilelist` is the output list of the target, while `outfiles` is the output list of the individual commands Bug: mesonbuild/pull/13304#issuecomment-2226398671
in `func_install_data`, `rename` parametter is ContainerTypeInfo(list, str) in `module/python.py`, rename is `None` rename is stored in `build.Data` object under the type `T.List[str]`
I updated the PR, it no longer requires the sources to be generated with a precise directory structure which should match meson philosophy. I also added a 'devel' install target to allow installing the module definition (for qmllint or and qml tools) |
This allows checking for tools that may not be available in older version of qt or avoiding to request tools that may not be necessary for a given project
This aims to bring the support of QML modules to meson, the goal is to provide something similar to CMake `qt_add_qml_module` function provided by Qt (see https://doc.qt.io/qt-6/qt-add-qml-module.html ) Fixes: mesonbuild#6988, mesonbuild#9683
This MR aims to bring the support of QML modules to meson, the goal is to
provide something similar to CMake
qt_add_qml_module
function provided by Qt(see https://doc.qt.io/qt-6/qt-add-qml-module.html)
fixes: #6988 #9683
what's provided
the QML module
what's missing:
the scope of this PR is already large, I voluntary put aside some aspect of the module generation.
tools (or options) are not available with older version of Qt,
specific Qml files, which is not very practical in terms of API
tooling, I haven't investigated this
VERSION
PAST_MAJOR_VERSIONS
STATIC / SHARED
PLUGIN_TARGET
OUTPUT_DIRECTORY
RESOURCE_PREFIX
CLASS_NAME
TYPEINFO
IMPORTS
OPTIONAL_IMPORTS
DEFAULT_IMPORTS
DEPENDENCIES
IMPORT_PATH
SOURCES
QML_FILES
RESOURCES
OUTPUT_TARGETS
DESIGNER_SUPPORTED
FOLLOW_FOREIGN_VERSIONING
NAMESPACE
NO_PLUGIN
NO_PLUGIN_OPTIONAL
NO_CREATE_PLUGIN_TARGET
NO_GENERATE_PLUGIN_SOURCE
NO_GENERATE_QMLTYPES
NO_GENERATE_QMLDIR
NO_LINT
NO_CACHEGEN
NO_RESOURCE_TARGET_PATH
NO_IMPORT_SCAN
ENABLE_TYPE_COMPILER
TYPE_COMPILER_NAMESPACE
QMLTC_EXPORT_DIRECTIVE
QMLTC_EXPORT_FILE_NAME