From 3acd5951ba5c6e978a6da486825e8ad61320f4eb Mon Sep 17 00:00:00 2001 From: Ken Martin Date: Mon, 26 Feb 2001 17:13:30 -0500 Subject: [PATCH] new command --- Source/cmFindFileCommand.cxx | 75 +++++++++++++++++++++++++++++++++ Source/cmFindFileCommand.h | 80 ++++++++++++++++++++++++++++++++++++ 2 files changed, 155 insertions(+) create mode 100644 Source/cmFindFileCommand.cxx create mode 100644 Source/cmFindFileCommand.h diff --git a/Source/cmFindFileCommand.cxx b/Source/cmFindFileCommand.cxx new file mode 100644 index 000000000..39f1371f7 --- /dev/null +++ b/Source/cmFindFileCommand.cxx @@ -0,0 +1,75 @@ +/*========================================================================= + + Program: Insight Segmentation & Registration Toolkit + Module: $RCSfile$ + Language: C++ + Date: $Date$ + Version: $Revision$ + + + Copyright (c) 2000 National Library of Medicine + All rights reserved. + + See COPYRIGHT.txt for copyright details. + +=========================================================================*/ +#include "cmFindFileCommand.h" +#include "cmCacheManager.h" +#include +#include + + +// cmFindFileCommand +bool cmFindFileCommand::Invoke(std::vector& args) +{ + if(args.size() < 2 ) + { + this->SetError("called with incorrect number of arguments"); + return false; + } + + std::vector::iterator i = args.begin(); + // Use the first argument as the name of something to be defined + const char* define = (*i).c_str(); + i++; // move iterator to next arg + // Now check and see if the value has been stored in the cache + // already, if so use that value and don't look for the program + const char* cacheValue + = cmCacheManager::GetInstance()->GetCacheValue(define); + if(cacheValue) + { + m_Makefile->AddDefinition(define, cacheValue); + return true; + } + // if it is not in the cache, then search the system path + std::vector path; + + // add any user specified paths + for (unsigned int j = 2; j < args.size(); j++) + { + // expand variables + std::string exp = args[j]; + m_Makefile->ExpandVariablesInString(exp); + path.push_back(exp); + } + + // add the standard path + cmSystemTools::GetPath(path); + for(unsigned int k=0; k < path.size(); k++) + { + std::string tryPath = path[k]; + tryPath += "/"; + tryPath += *i; + if(cmSystemTools::FileExists(tryPath.c_str())) + { + // Save the value in the cache + cmCacheManager::GetInstance()->AddCacheEntry(define, + tryPath.c_str(), + cmCacheManager::FILEPATH); + m_Makefile->AddDefinition(define, tryPath.c_str()); + return true; + } + } + return false; +} + diff --git a/Source/cmFindFileCommand.h b/Source/cmFindFileCommand.h new file mode 100644 index 000000000..eaac19468 --- /dev/null +++ b/Source/cmFindFileCommand.h @@ -0,0 +1,80 @@ +/*========================================================================= + + Program: Insight Segmentation & Registration Toolkit + Module: $RCSfile$ + Language: C++ + Date: $Date$ + Version: $Revision$ + + + Copyright (c) 2000 National Library of Medicine + All rights reserved. + + See COPYRIGHT.txt for copyright details. + +=========================================================================*/ +#ifndef cmFindFileCommand_h +#define cmFindFileCommand_h + +#include "cmStandardIncludes.h" +#include "cmCommand.h" + +/** \class cmFindFileCommand + * \brief Define a command to search for an executable program. + * + * cmFindFileCommand is used to define a CMake variable + * that specifies an executable program. The command searches + * in the current path (e.g., PATH environment variable) for + * an executable that matches one of the supplied names. + */ +class cmFindFileCommand : public cmCommand +{ +public: + /** + * This is a virtual constructor for the command. + */ + virtual cmCommand* Clone() + { + return new cmFindFileCommand; + } + + /** + * This is called when the command is first encountered in + * the CMakeLists.txt file. + */ + virtual bool Invoke(std::vector& args); + + /** + * This determines if the command gets propagated down + * to makefiles located in subdirectories. + */ + virtual bool IsInherited() { return true; } + + /** + * The name of the command as specified in CMakeList.txt. + */ + virtual const char* GetName() { return "FIND_FILE";} + + /** + * Succinct documentation. + */ + virtual const char* GetTerseDocumentation() + { + return "Find a file."; + } + + /** + * More documentation. + */ + virtual const char* GetFullDocumentation() + { + return + "FIND_FILE(NAME file extrapath extrapath ...)"; + } + + cmTypeMacro(cmFindFileCommand, cmCommand); +}; + + + +#endif