| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 |
- /*=========================================================================
- Program: CMake - Cross-Platform Makefile Generator
- Module: $RCSfile$
- Language: C++
- Date: $Date$
- Version: $Revision$
- Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved.
- See Copyright.txt or http://www.cmake.org/HTML/Copyright.html 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 "cmSourceFile.h"
- #include "cmSystemTools.h"
- // Set the name of the class and the full path to the file.
- // The class must be found in dir and end in name.cxx, name.txx,
- // name.c or it will be considered a header file only class
- // and not included in the build process
- bool cmSourceFile::SetName(const char* name, const char* dir,
- const std::vector<std::string>& sourceExts,
- const std::vector<std::string>& headerExts,
- const char* target)
- {
- this->SetProperty("HEADER_FILE_ONLY","1");
- this->SourceNameWithoutLastExtension = "";
- // Save the original name given.
- this->SourceName = name;
- // Convert the name to a full path in case the given name is a
- // relative path.
- std::string pathname = cmSystemTools::CollapseFullPath(name, dir);
- // First try and see whether the listed file can be found
- // as is without extensions added on.
- std::string hname = pathname;
- if(cmSystemTools::FileExists(hname.c_str()))
- {
- this->SourceName = cmSystemTools::GetFilenamePath(name);
- if ( this->SourceName.size() > 0 )
- {
- this->SourceName += "/";
- }
- this->SourceName += cmSystemTools::GetFilenameWithoutLastExtension(name);
- std::string::size_type pos = hname.rfind('.');
- if(pos != std::string::npos)
- {
- this->SourceExtension = hname.substr(pos+1, hname.size()-pos);
- if ( cmSystemTools::FileIsFullPath(name) )
- {
- std::string::size_type pos2 = hname.rfind('/');
- if(pos2 != std::string::npos)
- {
- this->SourceName = hname.substr(pos2+1, pos - pos2-1);
- }
- }
- }
- // See if the file is a header file
- if(std::find( headerExts.begin(), headerExts.end(),
- this->SourceExtension ) == headerExts.end())
- {
- this->SetProperty("HEADER_FILE_ONLY","0");
- }
- this->FullPath = hname;
- // Mark this as an external object file if it has the proper
- // extension. THIS CODE IS DUPLICATED IN THE OTHER SetName METHOD.
- // THESE METHODS SHOULD BE MERGED.
- if ( this->SourceExtension == "obj" || this->SourceExtension == "o" ||
- this->SourceExtension == "lo" )
- {
- this->SetProperty("EXTERNAL_OBJECT", "1");
- }
- return true;
- }
-
- // Next, try the various source extensions
- for( std::vector<std::string>::const_iterator ext = sourceExts.begin();
- ext != sourceExts.end(); ++ext )
- {
- hname = pathname;
- hname += ".";
- hname += *ext;
- if(cmSystemTools::FileExists(hname.c_str()))
- {
- this->SourceExtension = *ext;
- this->SetProperty("HEADER_FILE_ONLY","0");
- this->FullPath = hname;
- return true;
- }
- }
- // Finally, try the various header extensions
- for( std::vector<std::string>::const_iterator ext = headerExts.begin();
- ext != headerExts.end(); ++ext )
- {
- hname = pathname;
- hname += ".";
- hname += *ext;
- if(cmSystemTools::FileExists(hname.c_str()))
- {
- this->SourceExtension = *ext;
- this->FullPath = hname;
- return true;
- }
- }
- cmOStringStream e;
- e << "Cannot find source file \"" << pathname << "\"";
- if(target)
- {
- e << " for target \"" << target << "\"";
- }
- e << "\n\nTried extensions";
- for( std::vector<std::string>::const_iterator ext = sourceExts.begin();
- ext != sourceExts.end(); ++ext )
- {
- e << " ." << *ext;
- }
- for( std::vector<std::string>::const_iterator ext = headerExts.begin();
- ext != headerExts.end(); ++ext )
- {
- e << " ." << *ext;
- }
- cmSystemTools::Error(e.str().c_str());
- return false;
- }
- void cmSourceFile::SetName(const char* name, const char* dir, const char *ext,
- bool hfo)
- {
- this->SetProperty("HEADER_FILE_ONLY",(hfo ? "1" : "0"));
- this->SourceNameWithoutLastExtension = "";
- this->SourceName = name;
- std::string fname = this->SourceName;
- if(ext && strlen(ext))
- {
- fname += ".";
- fname += ext;
- }
- this->FullPath = cmSystemTools::CollapseFullPath(fname.c_str(), dir);
- cmSystemTools::ConvertToUnixSlashes(this->FullPath);
- this->SourceExtension = ext;
- // Mark this as an external object file if it has the proper
- // extension. THIS CODE IS DUPLICATED IN THE OTHER SetName METHOD.
- // THESE METHODS SHOULD BE MERGED.
- if ( this->SourceExtension == "obj" || this->SourceExtension == "o" ||
- this->SourceExtension == "lo" )
- {
- this->SetProperty("EXTERNAL_OBJECT", "1");
- }
- return;
- }
- void cmSourceFile::Print() const
- {
- std::cerr << "this->FullPath: " << this->FullPath << "\n";
- std::cerr << "this->SourceName: " << this->SourceName << std::endl;
- std::cerr << "this->SourceExtension: " << this->SourceExtension << "\n";
- }
- void cmSourceFile::SetProperty(const char* prop, const char* value)
- {
- if (!prop)
- {
- return;
- }
- if (!value)
- {
- value = "NOTFOUND";
- }
- this->Properties[prop] = value;
- }
- const char *cmSourceFile::GetProperty(const char* prop) const
- {
- // watch for special "computed" properties that are dependent on other
- // properties or variables, always recompute them
- if (!strcmp(prop,"LOCATION"))
- {
- return this->FullPath.c_str();
- }
- std::map<cmStdString,cmStdString>::const_iterator i =
- this->Properties.find(prop);
- if (i != this->Properties.end())
- {
- return i->second.c_str();
- }
- return 0;
- }
- bool cmSourceFile::GetPropertyAsBool(const char* prop) const
- {
- std::map<cmStdString,cmStdString>::const_iterator i =
- this->Properties.find(prop);
- if (i != this->Properties.end())
- {
- return cmSystemTools::IsOn(i->second.c_str());
- }
- return false;
- }
- void cmSourceFile::SetCustomCommand(cmCustomCommand* cc)
- {
- if(this->CustomCommand)
- {
- delete this->CustomCommand;
- }
- this->CustomCommand = cc;
- }
- const std::string& cmSourceFile::GetSourceNameWithoutLastExtension()
- {
- if ( this->SourceNameWithoutLastExtension.empty() )
- {
- this->SourceNameWithoutLastExtension =
- cmSystemTools::GetFilenameWithoutLastExtension(this->FullPath);
- }
- return this->SourceNameWithoutLastExtension;
- }
|