kde4_automoc change (need help)

Alexander Neundorf neundorf at kde.org
Fri May 12 00:25:53 CEST 2006


On Wednesday 10 May 2006 15:00, David Faure wrote:
> I want to implement "Q_OBJECT in .cpp file and no .h file at all, and .cpp
> includes .moc" support in kde4_automoc, for unit tests. Would be much more
> convenient than having to write a .h file for each, and by having the "no
> header file" condition there we avoid grepping both .h and .cpp for
> Q_OBJECT in all cases, which might slow things down.

How about using Qt4_WRAP_CPP() ?
Usage:

set(mySrcs foo.cpp widget.cpp main.cpp)
qt4_wrap_cpp(mySrcs widget.cpp) # <- all files which have to be moc'ed.

... would also not make automoc yet slower.

>
> But my current implementation doesn't work - no moc file, and the binary is
> being linked without any source file as input... I'm stumped.
>
> --- KDE4Macros.cmake    (revision 538918)
> +++ KDE4Macros.cmake    (working copy)
> @@ -240,6 +240,19 @@
>                 get_filename_component(_basename ${_current_MOC} NAME_WE)
>  #               set(_header ${CMAKE_CURRENT_SOURCE_DIR}/${_basename}.h)
>                 set(_header ${_abs_PATH}/${_basename}.h)
> +
> +               # Check if the header exists
> +               if (NOT EXISTS ${_header})
> +                   # Otherwise check if the cpp file has Q_OBJECT
> +                   string(REGEX MATCH "Q_OBJECT" _match "${_contents}")
> +                   if (_match)

Isn't it matched ?
Maybe ".*Q_OBJECT.*" should work ?

> +                      # Yes -> moc the cpp file, not the non-existing
> header file. +                      set(_header ${_abs_FILE})
> +                   else (_match)
> +                      message(FATAL_ERROR "${_abs_FILE} includes
> ${_moc_INCS} but there's no ${_header} file and no Q_OBJECT in ${_abs_FILE}
> either") +                   endif (_match)
> +               endif (NOT EXISTS ${_header})
> +
>                 set(_moc    ${CMAKE_CURRENT_BINARY_DIR}/${_current_MOC})
>                #set(_moc    ${_abs_PATH}/${_current_MOC})
>                 add_custom_command(OUTPUT ${_moc}
>                   COMMAND ${QT_MOC_EXECUTABLE}
>                   ARGS ${_moc_INCS} ${_header} -o ${_moc}
>                   MAIN_DEPENDENCY ${_header}
>                )
>
> The testcase:
> set(kovariabletest_SRCS kovariabletest.cpp)
> kde4_automoc(${kovariabletest_SRCS})
> kde4_add_executable(kovariabletest RUN_UNINSTALLED ${kovariabletest_SRCS})
> target_link_libraries(kovariabletest kotext ${QT_QTTEST_LIBRARY})
>
> with kovariabletest.cpp defining a QObject-derived class, with Q_OBJECT
> macro and #include "kovariabletest.moc"
>
> What happens:
> Linking CXX executable kovariabletest
> /usr/lib/gcc/x86_64-linux-gnu/4.0.3/../../../../lib64/crt1.o: In function
> `_start':../sysdeps/x86_64/elf/start.S:109: undefined reference to `main'
> Indeed in CMakeFiles/kovariabletest.dir/build.make, kovariabletest_OBJECTS
> is empty! How could this happen, given that I checked and
> ${kovariabletest_SRCS} is definitely not empty just before the call to
> kde4_add_executable...

Hmm, strange.
I'll have a closer look later.

Bye
Alex
-- 
Work: alexander.neundorf AT jenoptik.com - http://www.jenoptik-los.de
Home: neundorf AT kde.org                - http://www.kde.org
      alex AT neundorf.net               - http://www.neundorf.net


More information about the Kde-buildsystem mailing list