Browse Source

new command

Ken Martin 25 years ago
parent
commit
3acd5951ba
2 changed files with 155 additions and 0 deletions
  1. 75 0
      Source/cmFindFileCommand.cxx
  2. 80 0
      Source/cmFindFileCommand.h

+ 75 - 0
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 <stdlib.h>
+#include <stdio.h>
+  
+
+// cmFindFileCommand
+bool cmFindFileCommand::Invoke(std::vector<std::string>& args)
+{
+  if(args.size() < 2 )
+    {
+    this->SetError("called with incorrect number of arguments");
+    return false;
+    }
+
+  std::vector<std::string>::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<std::string> 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;
+}
+

+ 80 - 0
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<std::string>& 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