Browse Source

new command

Ken Martin 23 years ago
parent
commit
3eaf054d6a
2 changed files with 200 additions and 0 deletions
  1. 124 0
      Source/cmTryRunCommand.cxx
  2. 76 0
      Source/cmTryRunCommand.h

+ 124 - 0
Source/cmTryRunCommand.cxx

@@ -0,0 +1,124 @@
+/*=========================================================================
+
+  Program:   Insight Segmentation & Registration Toolkit
+  Module:    $RCSfile$
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+  Copyright (c) 2002 Insight Consortium. All rights reserved.
+  See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#include "cmTryRunCommand.h"
+#include "cmCacheManager.h"
+#include "cmTryCompileCommand.h"
+
+// cmExecutableCommand
+bool cmTryRunCommand::InitialPass(std::vector<std::string> const& argv)
+{
+  if(argv.size() < 4)
+    {
+    return false;
+    }
+
+  // build an arg list for TryCompile and extract the runArgs
+  std::vector<std::string> tryCompile;
+  std::string runArgs;
+  int i;
+  for (i = 1; i < argv.size(); ++i)
+    {
+    if (argv[i] == "ARGS")
+      {
+      ++i;
+      while (i < argv.size() && argv[i] != "COMPILE_DEFINITIONS" &&
+             argv[i] != "CMAKE_FLAGS")
+        {
+        runArgs += " ";
+        runArgs += argv[i];
+        ++i;
+        }
+      if (i < argv.size())
+        {
+        tryCompile.push_back(argv[i]);
+        }
+      }
+    else
+      {
+      tryCompile.push_back(argv[i]);
+      }
+    }
+  
+  // do the try compile
+  int res = cmTryCompileCommand::CoreTryCompileCode(m_Makefile, tryCompile, false);
+  
+  // now try running the command if it compiled
+  std::string binaryDirectory = argv[1] + "/CMakeTmp";
+  if (!res)
+    {
+    int retVal;
+    std::string output;
+    std::string command;
+    command = binaryDirectory;
+    command += "/cmTryRunExec";
+    command += cmSystemTools::GetExecutableExtension();
+    std::string fullPath;
+    if(cmSystemTools::FileExists(command.c_str()))
+      {
+      fullPath = cmSystemTools::CollapseFullPath(command.c_str());
+      }
+    else
+      {
+      command = binaryDirectory;
+      command += "/Debug/cmTryRunExec";
+      command += cmSystemTools::GetExecutableExtension();
+      if(cmSystemTools::FileExists(command.c_str()))
+        {
+        fullPath = cmSystemTools::CollapseFullPath(command.c_str());
+        }
+      }
+    if (runArgs.size() > 1)
+      {
+      std::string finalCommand = fullPath;
+      if(runArgs.size())
+        {
+        finalCommand = cmSystemTools::ConvertToOutputPath(fullPath.c_str());
+        finalCommand += runArgs;
+        }
+      cmSystemTools::RunCommand(finalCommand.c_str(), output, retVal);
+      // set the run var
+      char retChar[1000];
+      sprintf(retChar,"%i",retVal);
+      m_Makefile->AddDefinition(argv[1].c_str(), retChar);
+      }
+    else
+      {
+      cmSystemTools::Error("Unable to find executable for TRY_RUN");
+      }
+    }
+  
+  // if we created a directory etc, then cleanup after ourselves  
+  cmDirectory dir;
+  dir.Load(binaryDirectory.c_str());
+  size_t fileNum;
+  for (fileNum = 0; fileNum <  dir.GetNumberOfFiles(); ++fileNum)
+    {
+    if (strcmp(dir.GetFile(fileNum),".") &&
+        strcmp(dir.GetFile(fileNum),".."))
+      {
+      std::string fullPath = binaryDirectory;
+      fullPath += "/";
+      fullPath += dir.GetFile(fileNum);
+      cmSystemTools::RemoveFile(fullPath.c_str());
+      }
+    }
+  
+  return true;
+}
+
+
+      

+ 76 - 0
Source/cmTryRunCommand.h

@@ -0,0 +1,76 @@
+/*=========================================================================
+
+  Program:   Insight Segmentation & Registration Toolkit
+  Module:    $RCSfile$
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+  Copyright (c) 2002 Insight Consortium. All rights reserved.
+  See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#ifndef cmTryRunCommand_h
+#define cmTryRunCommand_h
+
+#include "cmStandardIncludes.h"
+#include "cmCommand.h"
+
+/** \class cmTryRunCommand
+ * \brief Specifies where to install some files
+ *
+ * cmTryRunCommand is used to test if soucre code can be compiled
+ */
+class cmTryRunCommand : public cmCommand
+{
+public:
+  /**
+   * This is a virtual constructor for the command.
+   */
+  virtual cmCommand* Clone() 
+    {
+    return new cmTryRunCommand;
+    }
+
+  /**
+   * This is called when the command is first encountered in
+   * the CMakeLists.txt file.
+   */
+  virtual bool InitialPass(std::vector<std::string> const& args);
+
+  /**
+   * The name of the command as specified in CMakeList.txt.
+   */
+  virtual const char* GetName() { return "TRY_RUN";}
+
+  /**
+   * Succinct documentation.
+   */
+  virtual const char* GetTerseDocumentation() 
+    {
+    return "Try compiling and then running some code.";
+    }
+  
+
+  /**
+   * More documentation.
+   */
+  virtual const char* GetFullDocumentation()
+    {
+    return
+      "TRY_RUN(RUN_RESULT_VAR COMPILE_RESULT_VAR bindir srcfile <CMAKE_FLAGS <Flags>> <COMPILE_DEFINITIONS <flags>> <ARGUMENTS <arg1> <arg2>...>)\n"
+      "Try compiling a srcfile. Return the success or failure in ";
+      "COMPILE_RESULT_VAR. Then if the compile succeeded, run the ";
+      "executable and return the result in RUN_RESULT_VAR. ";
+    }
+  
+  cmTypeMacro(cmTryRunCommand, cmCommand);
+
+};
+
+
+#endif