A reimplementation of Qt's moc using libclang. Contains both a drop-in remplacement, and a plugin for the clang compiler.
C++ CMake QMake
Permalink
Failed to load latest commit information.
cmake/modules
src Fix compilation with old version of clang Sep 8, 2016
tests Support for Q_NAMESPACE in the plugin Aug 24, 2016
CMakeLists.txt
COPYING
README.md Switch the README to markdown Oct 13, 2016

README.md

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

https://code.woboq.org/mocng/src/

Compile

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

Use

  • 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.

Not supported:

  • OSX Framework options (-F)

Problems?

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

Tests

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.