diff options
Diffstat (limited to 'Source/cmGetFilenameComponentCommand.cxx')
-rw-r--r-- | Source/cmGetFilenameComponentCommand.cxx | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/Source/cmGetFilenameComponentCommand.cxx b/Source/cmGetFilenameComponentCommand.cxx new file mode 100644 index 000000000..1a31d5428 --- /dev/null +++ b/Source/cmGetFilenameComponentCommand.cxx @@ -0,0 +1,139 @@ +/*============================================================================ + CMake - Cross Platform Makefile Generator + Copyright 2000-2009 Kitware, Inc., Insight Software Consortium + + Distributed under the OSI-approved BSD License (the "License"); + see accompanying file Copyright.txt for details. + + This software is distributed WITHOUT ANY WARRANTY; without even the + implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the License for more information. +============================================================================*/ +#include "cmGetFilenameComponentCommand.h" +#include "cmSystemTools.h" + +// cmGetFilenameComponentCommand +bool cmGetFilenameComponentCommand +::InitialPass(std::vector<std::string> const& args, cmExecutionStatus &) +{ + if(args.size() < 3) + { + this->SetError("called with incorrect number of arguments"); + return false; + } + + // Check and see if the value has been stored in the cache + // already, if so use that value + if(args.size() == 4 && args[3] == "CACHE") + { + const char* cacheValue = this->Makefile->GetDefinition(args[0].c_str()); + if(cacheValue && !cmSystemTools::IsNOTFOUND(cacheValue)) + { + return true; + } + } + + std::string result; + std::string filename = args[1]; + if(filename.find("[HKEY") != filename.npos) + { + // Check the registry as the target application would view it. + cmSystemTools::KeyWOW64 view = cmSystemTools::KeyWOW64_32; + cmSystemTools::KeyWOW64 other_view = cmSystemTools::KeyWOW64_64; + if(this->Makefile->PlatformIs64Bit()) + { + view = cmSystemTools::KeyWOW64_64; + other_view = cmSystemTools::KeyWOW64_32; + } + cmSystemTools::ExpandRegistryValues(filename, view); + if(filename.find("/registry") != filename.npos) + { + std::string other = args[1]; + cmSystemTools::ExpandRegistryValues(other, other_view); + if(other.find("/registry") == other.npos) + { + filename = other; + } + } + } + std::string storeArgs; + std::string programArgs; + if (args[2] == "PATH") + { + result = cmSystemTools::GetFilenamePath(filename); + } + else if (args[2] == "NAME") + { + result = cmSystemTools::GetFilenameName(filename); + } + else if (args[2] == "PROGRAM") + { + for(unsigned int i=2; i < args.size(); ++i) + { + if(args[i] == "PROGRAM_ARGS") + { + i++; + if(i < args.size()) + { + storeArgs = args[i]; + } + } + } + cmSystemTools::SplitProgramFromArgs(filename.c_str(), + result, programArgs); + } + else if (args[2] == "EXT") + { + result = cmSystemTools::GetFilenameExtension(filename); + } + else if (args[2] == "NAME_WE") + { + result = cmSystemTools::GetFilenameWithoutExtension(filename); + } + else if (args[2] == "ABSOLUTE" || + args[2] == "REALPATH") + { + // Collapse the path to its simplest form. + // If the path given is relative evaluate it relative to the + // current source directory. + result = cmSystemTools::CollapseFullPath( + filename.c_str(), this->Makefile->GetCurrentDirectory()); + if(args[2] == "REALPATH") + { + // Resolve symlinks if possible + result = cmSystemTools::GetRealPath(result.c_str()); + } + } + else + { + std::string err = "unknown component " + args[2]; + this->SetError(err.c_str()); + return false; + } + + if(args.size() == 4 && args[3] == "CACHE") + { + if(programArgs.size() && storeArgs.size()) + { + this->Makefile->AddCacheDefinition + (storeArgs.c_str(), programArgs.c_str(), + "", args[2] == "PATH" ? cmCacheManager::FILEPATH + : cmCacheManager::STRING); + } + this->Makefile->AddCacheDefinition + (args[0].c_str(), result.c_str(), "", + args[2] == "PATH" ? cmCacheManager::FILEPATH + : cmCacheManager::STRING); + } + else + { + if(programArgs.size() && storeArgs.size()) + { + this->Makefile->AddDefinition(storeArgs.c_str(), programArgs.c_str()); + } + this->Makefile->AddDefinition(args[0].c_str(), result.c_str()); + } + + return true; +} + |