|  | @@ -36,6 +36,7 @@
 | 
	
		
			
				|  |  |  # include <cmsys/Terminal.h>
 | 
	
		
			
				|  |  |  #endif
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +#include <cmsys/CommandLineArguments.hxx>
 | 
	
		
			
				|  |  |  #include <cmsys/Directory.hxx>
 | 
	
		
			
				|  |  |  #include <cmsys/Process.h>
 | 
	
		
			
				|  |  |  #include <cmsys/Glob.hxx>
 | 
	
	
		
			
				|  | @@ -947,7 +948,8 @@ void CMakeCommandUsage(const char* program)
 | 
	
		
			
				|  |  |    errorStream
 | 
	
		
			
				|  |  |      << "cmake bootstrap\n";
 | 
	
		
			
				|  |  |  #endif
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +  // If you add new commands, change here, 
 | 
	
		
			
				|  |  | +  // and in cmakemain.cxx in the options table
 | 
	
		
			
				|  |  |    errorStream
 | 
	
		
			
				|  |  |      << "Usage: " << program << " -E [command] [arguments ...]\n"
 | 
	
		
			
				|  |  |      << "Available commands: \n"
 | 
	
	
		
			
				|  | @@ -973,6 +975,7 @@ void CMakeCommandUsage(const char* program)
 | 
	
		
			
				|  |  |      << "  time command [args] ...   - run command and return elapsed time\n"
 | 
	
		
			
				|  |  |      << "  touch file                - touch a file.\n"
 | 
	
		
			
				|  |  |      << "  touch_nocreate file       - touch a file but do not create it.\n"
 | 
	
		
			
				|  |  | +    << "  build build_dir           - build the project in build_dir.\n"
 | 
	
		
			
				|  |  |  #if defined(_WIN32) && !defined(__CYGWIN__)
 | 
	
		
			
				|  |  |      << "  write_regv key value      - write registry value\n"
 | 
	
		
			
				|  |  |      << "  delete_regv key           - delete registry value\n"
 | 
	
	
		
			
				|  | @@ -987,6 +990,7 @@ void CMakeCommandUsage(const char* program)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  int cmake::ExecuteCMakeCommand(std::vector<std::string>& args)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | +  // IF YOU ADD A NEW COMMAND, DOCUMENT IT ABOVE and in cmakemain.cxx
 | 
	
		
			
				|  |  |    if (args.size() > 1)
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  |      // Copy file
 | 
	
	
		
			
				|  | @@ -1188,7 +1192,6 @@ int cmake::ExecuteCMakeCommand(std::vector<std::string>& args)
 | 
	
		
			
				|  |  |          << "\n";
 | 
	
		
			
				|  |  |        return ret;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |      // Command to calculate the md5sum of a file
 | 
	
		
			
				|  |  |      else if (args[1] == "md5sum" && args.size() >= 3)
 | 
	
		
			
				|  |  |        {
 | 
	
	
		
			
				|  | @@ -4329,3 +4332,86 @@ std::vector<std::string> const& cmake::GetDebugConfigs()
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    return this->DebugConfigs;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +int cmake::Build(const std::string& dir,
 | 
	
		
			
				|  |  | +                 const std::string& target,
 | 
	
		
			
				|  |  | +                 const std::string& config,
 | 
	
		
			
				|  |  | +                 const std::string& extraBuildOptions,
 | 
	
		
			
				|  |  | +                 bool clean)
 | 
	
		
			
				|  |  | +{ 
 | 
	
		
			
				|  |  | +  if(!cmSystemTools::FileIsDirectory(dir.c_str()))
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +    std::cerr << "Error: " << dir << " is not a directory\n";
 | 
	
		
			
				|  |  | +    return 1;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  std::string cachePath = dir;
 | 
	
		
			
				|  |  | +  cmSystemTools::ConvertToUnixSlashes(cachePath);
 | 
	
		
			
				|  |  | +  cmCacheManager* cachem = this->GetCacheManager();
 | 
	
		
			
				|  |  | +  cmCacheManager::CacheIterator it = cachem->NewIterator();
 | 
	
		
			
				|  |  | +  if(!cachem->LoadCache(cachePath.c_str()))
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +    std::cerr << "Error: could not load cache\n";
 | 
	
		
			
				|  |  | +    return 1;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  if(!it.Find("CMAKE_GENERATOR"))
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +    std::cerr << "Error: could find generator in Cache\n";
 | 
	
		
			
				|  |  | +    return 1;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  cmGlobalGenerator* gen =
 | 
	
		
			
				|  |  | +    this->CreateGlobalGenerator(it.GetValue());
 | 
	
		
			
				|  |  | +  std::string output;
 | 
	
		
			
				|  |  | +  std::string projName;
 | 
	
		
			
				|  |  | +  std::string makeProgram;
 | 
	
		
			
				|  |  | +  if(!it.Find("CMAKE_PROJECT_NAME"))
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +    std::cerr << "Error: could not find CMAKE_PROJECT_NAME in Cache\n";
 | 
	
		
			
				|  |  | +    return 1;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  projName = it.GetValue();
 | 
	
		
			
				|  |  | +  if(!it.Find("CMAKE_MAKE_PROGRAM"))
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +    std::cerr << "Error: could not find CMAKE_MAKE_PROGRAM in Cache\n";
 | 
	
		
			
				|  |  | +    return 1;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  makeProgram = it.GetValue();
 | 
	
		
			
				|  |  | +  return gen->Build(0, dir.c_str(),
 | 
	
		
			
				|  |  | +                    projName.c_str(), target.c_str(),
 | 
	
		
			
				|  |  | +                    &output, 
 | 
	
		
			
				|  |  | +                    makeProgram.c_str(),
 | 
	
		
			
				|  |  | +                    config.c_str(), clean, false, 0, true);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +int cmake::DoBuild(int ac, char* av[])
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +  std::string target;
 | 
	
		
			
				|  |  | +  std::string config = "Debug";
 | 
	
		
			
				|  |  | +  std::string extraBuildOptions;
 | 
	
		
			
				|  |  | +  std::string dir;
 | 
	
		
			
				|  |  | +  bool clean = false;
 | 
	
		
			
				|  |  | +  cmsys::CommandLineArguments arg;
 | 
	
		
			
				|  |  | +  arg.Initialize(ac, av);
 | 
	
		
			
				|  |  | +  typedef cmsys::CommandLineArguments argT;
 | 
	
		
			
				|  |  | +  arg.AddArgument("--build", argT::SPACE_ARGUMENT, &dir, 
 | 
	
		
			
				|  |  | +                  "Build a configured cmake project --build dir.");
 | 
	
		
			
				|  |  | +  arg.AddArgument("--target", argT::SPACE_ARGUMENT, &target, 
 | 
	
		
			
				|  |  | +                  "Specifiy the target to build,"
 | 
	
		
			
				|  |  | +                  " if missing, all targets are built.");
 | 
	
		
			
				|  |  | +  arg.AddArgument("--config", argT::SPACE_ARGUMENT, &config, 
 | 
	
		
			
				|  |  | +                  "Specify configuration to build"
 | 
	
		
			
				|  |  | +                  " if missing Debug is built.");
 | 
	
		
			
				|  |  | +  arg.AddArgument("--extra-options", argT::SPACE_ARGUMENT, &extraBuildOptions, 
 | 
	
		
			
				|  |  | +                  "Specify extra options to pass to build program,"
 | 
	
		
			
				|  |  | +                  " for example with gmake -jN.");
 | 
	
		
			
				|  |  | +  arg.AddArgument("--clean", argT::NO_ARGUMENT, &clean, 
 | 
	
		
			
				|  |  | +                  "Clean before building.");
 | 
	
		
			
				|  |  | +  if ( !arg.Parse() )
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +    std::cerr << "Problem parsing --build arguments:\n";
 | 
	
		
			
				|  |  | +    std::cerr << arg.GetHelp() << "\n";
 | 
	
		
			
				|  |  | +    return 1;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  cmake cm;
 | 
	
		
			
				|  |  | +  return cm.Build(dir, target, config, extraBuildOptions, clean);
 | 
	
		
			
				|  |  | +}
 |