Merge topic 'fix-Qt-autogen'

6053ce22 QtAutogen: Make uic work even when the source is in a subdir.
1fc9ecfa FindQt4: Make AUTOMOC work regardless which order Qt 4/5 is found.
This commit is contained in:
Brad King 2014-02-04 13:34:54 -05:00 committed by CMake Topic Stage
commit f748b59e20
9 changed files with 55 additions and 24 deletions

View File

@ -518,6 +518,14 @@ _qt4_find_qmake("${_QT4_QMAKE_NAMES}" QT_QMAKE_EXECUTABLE QTVERSION)
if (QT_QMAKE_EXECUTABLE AND QTVERSION) if (QT_QMAKE_EXECUTABLE AND QTVERSION)
if (Qt5Core_FOUND)
# Qt5CoreConfig sets QT_MOC_EXECUTABLE as a non-cache variable to the Qt 5
# path to moc. Unset that variable when Qt 4 and 5 are used together, so
# that when find_program looks for moc, it is not set to the Qt 5 version.
# If FindQt4 has already put the Qt 4 path in the cache, the unset()
# command 'unhides' the (correct) cache variable.
unset(QT_MOC_EXECUTABLE)
endif()
if (QT_QMAKE_EXECUTABLE_LAST) if (QT_QMAKE_EXECUTABLE_LAST)
string(COMPARE NOTEQUAL "${QT_QMAKE_EXECUTABLE_LAST}" "${QT_QMAKE_EXECUTABLE}" QT_QMAKE_CHANGED) string(COMPARE NOTEQUAL "${QT_QMAKE_EXECUTABLE_LAST}" "${QT_QMAKE_EXECUTABLE}" QT_QMAKE_CHANGED)
endif() endif()

View File

@ -1279,8 +1279,8 @@ bool cmQtAutoGenerators::RunAutogen(cmMakefile* makefile)
const std::vector<std::string>& headerExtensions = const std::vector<std::string>& headerExtensions =
makefile->GetHeaderExtensions(); makefile->GetHeaderExtensions();
std::vector<std::string> includedUis; std::map<std::string, std::string> includedUis;
std::vector<std::string> skippedUis; std::map<std::string, std::string> skippedUis;
std::vector<std::string> uicSkipped; std::vector<std::string> uicSkipped;
cmSystemTools::ExpandListArgument(this->SkipUic, uicSkipped); cmSystemTools::ExpandListArgument(this->SkipUic, uicSkipped);
@ -1290,7 +1290,8 @@ bool cmQtAutoGenerators::RunAutogen(cmMakefile* makefile)
{ {
const bool skipUic = std::find(uicSkipped.begin(), uicSkipped.end(), *it) const bool skipUic = std::find(uicSkipped.begin(), uicSkipped.end(), *it)
!= uicSkipped.end(); != uicSkipped.end();
std::vector<std::string>& uiFiles = skipUic ? skippedUis : includedUis; std::map<std::string, std::string>& uiFiles
= skipUic ? skippedUis : includedUis;
const std::string &absFilename = *it; const std::string &absFilename = *it;
if (this->Verbose) if (this->Verbose)
{ {
@ -1350,11 +1351,12 @@ bool cmQtAutoGenerators::RunAutogen(cmMakefile* makefile)
{ {
this->GenerateMoc(it->first, it->second); this->GenerateMoc(it->first, it->second);
} }
for(std::vector<std::string>::const_iterator it = includedUis.begin(); for(std::map<std::string, std::string>::const_iterator
it = includedUis.begin();
it != includedUis.end(); it != includedUis.end();
++it) ++it)
{ {
this->GenerateUi(*it); this->GenerateUi(it->first, it->second);
} }
if(!this->RccExecutable.empty()) if(!this->RccExecutable.empty())
@ -1431,7 +1433,7 @@ bool cmQtAutoGenerators::RunAutogen(cmMakefile* makefile)
void cmQtAutoGenerators::ParseCppFile(const std::string& absFilename, void cmQtAutoGenerators::ParseCppFile(const std::string& absFilename,
const std::vector<std::string>& headerExtensions, const std::vector<std::string>& headerExtensions,
std::map<std::string, std::string>& includedMocs, std::map<std::string, std::string>& includedMocs,
std::vector<std::string> &includedUis) std::map<std::string, std::string> &includedUis)
{ {
cmsys::RegularExpression mocIncludeRegExp( cmsys::RegularExpression mocIncludeRegExp(
"[\n][ \t]*#[ \t]*include[ \t]+" "[\n][ \t]*#[ \t]*include[ \t]+"
@ -1619,7 +1621,7 @@ void cmQtAutoGenerators::ParseCppFile(const std::string& absFilename,
void cmQtAutoGenerators::StrictParseCppFile(const std::string& absFilename, void cmQtAutoGenerators::StrictParseCppFile(const std::string& absFilename,
const std::vector<std::string>& headerExtensions, const std::vector<std::string>& headerExtensions,
std::map<std::string, std::string>& includedMocs, std::map<std::string, std::string>& includedMocs,
std::vector<std::string>& includedUis) std::map<std::string, std::string>& includedUis)
{ {
cmsys::RegularExpression mocIncludeRegExp( cmsys::RegularExpression mocIncludeRegExp(
"[\n][ \t]*#[ \t]*include[ \t]+" "[\n][ \t]*#[ \t]*include[ \t]+"
@ -1737,7 +1739,7 @@ void cmQtAutoGenerators::StrictParseCppFile(const std::string& absFilename,
void cmQtAutoGenerators::ParseForUic(const std::string& absFilename, void cmQtAutoGenerators::ParseForUic(const std::string& absFilename,
std::vector<std::string>& includedUis) std::map<std::string, std::string>& includedUis)
{ {
if (this->UicExecutable.empty()) if (this->UicExecutable.empty())
{ {
@ -1754,9 +1756,9 @@ void cmQtAutoGenerators::ParseForUic(const std::string& absFilename,
} }
void cmQtAutoGenerators::ParseForUic(const std::string&, void cmQtAutoGenerators::ParseForUic(const std::string& absFilename,
const std::string& contentsString, const std::string& contentsString,
std::vector<std::string>& includedUis) std::map<std::string, std::string>& includedUis)
{ {
if (this->UicExecutable.empty()) if (this->UicExecutable.empty())
{ {
@ -1768,6 +1770,9 @@ void cmQtAutoGenerators::ParseForUic(const std::string&,
std::string::size_type matchOffset = 0; std::string::size_type matchOffset = 0;
const std::string absPath = cmsys::SystemTools::GetFilenamePath(
cmsys::SystemTools::GetRealPath(absFilename.c_str())) + '/';
matchOffset = 0; matchOffset = 0;
if ((strstr(contentsString.c_str(), "ui_") != NULL) if ((strstr(contentsString.c_str(), "ui_") != NULL)
&& (uiIncludeRegExp.find(contentsString))) && (uiIncludeRegExp.find(contentsString)))
@ -1783,7 +1788,7 @@ void cmQtAutoGenerators::ParseForUic(const std::string&,
// finding the correct header, so we need to remove the ui_ part // finding the correct header, so we need to remove the ui_ part
basename = basename.substr(3); basename = basename.substr(3);
includedUis.push_back(basename); includedUis[absPath] = basename;
matchOffset += uiIncludeRegExp.end(); matchOffset += uiIncludeRegExp.end();
} while(uiIncludeRegExp.find(contentsString.c_str() + matchOffset)); } while(uiIncludeRegExp.find(contentsString.c_str() + matchOffset));
@ -1831,7 +1836,7 @@ cmQtAutoGenerators::SearchHeadersForCppFile(const std::string& absFilename,
void cmQtAutoGenerators::ParseHeaders(const std::set<std::string>& absHeaders, void cmQtAutoGenerators::ParseHeaders(const std::set<std::string>& absHeaders,
const std::map<std::string, std::string>& includedMocs, const std::map<std::string, std::string>& includedMocs,
std::map<std::string, std::string>& notIncludedMocs, std::map<std::string, std::string>& notIncludedMocs,
std::vector<std::string>& includedUis) std::map<std::string, std::string>& includedUis)
{ {
for(std::set<std::string>::const_iterator hIt=absHeaders.begin(); for(std::set<std::string>::const_iterator hIt=absHeaders.begin();
hIt!=absHeaders.end(); hIt!=absHeaders.end();
@ -1939,7 +1944,8 @@ bool cmQtAutoGenerators::GenerateMoc(const std::string& sourceFile,
return false; return false;
} }
bool cmQtAutoGenerators::GenerateUi(const std::string& uiFileName) bool cmQtAutoGenerators::GenerateUi(const std::string& path,
const std::string& uiFileName)
{ {
if (!cmsys::SystemTools::FileExists(this->Builddir.c_str(), false)) if (!cmsys::SystemTools::FileExists(this->Builddir.c_str(), false))
{ {
@ -1947,7 +1953,7 @@ bool cmQtAutoGenerators::GenerateUi(const std::string& uiFileName)
} }
std::string ui_output_file = "ui_" + uiFileName + ".h"; std::string ui_output_file = "ui_" + uiFileName + ".h";
std::string ui_input_file = this->Srcdir + uiFileName + ".ui"; std::string ui_input_file = path + uiFileName + ".ui";
int sourceNewerThanUi = 0; int sourceNewerThanUi = 0;
bool success = cmsys::SystemTools::FileTimeCompare(ui_input_file.c_str(), bool success = cmsys::SystemTools::FileTimeCompare(ui_input_file.c_str(),

View File

@ -48,16 +48,16 @@ private:
bool RunAutogen(cmMakefile* makefile); bool RunAutogen(cmMakefile* makefile);
bool GenerateMoc(const std::string& sourceFile, bool GenerateMoc(const std::string& sourceFile,
const std::string& mocFileName); const std::string& mocFileName);
bool GenerateUi(const std::string& uiFileName); bool GenerateUi(const std::string& path, const std::string& uiFileName);
bool GenerateQrc(); bool GenerateQrc();
void ParseCppFile(const std::string& absFilename, void ParseCppFile(const std::string& absFilename,
const std::vector<std::string>& headerExtensions, const std::vector<std::string>& headerExtensions,
std::map<std::string, std::string>& includedMocs, std::map<std::string, std::string>& includedMocs,
std::vector<std::string>& includedUis); std::map<std::string, std::string>& includedUis);
void StrictParseCppFile(const std::string& absFilename, void StrictParseCppFile(const std::string& absFilename,
const std::vector<std::string>& headerExtensions, const std::vector<std::string>& headerExtensions,
std::map<std::string, std::string>& includedMocs, std::map<std::string, std::string>& includedMocs,
std::vector<std::string>& includedUis); std::map<std::string, std::string>& includedUis);
void SearchHeadersForCppFile(const std::string& absFilename, void SearchHeadersForCppFile(const std::string& absFilename,
const std::vector<std::string>& headerExtensions, const std::vector<std::string>& headerExtensions,
std::set<std::string>& absHeaders); std::set<std::string>& absHeaders);
@ -65,14 +65,14 @@ private:
void ParseHeaders(const std::set<std::string>& absHeaders, void ParseHeaders(const std::set<std::string>& absHeaders,
const std::map<std::string, std::string>& includedMocs, const std::map<std::string, std::string>& includedMocs,
std::map<std::string, std::string>& notIncludedMocs, std::map<std::string, std::string>& notIncludedMocs,
std::vector<std::string>& includedUis); std::map<std::string, std::string>& includedUis);
void ParseForUic(const std::string& fileName, void ParseForUic(const std::string& fileName,
const std::string& contentsString, const std::string& contentsString,
std::vector<std::string>& includedUis); std::map<std::string, std::string>& includedUis);
void ParseForUic(const std::string& fileName, void ParseForUic(const std::string& fileName,
std::vector<std::string>& includedUis); std::map<std::string, std::string>& includedUis);
void Init(); void Init();

View File

@ -1191,6 +1191,18 @@ ${CMake_BINARY_DIR}/bin/cmake -DVERSION=master -P ${CMake_SOURCE_DIR}/Utilities/
--test-command ${CMAKE_CTEST_COMMAND} -V --test-command ${CMAKE_CTEST_COMMAND} -V
) )
list(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/Qt4And5Automoc") list(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/Qt4And5Automoc")
add_test(Qt4And5AutomocReverse ${CMAKE_CTEST_COMMAND}
--build-and-test
"${CMake_SOURCE_DIR}/Tests/Qt4And5Automoc"
"${CMake_BINARY_DIR}/Tests/Qt4And5AutomocReverse"
${build_generator_args}
--build-project Qt4And5Automoc
--build-exe-dir "${CMake_BINARY_DIR}/Tests/Qt4And5AutomocReverse"
--force-new-ctest-process
--build-options ${build_options} -DQT_REVERSE_FIND_ORDER=1
--test-command ${CMAKE_CTEST_COMMAND} -V
)
list(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/Qt4And5AutomocReverse")
endif() endif()
endif() endif()

View File

@ -2,8 +2,13 @@ cmake_minimum_required(VERSION 2.8.12)
project(Qt4And5Automoc) project(Qt4And5Automoc)
find_package(Qt4 REQUIRED) if (QT_REVERSE_FIND_ORDER)
find_package(Qt5Core REQUIRED) find_package(Qt5Core REQUIRED)
find_package(Qt4 REQUIRED)
else()
find_package(Qt4 REQUIRED)
find_package(Qt5Core REQUIRED)
endif()
set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOMOC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_INCLUDE_CURRENT_DIR ON)

View File

@ -88,6 +88,6 @@ target_link_libraries(empty no_link_language)
add_library(no_link_language STATIC empty.h) add_library(no_link_language STATIC empty.h)
set_target_properties(no_link_language PROPERTIES AUTOMOC TRUE) set_target_properties(no_link_language PROPERTIES AUTOMOC TRUE)
qtx_wrap_cpp(uicOnlyMoc uiconly.h) qtx_wrap_cpp(uicOnlyMoc sub/uiconly.h)
add_executable(uiconly uiconly.cpp ${uicOnlyMoc}) add_executable(uiconly sub/uiconly.cpp ${uicOnlyMoc})
target_link_libraries(uiconly ${QT_LIBRARIES}) target_link_libraries(uiconly ${QT_LIBRARIES})