diff options
-rw-r--r-- | Source/cmTryRunCommand.cxx | 124 | ||||
-rw-r--r-- | Source/cmTryRunCommand.h | 76 |
2 files changed, 200 insertions, 0 deletions
diff --git a/Source/cmTryRunCommand.cxx b/Source/cmTryRunCommand.cxx new file mode 100644 index 0000000..d65015d --- /dev/null +++ b/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; +} + + + diff --git a/Source/cmTryRunCommand.h b/Source/cmTryRunCommand.h new file mode 100644 index 0000000..985ccd0 --- /dev/null +++ b/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 |