summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Holtermann <sebholt@xwmw.org>2016-04-19 09:02:48 (GMT)
committerBrad King <brad.king@kitware.com>2016-04-22 12:54:25 (GMT)
commit9c6fa684e7681417f5e75f25034f28212e22b229 (patch)
tree60901c744f14bb17c840ccb72f6267882f33cabc
parent488ea8c7093849cc60ae0e99ef883b2ddacfdf86 (diff)
downloadCMake-9c6fa684e7681417f5e75f25034f28212e22b229.zip
CMake-9c6fa684e7681417f5e75f25034f28212e22b229.tar.gz
CMake-9c6fa684e7681417f5e75f25034f28212e22b229.tar.bz2
Autogen: Generate qrc_NAME.cpp files in subdirectories
A qrc_NAME.cpp file generated from NAME.qrc in the directory CMAKE_CURRENT_SOURCE_DIR/SUBDIR will be generated in the directory CMAKE_CURRENT_BINARY_DIR/TARGETNAME_automoc.dir/SUBDIR
-rw-r--r--Source/cmQtAutoGeneratorInitializer.cxx130
-rw-r--r--Source/cmQtAutoGenerators.cxx15
2 files changed, 109 insertions, 36 deletions
diff --git a/Source/cmQtAutoGeneratorInitializer.cxx b/Source/cmQtAutoGeneratorInitializer.cxx
index 4cab81f..ea9ea7c 100644
--- a/Source/cmQtAutoGeneratorInitializer.cxx
+++ b/Source/cmQtAutoGeneratorInitializer.cxx
@@ -25,6 +25,87 @@
# include "cmGlobalVisualStudioGenerator.h"
#endif
+static std::string GetAutogenTargetName(
+ cmGeneratorTarget const* target)
+{
+ std::string autogenTargetName = target->GetName();
+ autogenTargetName += "_automoc";
+ return autogenTargetName;
+}
+
+static std::string GetAutogenTargetDir(
+ cmGeneratorTarget const* target)
+{
+ cmMakefile* makefile = target->Target->GetMakefile();
+ std::string targetDir = makefile->GetCurrentBinaryDirectory();
+ targetDir += makefile->GetCMakeInstance()->GetCMakeFilesDirectory();
+ targetDir += "/";
+ targetDir += GetAutogenTargetName(target);
+ targetDir += ".dir/";
+ return targetDir;
+}
+
+static std::string GetAutogenTargetBuildDir(
+ cmGeneratorTarget const* target)
+{
+ cmMakefile* makefile = target->Target->GetMakefile();
+ std::string targetDir = makefile->GetCurrentBinaryDirectory();
+ targetDir += "/";
+ targetDir += GetAutogenTargetName(target);
+ targetDir += ".dir/";
+ return targetDir;
+}
+
+static std::string GetSourceRelativePath(
+ cmGeneratorTarget const* target,
+ const std::string& fileName)
+{
+ std::string pathRel;
+ // Test if the file is child to any of the known directories
+ {
+ const std::string fileNameReal = cmsys::SystemTools::GetRealPath(fileName);
+ std::string parentDirectory;
+ bool match ( false );
+ {
+ std::string testDirs[4];
+ {
+ cmMakefile* makefile = target->Target->GetMakefile();
+ testDirs[0] = makefile->GetCurrentSourceDirectory();
+ testDirs[1] = makefile->GetCurrentBinaryDirectory();
+ testDirs[2] = makefile->GetHomeDirectory();
+ testDirs[3] = makefile->GetHomeOutputDirectory();
+ }
+ for(int ii=0; ii != sizeof(testDirs)/sizeof(std::string); ++ii )
+ {
+ const ::std::string testDir = cmsys::SystemTools::GetRealPath(
+ testDirs[ii]);
+ if (!testDir.empty()
+ && cmsys::SystemTools::IsSubDirectory(fileNameReal, testDir) )
+ {
+ parentDirectory = testDir;
+ match = true;
+ break;
+ }
+ }
+ }
+ // Use root as fallback parent directory
+ if (!match)
+ {
+ cmsys::SystemTools::SplitPathRootComponent(fileNameReal,
+ &parentDirectory);
+ }
+ pathRel = cmsys::SystemTools::RelativePath(
+ parentDirectory, cmsys::SystemTools::GetParentDirectory(fileNameReal));
+ }
+ // Sanitize relative path
+ if (!pathRel.empty())
+ {
+ pathRel += '/';
+ cmSystemTools::ReplaceString(pathRel, "..", "__");
+ }
+ return pathRel;
+}
+
static void SetupSourceFiles(cmGeneratorTarget const* target,
std::vector<std::string>& skipMoc,
std::vector<std::string>& mocSources,
@@ -61,13 +142,16 @@ static void SetupSourceFiles(cmGeneratorTarget const* target,
if (ext == "qrc"
&& !cmSystemTools::IsOn(sf->GetPropertyForUser("SKIP_AUTORCC")))
{
+
+ std::string rcc_output_dir = GetAutogenTargetBuildDir(target);
+ rcc_output_dir += GetSourceRelativePath(target,absFile);
+ cmSystemTools::MakeDirectory(rcc_output_dir.c_str());
+
std::string basename = cmsys::SystemTools::
GetFilenameWithoutLastExtension(absFile);
- std::string rcc_output_dir = target->GetSupportDirectory();
- cmSystemTools::MakeDirectory(rcc_output_dir.c_str());
std::string rcc_output_file = rcc_output_dir;
- rcc_output_file += "/qrc_" + basename + ".cpp";
+ rcc_output_file += "qrc_" + basename + ".cpp";
makefile->AppendProperty("ADDITIONAL_MAKE_CLEAN_FILES",
rcc_output_file.c_str(), false);
makefile->GetOrCreateSource(rcc_output_file, true);
@@ -433,26 +517,6 @@ static void MergeRccOptions(std::vector<std::string> &opts,
opts.insert(opts.end(), extraOpts.begin(), extraOpts.end());
}
-std::string GetAutogenTargetName(
- cmGeneratorTarget const* target)
-{
- std::string autogenTargetName = target->GetName();
- autogenTargetName += "_automoc";
- return autogenTargetName;
-}
-
-std::string GetAutogenTargetDir(
- cmGeneratorTarget const* target)
-{
- cmMakefile* makefile = target->Target->GetMakefile();
- std::string targetDir = makefile->GetCurrentBinaryDirectory();
- targetDir += makefile->GetCMakeInstance()->GetCMakeFilesDirectory();
- targetDir += "/";
- targetDir += GetAutogenTargetName(target);
- targetDir += ".dir/";
- return targetDir;
-}
-
static void copyTargetProperty(cmTarget* destinationTarget,
cmTarget* sourceTarget,
const std::string& propertyName)
@@ -858,14 +922,18 @@ void cmQtAutoGeneratorInitializer::InitializeAutogenTarget(
if (ext == "qrc"
&& !cmSystemTools::IsOn(sf->GetPropertyForUser("SKIP_AUTORCC")))
{
- std::string basename = cmsys::SystemTools::
- GetFilenameWithoutLastExtension(absFile);
-
- std::string rcc_output_dir = target->GetSupportDirectory();
- cmSystemTools::MakeDirectory(rcc_output_dir.c_str());
- std::string rcc_output_file = rcc_output_dir;
- rcc_output_file += "/qrc_" + basename + ".cpp";
- rcc_output.push_back(rcc_output_file);
+
+ {
+ std::string rcc_output_dir = GetAutogenTargetBuildDir(target);
+ rcc_output_dir += GetSourceRelativePath(target,absFile);
+ cmSystemTools::MakeDirectory(rcc_output_dir.c_str());
+
+ std::string basename = cmsys::SystemTools::
+ GetFilenameWithoutLastExtension(absFile);
+ std::string rcc_output_file = rcc_output_dir;
+ rcc_output_file += "qrc_" + basename + ".cpp";
+ rcc_output.push_back(rcc_output_file);
+ }
if (!cmSystemTools::IsOn(sf->GetPropertyForUser("GENERATED")))
{
diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx
index 1431323..3c6db2d 100644
--- a/Source/cmQtAutoGenerators.cxx
+++ b/Source/cmQtAutoGenerators.cxx
@@ -1399,8 +1399,11 @@ bool cmQtAutoGenerators::GenerateQrcFiles()
{
std::string basename = cmsys::SystemTools::
GetFilenameWithoutLastExtension(*si);
- std::string qrcOutputFile = "CMakeFiles/" + this->OriginTargetName
- + ".dir/qrc_" + basename + ".cpp";
+ std::string qrcOutputFile = this->TargetBuildSubDir
+ + this->SourceRelativePath ( *si )
+ + "qrc_" + basename + ".cpp";
+ //std::string qrcOutputFile = "CMakeFiles/" + this->OriginTargetName
+ // + ".dir/qrc_" + basename + ".cpp";
qrcGenMap[*si] = qrcOutputFile;
}
}
@@ -1438,8 +1441,10 @@ bool cmQtAutoGenerators::GenerateQrc (
const std::string& qrcInputFile,
const std::string& qrcOutputFile )
{
- const std::string basename = cmsys::SystemTools::
- GetFilenameWithoutLastExtension(qrcInputFile);
+ std::string relName = this->SourceRelativePath ( qrcInputFile );
+ cmSystemTools::ReplaceString(relName, "/", "_");
+ relName += cmsys::SystemTools::GetFilenameWithoutLastExtension(qrcInputFile);
+
const ::std::string qrcBuildFile = this->Builddir + qrcOutputFile;
int sourceNewerThanQrc = 0;
@@ -1469,7 +1474,7 @@ bool cmQtAutoGenerators::GenerateQrc (
}
command.push_back("-name");
- command.push_back(basename);
+ command.push_back(relName);
command.push_back("-o");
command.push_back(qrcBuildFile);
command.push_back(qrcInputFile);