summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Kelly <steveire@gmail.com>2014-02-02 12:19:27 (GMT)
committerBrad King <brad.king@kitware.com>2014-02-04 18:21:43 (GMT)
commit6053ce22f69f58c9dc4db66dbfe62cdd8fbe2774 (patch)
tree8b1edb7c8940d5e7981a17df0fa6fdfc8cf7b875
parent1fc9ecfae63447f9109475c1b1ffb6a2974458d9 (diff)
downloadCMake-6053ce22f69f58c9dc4db66dbfe62cdd8fbe2774.zip
CMake-6053ce22f69f58c9dc4db66dbfe62cdd8fbe2774.tar.gz
CMake-6053ce22f69f58c9dc4db66dbfe62cdd8fbe2774.tar.bz2
QtAutogen: Make uic work even when the source is in a subdir.
Modify the includedUis to store the path to the file which includes the ui file. Reuse that path to generate the output file from the uic process.
-rw-r--r--Source/cmQtAutoGenerators.cxx34
-rw-r--r--Source/cmQtAutoGenerators.h12
-rw-r--r--Tests/QtAutogen/CMakeLists.txt4
-rw-r--r--Tests/QtAutogen/sub/uiconly.cpp (renamed from Tests/QtAutogen/uiconly.cpp)0
-rw-r--r--Tests/QtAutogen/sub/uiconly.h (renamed from Tests/QtAutogen/uiconly.h)0
-rw-r--r--Tests/QtAutogen/sub/uiconly.ui (renamed from Tests/QtAutogen/uiconly.ui)0
6 files changed, 28 insertions, 22 deletions
diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx
index cab59fe..7e44c26 100644
--- a/Source/cmQtAutoGenerators.cxx
+++ b/Source/cmQtAutoGenerators.cxx
@@ -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(),
diff --git a/Source/cmQtAutoGenerators.h b/Source/cmQtAutoGenerators.h
index f66d02b..2840fbf 100644
--- a/Source/cmQtAutoGenerators.h
+++ b/Source/cmQtAutoGenerators.h
@@ -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();
diff --git a/Tests/QtAutogen/CMakeLists.txt b/Tests/QtAutogen/CMakeLists.txt
index 515bf5b..546ed02 100644
--- a/Tests/QtAutogen/CMakeLists.txt
+++ b/Tests/QtAutogen/CMakeLists.txt
@@ -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})
diff --git a/Tests/QtAutogen/uiconly.cpp b/Tests/QtAutogen/sub/uiconly.cpp
index cdb3318..cdb3318 100644
--- a/Tests/QtAutogen/uiconly.cpp
+++ b/Tests/QtAutogen/sub/uiconly.cpp
diff --git a/Tests/QtAutogen/uiconly.h b/Tests/QtAutogen/sub/uiconly.h
index 9e21f82..9e21f82 100644
--- a/Tests/QtAutogen/uiconly.h
+++ b/Tests/QtAutogen/sub/uiconly.h
diff --git a/Tests/QtAutogen/uiconly.ui b/Tests/QtAutogen/sub/uiconly.ui
index 13fb832..13fb832 100644
--- a/Tests/QtAutogen/uiconly.ui
+++ b/Tests/QtAutogen/sub/uiconly.ui