diff --git a/cmake-fix-qt-includes.diff b/cmake-fix-qt-includes.diff new file mode 100644 index 0000000..59e0197 --- /dev/null +++ b/cmake-fix-qt-includes.diff @@ -0,0 +1,110 @@ +From d2536579d51e77827b8e55f39123316324314781 Mon Sep 17 00:00:00 2001 +From: Alex Neundorf +Date: Mon, 19 Nov 2012 21:47:20 +0100 +Subject: [PATCH] Automoc: fix regression #13667, broken build in phonon + +On some systems, ${QT_INCLUDE_DIR} is reported by gcc as a builtin +include search dir. Some projects use this information to extend +CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES. +In cmake 2.8.10 now the targets are queried for the include directories +they use. When they return the result, the include dirs contained in +CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES have been removed. +In cmake 2.8.9 and below the INCLUDE_DIRECTORIES directory property +was queried, where this had not been stripped. +So, in those projects which modify the implicit include dirs variable, +on systems where ${QT_INCLUDE_DIR} is reported by gcc, this directory, +e.g. /usr/lib/include/qt/, was not given anymore to moc. This made moc +not find required headers, so the build broke. +Simply giving the full CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES to moc +is no solution either, since moc can't handle some of the headers it +finds then (https://bugreports.qt-project.org/browse/QTBUG-28045). +So now cmake checks CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES, and if this +contains ${QT_INCLUDE_DIR}, and the target reports that it uses +${QT_QTCORE_INCLUDE_DIR} but not ${QT_INCLUDE_DIR}, ${QT_INCLUDE_DIR} +is added to the include dirs given to moc. + +Alex +--- + Source/cmQtAutomoc.cxx | 59 ++++++++++++++++++++++++++++++++++++++++++++++++ + 1 files changed, 59 insertions(+), 0 deletions(-) + +diff --git a/Source/cmQtAutomoc.cxx b/Source/cmQtAutomoc.cxx +index 942c7ab..25614b8 100644 +--- a/Source/cmQtAutomoc.cxx ++++ b/Source/cmQtAutomoc.cxx +@@ -195,6 +195,34 @@ void cmQtAutomoc::SetupAutomocTarget(cmTarget* target) + } + } + ++ ++ const char* qtIncDir = 0; ++ const char* qtCoreIncDir = 0; ++ ++ // check whether ${QT_INCLUDE_DIR} is part of the implicit include dirs, ++ // see http://public.kitware.com/Bug/view.php?id=13667 ++ bool qtIncludeDirMayHaveBeenRemoved = false; ++ if (makefile->IsSet("QT_INCLUDE_DIR")) ++ { ++ qtIncDir = makefile->GetDefinition("QT_INCLUDE_DIR"); ++ std::string s = ++ makefile->GetSafeDefinition("CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES"); ++ std::vector implIncDirs; ++ cmSystemTools::ExpandListArgument(s, implIncDirs); ++ if (std::find(implIncDirs.begin(), implIncDirs.end(),std::string(qtIncDir)) ++ != implIncDirs.end()) ++ { ++ qtIncludeDirMayHaveBeenRemoved = true; ++ if (makefile->IsSet("QT_QTCORE_INCLUDE_DIR")) ++ { ++ qtCoreIncDir = makefile->GetDefinition("QT_QTCORE_INCLUDE_DIR"); ++ } ++ } ++ } ++ ++ bool haveQtCoreIncDir = false; ++ bool haveQtIncDir = false; ++ + std::vector includeDirs; + cmGeneratorTarget gtgt(target); + localGen->GetIncludeDirectories(includeDirs, >gt, "CXX"); +@@ -207,6 +235,37 @@ void cmQtAutomoc::SetupAutomocTarget(cmTarget* target) + _moc_incs += sep; + sep = ";"; + _moc_incs += *incDirIt; ++ ++ if (qtIncludeDirMayHaveBeenRemoved && qtCoreIncDir && qtIncDir) // #13667 ++ { ++ if (*incDirIt == qtIncDir) ++ { ++ haveQtIncDir = true; ++ qtIncludeDirMayHaveBeenRemoved = false; // it's here, i.e. not removed ++ } ++ if (*incDirIt == qtCoreIncDir) ++ { ++ haveQtCoreIncDir = true; ++ } ++ } ++ } ++ ++ // Some projects (kdelibs, phonon) query the compiler for its default ++ // include search dirs, and add those to ++ // CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES. ++ // These may include e.g./usr/lib/qt/include . This is typically also part ++ // of ${QT_INCLUDES}. If this directory is then contained in the implicit ++ // include dirs, it is removed from the include dirs returned from the ++ // target above. So we add ${QT_INCLUDE_DIR} manually for moc if we detected ++ // that ${QT_QTCORE_INCLUDE_DIR} is among the include dirs (there shouldn't ++ // be a way to use Qt4 without using ${QT_QTCORE_INCLUDE_DIR} I think. ++ // See #13646 and #13667. ++ if (qtIncludeDirMayHaveBeenRemoved && qtCoreIncDir && qtIncDir ++ && (haveQtCoreIncDir == true) && (haveQtIncDir == false)) ++ { ++ _moc_incs += sep; ++ sep = ";"; ++ _moc_incs += qtIncDir; + } + + const char* tmp = target->GetProperty("COMPILE_DEFINITIONS"); +-- +1.7.0 + diff --git a/cmake.changes b/cmake.changes index 0997ca3..be4c7bd 100644 --- a/cmake.changes +++ b/cmake.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Mon Nov 26 19:56:15 UTC 2012 - tittiatcoke@gmail.com + +- Add cmake-fix-qt-includes.diff to fix the missing qt_include_dir. + This was reported as cmake regression from 2.8.9 (kitware#0013667). + ------------------------------------------------------------------- Wed Nov 14 12:55:10 UTC 2012 - idonmez@suse.com diff --git a/cmake.spec b/cmake.spec index 2575802..e835e97 100644 --- a/cmake.spec +++ b/cmake.spec @@ -24,6 +24,8 @@ Source0: http://www.cmake.org/files/v2.8/%{name}-%{version}.tar.gz Patch1: cmake-disable-builtin-chrpath.diff Patch2: cmake-fix-ruby-test.patch Patch3: cmake-gettext.patch +# PATCH-FIX-UPSTREAM Fix the missing QT_INCLUDE_DIR (bug#13667, bko#309718) +Patch4: cmake-fix-qt-includes.diff Summary: Cross-platform, open-source make system License: BSD-3-Clause Group: Development/Tools/Building @@ -53,6 +55,7 @@ CMake is a cross-platform, open-source make system %patch1 %patch2 %patch3 -p1 +%patch4 -p1 %build export CXXFLAGS="$RPM_OPT_FLAGS"