diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index 95746243a..1e2de6e3e 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -1047,3 +1047,11 @@ std::string cmSystemTools::ConvertToOutputPath(const char* path) #endif } +bool cmSystemTools::StringEndsWith(const char* str1, const char* str2) +{ + if ( !str1 || !str2 || strlen(str1) < strlen(str2) ) + { + return 0; + } + return !strncmp(str1 + (strlen(str1)-strlen(str2)), str2, strlen(str2)); +} diff --git a/Source/cmSystemTools.h b/Source/cmSystemTools.h index 724c5ec44..2ba190603 100644 --- a/Source/cmSystemTools.h +++ b/Source/cmSystemTools.h @@ -240,6 +240,9 @@ public: s_ForceUnixPaths = v; } static std::string ConvertToOutputPath(const char* path); + + //! Check if the first string ends with the second one. + static bool StringEndsWith(const char* str1, const char* str2); private: static bool s_ForceUnixPaths; diff --git a/Source/cmake.cxx b/Source/cmake.cxx index da7d2905e..cb442c2cb 100644 --- a/Source/cmake.cxx +++ b/Source/cmake.cxx @@ -215,9 +215,9 @@ bool cmake::SetCacheArgs(const std::vector& args) std::cerr << "loading initial cache file " << path.c_str() << "\n"; this->ReadListFile(path.c_str()); } - else if(arg.find("-M",0) == 0) + else if(arg.find("--script",0) == 0) { - std::string path = arg.substr(2); + std::string path = arg.substr(strlen("--script")); if ( path.size() == 0 ) { cmSystemTools::Error("No cmake scrpt provided."); @@ -308,7 +308,7 @@ void cmake::SetArgs(const std::vector& args) { // skip for now } - else if(arg.find("-M",0) == 0) + else if(arg.find("--script",0) == 0) { // skip for now } @@ -848,6 +848,7 @@ int cmake::DoPreConfigureChecks() cmSystemTools::Error( "The source directory does not appear to contain CMakeLists.txt.\n" "Specify --help for usage, or press the help button on the CMake GUI."); + abort(); return -2; } diff --git a/Source/cmakemain.cxx b/Source/cmakemain.cxx index 3f9433227..472ea7d4f 100644 --- a/Source/cmakemain.cxx +++ b/Source/cmakemain.cxx @@ -183,7 +183,7 @@ int do_cmake(int ac, char** av) list_all_cached = true; list_help = true; } - else if (strncmp(av[i], "-M", 2) == 0) + else if (strncmp(av[i], "--script", strlen("--script")) == 0) { script_mode = true; args.push_back(av[i]); @@ -194,6 +194,21 @@ int do_cmake(int ac, char** av) } } + if ( args.size() > 0 ) + { + std::string &arg = args[args.size()-1]; + if ( cmSystemTools::StringEndsWith(arg.c_str(), ".cmake") && + cmSystemTools::FileExists(arg.c_str()) && + !cmSystemTools::FileIsDirectory(arg.c_str()) ) + { + std::vector::iterator it = args.end(); + -- it; + std::string ar = "--script" + arg; + args.insert(it, ar); + script_mode = 1; + } + } + if(command) { int ret = cmake::CMakeCommand(args); @@ -216,7 +231,7 @@ int do_cmake(int ac, char** av) { cmCacheManager::CacheEntryType t = it.GetType(); if ( t != cmCacheManager::INTERNAL && t != cmCacheManager::STATIC && - t != cmCacheManager::UNINITIALIZED ) + t != cmCacheManager::UNINITIALIZED ) { bool advanced = it.PropertyExists("ADVANCED"); if ( list_all_cached || !advanced)