diff --git a/Source/cmAddExecutableCommand.cxx b/Source/cmAddExecutableCommand.cxx index 9710d2052..ef75b3b06 100644 --- a/Source/cmAddExecutableCommand.cxx +++ b/Source/cmAddExecutableCommand.cxx @@ -126,14 +126,6 @@ bool cmAddExecutableCommand } std::vector srclists(s, args.end()); - cmQtAutomoc* automoc = 0; - if ( doAutomoc ) - { - automoc = new cmQtAutomoc; - automoc->SetupAutomocTarget(this->Makefile, exename.c_str(), srclists); - } - - cmTarget* tgt = this->Makefile->AddExecutable(exename.c_str(), srclists, excludeFromAll); if ( use_win32 ) @@ -145,11 +137,10 @@ bool cmAddExecutableCommand tgt->SetProperty("MACOSX_BUNDLE", "ON"); } - if ( automoc ) + if ( doAutomoc ) { - automoc->AddTargetDependency(this->Makefile, tgt); - delete automoc; - automoc = 0; + cmQtAutomoc automoc; + automoc.SetupAutomocTarget(tgt); } return true; diff --git a/Source/cmAddLibraryCommand.cxx b/Source/cmAddLibraryCommand.cxx index a581ea14a..f0b2e0d43 100644 --- a/Source/cmAddLibraryCommand.cxx +++ b/Source/cmAddLibraryCommand.cxx @@ -178,21 +178,13 @@ bool cmAddLibraryCommand ++s; } - cmQtAutomoc* automoc = 0; - if ( doAutomoc ) - { - automoc = new cmQtAutomoc; - automoc->SetupAutomocTarget(this->Makefile, libName.c_str(), srclists); - } - cmTarget* tgt =this->Makefile->AddLibrary(libName.c_str(), type, srclists, excludeFromAll); - if ( automoc ) + if ( doAutomoc ) { - automoc->AddTargetDependency(this->Makefile, tgt); - delete automoc; - automoc = 0; + cmQtAutomoc automoc; + automoc.SetupAutomocTarget(tgt); } return true; diff --git a/Source/cmQtAutomoc.cxx b/Source/cmQtAutomoc.cxx index b03e9cf45..6dbc9e147 100644 --- a/Source/cmQtAutomoc.cxx +++ b/Source/cmQtAutomoc.cxx @@ -32,10 +32,10 @@ cmQtAutomoc::cmQtAutomoc() } -void cmQtAutomoc::SetupAutomocTarget(cmMakefile* makefile, - const char* targetName, - std::vector& srcs) +void cmQtAutomoc::SetupAutomocTarget(cmTarget* target) { + cmMakefile* makefile = target->GetMakefile(); + const char* targetName = target->GetName(); // don't do anything if there is no Qt4: std::string qtMajorVersion = makefile->GetSafeDefinition("QT_VERSION_MAJOR"); if (qtMajorVersion != "4") @@ -43,6 +43,7 @@ void cmQtAutomoc::SetupAutomocTarget(cmMakefile* makefile, return; } + // create a custom target for running automoc at buildtime: std::string automocTargetName = targetName; automocTargetName += "_automoc"; @@ -66,34 +67,32 @@ void cmQtAutomoc::SetupAutomocTarget(cmMakefile* makefile, std::vector depends; - cmTarget* target = makefile->AddUtilityCommand(automocTargetName.c_str(), - true, + cmTarget* mocTarget = makefile->AddUtilityCommand(automocTargetName.c_str(), + true, workingDirectory.c_str(), depends, commandLines, false, "Automoc target"); + target->AddUtility(automocTargetName.c_str()); + // configure a file to get all information to automoc at buildtime: std::string _moc_files; std::string _moc_headers; const char* sepFiles = ""; const char* sepHeaders = ""; - for(std::vector::const_iterator fileIt = srcs.begin(); - fileIt != srcs.end(); + + const std::vector& srcFiles = target->GetSourceFiles(); + + for(std::vector::const_iterator fileIt = srcFiles.begin(); + fileIt != srcFiles.end(); ++fileIt) { - std::string absFile = cmSystemTools::CollapseFullPath( - fileIt->c_str(), makefile->GetCurrentDirectory()); - - bool skip = false; - bool generated = false; - cmSourceFile* sf = makefile->GetSource(absFile.c_str()); - if (sf) - { - skip = cmSystemTools::IsOn(sf->GetPropertyForUser("SKIP_AUTOMOC")); - generated = cmSystemTools::IsOn(sf->GetPropertyForUser("GENERATED")); - } + cmSourceFile* sf = *fileIt; + std::string absFile = sf->GetFullPath(); + bool skip = cmSystemTools::IsOn(sf->GetPropertyForUser("SKIP_AUTOMOC")); + bool generated = cmSystemTools::IsOn(sf->GetPropertyForUser("GENERATED")); if ((skip==false) && (generated == false)) { - std::string ext = cmSystemTools::GetFilenameExtension(fileIt->c_str()); + std::string ext = sf->GetExtension(); cmSystemTools::FileFormat fileType = cmSystemTools::GetFileFormat( ext.c_str()); if (fileType == cmSystemTools::CXX_FILE_FORMAT) @@ -137,29 +136,15 @@ void cmQtAutomoc::SetupAutomocTarget(cmMakefile* makefile, mocCppFile += "/"; mocCppFile += automocTargetName; mocCppFile += ".cpp"; - makefile->GetOrCreateSource(mocCppFile.c_str(), true); - srcs.push_back(mocCppFile); + cmSourceFile* mocCppSource = makefile->GetOrCreateSource(mocCppFile.c_str(), + true); + target->AddSourceFile(mocCppSource); makefile->AppendProperty("ADDITIONAL_MAKE_CLEAN_FILES", mocCppFile.c_str(), false); } -void cmQtAutomoc::AddTargetDependency(cmMakefile* makefile, cmTarget* target) -{ - // don't do anything if there is no Qt4: - std::string qtMajorVersion = makefile->GetSafeDefinition("QT_VERSION_MAJOR"); - if (qtMajorVersion != "4") - { - return; - } - - std::string automocTargetName = target->GetName(); - automocTargetName += "_automoc"; - target->AddUtility(automocTargetName.c_str()); -} - - bool cmQtAutomoc::Run(const char* targetDirectory) { cmake cm; diff --git a/Source/cmQtAutomoc.h b/Source/cmQtAutomoc.h index af773664c..4fd904161 100644 --- a/Source/cmQtAutomoc.h +++ b/Source/cmQtAutomoc.h @@ -10,11 +10,7 @@ public: cmQtAutomoc(); bool Run(const char* targetDirectory); - void SetupAutomocTarget(cmMakefile* makefile, - const char* targetName, - std::vector& srcs); - - void AddTargetDependency(cmMakefile* makefile, cmTarget* target); + void SetupAutomocTarget(cmTarget* target); private: cmGlobalGenerator* CreateGlobalGenerator(cmake* cm,