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:
commit
f748b59e20
|
@ -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()
|
||||||
|
|
|
@ -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(),
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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()
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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})
|
||||||
|
|
Loading…
Reference in New Issue