[cmake-developers] Correct way to get include directories for a target (automoc regression) ?

David Cole david.cole at kitware.com
Fri Nov 9 14:36:21 EST 2012


I would append (or maybe prepend?) the implicit ones to the target ones.

The compiler doesn't need to know about these (or already does know,
more accurately, so doesn't need to be told...)

Sounds like moc needs to be told.


On Fri, Nov 9, 2012 at 2:31 PM, Alexander Neundorf <neundorf at kde.org> wrote:
> On Friday 09 November 2012, Alexander Neundorf wrote:
>> Hi,
>>
>> as you know, there is a regression in 2.8.10 with automoc:
>> http://public.kitware.com/Bug/view.php?id=13667
>> http://public.kitware.com/Bug/view.php?id=13646
>>
>> I'm looking at this right now.
>> The problem is that when moc is invoked, an include directory is missing, -
>> I/usr/lib/qt/include is missing.
>>
>> Now, I printed ${QT_INCLUDES} in the CMakeLists.txt:
>>
>> -- qt:
>> -/usr/lib/qt/include/QtXmlPatterns;/usr/lib/qt/include/QtXml;/usr/lib/qt/in
>> clude/QtWebKit;/usr/lib/qt/include/QtUiTools;/usr/lib/qt/include/QtTest;/us
>> r/lib/qt/include/QtSvg;/usr/lib/qt/include/QtSql;/usr/lib/qt/include/QtScri
>> ptTools;/usr/lib/qt/include/QtScript;/usr/lib/qt/include/QtOpenGL;/usr/lib/
>> qt/include/QtNetwork;/usr/lib/qt/include/QtMultimedia;/usr/lib/qt/include/Q
>> tHelp;/usr/lib/qt/include/QtDesigner;/usr/lib/qt/include/QtDesigner;/usr/li
>> b/qt/include/QtDeclarative;/usr/lib/qt/include/QtDBus;/usr/lib/qt/include/Q
>> t3Support;/usr/lib/qt/include/QtGui;/usr/lib/qt/include/QtCore;/usr/lib/qt/
>> include/Qt;/usr/lib/qt/mkspecs/default;/usr/lib/qt/include-
>>
>> This has /usr/lib/qt/includes/ at the end.
>>
>> Now I added debug output to the point where the include directories are
>> queried from the target in cmQtAutomoc.cxx:
>>
>>
>> std::vector<std::string> includeDirs;
>> cmGeneratorTarget gtgt(target);
>> localGen->GetIncludeDirectories(includeDirs, &gtgt, "CXX");
>> std::string _moc_incs = "";
>> const char* sep = "";
>> fprintf(stderr, "---------- %s--------\n", targetNames);
>> for(std::vector<std::string>::const_iterator incDirIt =
>> includeDirs.begin(); incDirIt != includeDirs.end();
>>     ++incDirIt)
>>   {
>>   fprintf(stderr, "%s\n", incDirIt->c_str());
>>   _moc_incs += sep;
>>   sep = ";";
>>   _moc_incs += *incDirIt;
>>   }
>>
>>
>> This gives:
>>
>> ---------- phononqmlplugin--------
>> /home/alex/src/packages/phonon/build-HEAD/declarative
>> /home/alex/src/packages/phonon/declarative
>> /home/alex/src/packages/phonon
>> /home/alex/src/packages/phonon/includes
>> /home/alex/src/packages/phonon/phonon
>> /home/alex/src/packages/phonon/build-HEAD/phonon
>> /home/alex/src/packages/phonon/build-HEAD/declarative/..
>> /usr/lib/qt/include/QtXmlPatterns
>> /usr/lib/qt/include/QtXml
>> /usr/lib/qt/include/QtWebKit
>> /usr/lib/qt/include/QtUiTools
>> /usr/lib/qt/include/QtTest
>> /usr/lib/qt/include/QtSvg
>> /usr/lib/qt/include/QtSql
>> /usr/lib/qt/include/QtScriptTools
>> /usr/lib/qt/include/QtScript
>> /usr/lib/qt/include/QtOpenGL
>> /usr/lib/qt/include/QtNetwork
>> /usr/lib/qt/include/QtMultimedia
>> /usr/lib/qt/include/QtHelp
>> /usr/lib/qt/include/QtDesigner
>> /usr/lib/qt/include/QtDeclarative
>> /usr/lib/qt/include/QtDBus
>> /usr/lib/qt/include/Qt3Support
>> /usr/lib/qt/include/QtGui
>> /usr/lib/qt/include/QtCore
>> /usr/lib/qt/include/Qt
>> /usr/lib/qt/mkspecs/default
>> ---------- phonon--------
>>
>>
>> So here /usr/lib/qt/include is missing.
>>
>> Am I doing something wrong or is the list of returned include dirs wrong ?
>
> I'm getting closer.
> Phonon and kdelibs do the following
>
> _DETERMINE_GCC_SYSTEM_INCLUDE_DIRS(c++ _dirs)
> set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES
>     ${CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES} ${_dirs}
>    )
>
>
> _DETERMINE_GCC_SYSTEM_INCLUDE_DIRS() calls the compiler (gcc -v -E -x c++ -dD)
> and parses the include search dirs. This contains /usr/lib/qt/include on my
> system (/usr/lib/qt/include;;/usr/lib/gcc/i486-slackware-
> linux/4.5.2/../../../../include/c++/4.5.2;;/usr/lib/gcc/i486-slackware-
> linux/4.5.2/../../../../include/c++/4.5.2/i486-slackware-
> linux;;/usr/lib/gcc/i486-slackware-
> linux/4.5.2/../../../../include/c++/4.5.2/backward;;/usr/local/include;;/usr/lib/gcc/i486-
> slackware-linux/4.5.2/include;;/usr/lib/gcc/i486-slackware-
> linux/4.5.2/include-fixed;;/usr/include)
>
> 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.
>
> So what should I do ?
>
> Simply always add all ${CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES} to the include
> dirs used by moc ?
>
> Getting the include dirs from the directory and the include dirs from the
> target, and then using the union of both is probably not the right way to go I
> think ?
>
> Alex
> --
>
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html
>
> Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://public.kitware.com/cgi-bin/mailman/listinfo/cmake-developers



More information about the cmake-developers mailing list