From 4666b017101de1aa9367a8c6d8ad0b8cb03a77c5 Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 8 Mar 2001 10:30:18 -0500 Subject: ENH: Added UTILITY_SOURCE command for specifying where a 3rd party utility's source is located when it is included in the distribution of a project. --- Source/cmCommands.cxx | 2 + Source/cmMakefile.cxx | 15 +++++++- Source/cmMakefile.h | 2 +- Source/cmSystemTools.cxx | 11 ++++++ Source/cmSystemTools.h | 6 +++ Source/cmUtilitySourceCommand.cxx | 81 +++++++++++++++++++++++++++++++++++++++ Source/cmUtilitySourceCommand.h | 80 ++++++++++++++++++++++++++++++++++++++ 7 files changed, 195 insertions(+), 2 deletions(-) create mode 100644 Source/cmUtilitySourceCommand.cxx create mode 100644 Source/cmUtilitySourceCommand.h diff --git a/Source/cmCommands.cxx b/Source/cmCommands.cxx index d529b09..e62f3e9 100644 --- a/Source/cmCommands.cxx +++ b/Source/cmCommands.cxx @@ -39,6 +39,7 @@ #include "cmWrapExcludeFilesCommand.cxx" #include "cmWrapTclCommand.cxx" #include "cmBuildSharedLibrariesCommand.cxx" +#include "cmUtilitySourceCommand.cxx" void GetPredefinedCommands(std::list& commands) { @@ -75,6 +76,7 @@ void GetPredefinedCommands(std::list& commands) commands.push_back(new cmWrapExcludeFilesCommand); commands.push_back(new cmWrapTclCommand); commands.push_back(new cmBuildSharedLibrariesCommand); + commands.push_back(new cmUtilitySourceCommand); } diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index 8e6bc96..4ce9322 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -29,6 +29,7 @@ cmMakefile::cmMakefile() m_DefineFlags = " "; m_MakefileGenerator = 0; this->AddDefaultCommands(); + this->AddDefaultDefinitions(); } void cmMakefile::AddDefaultCommands() @@ -523,5 +524,17 @@ void cmMakefile::GenerateCacheOnly() } } - +/** + * Add the default definitions to the makefile. These values must not + * be dependent on anything that isn't known when this cmMakefile instance + * is constructed. + */ +void cmMakefile::AddDefaultDefinitions() +{ +#if defined(_WIN32) && !defined(__CYGWIN__) + this->AddDefinition("CMAKE_CFG","$(CFG)"); +#else + this->AddDefinition("CMAKE_CFG","."); +#endif +} diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h index 51cf3c5..7dee07b 100644 --- a/Source/cmMakefile.h +++ b/Source/cmMakefile.h @@ -420,7 +420,7 @@ private: // to the m_Classes array void PrintStringVector(const char* s, std::vector& v); void AddDefaultCommands(); - + void AddDefaultDefinitions(); }; diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index 75bc616..848e7be 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -65,6 +65,17 @@ void cmSystemTools::GetPath(std::vector& path) } } + +const char* cmSystemTools::GetExecutableExtension() +{ +#if defined(_WIN32) + return ".exe"; +#else + return ""; +#endif +} + + bool cmSystemTools::MakeDirectory(const char* path) { std::string dir = path; diff --git a/Source/cmSystemTools.h b/Source/cmSystemTools.h index 6175623..da94820 100644 --- a/Source/cmSystemTools.h +++ b/Source/cmSystemTools.h @@ -86,6 +86,12 @@ public: static void GetPath(std::vector& path); /** + * Get the file extension (including ".") needed for an executable + * on the current platform ("" for unix, ".exe" for Windows). + */ + static const char* GetExecutableExtension(); + + /** * Display an error message. */ static void Error(const char* m, const char* m2=0 ); diff --git a/Source/cmUtilitySourceCommand.cxx b/Source/cmUtilitySourceCommand.cxx new file mode 100644 index 0000000..0a8c9b7 --- /dev/null +++ b/Source/cmUtilitySourceCommand.cxx @@ -0,0 +1,81 @@ +/*========================================================================= + + Program: Insight Segmentation & Registration Toolkit + Module: $RCSfile$ + Language: C++ + Date: $Date$ + Version: $Revision$ + + + Copyright (c) 2000 National Library of Medicine + All rights reserved. + + See COPYRIGHT.txt for copyright details. + +=========================================================================*/ +#include "cmUtilitySourceCommand.h" + +// cmUtilitySourceCommand +bool cmUtilitySourceCommand::Invoke(std::vector& args) +{ + if(args.size() < 3) + { + this->SetError("called with incorrect number of arguments"); + return false; + } + + std::vector::const_iterator arg = args.begin(); + + // The first argument is the cache entry name. + std::string cacheEntry = *arg++; + const char* cacheValue = + cmCacheManager::GetInstance()->GetCacheValue(cacheEntry.c_str()); + // If it exists already, we are done. + if(cacheValue) + { + // Set the makefile's definition with the cache value. + m_Makefile->AddDefinition(cacheEntry.c_str(), cacheValue); + return true; + } + + // The second argument is the utility's executable name, which will be + // needed later. + std::string utilityName = *arg++; + + // The third argument specifies the relative directory of the source + // of the utility. + std::string relativeSource = *arg++; + std::string utilitySource = m_Makefile->GetCurrentDirectory(); + utilitySource = utilitySource+"/"+relativeSource; + + // If the directory doesn't exist, the source has not been included. + if(!cmSystemTools::FileExists(utilitySource.c_str())) + { return true; } + + // Make sure all the files exist in the source directory. + while(arg != args.end()) + { + std::string file = utilitySource+"/"+*arg++; + if(!cmSystemTools::FileExists(file.c_str())) + { return true; } + } + + // The source exists. Construct the cache entry for the executable's + // location. + std::string cmakeCFG = m_Makefile->GetDefinition("CMAKE_CFG"); + std::string utilityExecutable = m_Makefile->GetCurrentOutputDirectory(); + utilityExecutable = + (utilityExecutable+"/"+relativeSource+"/"+cmakeCFG+"/" + +utilityName+cmSystemTools::GetExecutableExtension()); + + // Enter the value into the cache. + cmCacheManager::GetInstance()->AddCacheEntry(cacheEntry.c_str(), + utilityExecutable.c_str(), + cmCacheManager::FILEPATH); + + // Set the definition in the makefile. + m_Makefile->AddDefinition(cacheEntry.c_str(), utilityExecutable.c_str()); + + return true; +} + diff --git a/Source/cmUtilitySourceCommand.h b/Source/cmUtilitySourceCommand.h new file mode 100644 index 0000000..6fced25 --- /dev/null +++ b/Source/cmUtilitySourceCommand.h @@ -0,0 +1,80 @@ +/*========================================================================= + + Program: Insight Segmentation & Registration Toolkit + Module: $RCSfile$ + Language: C++ + Date: $Date$ + Version: $Revision$ + + + Copyright (c) 2000 National Library of Medicine + All rights reserved. + + See COPYRIGHT.txt for copyright details. + +=========================================================================*/ +#ifndef cmUtilitySourceCommand_h +#define cmUtilitySourceCommand_h + +#include "cmStandardIncludes.h" +#include "cmCommand.h" + +/** \class cmUtilitySourceCommand + * \brief A command to setup a cache entry with the location of a third-party + * utility's source. + * + * cmUtilitySourceCommand is used when a third-party utility's source is + * included in the project's source tree. It specifies the location of + * the executable's source, and any files that may be needed to confirm the + * identity of the source. + */ +class cmUtilitySourceCommand : public cmCommand +{ +public: + /** + * This is a virtual constructor for the command. + */ + virtual cmCommand* Clone() + { + return new cmUtilitySourceCommand; + } + + /** + * This is called when the command is first encountered in + * the CMakeLists.txt file. + */ + virtual bool Invoke(std::vector& args); + + /** + * The name of the command as specified in CMakeList.txt. + */ + virtual const char* GetName() { return "UTILITY_SOURCE";} + + /** + * Succinct documentation. + */ + virtual const char* GetTerseDocumentation() + { + return "Specify the source tree of a third-party utility."; + } + + /** + * More documentation. + */ + virtual const char* GetFullDocumentation() + { + return + "UTILITY_SOURCE(cache_entry executable_name path_to_source [file1 file2 ...])\n" + "When a third-party utility's source is included in the distribution,\n" + "this command specifies its location and name. The cache entry will\n" + "not be set unless the path_to_source and all listed files exist. It\n" + "is assumed that the source tree of the utility will have been built\n" + "before it is needed."; + } + + cmTypeMacro(cmUtilitySourceCommand, cmCommand); +}; + + + +#endif -- cgit v0.12