diff --git a/Source/cmAbstractFilesCommand.cxx b/Source/cmAbstractFilesCommand.cxx index 74c02f372..9941e14d2 100644 --- a/Source/cmAbstractFilesCommand.cxx +++ b/Source/cmAbstractFilesCommand.cxx @@ -40,10 +40,14 @@ bool cmAbstractFilesCommand::InitialPass(std::vector const& argsIn) } else { - m += *j; - m += "\n"; - ret = false; - } + // for VTK 4.0 we have to support missing abstract sources + if(m_Makefile->GetDefinition("CMAKE_MINIMUM_REQUIRED_VERSION")) + { + m += *j; + m += "\n"; + ret = false; + } + } } if(!ret) { diff --git a/Source/cmAddCustomCommandCommand.cxx b/Source/cmAddCustomCommandCommand.cxx index f601ecc05..b949438b3 100644 --- a/Source/cmAddCustomCommandCommand.cxx +++ b/Source/cmAddCustomCommandCommand.cxx @@ -18,19 +18,17 @@ // cmAddCustomCommandCommand -bool cmAddCustomCommandCommand::InitialPass(std::vector const& argsIn) +bool cmAddCustomCommandCommand::InitialPass(std::vector const& args) { /* Let's complain at the end of this function about the lack of a particular arg. For the moment, let's say that COMMAND, TARGET are always required. */ - if (argsIn.size() < 4) + if (args.size() < 4) { this->SetError("called with wrong number of arguments."); return false; } - std::vector args; - cmSystemTools::ExpandListArguments(argsIn, args); std::string source, command, target; std::vector command_args, depends, outputs; diff --git a/Source/cmCMakeMinimumRequired.cxx b/Source/cmCMakeMinimumRequired.cxx new file mode 100644 index 000000000..6be31de0d --- /dev/null +++ b/Source/cmCMakeMinimumRequired.cxx @@ -0,0 +1,45 @@ +/*========================================================================= + + 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 "cmCMakeMinimumRequired.h" + +// cmCMakeMinimumRequired +bool cmCMakeMinimumRequired::InitialPass(std::vector const& args) +{ + if(args.size() != 2) + { + this->SetError("called with incorrect number of arguments"); + return false; + } + if(args[0] == "VERSION") + { + m_Makefile->AddDefinition("CMAKE_MINIMUM_REQUIRED_VERSION", args[1].c_str()); + } + float version = float(m_Makefile->GetMajorVersion()); + version += (float(m_Makefile->GetMinorVersion()) * .1); + float reqVersion = 0; + sscanf(args[1].c_str(), "%f", &reqVersion); + if(reqVersion > version) + { + std::strstream str; + str << "WARNING: This project requires version: " << args[1].c_str() << " of cmake.\n" + << "You are running version: " << version << std::ends; + cmSystemTools::Message(str.str()); + delete [] str.str(); + } + return true; +} + diff --git a/Source/cmCMakeMinimumRequired.h b/Source/cmCMakeMinimumRequired.h new file mode 100644 index 000000000..677a4a077 --- /dev/null +++ b/Source/cmCMakeMinimumRequired.h @@ -0,0 +1,79 @@ +/*========================================================================= + + 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 cmCMakeMinimumRequired_h +#define cmCMakeMinimumRequired_h + +#include "cmStandardIncludes.h" +#include "cmCommand.h" + +/** \class cmCMakeMinimumRequired + * \brief Build a CMAKE variable + * + * cmCMakeMinimumRequired sets a variable to a value with expansion. + */ +class cmCMakeMinimumRequired : public cmCommand +{ +public: + /** + * This is a virtual constructor for the command. + */ + virtual cmCommand* Clone() + { + return new cmCMakeMinimumRequired; + } + + /** + * This is called when the command is first encountered in + * the CMakeLists.txt file. + */ + virtual bool InitialPass(std::vector const& 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 "CMAKE_MINIMUM_REQUIRED";} + + /** + * Succinct documentation. + */ + virtual const char* GetTerseDocumentation() + { + return "Determine the command line that will build this project."; + } + + /** + * More documentation. + */ + virtual const char* GetFullDocumentation() + { + return + "CMAKE_MINIMUM_REQUIRED(NAME MAKECOMMAND)\n" + "Within CMAKE set NAME to the command that will build this project from the command line using MAKECOMMAND."; + } + + cmTypeMacro(cmCMakeMinimumRequired, cmCommand); +}; + + + +#endif diff --git a/Source/cmCommands.cxx b/Source/cmCommands.cxx index 7bc208006..0b768b0a9 100644 --- a/Source/cmCommands.cxx +++ b/Source/cmCommands.cxx @@ -29,6 +29,7 @@ #include "cmAuxSourceDirectoryCommand.cxx" #include "cmBuildCommand.cxx" #include "cmBuildNameCommand.cxx" +#include "cmCMakeMinimumRequired.cxx" #include "cmConfigureFileCommand.cxx" #include "cmCreateTestSourceList.cxx" #include "cmElseCommand.cxx" @@ -94,6 +95,7 @@ void GetPredefinedCommands(std::list& commands) commands.push_back(new cmAuxSourceDirectoryCommand); commands.push_back(new cmBuildCommand); commands.push_back(new cmBuildNameCommand); + commands.push_back(new cmCMakeMinimumRequired); commands.push_back(new cmConfigureFileCommand); commands.push_back(new cmCreateTestSourceList); commands.push_back(new cmElseCommand); diff --git a/Source/cmOptionCommand.cxx b/Source/cmOptionCommand.cxx index 2a943b85d..4478a21fd 100644 --- a/Source/cmOptionCommand.cxx +++ b/Source/cmOptionCommand.cxx @@ -19,12 +19,33 @@ // cmOptionCommand bool cmOptionCommand::InitialPass(std::vector const& args) { - if(args.size() < 2 || args.size() > 3) + bool argError = false; + if(args.size() < 2) { - this->SetError("called with incorrect number of arguments"); + argError = true; + } + // for VTK 4.0 we have to support the option command with more than 3 arguments + // if CMAKE_MINIMUM_REQUIRED_VERSION is not defined, if CMAKE_MINIMUM_REQUIRED_VERSION + // is defined, then we can have stricter checking. + if(m_Makefile->GetDefinition("CMAKE_MINIMUM_REQUIRED_VERSION")) + { + if(args.size() > 3) + { + argError = true; + } + } + if(argError) + { + std::string m = "called with incorrect number of arguments: "; + for(int i =0; i < args.size(); ++i) + { + m += args[i]; + m += " "; + } + this->SetError(m.c_str()); return false; } - + // 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 diff --git a/Tests/Complex/CMakeLists.txt b/Tests/Complex/CMakeLists.txt index 720ae1aec..c2448a45c 100644 --- a/Tests/Complex/CMakeLists.txt +++ b/Tests/Complex/CMakeLists.txt @@ -3,6 +3,9 @@ # PROJECT (Complex) +CMAKE_MINIMUM_REQUIRED(VERSION 1.3) + + # # Use the ansi CXX compile flag for building cmake # diff --git a/Tests/Complex/Executable/complex.cxx b/Tests/Complex/Executable/complex.cxx index af49dcdbf..7d86179dd 100644 --- a/Tests/Complex/Executable/complex.cxx +++ b/Tests/Complex/Executable/complex.cxx @@ -647,6 +647,14 @@ int main() #endif #endif // defined(_WIN32) && !defined(__CYGWIN__) + if(strcmp(CMAKE_MINIMUM_REQUIRED_VERSION, "1.3") == 0) + { + cmPassed("CMAKE_MINIMUM_REQUIRED_VERSION is set to 1.3"); + } + else + { + cmFailed("CMAKE_MINIMUM_REQUIRED_VERSION is not set to the expected 1.3"); + } // ---------------------------------------------------------------------- // Summary diff --git a/Tests/Complex/cmTestConfigure.h.in b/Tests/Complex/cmTestConfigure.h.in index 5edff154d..58a3f60d9 100644 --- a/Tests/Complex/cmTestConfigure.h.in +++ b/Tests/Complex/cmTestConfigure.h.in @@ -54,3 +54,4 @@ #if defined(_WIN32) && !defined(__CYGWIN__) #define REGISTRY_TEST_PATH "${REGISTRY_TEST_PATH}" #endif +#define CMAKE_MINIMUM_REQUIRED_VERSION "${CMAKE_MINIMUM_REQUIRED_VERSION}" diff --git a/Tests/ComplexOneConfig/CMakeLists.txt b/Tests/ComplexOneConfig/CMakeLists.txt index 720ae1aec..c2448a45c 100644 --- a/Tests/ComplexOneConfig/CMakeLists.txt +++ b/Tests/ComplexOneConfig/CMakeLists.txt @@ -3,6 +3,9 @@ # PROJECT (Complex) +CMAKE_MINIMUM_REQUIRED(VERSION 1.3) + + # # Use the ansi CXX compile flag for building cmake # diff --git a/Tests/ComplexOneConfig/Executable/complex.cxx b/Tests/ComplexOneConfig/Executable/complex.cxx index af49dcdbf..7d86179dd 100644 --- a/Tests/ComplexOneConfig/Executable/complex.cxx +++ b/Tests/ComplexOneConfig/Executable/complex.cxx @@ -647,6 +647,14 @@ int main() #endif #endif // defined(_WIN32) && !defined(__CYGWIN__) + if(strcmp(CMAKE_MINIMUM_REQUIRED_VERSION, "1.3") == 0) + { + cmPassed("CMAKE_MINIMUM_REQUIRED_VERSION is set to 1.3"); + } + else + { + cmFailed("CMAKE_MINIMUM_REQUIRED_VERSION is not set to the expected 1.3"); + } // ---------------------------------------------------------------------- // Summary diff --git a/Tests/ComplexOneConfig/cmTestConfigure.h.in b/Tests/ComplexOneConfig/cmTestConfigure.h.in index 5edff154d..58a3f60d9 100644 --- a/Tests/ComplexOneConfig/cmTestConfigure.h.in +++ b/Tests/ComplexOneConfig/cmTestConfigure.h.in @@ -54,3 +54,4 @@ #if defined(_WIN32) && !defined(__CYGWIN__) #define REGISTRY_TEST_PATH "${REGISTRY_TEST_PATH}" #endif +#define CMAKE_MINIMUM_REQUIRED_VERSION "${CMAKE_MINIMUM_REQUIRED_VERSION}" diff --git a/Tests/ComplexRelativePaths/CMakeLists.txt b/Tests/ComplexRelativePaths/CMakeLists.txt index 720ae1aec..c2448a45c 100644 --- a/Tests/ComplexRelativePaths/CMakeLists.txt +++ b/Tests/ComplexRelativePaths/CMakeLists.txt @@ -3,6 +3,9 @@ # PROJECT (Complex) +CMAKE_MINIMUM_REQUIRED(VERSION 1.3) + + # # Use the ansi CXX compile flag for building cmake # diff --git a/Tests/ComplexRelativePaths/Executable/complex.cxx b/Tests/ComplexRelativePaths/Executable/complex.cxx index af49dcdbf..7d86179dd 100644 --- a/Tests/ComplexRelativePaths/Executable/complex.cxx +++ b/Tests/ComplexRelativePaths/Executable/complex.cxx @@ -647,6 +647,14 @@ int main() #endif #endif // defined(_WIN32) && !defined(__CYGWIN__) + if(strcmp(CMAKE_MINIMUM_REQUIRED_VERSION, "1.3") == 0) + { + cmPassed("CMAKE_MINIMUM_REQUIRED_VERSION is set to 1.3"); + } + else + { + cmFailed("CMAKE_MINIMUM_REQUIRED_VERSION is not set to the expected 1.3"); + } // ---------------------------------------------------------------------- // Summary diff --git a/Tests/ComplexRelativePaths/cmTestConfigure.h.in b/Tests/ComplexRelativePaths/cmTestConfigure.h.in index 5edff154d..58a3f60d9 100644 --- a/Tests/ComplexRelativePaths/cmTestConfigure.h.in +++ b/Tests/ComplexRelativePaths/cmTestConfigure.h.in @@ -54,3 +54,4 @@ #if defined(_WIN32) && !defined(__CYGWIN__) #define REGISTRY_TEST_PATH "${REGISTRY_TEST_PATH}" #endif +#define CMAKE_MINIMUM_REQUIRED_VERSION "${CMAKE_MINIMUM_REQUIRED_VERSION}"