[cmake-developers] CMAKE_AUTOMOC, system include dirs and target include directories
Stephen Kelly
steveire at gmail.com
Sun Mar 17 08:34:19 EDT 2013
Hi there,
I applied my patch to kdelibs to use the INTERFACE_INCLUDE_DIRECTORIES of
targets and remove include_directories() calls.
This resulted in a failure when moc'ing for dfaure:
http://thread.gmane.org/gmane.comp.kde.devel.buildsystem/7778/focus=7779
In his system, he has Qt 4 headers in /usr/include, and a dependent package
in /usr/include too. The Qt 5 moc is finding the headers there first because
/usr/include is listed before the Qt 5 includes.
This isn't a bug which will break existing buildsystems, but would be a
common bug in all projects which applied a patch like mine to use the
INTERFACE_INCLUDE_DIRECTORIES.
So, here's a simplification of the bug he hit:
set(somepackage_INCLUDE_DIRS /usr/include) # From a find_package
find_package(Qt5Test)
if (TRUE)
# The order makes this work fine:
include_directories(${Qt5Test_INCLUDE_DIRS})
include_directories(${somepackage_INCLUDE_DIRS})
else()
# This would break:
include_directories(${somepackage_INCLUDE_DIRS})
include_directories(${Qt5Test_INCLUDE_DIRS})
endif()
add_executable(foo ...)
target_link_libraries(foo Qt5::Test)
After my patch was applied, we have this:
include_directories(${somepackage_INCLUDE_DIRS})
add_executable(foo ...)
target_link_libraries(foo Qt5::Test)
and the Qt5::Test include dirs are added after the somepackage_INCLUDE_DIRS.
For the compiler that's ok because we don't generate buildsystems with the
default include paths explicitly listed, but for moc, those include paths
are added to the command line. The problem is that they are added to the
command line in the order that they were specified, so I get this:
/home/stephen/dev/prefix/qtbase-stable/bin/moc -I/usr/include -
I/home/stephen/dev/prefix/qtbase-stable/include/QtTest
A recently applied patch to the stable branch of qmake adds the default
include paths after the user-specified ones:
https://codereview.qt-project.org/#change,51065
I recommend changing AUTOMOC to do the same appending. At some point, it
seems that was done
http://thread.gmane.org/gmane.comp.programming.tools.cmake.devel/5293/focus=5297
but a followup branch probably changed that to the current state.
Comments?
Thanks,
Steve.
The bug can be reproduced with this cpp file:
#include <QtTest/QTest>
// Make CMAKE_AUTOMOC run on this file.
class MyObject : public QObject
{
Q_OBJECT
explicit MyObject(QObject *parent = 0)
{
QSKIP("The QSKIP macro has two args in Qt4 and one in Qt5.");
}
};
#include "main.moc"
More information about the cmake-developers
mailing list