/moc-ng

Primary LanguageC++GNU General Public License v3.0GPL-3.0

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:  http://woboq.com/blog/moc-with-clang.html

BROWSE SOURCE CODE ONLINE:
http://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

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

Known issue:
 * FAIL!  : tst_QObject::normalize() 'object.connect(&object, SIGNAL(unsignedlongintSignal(unsigned long int)), SLOT(unsignedlongintSlot(unsigned long int)))' returned FALSE. ()
   Because unsigned long int don't have the right metatype according to Qt. And clang looses the "int" in "long int"

 * tst_qmetaobjectbuilder
   reimplements its own metaobject but still is Q_OBJECT_CHECK which we use to detect it is a QObject

(if moc is in the paths:)

 * FAIL!  : tst_Moc::warnings
   FAIL!  : tst_Moc::warnOnExtraSignalSlotQualifiaction
   FAIL!  : tst_Moc::warnOnMultipleInheritance
   FAIL!  : tst_Moc::forgottenQInterface
   FAIL!  : tst_Moc::defineMacroViaCmdline
   FAIL!  : tst_Moc::warnOnPropertyWithoutREAD
   FAIL!  : tst_Moc::warnOnVirtualSignal
   FAIL!  : tst_Moc::notifyError

   The wording of the warnings is not the same with moc ng  (it is better)

 * FAIL!  : tst_Moc::ignoreOptionClashes
   Small difference in the handling of the options

 * FAIL!  : tst_Moc::frameworkSearchPath
   Not implemented

 * FAIL!  : tst_Moc::templateGtGt()
   the header don't include QObject

 * FAIL!  : tst_Moc::unterminatedFunctionMacro()
   moc -E  to preprocess behave differently