| /*============================================================================ |
| 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] == "DIRECTORY" || 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; |
| } |
| |