[cmake-developers] Correct way to get include directories for a target (automoc regression) ?
Stephen Kelly
steveire at gmail.com
Sun Nov 11 11:24:29 EST 2012
Alexander Neundorf wrote:
> On Sunday 11 November 2012, Stephen Kelly wrote:
>> Alexander Neundorf wrote:
>> > In 2.8.9 automoc did not ask the target for its include dirs, but it
>> > asked the directory for its include dirs. This contained and still
>> > contains as it seems the CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES.
>> > In 2.8.10 the target is asked for its include dirs, and it seems there
>> > the implicit include dirs have been stripped.
>>
>> It seems that the bug is in KDE/Phonon. Why do they populate the
>> CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES instead of the INCLUDE_DIRECTORIES
>> directory property?
>>
>> The patch that you added looks like a hack to me which is only for the
>> benefit of what KDE/Phonon is doing (but maybe shouldn't be). I'd prefer
>> to fix KDE/Phonon instead.
>
> It still is a backward compatibility break in cmake, for kdelibs, which is
> a big user of cmake.
Are you sure? This only affects the CMAKE_AUTOMOC feature, which kdelibs
doesn't use. This seems to affect only phonon because they have started to
use CMAKE_AUTOMOC instead of automoc4, and because they have a copy of a
kdelibs macro. kdelibs should not be affected. KDE Frameworks 5 won't use
this trick to populate the implicit include directories, so it is only
phonon that is affected, as far as I can tell.
Already this feature doesn't work with CMake 2.8.10 and phonon releases
since they started to use CMAKE_AUTOMOC. If we patch kdelibs and phonon now
to populate INCLUDE_DIRECTORIES instead of the internal system include
directories (or some other appropriate fix), then the next phonon release
will work with CMake 2.8.10 (right?) instead of having to wait for CMake
2.8.11. It might be appropriate to patch both cmake and kdelibs/phonon so
that implicit directories are not appended to anymore.
Do you know any reason not to do that?
In fact, it was suggested to remove the macro in question earlier this year:
http://thread.gmane.org/gmane.comp.kde.devel.buildsystem/5581/focus=7096
when an older thread from 2010 was revived.
In that thread, appending to the implicit include dirs was selected as the
solution instead of seeing if CMake could be patched. Two years later we hit
issues resulting from that choice. For me, that's an argument for finding
out what the right fix in the right place is.
The reported bugs are side-effects of populating the implicit include
directories as was done in 2010.
As Raphael notes in the post I linked to, the fix might be simply relying on
the user to set up their environment, because we can't re-order include
directories for every /opt directory that someone might install to, while
they have system includes somewhere else.
Your patch in FixAutomocRegression might result in inflexibility or bugs in
two years, so I think caution is in order. It might be the only way to re-
add 'backward compatibility' while not patching phonon at all (assuming that
is the goal), I don't know. I think it's worth considering Raphaels post
above, particularly:
'if, say, X11 and Soprano are installed into /opt/custom-prefix, the
original problem will show up again'
Is making /usr/local an implicit include directory on freebsd the right fix?
>
> Does moc know actually know about system include dirs ?
I don't know.
> If it doesn't, this is not a hack, but potentially necessary.
I think that depends on how the users environment is set up.
Here's what I understand about how the bug occurs:
http://cmake.org/gitweb?p=stage/cmake.git;a=commitdiff;h=a9465098c01ace9ead62c04674dc2f4a529962f5
says that /usr/lib/qt/include is usually in QT_INCLUDES, but not passed to
moc.
The reason /usr/lib/qt/include is not passed to moc is that it is inserted
by phonon into the implicit include directories for the language, and
therefore filtered out by cmLocalGenerator::AddIncludeDirectories.
The reason /usr/lib/qt/include is inserted by phonon into the implicit
include directories is that querying g++ returns that path. Is it normal for
g++ to return that (Qt specific) path as a system include, or is that
resulting from a patch the distros make to g++ based on where they install
Qt?
The phonon and tomahawk related bug reports you linked to seem to be from
people who are using a distro-provided Qt, and FindQt4 finds it
appropriately, but phonon causes CMake to remove the directory from what it
passes to moc.
The bug is the result of the combination of 1) populating the implicit
include dirs externally and 2) using CMAKE_AUTOMOC.
This to me looks like it's not appropriate for KDE/phonon to populate the
implicit include directories. Whatever patch goes into CMake (to handle
already-released versions of phonon and others that have copied from
FindKDE4Internal), that should probably not be done anymore by
kdelibs/phonon.
Removing that macro from phonon would fix the reported issues too, I think,
without requiring the users of (trunk versions of) phonon to wait for CMake
2.8.11.
Can your patch be wrapped in some condition to check if FindPhononInternal
is being used? I've seen something similar to check VTK versions, so it's
not un-heard-of.
Thanks,
Steve.
More information about the cmake-developers
mailing list