2000-08-29 23:26:29 +04:00
|
|
|
/*=========================================================================
|
|
|
|
|
|
|
|
Program: Insight Segmentation & Registration Toolkit
|
|
|
|
Module: $RCSfile$
|
|
|
|
Language: C++
|
|
|
|
Date: $Date$
|
|
|
|
Version: $Revision$
|
|
|
|
|
2001-04-27 16:01:17 +04:00
|
|
|
Copyright (c) 2001 Insight Consortium
|
|
|
|
All rights reserved.
|
2000-08-29 23:26:29 +04:00
|
|
|
|
2001-04-27 16:01:17 +04:00
|
|
|
Redistribution and use in source and binary forms, with or without
|
|
|
|
modification, are permitted provided that the following conditions are met:
|
2000-08-29 23:26:29 +04:00
|
|
|
|
2001-04-27 16:01:17 +04:00
|
|
|
* Redistributions of source code must retain the above copyright notice,
|
|
|
|
this list of conditions and the following disclaimer.
|
|
|
|
|
|
|
|
* Redistributions in binary form must reproduce the above copyright notice,
|
|
|
|
this list of conditions and the following disclaimer in the documentation
|
|
|
|
and/or other materials provided with the distribution.
|
|
|
|
|
|
|
|
* The name of the Insight Consortium, nor the names of any consortium members,
|
|
|
|
nor of any contributors, may be used to endorse or promote products derived
|
|
|
|
from this software without specific prior written permission.
|
|
|
|
|
|
|
|
* Modified source versions must be plainly marked as such, and must not be
|
|
|
|
misrepresented as being the original software.
|
|
|
|
|
|
|
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS''
|
|
|
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
|
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR
|
|
|
|
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
|
|
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
|
|
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
|
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
|
|
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
|
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
2000-08-29 23:26:29 +04:00
|
|
|
|
|
|
|
=========================================================================*/
|
2000-09-12 13:30:35 +04:00
|
|
|
#ifndef cmSystemTools_h
|
|
|
|
#define cmSystemTools_h
|
2000-08-29 23:26:29 +04:00
|
|
|
|
2001-01-05 19:41:20 +03:00
|
|
|
#include "cmStandardIncludes.h"
|
2000-08-29 23:26:29 +04:00
|
|
|
|
2001-01-11 22:47:38 +03:00
|
|
|
/** \class cmSystemTools
|
|
|
|
* \brief A collection of useful functions for CMake.
|
|
|
|
*
|
|
|
|
* cmSystemTools is a class that provides helper functions
|
|
|
|
* for the CMake build system.
|
|
|
|
*/
|
2000-08-29 23:26:29 +04:00
|
|
|
class cmSystemTools
|
|
|
|
{
|
|
|
|
public:
|
2000-09-12 13:30:35 +04:00
|
|
|
/**
|
|
|
|
* Make a new directory if it is not there. This function
|
|
|
|
* can make a full path even if none of the directories existed
|
|
|
|
* prior to calling this function.
|
|
|
|
*/
|
2000-08-29 23:26:29 +04:00
|
|
|
static bool MakeDirectory(const char* path);
|
2001-01-11 22:47:38 +03:00
|
|
|
|
2000-09-12 13:30:35 +04:00
|
|
|
/**
|
2001-01-11 22:47:38 +03:00
|
|
|
* Replace replace all occurances of the string in
|
|
|
|
* the source string.
|
2000-09-12 13:30:35 +04:00
|
|
|
*/
|
2000-08-29 23:26:29 +04:00
|
|
|
static void ReplaceString(std::string& source,
|
|
|
|
const char* replace,
|
|
|
|
const char* with);
|
2001-01-11 22:47:38 +03:00
|
|
|
|
2001-05-11 18:53:17 +04:00
|
|
|
/**
|
|
|
|
* Look for and replace registry values in a string
|
|
|
|
*/
|
|
|
|
static void ExpandRegistryValues(std::string& source);
|
|
|
|
|
2001-08-28 22:55:14 +04:00
|
|
|
/**
|
|
|
|
* make sure on windows that paths with // are converted to \\
|
|
|
|
*/
|
|
|
|
static std::string HandleNetworkPaths(const char*);
|
|
|
|
|
2001-04-09 18:31:36 +04:00
|
|
|
/**
|
|
|
|
* Return a string equivalent to the input string, but with all " " replaced
|
|
|
|
* with "\ " to escape the spaces.
|
|
|
|
*/
|
|
|
|
static std::string EscapeSpaces(const char*);
|
|
|
|
|
2001-06-22 18:21:08 +04:00
|
|
|
/**
|
|
|
|
* Return a string equivalent to the input string, but with all " replaced
|
|
|
|
* with \" to escape the quote
|
|
|
|
*/
|
|
|
|
static std::string EscapeQuotes(const char*);
|
|
|
|
|
2000-09-12 13:30:35 +04:00
|
|
|
/**
|
2001-05-24 21:40:46 +04:00
|
|
|
* Return a capitalized string (i.e the first letter is uppercased, all other
|
|
|
|
* are lowercased).
|
|
|
|
*/
|
2001-05-25 05:17:02 +04:00
|
|
|
static std::string Capitalized(const std::string&);
|
2001-05-24 21:40:46 +04:00
|
|
|
|
2001-09-13 01:09:02 +04:00
|
|
|
/**
|
|
|
|
* Return a lower case string
|
|
|
|
*/
|
|
|
|
static std::string LowerCase(const std::string&);
|
|
|
|
|
2001-05-24 21:40:46 +04:00
|
|
|
/**
|
2001-01-11 22:47:38 +03:00
|
|
|
* Replace Windows file system slashes with Unix-style slashes.
|
2000-09-12 13:30:35 +04:00
|
|
|
*/
|
2001-09-02 00:13:56 +04:00
|
|
|
static const char *ConvertToUnixSlashes(std::string& path);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Replace Unix file system slashes with Windows-style slashes
|
|
|
|
*/
|
|
|
|
static const char *ConvertToWindowsSlashes(std::string& path);
|
2001-06-06 01:41:16 +04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Replace Unix file system slashes with Windows-style slashes and
|
2001-09-02 00:13:56 +04:00
|
|
|
* remove any duplicate \\ slashes to clean the path.
|
2001-06-06 01:41:16 +04:00
|
|
|
*/
|
2001-09-02 00:13:56 +04:00
|
|
|
static const char *ConvertToWindowsSlashesAndCleanUp(std::string& path);
|
2001-06-06 01:41:16 +04:00
|
|
|
|
2001-02-23 03:24:43 +03:00
|
|
|
///! Return true if a file exists in the current directory.
|
2000-09-12 13:30:35 +04:00
|
|
|
static bool FileExists(const char* filename);
|
2001-01-11 22:47:38 +03:00
|
|
|
|
2000-09-12 13:30:35 +04:00
|
|
|
/**
|
2001-01-18 19:20:24 +03:00
|
|
|
* Read a CMake command (or function) from an input file. This
|
2001-01-05 19:41:20 +03:00
|
|
|
* returns the name of the function and a list of its
|
2001-10-03 01:28:55 +04:00
|
|
|
* arguments. The last argument is the name of the file that
|
|
|
|
* the ifstream points to, and is used for debug info only.
|
2000-09-12 13:30:35 +04:00
|
|
|
*/
|
2001-01-05 19:41:20 +03:00
|
|
|
static bool ParseFunction(std::ifstream&,
|
|
|
|
std::string& name,
|
2001-10-03 01:28:55 +04:00
|
|
|
std::vector<std::string>& arguments,
|
|
|
|
const char* filename);
|
2001-01-11 22:47:38 +03:00
|
|
|
|
2001-01-05 19:41:20 +03:00
|
|
|
/**
|
2001-01-11 22:47:38 +03:00
|
|
|
* Extract white-space separated arguments from a string.
|
2001-01-05 19:41:20 +03:00
|
|
|
* Double quoted strings are accepted with spaces.
|
|
|
|
* This is called by ParseFunction.
|
|
|
|
*/
|
|
|
|
static void GetArguments(std::string& line,
|
|
|
|
std::vector<std::string>& arguments);
|
2001-07-17 17:54:05 +04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Given a string, replace any escape sequences with the corresponding
|
|
|
|
* characters.
|
|
|
|
*/
|
|
|
|
static std::string RemoveEscapes(const char*);
|
|
|
|
|
2001-01-11 22:47:38 +03:00
|
|
|
|
2001-02-16 19:34:23 +03:00
|
|
|
/**
|
|
|
|
* Add the paths from the environment variable PATH to the
|
|
|
|
* string vector passed in.
|
|
|
|
*/
|
|
|
|
static void GetPath(std::vector<std::string>& path);
|
|
|
|
|
2001-03-08 18:30:18 +03:00
|
|
|
/**
|
|
|
|
* Get the file extension (including ".") needed for an executable
|
|
|
|
* on the current platform ("" for unix, ".exe" for Windows).
|
|
|
|
*/
|
|
|
|
static const char* GetExecutableExtension();
|
2001-10-29 18:19:34 +03:00
|
|
|
|
|
|
|
typedef void (*ErrorCallback)(const char*, const char*, bool&);
|
|
|
|
/**
|
|
|
|
* Set the function used by GUI's to display error messages
|
|
|
|
* Function gets passed: message as a const char*,
|
|
|
|
* title as a const char*, and a reference to bool that when
|
|
|
|
* set to false, will disable furthur messages (cancel).
|
|
|
|
*/
|
|
|
|
static void SetErrorCallback(ErrorCallback f);
|
|
|
|
|
2001-01-05 19:41:20 +03:00
|
|
|
/**
|
|
|
|
* Display an error message.
|
|
|
|
*/
|
2001-03-13 02:30:58 +03:00
|
|
|
static void Error(const char* m, const char* m2=0,
|
|
|
|
const char* m3=0, const char* m4=0);
|
2001-02-23 03:24:43 +03:00
|
|
|
|
2001-06-05 00:55:37 +04:00
|
|
|
/**
|
|
|
|
* Display a message.
|
|
|
|
*/
|
|
|
|
static void Message(const char* m, const char* title=0);
|
|
|
|
|
2001-02-23 03:24:43 +03:00
|
|
|
///! Return true if there was an error at any point.
|
|
|
|
static bool GetErrorOccuredFlag()
|
|
|
|
{
|
|
|
|
return cmSystemTools::s_ErrorOccured;
|
|
|
|
}
|
2001-06-07 22:52:29 +04:00
|
|
|
|
|
|
|
///! Set the error occured flag back to false
|
|
|
|
static void ResetErrorOccuredFlag()
|
|
|
|
{
|
|
|
|
cmSystemTools::s_ErrorOccured = false;
|
|
|
|
}
|
2001-02-23 03:24:43 +03:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Copy the source file to the destination file only
|
|
|
|
* if the two files differ.
|
|
|
|
*/
|
|
|
|
static void CopyFileIfDifferent(const char* source,
|
|
|
|
const char* destination);
|
2001-01-05 19:41:20 +03:00
|
|
|
|
2001-02-23 03:24:43 +03:00
|
|
|
///! Compare the contents of two files. Return true if different.
|
|
|
|
static bool FilesDiffer(const char* source,
|
|
|
|
const char* destination);
|
|
|
|
///! Copy a file.
|
|
|
|
static void cmCopyFile(const char* source,
|
|
|
|
const char* destination);
|
|
|
|
|
|
|
|
///! Remove a file.
|
|
|
|
static void RemoveFile(const char* source);
|
|
|
|
|
2001-04-30 22:56:06 +04:00
|
|
|
/**
|
|
|
|
* does a string indicate a true or on value ? This is not the same
|
|
|
|
* as ifdef.
|
|
|
|
*/
|
2001-04-26 18:49:12 +04:00
|
|
|
static bool IsOn(const char* val);
|
2001-02-23 03:24:43 +03:00
|
|
|
|
2001-04-30 22:56:06 +04:00
|
|
|
/**
|
|
|
|
* does a string indicate a false or off value ? Note that this is
|
|
|
|
* not the same as !IsOn(...) because there are a number of
|
|
|
|
* ambiguous values such as "/usr/local/bin" a path will result in
|
|
|
|
* IsON and IsOff both returning false. Note that the special path
|
2001-08-29 17:26:55 +04:00
|
|
|
* NOTFOUND or IGNORE will cause IsOff to return true.
|
2001-04-30 22:56:06 +04:00
|
|
|
*/
|
2001-05-09 22:53:32 +04:00
|
|
|
static bool IsOff(const char* val);
|
2001-04-30 22:56:06 +04:00
|
|
|
|
2001-09-12 03:58:22 +04:00
|
|
|
///! Find a file in the system PATH, with optional extra paths.
|
|
|
|
static std::string FindFile(const char* name,
|
|
|
|
const std::vector<std::string>& path= std::vector<std::string>());
|
|
|
|
|
2001-05-09 22:53:32 +04:00
|
|
|
///! Find an executable in the system PATH, with optional extra paths.
|
2001-05-04 00:55:18 +04:00
|
|
|
static std::string FindProgram(const char* name,
|
2001-05-09 22:53:32 +04:00
|
|
|
const std::vector<std::string>& path= std::vector<std::string>());
|
2001-05-25 05:17:02 +04:00
|
|
|
|
2001-05-09 22:53:32 +04:00
|
|
|
///! Find a library in the system PATH, with optional extra paths.
|
|
|
|
static std::string FindLibrary(const char* name,
|
|
|
|
const std::vector<std::string>& path);
|
2001-05-25 05:17:02 +04:00
|
|
|
|
2001-05-09 22:53:32 +04:00
|
|
|
///! return true if the file is a directory.
|
2001-05-04 00:55:18 +04:00
|
|
|
static bool FileIsDirectory(const char* name);
|
2001-06-21 20:01:18 +04:00
|
|
|
static void Glob(const char *directory, const char *regexp,
|
|
|
|
std::vector<std::string>& files);
|
2001-09-20 18:54:29 +04:00
|
|
|
static void GlobDirs(const char *fullPath, std::vector<std::string>& files);
|
2001-06-21 20:01:18 +04:00
|
|
|
|
2001-05-04 00:55:18 +04:00
|
|
|
static std::string GetCurrentWorkingDirectory();
|
|
|
|
static std::string GetProgramPath(const char*);
|
2001-05-25 05:17:02 +04:00
|
|
|
static void SplitProgramPath(const char* in_name,
|
|
|
|
std::string& dir,
|
|
|
|
std::string& file);
|
2001-05-04 00:55:18 +04:00
|
|
|
static std::string CollapseFullPath(const char*);
|
2001-05-25 05:17:02 +04:00
|
|
|
|
|
|
|
///! return path of a full filename (no trailing slashes).
|
|
|
|
static std::string GetFilenamePath(const std::string&);
|
|
|
|
|
|
|
|
///! return file name of a full filename (i.e. file name without path).
|
|
|
|
static std::string GetFilenameName(const std::string&);
|
|
|
|
|
|
|
|
///! return file extension of a full filename (dot included).
|
|
|
|
static std::string GetFilenameExtension(const std::string&);
|
2001-09-13 19:27:54 +04:00
|
|
|
static std::string GetFilenameShortestExtension(const std::string&);
|
2001-05-25 05:17:02 +04:00
|
|
|
|
|
|
|
///! return file name without extension of a full filename.
|
|
|
|
static std::string GetFilenameNameWithoutExtension(const std::string&);
|
2001-05-04 00:55:18 +04:00
|
|
|
|
2001-02-23 03:24:43 +03:00
|
|
|
static long int ModifiedTime(const char* filename);
|
|
|
|
|
2001-05-04 19:30:46 +04:00
|
|
|
/**
|
|
|
|
* Run an executable command and put the stdout in output.
|
|
|
|
* A temporary file is created in the binaryDir for storing the
|
|
|
|
* output because windows does not have popen.
|
2001-07-23 19:53:52 +04:00
|
|
|
*
|
|
|
|
* If verbose is false, no user-viewable output from the program
|
|
|
|
* being run will be generated.
|
2001-05-04 19:30:46 +04:00
|
|
|
*/
|
2001-07-23 19:53:52 +04:00
|
|
|
static bool RunCommand(const char* command, std::string& output,
|
|
|
|
bool verbose = true);
|
2001-08-23 19:12:19 +04:00
|
|
|
static bool RunCommand(const char* command, std::string& output,
|
|
|
|
int &retVal, bool verbose = true);
|
|
|
|
|
2001-05-04 19:30:46 +04:00
|
|
|
///! Generate a temporary file name
|
|
|
|
static std::string TemporaryFileName();
|
2001-06-22 01:53:15 +04:00
|
|
|
|
|
|
|
///! change directory the the directory specified
|
|
|
|
static int ChangeDirectory(const char* dir);
|
|
|
|
|
2001-02-23 03:24:43 +03:00
|
|
|
private:
|
|
|
|
static bool s_ErrorOccured;
|
2001-10-29 18:19:34 +03:00
|
|
|
static ErrorCallback s_ErrorCallback;
|
2000-08-29 23:26:29 +04:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|