A reimplementation of Qt's moc using libclang. Contains both a drop-in remplacement, and a plugin for the clang compiler.
C++ C CMake QMake
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
src
tests
.travis.yml
CMakeLists.txt
COPYING
README.md

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

Build Status

Browse the source code online

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

Compile

You need llvm and clang (>= 3.4). 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. Check the README in the tests subdirectory for the moc-ng specific tests