moc-ng: a replacement for Qt's moc that is using clang libraries
This is really two project:
A plugin for clang which removes the needs of running moc if your code is compiled with this plugin.
A replacement for moc that aim to be compatible with qt's moc, but uses the clang libraries for the parsing step.
Read the blog post: https://woboq.com/blog/moc-with-clang.html
Browse the source code online
You need llvm and clang (3.4, 3.5 or 3.6). Then run cmake and make (adapt your paths)
cmake . -DCMAKE_CXX_COMPILER=/opt/llvm/bin/clang++ -DLLVM_CONFIG_EXECUTABLE=/opt/llvm/bin/llvm-config make
As a binary: replace the moc provided by Qt by the one which is in src/moc
As a clang plugin: Tell your build system not to run moc, and add this to the CXXFLAGS -Xclang -load -Xclang /path/to/src/libmocng_plugin.so -Xclang -add-plugin -Xclang moc
Differences with upstream moc
This version of moc has nice additional support compared to upstream moc:
- Template support: You can have templated QObject
- Automatically register all types using qRegisterMetaType
- Supports trailing return type, auto return types for signals and slot and decltype in the return type or parameter types.
- Support for nested classes.
- OSX Framework options (-F)
Make sure that the Qt include paths (and other include paths) are correctly passed to moc via the -I option
Report bugs on github: https://github.com/woboq/moc-ng/issues
Replace the moc binary in the builddir (qtbase/bin/moc) and run the Qt tests. Expecially the tst_moc and the tests for corelib/kernel. The tests that are known to fail are worked around in "workaroundtests.cpp". Tests for features not supported by normal Qt (such as templates) are found in the tests subdirectory.