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 (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)
string(COMPARE NOTEQUAL "${QT_QMAKE_EXECUTABLE_LAST}" "${QT_QMAKE_EXECUTABLE}" QT_QMAKE_CHANGED)
endif()

View File

@ -1279,8 +1279,8 @@ bool cmQtAutoGenerators::RunAutogen(cmMakefile* makefile)
const std::vector<std::string>& headerExtensions =
makefile->GetHeaderExtensions();
std::vector<std::string> includedUis;
std::vector<std::string> skippedUis;
std::map<std::string, std::string> includedUis;
std::map<std::string, std::string> skippedUis;
std::vector<std::string> 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)
!= 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;
if (this->Verbose)
{
@ -1350,11 +1351,12 @@ bool cmQtAutoGenerators::RunAutogen(cmMakefile* makefile)
{
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)
{
this->GenerateUi(*it);
this->GenerateUi(it->first, it->second);
}
if(!this->RccExecutable.empty())
@ -1431,7 +1433,7 @@ bool cmQtAutoGenerators::RunAutogen(cmMakefile* makefile)
void cmQtAutoGenerators::ParseCppFile(const std::string& absFilename,
const std::vector<std::string>& headerExtensions,
std::map<std::string, std::string>& includedMocs,
std::vector<std::string> &includedUis)
std::map<std::string, std::string> &includedUis)
{
cmsys::RegularExpression mocIncludeRegExp(
"[\n][ \t]*#[ \t]*include[ \t]+"
@ -1619,7 +1621,7 @@ void cmQtAutoGenerators::ParseCppFile(const std::string& absFilename,
void cmQtAutoGenerators::StrictParseCppFile(const std::string& absFilename,
const std::vector<std::string>& headerExtensions,
std::map<std::string, std::string>& includedMocs,
std::vector<std::string>& includedUis)
std::map<std::string, std::string>& includedUis)
{
cmsys::RegularExpression mocIncludeRegExp(
"[\n][ \t]*#[ \t]*include[ \t]+"
@ -1737,7 +1739,7 @@ void cmQtAutoGenerators::StrictParseCppFile(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())
{
@ -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,
std::vector<std::string>& includedUis)
std::map<std::string, std::string>& includedUis)
{
if (this->UicExecutable.empty())
{
@ -1768,6 +1770,9 @@ void cmQtAutoGenerators::ParseForUic(const std::string&,
std::string::size_type matchOffset = 0;
const std::string absPath = cmsys::SystemTools::GetFilenamePath(
cmsys::SystemTools::GetRealPath(absFilename.c_str())) + '/';
matchOffset = 0;
if ((strstr(contentsString.c_str(), "ui_") != NULL)
&& (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
basename = basename.substr(3);
includedUis.push_back(basename);
includedUis[absPath] = basename;
matchOffset += uiIncludeRegExp.end();
} 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,
const std::map<std::string, std::string>& includedMocs,
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();
hIt!=absHeaders.end();
@ -1939,7 +1944,8 @@ bool cmQtAutoGenerators::GenerateMoc(const std::string& sourceFile,
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))
{
@ -1947,7 +1953,7 @@ bool cmQtAutoGenerators::GenerateUi(const std::string& uiFileName)
}
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;
bool success = cmsys::SystemTools::FileTimeCompare(ui_input_file.c_str(),

View File

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

View File

@ -2,8 +2,13 @@ cmake_minimum_required(VERSION 2.8.12)
project(Qt4And5Automoc)
find_package(Qt4 REQUIRED)
find_package(Qt5Core REQUIRED)
if (QT_REVERSE_FIND_ORDER)
find_package(Qt5Core REQUIRED)
find_package(Qt4 REQUIRED)
else()
find_package(Qt4 REQUIRED)
find_package(Qt5Core REQUIRED)
endif()
set(CMAKE_AUTOMOC 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)
set_target_properties(no_link_language PROPERTIES AUTOMOC TRUE)
qtx_wrap_cpp(uicOnlyMoc uiconly.h)
add_executable(uiconly uiconly.cpp ${uicOnlyMoc})
qtx_wrap_cpp(uicOnlyMoc sub/uiconly.h)
add_executable(uiconly sub/uiconly.cpp ${uicOnlyMoc})
target_link_libraries(uiconly ${QT_LIBRARIES})