From 9b079becdf11669f9fffd1beb9e89582d667c961 Mon Sep 17 00:00:00 2001 From: Brad King Date: Fri, 23 Mar 2001 14:27:02 -0500 Subject: [PATCH] ENH: Added support for CABLE_SOURCE_FILES to refer to files that are not in the current directory. The include path is searched for the files. --- Source/cmCableSourceFilesCommand.cxx | 45 ++++++++++++++++++++++++---- Source/cmCableSourceFilesCommand.h | 3 +- 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/Source/cmCableSourceFilesCommand.cxx b/Source/cmCableSourceFilesCommand.cxx index d41dcc8d5..466560242 100644 --- a/Source/cmCableSourceFilesCommand.cxx +++ b/Source/cmCableSourceFilesCommand.cxx @@ -48,17 +48,13 @@ void cmCableSourceFilesCommand::WriteConfiguration() const cmRegularExpression needCdataBlock("[&<>]"); - // Look for the files on a path relative to the current CMakeLists.txt. - std::string curPath = m_Makefile->GetCurrentDirectory(); - curPath += "/"; - os << indent << "" << std::endl; for(Entries::const_iterator f = m_Entries.begin(); f != m_Entries.end(); ++f) { // Look for the normal include file. std::string header = *f+".h"; - if(cmSystemTools::FileExists((curPath+header).c_str())) + if(this->SourceFileExists(header)) { os << indent << " " << std::endl; @@ -70,7 +66,7 @@ void cmCableSourceFilesCommand::WriteConfiguration() const // Look for an instantiation file. std::string txx = *f+".txx"; - if(cmSystemTools::FileExists((curPath+txx).c_str())) + if(this->SourceFileExists(txx)) { os << indent << " " << std::endl; @@ -78,3 +74,40 @@ void cmCableSourceFilesCommand::WriteConfiguration() const } os << indent << "" << std::endl; } + + +/** + * Search the include path for the specified file. + */ +bool cmCableSourceFilesCommand::SourceFileExists(const std::string& name) const +{ + // We must locate the file in the include path so that we can detect + // its extension, and whether there is more than one to find. + std::string file = name; + m_Makefile->ExpandVariablesInString(file); + + // See if the file just exists here. The compiler's search path will + // locate it. + if(cmSystemTools::FileExists(file.c_str())) + { + return true; + } + + // We must look for the file in the include search path. + const std::vector& includeDirectories = + m_Makefile->GetIncludeDirectories(); + + for(std::vector::const_iterator dir = includeDirectories.begin(); + dir != includeDirectories.end(); ++dir) + { + std::string path = *dir + "/"; + m_Makefile->ExpandVariablesInString(path); + if(cmSystemTools::FileExists((path+file).c_str())) + { + return true; + } + } + + // We couldn't locate the source file. + return false; +} diff --git a/Source/cmCableSourceFilesCommand.h b/Source/cmCableSourceFilesCommand.h index 866eb50a9..4aefeb032 100644 --- a/Source/cmCableSourceFilesCommand.h +++ b/Source/cmCableSourceFilesCommand.h @@ -68,7 +68,8 @@ public: } virtual void WriteConfiguration() const; - + bool SourceFileExists(const std::string&) const; + cmTypeMacro(cmCableSourceFilesCommand, cmCableCommand); protected: typedef cmCablePackageEntryCommand::Entries Entries;