|
|
@@ -17,39 +17,34 @@
|
|
|
#include "cmake.h"
|
|
|
#include "time.h"
|
|
|
#include "cmCacheManager.h"
|
|
|
+#include "cmMakefile.h"
|
|
|
+#include "cmLocalGenerator.h"
|
|
|
|
|
|
// include the generator
|
|
|
#if defined(_WIN32) && !defined(__CYGWIN__)
|
|
|
-#include "cmMSProjectGenerator.h"
|
|
|
-#include "cmMSDotNETGenerator.h"
|
|
|
-#include "cmBorlandMakefileGenerator.h"
|
|
|
-#include "cmNMakeMakefileGenerator.h"
|
|
|
+#include "cmGlobalVisualStudio6Generator.h"
|
|
|
+#include "cmGlobalVisualStudio7Generator.h"
|
|
|
+#include "cmGlobalBorlandMakefileGenerator.h"
|
|
|
+#include "cmGlobalNMakeMakefileGenerator.h"
|
|
|
#else
|
|
|
-#include "cmUnixMakefileGenerator.h"
|
|
|
+#include "cmGlobalUnixMakefileGenerator.h"
|
|
|
#endif
|
|
|
|
|
|
cmake::cmake()
|
|
|
{
|
|
|
m_Verbose = false;
|
|
|
-#if defined(_WIN32) && !defined(__CYGWIN__)
|
|
|
- this->RegisterGenerator(new cmMSProjectGenerator);
|
|
|
- this->RegisterGenerator(new cmMSDotNETGenerator);
|
|
|
- this->RegisterGenerator(new cmNMakeMakefileGenerator);
|
|
|
- this->RegisterGenerator(new cmBorlandMakefileGenerator);
|
|
|
-#else
|
|
|
- this->RegisterGenerator(new cmUnixMakefileGenerator);
|
|
|
-#endif
|
|
|
+ m_CacheManager = new cmCacheManager;
|
|
|
+ m_GlobalGenerator = 0;
|
|
|
}
|
|
|
|
|
|
cmake::~cmake()
|
|
|
{
|
|
|
- for(std::map<cmStdString, cmMakefileGenerator*>::iterator i
|
|
|
- = m_RegisteredGenerators.begin();
|
|
|
- i != m_RegisteredGenerators.end(); ++i)
|
|
|
+ delete m_CacheManager;
|
|
|
+ if (m_GlobalGenerator)
|
|
|
{
|
|
|
- delete i->second;
|
|
|
+ delete m_GlobalGenerator;
|
|
|
+ m_GlobalGenerator = 0;
|
|
|
}
|
|
|
- m_RegisteredGenerators = std::map<cmStdString, cmMakefileGenerator*>();
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -79,8 +74,7 @@ void cmake::Usage(const char* program)
|
|
|
}
|
|
|
|
|
|
// Parse the args
|
|
|
-void cmake::SetCacheArgs(cmMakefile& builder,
|
|
|
- const std::vector<std::string>& args)
|
|
|
+void cmake::SetCacheArgs(const std::vector<std::string>& args)
|
|
|
{
|
|
|
for(unsigned int i=1; i < args.size(); ++i)
|
|
|
{
|
|
|
@@ -92,9 +86,7 @@ void cmake::SetCacheArgs(cmMakefile& builder,
|
|
|
cmCacheManager::CacheEntryType type;
|
|
|
if(cmCacheManager::ParseEntry(entry.c_str(), var, value, type))
|
|
|
{
|
|
|
- this->m_CacheManager.AddCacheEntry(
|
|
|
- var.c_str(),
|
|
|
- value.c_str(),
|
|
|
+ this->m_CacheManager->AddCacheEntry(var.c_str(), value.c_str(),
|
|
|
"No help, variable specified on the command line.",
|
|
|
type);
|
|
|
}
|
|
|
@@ -108,17 +100,46 @@ void cmake::SetCacheArgs(cmMakefile& builder,
|
|
|
{
|
|
|
std::string path = arg.substr(2);
|
|
|
std::cerr << "loading initial cache file " << path.c_str() << "\n";
|
|
|
- if(!builder.ReadListFile(path.c_str()))
|
|
|
- {
|
|
|
- std::cerr << "Error in reading cmake initial cache file:"
|
|
|
- << path.c_str() << "\n";
|
|
|
- }
|
|
|
+ this->ReadListFile(path.c_str());
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void cmake::ReadListFile(const char *path)
|
|
|
+{
|
|
|
+ // if a generator was not yet created, temporarily create one
|
|
|
+ cmGlobalGenerator *gg = this->GetGlobalGenerator();
|
|
|
+ bool created;
|
|
|
+
|
|
|
+ // if a generator was not specified use a generic one
|
|
|
+ if (!gg)
|
|
|
+ {
|
|
|
+ gg = new cmGlobalGenerator;
|
|
|
+ gg->SetCMakeInstance(this);
|
|
|
+ created = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ // read in the list file to fill the cache
|
|
|
+ if(path)
|
|
|
+ {
|
|
|
+ cmLocalGenerator *lg = gg->CreateLocalGenerator();
|
|
|
+ lg->SetGlobalGenerator(gg);
|
|
|
+ if (!lg->GetMakefile()->ReadListFile(path))
|
|
|
+ {
|
|
|
+ std::cerr << "Error in reading cmake initial cache file:"
|
|
|
+ << path << "\n";
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ // free generic one if generated
|
|
|
+ if (created)
|
|
|
+ {
|
|
|
+ delete gg;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// Parse the args
|
|
|
-void cmake::SetArgs(cmMakefile& builder, const std::vector<std::string>& args)
|
|
|
+void cmake::SetArgs(const std::vector<std::string>& args)
|
|
|
{
|
|
|
m_Local = false;
|
|
|
bool directoriesSet = false;
|
|
|
@@ -126,22 +147,22 @@ void cmake::SetArgs(cmMakefile& builder, const std::vector<std::string>& args)
|
|
|
if (args.size() <= 2)
|
|
|
{
|
|
|
directoriesSet = true;
|
|
|
- builder.SetHomeOutputDirectory
|
|
|
+ this->SetHomeOutputDirectory
|
|
|
(cmSystemTools::GetCurrentWorkingDirectory().c_str());
|
|
|
- builder.SetStartOutputDirectory
|
|
|
+ this->SetStartOutputDirectory
|
|
|
(cmSystemTools::GetCurrentWorkingDirectory().c_str());
|
|
|
if (args.size() == 2)
|
|
|
{
|
|
|
- builder.SetHomeDirectory
|
|
|
+ this->SetHomeDirectory
|
|
|
(cmSystemTools::CollapseFullPath(args[1].c_str()).c_str());
|
|
|
- builder.SetStartDirectory
|
|
|
+ this->SetStartDirectory
|
|
|
(cmSystemTools::CollapseFullPath(args[1].c_str()).c_str());
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- builder.SetHomeDirectory
|
|
|
+ this->SetHomeDirectory
|
|
|
(cmSystemTools::GetCurrentWorkingDirectory().c_str());
|
|
|
- builder.SetStartDirectory
|
|
|
+ this->SetStartDirectory
|
|
|
(cmSystemTools::GetCurrentWorkingDirectory().c_str());
|
|
|
}
|
|
|
}
|
|
|
@@ -153,26 +174,26 @@ void cmake::SetArgs(cmMakefile& builder, const std::vector<std::string>& args)
|
|
|
{
|
|
|
directoriesSet = true;
|
|
|
std::string path = arg.substr(2);
|
|
|
- builder.SetHomeDirectory(path.c_str());
|
|
|
+ this->SetHomeDirectory(path.c_str());
|
|
|
}
|
|
|
else if(arg.find("-S",0) == 0)
|
|
|
{
|
|
|
directoriesSet = true;
|
|
|
m_Local = true;
|
|
|
std::string path = arg.substr(2);
|
|
|
- builder.SetStartDirectory(path.c_str());
|
|
|
+ this->SetStartDirectory(path.c_str());
|
|
|
}
|
|
|
else if(arg.find("-O",0) == 0)
|
|
|
{
|
|
|
directoriesSet = true;
|
|
|
std::string path = arg.substr(2);
|
|
|
- builder.SetStartOutputDirectory(path.c_str());
|
|
|
+ this->SetStartOutputDirectory(path.c_str());
|
|
|
}
|
|
|
else if(arg.find("-B",0) == 0)
|
|
|
{
|
|
|
directoriesSet = true;
|
|
|
std::string path = arg.substr(2);
|
|
|
- builder.SetHomeOutputDirectory(path.c_str());
|
|
|
+ this->SetHomeOutputDirectory(path.c_str());
|
|
|
}
|
|
|
else if(arg.find("-V",0) == 0)
|
|
|
{
|
|
|
@@ -189,8 +210,8 @@ void cmake::SetArgs(cmMakefile& builder, const std::vector<std::string>& args)
|
|
|
else if(arg.find("-G",0) == 0)
|
|
|
{
|
|
|
std::string value = arg.substr(2);
|
|
|
- cmMakefileGenerator* gen =
|
|
|
- this->CreateGenerator(value.c_str());
|
|
|
+ cmGlobalGenerator* gen =
|
|
|
+ this->CreateGlobalGenerator(value.c_str());
|
|
|
if(!gen)
|
|
|
{
|
|
|
cmSystemTools::Error("Could not create named generator ",
|
|
|
@@ -198,47 +219,47 @@ void cmake::SetArgs(cmMakefile& builder, const std::vector<std::string>& args)
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- builder.SetMakefileGenerator(gen);
|
|
|
+ this->SetGlobalGenerator(gen);
|
|
|
}
|
|
|
}
|
|
|
// no option assume it is the path to the source
|
|
|
else
|
|
|
{
|
|
|
directoriesSet = true;
|
|
|
- builder.SetHomeOutputDirectory
|
|
|
+ this->SetHomeOutputDirectory
|
|
|
(cmSystemTools::GetCurrentWorkingDirectory().c_str());
|
|
|
- builder.SetStartOutputDirectory
|
|
|
+ this->SetStartOutputDirectory
|
|
|
(cmSystemTools::GetCurrentWorkingDirectory().c_str());
|
|
|
- builder.SetHomeDirectory
|
|
|
+ this->SetHomeDirectory
|
|
|
(cmSystemTools::CollapseFullPath(arg.c_str()).c_str());
|
|
|
- builder.SetStartDirectory
|
|
|
+ this->SetStartDirectory
|
|
|
(cmSystemTools::CollapseFullPath(arg.c_str()).c_str());
|
|
|
}
|
|
|
}
|
|
|
if(!directoriesSet)
|
|
|
{
|
|
|
- builder.SetHomeOutputDirectory
|
|
|
+ this->SetHomeOutputDirectory
|
|
|
(cmSystemTools::GetCurrentWorkingDirectory().c_str());
|
|
|
- builder.SetStartOutputDirectory
|
|
|
+ this->SetStartOutputDirectory
|
|
|
(cmSystemTools::GetCurrentWorkingDirectory().c_str());
|
|
|
- builder.SetHomeDirectory
|
|
|
+ this->SetHomeDirectory
|
|
|
(cmSystemTools::GetCurrentWorkingDirectory().c_str());
|
|
|
- builder.SetStartDirectory
|
|
|
+ this->SetStartDirectory
|
|
|
(cmSystemTools::GetCurrentWorkingDirectory().c_str());
|
|
|
}
|
|
|
if (!m_Local)
|
|
|
{
|
|
|
- builder.SetStartDirectory(builder.GetHomeDirectory());
|
|
|
- builder.SetStartOutputDirectory(builder.GetHomeOutputDirectory());
|
|
|
+ this->SetStartDirectory(this->GetHomeDirectory());
|
|
|
+ this->SetStartOutputDirectory(this->GetHomeOutputDirectory());
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// at the end of this CMAKE_ROOT and CMAKE_COMMAND should be added to the cache
|
|
|
-int cmake::AddCMakePaths(const std::vector<std::string>& args)
|
|
|
+int cmake::AddCMakePaths(const char *arg0)
|
|
|
{
|
|
|
// Find our own executable.
|
|
|
std::vector<cmStdString> failures;
|
|
|
- std::string cMakeSelf = args[0];
|
|
|
+ std::string cMakeSelf = arg0;
|
|
|
cmSystemTools::ConvertToUnixSlashes(cMakeSelf);
|
|
|
failures.push_back(cMakeSelf);
|
|
|
cMakeSelf = cmSystemTools::FindProgram(cMakeSelf.c_str());
|
|
|
@@ -268,7 +289,7 @@ int cmake::AddCMakePaths(const std::vector<std::string>& args)
|
|
|
failures.push_back(cMakeSelf);
|
|
|
cmStringStream msg;
|
|
|
msg << "CMAKE can not find the command line program cmake.\n";
|
|
|
- msg << " argv[0] = \"" << args[0].c_str() << "\"\n";
|
|
|
+ msg << " argv[0] = \"" << arg0 << "\"\n";
|
|
|
msg << " Attempted paths:\n";
|
|
|
std::vector<cmStdString>::iterator i;
|
|
|
for(i=failures.begin(); i != failures.end(); ++i)
|
|
|
@@ -279,7 +300,7 @@ int cmake::AddCMakePaths(const std::vector<std::string>& args)
|
|
|
return 0;
|
|
|
}
|
|
|
// Save the value in the cache
|
|
|
- this->m_CacheManager.AddCacheEntry
|
|
|
+ this->m_CacheManager->AddCacheEntry
|
|
|
("CMAKE_COMMAND",cMakeSelf.c_str(), "Path to CMake executable.",
|
|
|
cmCacheManager::INTERNAL);
|
|
|
|
|
|
@@ -293,7 +314,7 @@ int cmake::AddCMakePaths(const std::vector<std::string>& args)
|
|
|
}
|
|
|
if(cmSystemTools::FileExists(editCacheCommand.c_str()))
|
|
|
{
|
|
|
- this->m_CacheManager.AddCacheEntry
|
|
|
+ this->m_CacheManager->AddCacheEntry
|
|
|
("CMAKE_EDIT_COMMAND", editCacheCommand.c_str(),
|
|
|
"Path to cache edit program executable.", cmCacheManager::INTERNAL);
|
|
|
}
|
|
|
@@ -363,7 +384,7 @@ int cmake::AddCMakePaths(const std::vector<std::string>& args)
|
|
|
modules.c_str());
|
|
|
return 0;
|
|
|
}
|
|
|
- this->m_CacheManager.AddCacheEntry
|
|
|
+ this->m_CacheManager->AddCacheEntry
|
|
|
("CMAKE_ROOT", cMakeRoot.c_str(),
|
|
|
"Path to CMake installation.", cmCacheManager::INTERNAL);
|
|
|
return 1;
|
|
|
@@ -371,182 +392,6 @@ int cmake::AddCMakePaths(const std::vector<std::string>& args)
|
|
|
|
|
|
|
|
|
|
|
|
-int cmake::Generate(const std::vector<std::string>& args, bool buildMakefiles)
|
|
|
-{
|
|
|
- if(args.size() == 1 && !cmSystemTools::FileExists("CMakeLists.txt"))
|
|
|
- {
|
|
|
- this->Usage(args[0].c_str());
|
|
|
- return -1;
|
|
|
- }
|
|
|
- // look for obvious request for help
|
|
|
- for(unsigned int i=1; i < args.size(); ++i)
|
|
|
- {
|
|
|
- std::string arg = args[i];
|
|
|
- if(arg.find("-help",0) != std::string::npos ||
|
|
|
- arg.find("--help",0) != std::string::npos ||
|
|
|
- arg.find("/?",0) != std::string::npos ||
|
|
|
- arg.find("-usage",0) != std::string::npos)
|
|
|
- {
|
|
|
- this->Usage(args[0].c_str());
|
|
|
- return -1;
|
|
|
- }
|
|
|
- }
|
|
|
- // Create a makefile
|
|
|
- cmMakefile mf;
|
|
|
- mf.SetCacheManager(&this->m_CacheManager);
|
|
|
-
|
|
|
- // extract the directory arguments, could create a Generator
|
|
|
- this->SetArgs(mf, args);
|
|
|
- // Read and parse the input makefile
|
|
|
- mf.MakeStartDirectoriesCurrent();
|
|
|
- this->m_CacheManager.LoadCache(&mf);
|
|
|
- if(mf.GetDefinition("CMAKE_HOME_DIRECTORY"))
|
|
|
- {
|
|
|
- std::string cacheStart = mf.GetDefinition("CMAKE_HOME_DIRECTORY");
|
|
|
- cacheStart += "/CMakeLists.txt";
|
|
|
- std::string currentStart = mf.GetHomeDirectory();
|
|
|
- currentStart += "/CMakeLists.txt";
|
|
|
- if(!cmSystemTools::SameFile(cacheStart.c_str(), currentStart.c_str()))
|
|
|
- {
|
|
|
- std::string message = "Error: source : ";
|
|
|
- message += currentStart;
|
|
|
- message += "\nDoes not match source used to generate cache: ";
|
|
|
- message += cacheStart;
|
|
|
- message += "\nRe-run cmake with a different source directory.";
|
|
|
- cmSystemTools::Error(message.c_str());
|
|
|
- return -2;
|
|
|
- }
|
|
|
- }
|
|
|
- mf.AddCacheDefinition("CMAKE_HOME_DIRECTORY", mf.GetHomeDirectory(),
|
|
|
- "Start directory with the top level CMakeLists.txt file for this project",
|
|
|
- cmCacheManager::INTERNAL);
|
|
|
-
|
|
|
- // extract command line arguments that might add cache entries
|
|
|
- this->SetCacheArgs(mf, args);
|
|
|
-
|
|
|
- // no generator specified on the command line
|
|
|
- if(!mf.GetMakefileGenerator())
|
|
|
- {
|
|
|
- cmMakefileGenerator* gen;
|
|
|
- const char* genName = mf.GetDefinition("CMAKE_GENERATOR");
|
|
|
- if(genName)
|
|
|
- {
|
|
|
- gen = this->CreateGenerator(genName);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
-#if defined(__BORLANDC__)
|
|
|
- gen = new cmBorlandMakefileGenerator;
|
|
|
-#elif defined(_WIN32) && !defined(__CYGWIN__)
|
|
|
- gen = new cmMSProjectGenerator;
|
|
|
-#else
|
|
|
- gen = new cmUnixMakefileGenerator;
|
|
|
-#endif
|
|
|
- }
|
|
|
- if(!gen)
|
|
|
- {
|
|
|
- cmSystemTools::Error("Could not create generator");
|
|
|
- return -1;
|
|
|
- }
|
|
|
- mf.SetMakefileGenerator(gen);
|
|
|
- // add the
|
|
|
- }
|
|
|
- cmMakefileGenerator* gen = mf.GetMakefileGenerator();
|
|
|
- gen->SetLocal(m_Local);
|
|
|
- const char* genName = mf.GetDefinition("CMAKE_GENERATOR");
|
|
|
- if(genName)
|
|
|
- {
|
|
|
- if(strcmp(gen->GetName(), genName) != 0)
|
|
|
- {
|
|
|
- std::string message = "Error: generator : ";
|
|
|
- message += gen->GetName();
|
|
|
- message += "\nDoes not match the generator used previously: ";
|
|
|
- message += genName;
|
|
|
- message +=
|
|
|
- "\nEither remove the CMakeCache.txt file or choose a different"
|
|
|
- " binary directory.";
|
|
|
- cmSystemTools::Error(message.c_str());
|
|
|
- return -2;
|
|
|
- }
|
|
|
- }
|
|
|
- if(!mf.GetDefinition("CMAKE_GENERATOR"))
|
|
|
- {
|
|
|
- mf.AddCacheDefinition("CMAKE_GENERATOR",
|
|
|
- gen->GetName(),
|
|
|
- "Name of generator.",
|
|
|
- cmCacheManager::INTERNAL);
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- // setup CMAKE_ROOT and CMAKE_COMMAND
|
|
|
- if(!this->AddCMakePaths(args))
|
|
|
- {
|
|
|
- return -3;
|
|
|
- }
|
|
|
-
|
|
|
- // reset any system configuration information
|
|
|
- cmMakefileGenerator::ClearEnabledLanguages();
|
|
|
-
|
|
|
- std::string lf = mf.GetStartDirectory();
|
|
|
- lf += "/CMakeLists.txt";
|
|
|
- if(!mf.ReadListFile(lf.c_str()))
|
|
|
- {
|
|
|
- this->Usage(args[0].c_str());
|
|
|
- return -1;
|
|
|
- }
|
|
|
- // if buildMakefiles, then call GenerateMakefile
|
|
|
- if(buildMakefiles)
|
|
|
- {
|
|
|
- mf.GenerateMakefile();
|
|
|
- }
|
|
|
- else // do not build, but let the commands finalize
|
|
|
- {
|
|
|
- std::vector<cmMakefile*> makefiles;
|
|
|
- mf.FindSubDirectoryCMakeListsFiles(makefiles);
|
|
|
- for(std::vector<cmMakefile*>::iterator i = makefiles.begin();
|
|
|
- i != makefiles.end(); ++i)
|
|
|
- {
|
|
|
- cmMakefile* mf = *i;
|
|
|
- mf->FinalPass();
|
|
|
- delete mf;
|
|
|
- }
|
|
|
- mf.FinalPass();
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- // Before saving the cache
|
|
|
- // if the project did not define one of the entries below, add them now
|
|
|
- // so users can edit the values in the cache:
|
|
|
- // LIBRARY_OUTPUT_PATH
|
|
|
- // EXECUTABLE_OUTPUT_PATH
|
|
|
- if(!this->m_CacheManager.GetCacheValue("LIBRARY_OUTPUT_PATH"))
|
|
|
- {
|
|
|
- this->m_CacheManager.AddCacheEntry("LIBRARY_OUTPUT_PATH", "",
|
|
|
- "Single output directory for building all libraries.",
|
|
|
- cmCacheManager::PATH);
|
|
|
- }
|
|
|
- if(!this->m_CacheManager.GetCacheValue("EXECUTABLE_OUTPUT_PATH"))
|
|
|
- {
|
|
|
- this->m_CacheManager.AddCacheEntry("EXECUTABLE_OUTPUT_PATH", "",
|
|
|
- "Single output directory for building all executables.",
|
|
|
- cmCacheManager::PATH);
|
|
|
- }
|
|
|
-
|
|
|
- this->m_CacheManager.SaveCache(&mf);
|
|
|
-
|
|
|
- if(m_Verbose)
|
|
|
- {
|
|
|
- this->m_CacheManager.PrintCache(std::cout);
|
|
|
- }
|
|
|
-
|
|
|
- if(cmSystemTools::GetErrorOccuredFlag())
|
|
|
- {
|
|
|
- return -1;
|
|
|
- }
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
void CMakeCommandUsage(const char* program)
|
|
|
{
|
|
|
cmStringStream errorStream;
|
|
|
@@ -678,39 +523,291 @@ int cmake::CMakeCommand(std::vector<std::string>& args)
|
|
|
|
|
|
void cmake::GetRegisteredGenerators(std::vector<std::string>& names)
|
|
|
{
|
|
|
- for(std::map<cmStdString, cmMakefileGenerator*>::iterator i
|
|
|
- = this->m_RegisteredGenerators.begin();
|
|
|
- i != this->m_RegisteredGenerators.end(); ++i)
|
|
|
+#if defined(_WIN32) && !defined(__CYGWIN__)
|
|
|
+ names.push_back(cmGlobalVisualStudio6Generator::GetActualName());
|
|
|
+ names.push_back(cmGlobalVisualStudio7Generator::GetActualName());
|
|
|
+ names.push_back(cmGlobalBorlandMakefileGenerator::GetActualName());
|
|
|
+ names.push_back(cmGlobalNMakeMakefileGenerator::GetActualName());
|
|
|
+#else
|
|
|
+ names.push_back(cmGlobalUnixMakefileGenerator::GetActualName());
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
+cmGlobalGenerator* cmake::CreateGlobalGenerator(const char* name)
|
|
|
+{
|
|
|
+ cmGlobalGenerator *ret = 0;
|
|
|
+#if defined(_WIN32) && !defined(__CYGWIN__)
|
|
|
+ if (!strcmp(name,cmGlobalNMakeMakefileGenerator::GetActualName()))
|
|
|
+ {
|
|
|
+ ret = new cmGlobalNMakeMakefileGenerator;
|
|
|
+ ret->SetCMakeInstance(this);
|
|
|
+ }
|
|
|
+ if (!strcmp(name,cmGlobalVisualStudio6Generator::GetActualName()))
|
|
|
+ {
|
|
|
+ ret = new cmGlobalVisualStudio6Generator;
|
|
|
+ ret->SetCMakeInstance(this);
|
|
|
+ }
|
|
|
+ if (!strcmp(name,cmGlobalVisualStudio7Generator::GetActualName()))
|
|
|
+ {
|
|
|
+ ret = new cmGlobalVisualStudio7Generator;
|
|
|
+ ret->SetCMakeInstance(this);
|
|
|
+ }
|
|
|
+ if (!strcmp(name,cmGlobalBorlandMakefileGenerator::GetActualName()))
|
|
|
+ {
|
|
|
+ ret = new cmGlobalBorlandMakefileGenerator;
|
|
|
+ ret->SetCMakeInstance(this);
|
|
|
+ }
|
|
|
+#else
|
|
|
+ if (!strcmp(name,cmGlobalUnixMakefileGenerator::GetActualName()))
|
|
|
{
|
|
|
- names.push_back(i->first);
|
|
|
+ ret = new cmGlobalUnixMakefileGenerator;
|
|
|
+ ret->SetCMakeInstance(this);
|
|
|
}
|
|
|
+#endif
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
+void cmake::SetHomeDirectory(const char* dir)
|
|
|
+{
|
|
|
+ m_cmHomeDirectory = dir;
|
|
|
+ cmSystemTools::ConvertToUnixSlashes(m_cmHomeDirectory);
|
|
|
+}
|
|
|
|
|
|
-void cmake::RegisterGenerator(cmMakefileGenerator* mg)
|
|
|
+void cmake::SetHomeOutputDirectory(const char* lib)
|
|
|
{
|
|
|
- std::map<cmStdString, cmMakefileGenerator*>::iterator i =
|
|
|
- this->m_RegisteredGenerators.find(mg->GetName());
|
|
|
- // delete re-registered objects
|
|
|
- if(i != this->m_RegisteredGenerators.end())
|
|
|
+ m_HomeOutputDirectory = lib;
|
|
|
+ cmSystemTools::ConvertToUnixSlashes(m_HomeOutputDirectory);
|
|
|
+}
|
|
|
+
|
|
|
+void cmake::SetGlobalGenerator(cmGlobalGenerator *gg)
|
|
|
+{
|
|
|
+ // delete the old generator
|
|
|
+ if (m_GlobalGenerator)
|
|
|
{
|
|
|
- delete i->second;
|
|
|
+ delete m_GlobalGenerator;
|
|
|
}
|
|
|
- this->m_RegisteredGenerators[mg->GetName()] = mg;
|
|
|
+ // set the new
|
|
|
+ m_GlobalGenerator = gg;
|
|
|
+ // set the cmake instance just to be sure
|
|
|
+ gg->SetCMakeInstance(this);
|
|
|
}
|
|
|
|
|
|
-cmMakefileGenerator* cmake::CreateGenerator(const char* name)
|
|
|
+int cmake::Configure(const char *arg0, const std::vector<std::string>* args)
|
|
|
{
|
|
|
- std::map<cmStdString, cmMakefileGenerator*>::iterator i;
|
|
|
- for(i = this->m_RegisteredGenerators.begin();
|
|
|
- i != this->m_RegisteredGenerators.end(); ++i)
|
|
|
+ // Read in the cache
|
|
|
+ m_CacheManager->LoadCache(this->GetHomeOutputDirectory());
|
|
|
+ if(m_CacheManager->GetCacheValue("CMAKE_HOME_DIRECTORY"))
|
|
|
+ {
|
|
|
+ std::string cacheStart =
|
|
|
+ m_CacheManager->GetCacheValue("CMAKE_HOME_DIRECTORY");
|
|
|
+ cacheStart += "/CMakeLists.txt";
|
|
|
+ std::string currentStart = this->GetHomeDirectory();
|
|
|
+ currentStart += "/CMakeLists.txt";
|
|
|
+ if(!cmSystemTools::SameFile(cacheStart.c_str(), currentStart.c_str()))
|
|
|
+ {
|
|
|
+ std::string message = "Error: source : ";
|
|
|
+ message += currentStart;
|
|
|
+ message += "\nDoes not match source used to generate cache: ";
|
|
|
+ message += cacheStart;
|
|
|
+ message += "\nRe-run cmake with a different source directory.";
|
|
|
+ cmSystemTools::Error(message.c_str());
|
|
|
+ return -2;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ m_CacheManager->AddCacheEntry("CMAKE_HOME_DIRECTORY",
|
|
|
+ this->GetHomeDirectory(),
|
|
|
+ "Start directory with the top level CMakeLists.txt file for this project",
|
|
|
+ cmCacheManager::INTERNAL);
|
|
|
+ }
|
|
|
+
|
|
|
+ // extract command line arguments that might add cache entries
|
|
|
+ if (args)
|
|
|
+ {
|
|
|
+ this->SetCacheArgs(*args);
|
|
|
+ }
|
|
|
+
|
|
|
+ // setup CMAKE_ROOT and CMAKE_COMMAND
|
|
|
+ if(!this->AddCMakePaths(arg0))
|
|
|
+ {
|
|
|
+ return -3;
|
|
|
+ }
|
|
|
+
|
|
|
+ // no generator specified on the command line
|
|
|
+ if(!m_GlobalGenerator)
|
|
|
+ {
|
|
|
+ const char* genName = m_CacheManager->GetCacheValue("CMAKE_GENERATOR");
|
|
|
+ if(genName)
|
|
|
+ {
|
|
|
+ m_GlobalGenerator = this->CreateGlobalGenerator(genName);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+#if defined(__BORLANDC__)
|
|
|
+ this->SetGlobalGenerator(new cmGlobalBorlandMakefileGenerator);
|
|
|
+#elif defined(_WIN32) && !defined(__CYGWIN__)
|
|
|
+ this->SetGlobalGenerator(new cmGlobalVisualStudio6Generator);
|
|
|
+#else
|
|
|
+ this->SetGlobalGenerator(new cmGlobalUnixMakefileGenerator);
|
|
|
+#endif
|
|
|
+ }
|
|
|
+ if(!m_GlobalGenerator)
|
|
|
+ {
|
|
|
+ cmSystemTools::Error("Could not create generator");
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ const char* genName = m_CacheManager->GetCacheValue("CMAKE_GENERATOR");
|
|
|
+ if(genName)
|
|
|
{
|
|
|
- cmMakefileGenerator* gen = i->second;
|
|
|
- if(strcmp(name, gen->GetName()) == 0)
|
|
|
+ if(strcmp(m_GlobalGenerator->GetName(), genName) != 0)
|
|
|
{
|
|
|
- return gen->CreateObject();
|
|
|
+ std::string message = "Error: generator : ";
|
|
|
+ message += m_GlobalGenerator->GetName();
|
|
|
+ message += "\nDoes not match the generator used previously: ";
|
|
|
+ message += genName;
|
|
|
+ message +=
|
|
|
+ "\nEither remove the CMakeCache.txt file or choose a different"
|
|
|
+ " binary directory.";
|
|
|
+ cmSystemTools::Error(message.c_str());
|
|
|
+ return -2;
|
|
|
}
|
|
|
}
|
|
|
+ if(!m_CacheManager->GetCacheValue("CMAKE_GENERATOR"))
|
|
|
+ {
|
|
|
+ m_CacheManager->AddCacheEntry("CMAKE_GENERATOR", m_GlobalGenerator->GetName(),
|
|
|
+ "Name of generator.",
|
|
|
+ cmCacheManager::INTERNAL);
|
|
|
+ }
|
|
|
+
|
|
|
+ // reset any system configuration information
|
|
|
+ m_GlobalGenerator->ClearEnabledLanguages();
|
|
|
+
|
|
|
+ // actually do the configure
|
|
|
+ m_GlobalGenerator->Configure();
|
|
|
+
|
|
|
+ // Before saving the cache
|
|
|
+ // if the project did not define one of the entries below, add them now
|
|
|
+ // so users can edit the values in the cache:
|
|
|
+ // LIBRARY_OUTPUT_PATH
|
|
|
+ // EXECUTABLE_OUTPUT_PATH
|
|
|
+ if(!m_CacheManager->GetCacheValue("LIBRARY_OUTPUT_PATH"))
|
|
|
+ {
|
|
|
+ m_CacheManager->AddCacheEntry("LIBRARY_OUTPUT_PATH", "",
|
|
|
+ "Single output directory for building all libraries.",
|
|
|
+ cmCacheManager::PATH);
|
|
|
+ }
|
|
|
+ if(!m_CacheManager->GetCacheValue("EXECUTABLE_OUTPUT_PATH"))
|
|
|
+ {
|
|
|
+ m_CacheManager->AddCacheEntry("EXECUTABLE_OUTPUT_PATH", "",
|
|
|
+ "Single output directory for building all executables.",
|
|
|
+ cmCacheManager::PATH);
|
|
|
+ }
|
|
|
+
|
|
|
+ this->m_CacheManager->SaveCache(this->GetHomeOutputDirectory());
|
|
|
+ if(cmSystemTools::GetErrorOccuredFlag())
|
|
|
+ {
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+// handle a command line invocation
|
|
|
+int cmake::Run(const std::vector<std::string>& args)
|
|
|
+{
|
|
|
+ // a quick check for args
|
|
|
+ if(args.size() == 1 && !cmSystemTools::FileExists("CMakeLists.txt"))
|
|
|
+ {
|
|
|
+ this->Usage(args[0].c_str());
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ // look for obvious request for help
|
|
|
+ for(unsigned int i=1; i < args.size(); ++i)
|
|
|
+ {
|
|
|
+ std::string arg = args[i];
|
|
|
+ if(arg.find("-help",0) != std::string::npos ||
|
|
|
+ arg.find("--help",0) != std::string::npos ||
|
|
|
+ arg.find("/?",0) != std::string::npos ||
|
|
|
+ arg.find("-usage",0) != std::string::npos)
|
|
|
+ {
|
|
|
+ this->Usage(args[0].c_str());
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // Process the arguments
|
|
|
+ this->SetArgs(args);
|
|
|
+
|
|
|
+ // if we are local do the local thing, otherwise do global
|
|
|
+ if (m_Local)
|
|
|
+ {
|
|
|
+ return this->LocalGenerate();
|
|
|
+ }
|
|
|
+
|
|
|
+ // otherwise global
|
|
|
+ int ret = this->Configure(args[0].c_str(),&args);
|
|
|
+ if (ret)
|
|
|
+ {
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+ return this->Generate();
|
|
|
+}
|
|
|
+
|
|
|
+int cmake::Generate()
|
|
|
+{
|
|
|
+ m_GlobalGenerator->Generate();
|
|
|
+ if(cmSystemTools::GetErrorOccuredFlag())
|
|
|
+ {
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+int cmake::LocalGenerate()
|
|
|
+{
|
|
|
+ // Read in the cache
|
|
|
+ m_CacheManager->LoadCache(this->GetHomeOutputDirectory());
|
|
|
+
|
|
|
+ // create the generator based on the cache if it isn't already there
|
|
|
+ const char* genName = m_CacheManager->GetCacheValue("CMAKE_GENERATOR");
|
|
|
+ if(genName)
|
|
|
+ {
|
|
|
+ m_GlobalGenerator = this->CreateGlobalGenerator(genName);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ cmSystemTools::Error("Could local Generate called without the GENERATOR being specified in the CMakeCache");
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ // do the local generate
|
|
|
+ m_GlobalGenerator->LocalGenerate();
|
|
|
+ if(cmSystemTools::GetErrorOccuredFlag())
|
|
|
+ {
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+unsigned int cmake::GetMajorVersion()
|
|
|
+{
|
|
|
+ return cmMakefile::GetMajorVersion();
|
|
|
+}
|
|
|
+
|
|
|
+unsigned int cmake::GetMinorVersion()
|
|
|
+{
|
|
|
+ return cmMakefile::GetMinorVersion();
|
|
|
+}
|
|
|
+
|
|
|
+const char *cmake::GetReleaseVersion()
|
|
|
+{
|
|
|
+ return cmMakefile::GetReleaseVersion();
|
|
|
+}
|
|
|
+
|
|
|
+const char* cmake::GetCacheDefinition(const char* name) const
|
|
|
+{
|
|
|
+ return m_CacheManager->GetCacheValue(name);
|
|
|
+}
|